ROS1入门教程2:主题发布和订阅

一、创建发布者

创建源文件publisher.cpp,并写入以下内容:

cpp 复制代码
#include <iostream>

#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char* argv[]) {
    std::string nodeName = "publisher"; // 节点名称
    ROS_INFO("Publisher node name is: %s", nodeName.c_str()); // 日志打印节点名称
    ros::init(argc, argv, nodeName); // 初始化ROS1
    ros::NodeHandle nodeHandle; // 节点句柄
    std::string topicName = "demo2"; // 主题名称
    uint32_t queueSize = 1000; // 指定发布者队列的大小
    const ros::Publisher &publisher = nodeHandle.advertise<std_msgs::String>(topicName, queueSize); // 创建主题发布者
    uint32_t messageId = 0; // 消息ID
    double frequency = 1; // 消息发送频率,每秒发送1次
    ros::Rate rate(frequency); // 创建消息频率对象
    while (ros::ok() == true) { // 循环发送主题消息,直到ROS1关闭
        std_msgs::String message; // 创建消息对象
        std::string data = "publish message id " + std::to_string(messageId); // 创建消息内容
        message.data = data; // 填写消息内容
        publisher.publish(message); // 开始发布消息
        ROS_INFO("Publish topic message: %s", data.c_str());
        ++messageId; // 发布完成,消息ID自增1
        rate.sleep(); // 执行延时
    }

    return EXIT_SUCCESS;
}

二、创建订阅者

创建源文件subscriber.cpp,并写入以下内容:

cpp 复制代码
#include <iostream>

#include "ros/ros.h"
#include "std_msgs/String.h"

void topicCallback(const std_msgs::String::ConstPtr &message) { // 主题消息回调函数
    if (message.get() != nullptr) {
        ROS_INFO("Subscribe topic message: %s", message.get()->data.c_str());
    }
}

int main(int argc, char* argv[]) {
    std::string nodeName = "subscriber"; // 节点名称
    ROS_INFO("Subscriber node name is: %s", nodeName.c_str()); // 日志打印节点名称
    ros::init(argc, argv, nodeName); // 初始化ROS1
    ros::NodeHandle nodeHandle; // 节点句柄
    std::string topicName = "demo2"; // 主题名称
    uint32_t queueSize = 1000; // 指定发布者队列的大小
    const ros::Subscriber &subscriber = nodeHandle.subscribe<std_msgs::String>(topicName, queueSize, topicCallback); // 创建主题订阅者
    ros::spin(); // 阻塞线程,防止退出

    return EXIT_SUCCESS;
}

三、编译运行

1、修改编译配置

打开CMakeLists.txt文件,添加以下内容:

bash 复制代码
# 添加发布者源文件
add_executable(publisher src/publisher.cpp)

# 添加订阅者源文件
add_executable(subscriber src/subscriber.cpp)

# 发布者链接catkin库
target_link_libraries(publisher ${catkin_LIBRARIES})

# 订阅者链接catkin库
target_link_libraries(subscriber ${catkin_LIBRARIES})

2、开始编译

bash 复制代码
# 执行编译命令
catkin_make

# 新建【终端1】和【终端2】,分别执行以下命令加载运行环境:
source ./devel/setup.sh

3、运行发布者

bash 复制代码
# 打开【终端1】运行以下命令:
rosrun demo publisher

发布成功的日志打印:

4、运行订阅者

bash 复制代码
# 打开【终端2】运行以下命令:
rosrun demo subscriber

订阅成功的日志打印:

相关推荐
Robot侠19 小时前
ROS1从入门到精通 1 :ROS1简介与环境搭建(Ubuntu 20.04 + Noetic完整指南)
linux·ubuntu·ros·机器人操作系统
Robot侠2 天前
ROS1从入门到精通 3:创建工作空间与功能包(从零开始的ROS项目)
人工智能·机器学习·机器人·ros
Robot侠2 天前
ROS1从入门到精通 2:ROS1核心概念详解(节点、话题、服务一网打尽)
unity·游戏引擎·ros·机器人操作系统
杰仔coding4 天前
ROS 运动规划器对比分析
ros·运动规划
再遇当年6 天前
因为研究平台arm,RK3588交叉编译误把我笔记本X86平台的/x86_64-linux-gnu文件删除,导致联想拯救者笔记本中的ubuntu系统损坏
linux·arm开发·ros·gnu·交叉编译·x86
nandycooh11 天前
Ubuntu22.04.5安装ROS2教程(使用鱼香ROS工具)
ubuntu·ros
奔跑的花短裤11 天前
ROS2安装
ros·ros2·ros1
liiiuzy14 天前
fastlio2建图与重定位 neotic ubuntu20.04
ros·雷达建图·fastlio2
FateRing16 天前
ros2的turtlebot3_gazebo仿真加深度相机
ros·gazebo
老黄编程20 天前
Gazebo Classic 11 与 Gazebo Harmonic(Gazebo Sim) 的功能对比总结
ros·gazebo