ROS自学笔记1--ROS通信方式

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命令。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值