二 ROS通信机制-话题通信[发布订阅模式]
ROS 中的基本通信机制
-
话题通信(发布订阅模式):
-
服务通信(请求响应模式)
-
参数服务器(参数共享模式)
2.1话题通信(发布订阅模式)
话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。话题通信的应用场景也极其广泛,比如下面一个常见场景:
在上述场景中,就不止一次使用到了话题通信。
以激光雷达信息的采集处理为例,在 ROS 中有一个节点需要时时的发布当前雷达采集到的数据,导航模块中也有节点会订阅并解析雷达数据。
以运动消息的发布为例,导航模块会根据传感器采集的数据时时的计算出运动控制信息并发布给底盘,底盘也可以有一个节点订阅运动信息并最终转换成控制电机的脉冲信号。
以此类推,像雷达、摄像头、GPS… 等等一些传感器数据的采集,也都是使用了话题通信,换言之,话题通信适用于不断更新的数据传输相关的应用场景。
2.1.1概念
以发布订阅的方式实现不同节点之间数据交互的通信模式。
2.1.2作用
用于不断更新的、少逻辑处理的数据传输场景。
2.1.3 理论模型
该模型中涉及到三个角色:1.ROS Master (管理者) 2.Talker (发布者) 3.Listener (订阅者)
该模型大致意思是这样的:
注意1:上述实现流程中,前五步使用的 RPC协议(联系方式),最后两步使用的是 TCP 协议
注意2: Talker 与 Listener 的启动无先后顺序要求(第0步和第1步无先后顺序)
注意3: Talker 与 Listener 都可以有多个
注意4: Talker 与 Listener 连接建立后,不再需要 ROS Master。也即,即便关闭ROS Master,Talker 与 Listern 照常通信。
注意5: 该模型的实现流程已经封装好了,基本使用的时候都是调用。但也需要明白基本原理
2.1.4 话题通信应用时需要关注的地方:
- 关注话题设置
- 关注发布者和订阅者的实现
- 关注消息的载体
3 简单实现
3.1ROS工作空间建立:
//建立工作空间
mkdir -p demo_ws/src
//进入demo_ws编译
cd demo_ws -> caktin_make
//进入src目录创建功能包
cd src -> catkin_create_pkg 包名 roscpp rospy std_msgs
3.2 服务端实现
在 包名的路径下面还会有src目录,在里面创建一个cpp文件
/*
发布者实现流程:
1.包含头文件
2.初始化ROS节点
3.创建节点句柄
4.创建发布者对象
5.编写发布者逻辑并发布数据
*/
#include"ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char *argv[])
{
//2.初始化ROS节点 定义节点名称”hzh“
ros::init(argc, argv, "hzh" );
//3.创建节点句柄
ros::NodeHandle nh;
//4.创建发布者对象
ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);
//5.编写发布者逻辑并发布数据
//创建被发布的消息
std_msgs::String msg;
//编写循环,循环发布数据
while (ros::ok())
{
msg.data = "hello";
pub.publish(msg);
}
return 0;
}
2.写完后修改功能包里面的CMakeList.txt文件
第二个红括号是src下面你写的cpp文件名称,前一个是映射名称,自己定义。尽量和后面cpp文件一样
改成你写的映射名称
3.编译
如果是用VS code写的快捷键 ctrl+shift+b直接编译,否则在命令行里进入工作空间catkin_make
4.执行
启动roscore
cd demo_ws
source ./devel/setup.bash
rosrun 功能包 cpp文件
//回车后没反应就是对的
5.接受
cd demo_ws
//fang是话题名称
rostopic echo fang
运行结果应该就是下面这样