1. 前言
本教程是B站阿杰视频的笔记
视频地址:https://www.bilibili.com/video/BV1qa41137ED
1.1 王者解释结点通讯:
- 话题topic
- 发布者publisher
- 订阅者subsciber
1.2 通讯小结
- 话题Topic是节点间进行持续通讯的一种形式。
- 话题通讯的两个节点通过话题的名称建立起话题通讯连接。3.话题中通讯的数据,叫做消息Message。
- 消息Message通常会按照一定的频率持续不断的发送,以保证消息数据的实时性。
- 消息的发送方叫做话题的发布者Pubplisher。
- 消息的接收方叫做话题的订阅者Subsciber。
2. 灵活的Topic话题图解
2.1 话题注意细节
2.2 外延补充
- —个ROS节点网络中,可以同时存在多个话题。
- 一个话题可以有多个发布者也可以有多个订阅者。
- 一个节点可以对多个话题进行订阅,也可以发布多个话题。
- 不同的传感器消息通常会拥有各自独立话题名称,每个话题只有一个发布者。
- 机器人速度指令话题通常会有多个发布者,但是同一时间只能有一个发言人。
3. Message消息图解
3.1 消息类型
ROS Index官网:https://index.ros.org/
搜索std_msgs
找到匹配的版本
3.2 查看标准消息类型std_msgs
选择Website,进入https://wiki.ros.org/std_msgs
下翻到 2.ROS Message Types
消息是嵌套的,由简单到复杂,类似C++的结构体
4. 使用C++实现Publisher发布者
这一期我们将按照这个场景来构建话题的发布者,一共有2个发布者,根据需求创建ssr_pkg包的chao_node和yao_node订阅节点
4.1 发布者的实现
打开之前创建的ssr_pkg,教程参照: 【初学ROS,年轻人的第一个Node节点】用VScode打开chao_node.cpp
4.2 消息分析
去ROS Index查找对应消息类型,进入https://wiki.ros.org/std_msgs,下翻到 2.ROS Message Types
超哥说的那句话不就是一个字符串吗
4.3 chao_node.cpp源程序
#include <ros/ros.h> #include <std_msgs/String.h> int main(int argc,char *argv[]) { ros::init(argc,argv,"chao_node" ); printf("我的枪去而复返,你的生命有去无回!\n"); ros::NodeHandle nh; ros::Publisher pub = nh.advertise<std_msgs ::String>("kuai_shang_che_kai_hei_qun", 10); ros::Rate loop_rate(10); while( ros::ok()) { printf("我要开始刷屏了!\n"); std_msgs::String msg; msg.data ="国服马超,带飞"; pub.publish(msg); loop_rate.sleep(); } return 0; }
ctrl+s快捷保存
ctrl+shift+b快捷编译
4.4 运行调试chao_node节点
打开两个终端,分别运行两行代码
roscore rosrun ssr_pkg chao_node
rostopic工具
rostopic list rostopic echo /kuai_shang_che_kai_hei_qun echo -e "\u56FD\u670D\u9A6C\u8D85\uFF0C\u5E26\u98DE" rostopic hz /kuai_shang_che_kai_hei_qun
小结
- 确定话题名称和消息类型。
- 在代码文件中include消息类型对应的头文件。
- 在main函数中通过NodeHandler大管家发布一个话题并得到消息发送对象。
- 生成要发送的消息包并进行发送数据的赋值。
- 调用消息发送对象的publish()函数将消息包发送到话题当中。
5. 复制节点yao_node
从chao_node.cpp复制到节点yao_node.cpp
5.1 修改C++源代码
#include <ros/ros.h> #include <std_msgs/String.h> int main(int argc,char *argv[]) { ros::init(argc,argv,"yao_node" ); printf("过去生于未来!\n"); ros::NodeHandle nh; ros::Publisher pub = nh.advertise<std_msgs ::String>("gie_gie_dai_wo", 10); ros::Rate loop_rate(10); while( ros::ok()) { printf("我要开始刷屏了!\n"); std_msgs::String msg; msg.data ="求上车+++"; pub.publish(msg); loop_rate.sleep(); } return 0; }
ctrl+s快捷保存
ctrl+shift+b快捷编译
5.2 修改CMakeLists.tet文件
增加yao_node节点配置
/
add_executable(chao_node src/chao_node.cpp) target_link_libraries (chao_node ${catkin_LIBRARIES} ) add_executable(yao_node src/yao_node.cpp) target_link_libraries(yao_node ${catkin_LIBRARIES} )
5.3 运行调试yao_node节点
运行新节点前,需要保留下面两个终端
roscore rosrun ssr_pkg chao_node
rosrun ssr_pkg yao_node
采用rostopic查看消息
rostopic工具
rostopic list rostopic echo /gie_gie_dai_wo echo -e "\u56FD\u670D\u9A6C\u8D85\uFF0C\u5E26\u98DE" rostopic hz /gie_gie_dai_wo