ROS的通信是整个系统的核心和精髓部分。
ROS主要的通信方式有:
Topic
Service
Parameter Service
Actionlib
1 Topic通信方式
Topic是ROS最通用的通信方式,两个node之间要进行通信,就需要建立一个Topic话题,两个node之间是通过publish-subscribe机制进行通信的。
例如 Camera节点发送image_rgb和image_depth话题,node2图形显示节点和node3图像处理节点在不停地订阅这个话题,所以我们可以实时处理和显示图像。
Topic的通信是异步通信。什么是异步呢?
就是说我这个节点Publish发送Topic话题,但是不管有没有其他节点接收它。而另外的节点只要检测到有Topic话题Publish发送过来,就Subscrib接收它。
对于同一个Topic,可以有多个订阅的节点,同时也会有多个发布的节点。
Topic有很严格的格式要求,我们这里面是按照Message数据格式来发送的。
我们可以把Message理解成一个类或者数据结构,具体发布的消息是一个个对象。
ROS里面基本的msg包括bool,int8 16 32 64,float32 64,string,time,duration,header,可变长数组array[]。
具体的一个Message的定义如上所示。是一个类,我们发布的内容就是一个对象。
rostopic
$rostopic list//列出当前所有topic
$rostopic info /topic_name//显示某个topic属性
$rostopic echo /topic_name//显示某个topic的内容
$rostopic pub /topic_name//向某个topic发布内容
- 1
- 2
- 3
- 4
rosmsg
$rosmsg list//列出系统上所有msg
$rosmsg show /msg_name//显示某个msg内容
- 1
- 2
2 Service通信方式
topic在单向的情况下无法满足要求。
例如一个节点在不停的发布数据,另一个节点只是在需要处理的时候计算一下接收的数据,使用topic实现这种情况就比较耗费资源。
Service是同步通信方式,node之间可以通过request-reply方式通信。
例如服务器节点B会向外面提供一个service服务,客户端节点A需要数据,就会向service发送请求,等待结果,然后服务器接收到请求就会发送数据给客户端。
下面是topic和service两种通信方式的区别:
client-service是多对一的,服务不能重名,只能有一个服务。
srv是service的通信数据格式,定义在*.srv文件中。
上图是我们自定义一个srv文件的过程:
1.首先定义一个srv文件中的一些基本的元素,其中有一些可以是meg类型。我们不能嵌套srv,只能嵌套msg。例如我们定义了一个DetectHuman.src,里面有my_pkg/HumanPose类型的数据。
人体检测的srv里面定义了多个人体姿态的消息。
2.接着对嵌套的msg类型进行定义,my_pkg/msg/HumanPose.msg对这个msg进行了详细定义,里面有一个my_pkg/msg/JointPose.msg消息类型,后面再对这个类型进行定义。
- 1
- 2
- 3
每次添加完srv和msg后就需要修改package.xml和CMakeLists.txt依赖
rosservice
$rosservice list//列出当前所有活跃的service
$rosservice info service_name//显示某个sercice的属性信息
$rosservice call service name args//调用某个service
- 1
- 2
- 3
rossrv
$rossrv list//列出所有srv
$rossrv show srv_name//显示某个srv内容
- 1
- 2
3 Parameter Server
参数服务器在启动roscore的时候会被启动,另外还会启动master和rosout。
Parameter server存储各种参数的字典,我们可以用命令行运行,launch文件和node(API)读写。
下图是一个参数服务器的一个字典的具体组成:
下面用命令行来进行参数的读写:
$rosparam list//列出当前所有参数
$rosparam get param_key//显示某个参数的值
$rosparam set param_key param_value //设置某个参数的值
$rosparam dump file_name//保存参数到文件
$rosparam load file_name//从文件读取参数
$rosparam delete param_key//删除参数
- 1
- 2
- 3
- 4
- 5
- 6
YAL文件的格式如下所示:
另外一种是在launch文件里面进行读写。
launch文件里面有很多标签,和参数服务器相关的标签是param和rosparam,他俩的功能比较相近,但是param一般只是设置一个参数,rosparam需要设置多个参数。
上面红色的区域的param的name是publish_frequency,value是100.0
另外一个param的name是robot_descripton,虽然上面没有写value是多少,但是写了一个command,他的意思是用xacro.py这个脚本去执行robot.xacro这个文件,最后输出得到的结果作为value。
rosparam的用法比较固定,一般是先指定一个.yal文件,然后对它施加一个load,所以可以把真个标签理解为一个rosparam load命令。