ROS基础(6)——通信架构(1)

ROS的通信架构是ROS的灵魂,也是整个ROS正常运行的关键所在。

ROS通信架构包括各种数据的处理,进程的运行,消息的传递等等。

本章主要介绍通信架构的基础通信方式和相关概念。

一、Node & Master

1、Node

在ROS的世界里,最小的进程单元就是节点(node)。
一个软件包里可以有多个可执行文件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点。
从程序角度来说,node就是一个可执行文件(通常为C++编译生成的可执行文件、Python脚本)被执行,加载到了内存之中;
从功能角度来说,通常一个node负责者机器人的某一个单独的功能。

由于机器人的功能模块非常复杂,往往不会把所有功能都集中到一个node上,而会采用分布式的方式,把鸡蛋放到不同的篮子里。
例如一个node控制底盘轮子运动,一个node驱动摄像头获取图像,一个node驱动激光雷达,一个node根据传感器信息进行路径规划……
这样做可以降低程序发生崩溃的可能性,试想一下如果把所有功能都写到一个程序中,模块间的通信、异常处理将会很麻烦。

ROS系统中不同功能模块之间的通信,也就是节点间的通信。
把键盘控制替换为其他控制方式,而小海龟运动程序不用变化,这样就是一种模块化分工的思想。

2、Master

由于机器人的元器件很多,功能庞大,因此实际运行时往往会运行众多的node,负责感知世界、控制运动、决策和计算等功能。
那么如何合理的进行调配、管理这些node?这就要利用ROS提供节点管理器master,
master在整个网络通信架构里相当于管理中心,管理着各个node。
node首先在master处进行注册,之后master会将该node纳入整个ROS程序中。
node之间的通信也是先由master进行“牵线”,才能两两的进行点对点通信。
当ROS程序启动时,第一步首先启动master,由节点管理器处理依次启动node。

3、启动master和node

启动ROS时,首先输入命令:

roscore     # 启动ROS master

每一次运行ROS的节点前,都需要把master启动起来,这样才能够让节点启动和注册。
在这里插入图片描述
具体启动node的语句是:

 rosrun pkg_name node_name

通常运行ROS,就是按照这样的顺序启动,有时候节点太多,会选择用launch文件来启动。

Master、Node之间以及Node之间的关系如下图所示(以小海龟为例):
在这里插入图片描述
在这里插入图片描述

4、 rosrun和rosnode命令

rosrun命令的详细用法如下:

rosrun [--prefix cmd] [--debug] pkg_name node_name [ARGS]

rosrun将会寻找PACKAGE下的名为EXECUTABLE的可执行程序,将可选参数ARGS传入。

例如在GDB下运行ros程序:

rosrun --prefix 'gdb -ex run --args' pkg_name node_name

rosnode命令的详细作用列表如下:

rosnode命令作用
rosnode list列出当前运行的node信息
rosnode info node_name显示出node的详细信息
rosnode kill node_name结束某个node
rosnode ping测试连接节点
rosnode machine列出在特定机器或列表机器上运行的节点
rosnode cleanup清除不可到达节点的注册信息

以上命令中常用的为前三个,在开发调试时经常会需要查看当前node以及node信息。

如果想不起来,也可以通过rosnode help来查看rosnode命令的用法。
在这里插入图片描述

二、launch文件

1、启动方式

机器人是一个系统工程,通常一个机器人运行操作时要开启很多个node,对于一个复杂的机器人的启并不需要每个节点依次进行rosrun,ROS提供了一个命令能一次性启动master和多个node。

该命令是:

roslaunch pkg_name file_name.launch

roslaunch命令首先会自动进行检测系统的roscore有没有运行,也即是确认节点管理器是否在运行状态中,如果master没有启动,那么roslaunch就会首先启动master,然后再按照launch的规则执行。

launch文件里已经配置好了启动的规则。 所以roslaunch就像是一个启动工具,能够一次性把多个节点按照预先的配置启动起来,减少在终端中一条条输入指令的麻烦。

2、写法与格式

launch文件同样也遵循着xml格式规范,是一种标签文本,它的格式包括以下标签:

<launch>    <!--根标签-->
<node>    <!--需要启动的node及其参数-->
<include>    <!--包含其他launch-->
<machine>    <!--指定运行的机器-->
<env-loader>    <!--设置环境变量-->
<param>    <!--定义参数到参数服务器-->
<rosparam>    <!--启动yaml文件参数到参数服务器-->
<arg>    <!--定义变量-->
<remap>    <!--设定参数映射-->
<group>    <!--设定命名空间-->
</launch>    <!--根标签-->

参考网址

例如:

<launch>
        <node name="talker" pkg="rospy_tutorials" type="talker" />
</launch>

这是官网给出的一个最小的例子,文本中的信息是,它启动了一个单独的节点talker,该节点是包rospy_tutorials软件包中的节点。

三、Topic

1、基本内容

ROS的通信方式是ROS最为核心的概念,ROS系统的精髓就在于它提供的通信架构。

ROS的通信方式有以下四种:
Topic 主题
Service 服务
Parameter Service 参数服务器
Actionlib 动作库

ROS中的通信方式中,topic是常用的一种。
对于实时性、周期性的消息,使用topic来传输是最佳的选择。
topic是一种点对点的单向通信方式,这里的“点”指的是node,也就是说node之间可以通过topic方式来传递信息。

topic要经历下面几步的初始化过程:
首先,publisher节点和subscriber节点都要到节点管理器进行注册,
然后,publisher会发布topic,subscriber在master的指挥下会订阅该topic,从而建立起sub-pub之间的通信。

整个过程是单向的。其结构示意图如下:
在这里插入图片描述

Subscriber接收消息会进行处理,一般这个过程叫做回调(Callback)。
所谓回调就是提前定义好了一个处理函数(写在代码中),当有消息来就会触发这个处理函数,函数会对消息进行处理。

上图就是ROS的topic通信方式的流程示意图。
topic通信属于一种异步的通信方式。

2、示例

参考下图,以摄像头画面的发布、处理、显示为例讲讲topic通信的流程。

在机器人上的摄像头拍摄程序是一个node(圆圈表示,记作node1),当node1运行启动之后,它作为一个Publisher就开始发布topic。
比如它发布了一个topic(方框表示),叫做/camera_rgb,是rgb颜色信息,即采集到的彩色图像。
同时,node2假如是图像处理程序,它订阅了/camera_rgb这个topic,经过节点管理器的介绍,它就能建立和摄像头节点(node1)的连接。

在node1每发布一次消息之后,就会继续执行下一个动作,至于消息是什么状态、被怎样处理,它不需要了解;
而对于node2图像处理程序,它只管接收和处理/camera_rgb上的消息,至于是谁发来的,它不会关心。
所以node1、node2两者都是各司其责,不存在协同工作,称这样的通信方式是异步的。

在这里插入图片描述
ROS是一种分布式的架构,一个topic可以被多个节点同时发布,也可以同时被多个节点接收。

这就体现了分布式系统通信的好处:扩展性好、软件复用率高。

总结三点:
topic通信方式是异步的,发送时调用publish()方法,发送完成立即返回,不用等待反馈。
subscriber通过回调函数的方式来处理消息。
topic可以同时有多个subscribers,也可以同时有多个publishers。ROS中这样的例子有:/rosout、/tf等等。

3、操作命令

在实际应用中,应该熟悉topic的几种使用命令,下表详细的列出了各自的命令及其作用。

命令作用
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

1、简介

topic有很严格的格式要求,比如上节的摄像头进程中的rgb图像topic,它就必然要遵循ROS中定义好的rgb图像格式,这种数据格式就是Message。

Message按照定义解释就是topic内容的数据类型,也称之为topic的格式标准。这里和平常用到的Massage直观概念有所不同,这里的Message不单单指一条发布或者订阅的消息,也指定为topic的格式标准。

2、结构与类型

基本的msg包括:

bool、int8、int16、int32、int64(以及uint)、float、float64、string、time、duration、header、可变长数组array[]、固定长度数组array[C]。

msg的定义类似C语言中的结构体,通过具体的定义图像的宽度,高度等等来规范图像的格式。

所以这就解释了Message不仅仅是平时理解的一条一条的消息,而且更是ROS中topic的格式规范。

或者可以理解msg是一个“类”,那么每次发布的内容可以理解为“对象”,这么对比来理解可能更加容易。

实际通常不会把Message概念分的那么清,通常说Message既指的是类,也是指它的对象。而msg文件则相当于类的定义。

小海龟程序里的位置信息的msg文件内容:
在这里插入图片描述

3、操作命令

rosmsg的命令相比topic就比较少了,只有两个如下:

rosmsg命令作用
rosmsg list列出系统上所有的msg
rosmsg show msg_name显示某个msg的内容
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值