浏览量: 284 次浏览

ROS通信架构

2019年10月15日 1 作者 Nie Hen

ROS的通信架构是ROS的灵魂,也是整个ROS正常运行的关键所在。ROS通信架构包括各种数据的处理,进程的运行,消息的传递等等。
ROS中的进程都是由很多的Node组成,并且由Node master来管理这些节点。
ROS中的通信方式有四种,Topic主题、Service服务、Parameter Service参数服务器、Actionlib动作库。每个通信方式都有自己的特点

Node & Master

Node
从程序角度来说,node就是一个可执行文件(通常为C++编译生成的可执行文件、Python脚本)被执行,加载到了内存之中;
从功能角度来说,通常一个node负责者机器人的某一个单独的功能。
这样做可以降低程序发生崩溃的可能性
在测试ros时 一个终端用来打开了小海龟的运动程序和键盘控制程序
    另一个终端用来启动键盘运动控制程序
每个程序就是一个node。 各个模块之间的通信就是node 之间的通信。

Master
如何合理的进行调配、管理这些node呢
就是使用节点管理器master。
master在整个网络通信架构里相当于管理中心,管理着各个node。(各个node通信时也是由master来管理)
node首先在master处进行注册,之后master会将该node纳入整个ROS程序中。
node之间的通信也是先由master进行“牵线”,才能两两的进行点对点通信。
当ROS程序启动时,第一步首先启动master,由节点管理器处理依次启动node。

启动Master Node
启动ros时 使用命令 roscore
此时ROS master启动,同时启动的还有rosout(日志记录)和parameter server(参数服务器)
package中存放着可执行文件,可执行文件是静态的,当系统执行这些可执行文件,将这些文件加载到内存中,它就成为了动态的node。
具体启动node的语句是:

rosrun pkg_name node_name

根据master需要的每个节点依次进行rosrun,(多个node调用可以使用lunch文件)
enter description here

开发中常用到的node命令,查看当前node以及node信息

rosnode命令 作用
rosnode list 列出当前运行的node信息
rosnode info node_name 显示出node的详细信息
rosnode kill node_name 结束某个node

launch使用命令

roslaunch pkg_name file_name.launch
介绍在POS文件系统中

Topic 主题

跟mqtt服务是一样的。有发布者 和订阅者。能够实现异步的传输数据。两者互不影响。
在ros中topic要经历下面几步的初始化过程:
首先,publisher节点和subscriber节点都要到节点管理器进行注册。
然后publisher会发布topic,subscriber在master的指挥下会订阅该topic。
从而建立起sub-pub之间的通信。
enter description here
Subscriber接收消息会进行处理,就是callback。

总结三点:
1. topic通信方式是异步的,发送时调用publish()方法,发送完成立即返回,不用等待反馈。
2. subscriber通过回调函数的方式来处理消息。
3. topic可以同时有多个subscribers,也可以同时有多个publishers。ROS中这样的例子有:/rosout、/tf等等。
应用在 连续、高频的数据发布的任务中,如激光雷达、里程计发布数据
操作命令
命令 |作用
—— |—–
rostopic list |列出当前所有的topic
rostopic info topic_name |显示某个topic的属性信息
rostopic echo topic_name |显示某个topic的内容
rostopic pub topic_name … |向某个topic发布内容
rostopic bw topic_name |查看某个topic的带宽
rostopic hz topic_name |查看某个topic的频率
rostopic find topic_type |查找某个类型的topic
rostopic type topic_name |查看某个topic的类型(msg)
可以通过rostopic help或rostopic command -h查看具体用法。

message

Message按照定义解释就是topic内容的数据类型,也称之为topic的格式标准。
可以使用 rosmsg lis 查看已有的数据类型
基本的msg包括bool、int8、int16、int32、int64(以及uint)、float、float64、string、time、duration、header、可变长数组array[]、固定长度数组array[C]

文件在opt/ros/kinetic/incude 中 各个数据类型在不同文件下的不同头文件中
有些里面就是一种c语言中的结构体。定义各个数据类型
其他命令
rosmsg show msg_name 显示某个msg的内容

常见meg数据类型 包括std_msgs, sensor_msgs, nav_msgs, geometry_msgs

service 服务

有些时候单向的通信满足不了通信要求,比如当一些节点只是临时而非周期性的需要某些数据,如果用topic通信方式时就会消耗大量不必要的系统资源,造成系统的低效率高功耗。
而service 提供的是 请求-查询式的服务正好满足这些需求。

service 服务是双向的。请求方(Client)发送一个request,要等待server处理,反馈回一个reply,这样通过类似“请求-应答”的机制完成整个服务通信。
enter description here
过程是同步的 如果请求方没有受到reply就会一直等待。
应用在 偶尔使用的功能/具体的任务。比如开关传感器、拍照、逆解计算

常用命令
rosservice list 显示服务列表
rosservice info 打印服务信息
rosservice type 打印服务类型

srv
类似msg文件,srv文件是用来描述服务(service数据类型的,service通信的数据格式定义在*.srv中。它声明了一个服务,包括请求(request)和响应(reply)两部分
(小海龟控制中就是使用srv文件)
enter description here
如果修改了msg或者srv文件需要修改package.xml和修改CMakeList.txt。这些文件需要添加一些必要的依赖等。

Parameter server参数服务器

参数服务器也可以说是特殊的“通信方式”。特殊点在于参数服务器是节点存储参数的地方、用于配置参数,全局共享参数。参数服务器使用互联网传输,在节点管理器中运行,实现整个通信过程。

参数服务器,作为ROS中另外一种数据传输方式,有别于topic和service,它更加的静态。参数服务器维护着一个数据字典,字典里存储着各种参数和配置。

参数服务器的维护方式非常的简单灵活,总的来讲有三种方式:
命令行维护
launch文件内读写
node源码

  1. rosparam set param_key param_value 设置参数
    rosparam get param_key 显示参数
    rosparam dump file_name 保存参数到文件
    rosparam load file_name 从文件加载参数
    rosparam list 列出参数名称
  2. launch文件中有很多标签,而与参数服务器相关的标签只有两个,一个是,另一个是

Action 动作库

actionlib也是一种请求响应机制的通信方式。
当机器人执行一个长时间的任务时,假如利用service通信方式,那么publisher会很长时间接受不到反馈的reply,致使通信受阻。当service通信不能很好的完成任务时候,actionlib则可以比较适合实现长时间的通信过程,actionlib通信过程可以随时被查看过程进度,也可以终止请求,这样的一个特性,使得它在一些特别的机制中拥有很高的效率。

enter description here
通信双方在ROS Action Protocol下通过消息进行数据的交流通信。client和server为用户提供一个简单的API来请求目标(在客户端)或通过函数调用和回调来执行目标(在服务器端)。

利用动作库进行请求响应,动作的内容格式应包含三个部分,目标、反馈、结果。
enter description here

常用msg类型srv类型 action类型 都没有写下来 有点多 参考其他文章。