ROS—话题通讯机制
节点与节点管理器
机器人开发中,我们经常将机器人的整个系统划分为不同的模块,每个模块中也可能包含不同的处理单元。在ROS系统中,也采用了相似的任务处理方式,这就引入了ROS中比较重要的一个概念:
节点(Node)
,通俗的来说,一个节点即为一个可执行文件,就是一个任务执行单元;此外,ROS中还有一个
节点管理器
(Master) 作为控制中心,来管理节点之间的通讯。
节点(Node)
-
执行具体任务的进程、独立运行的
可执行文件
; -
不同节点
可以使用不同的编程语言
,可以分布式地运行在不同的主机; - 节点在系统中的名称必须是唯一的。
节点管理器(Master)
-
为节点提供
命名和注册服务
; -
跟踪和记录话题/服务
通信
,辅助节点之间相互查找、建立连接; -
提供
参数服务器
,节点使用此服务器存储和检索运行时的参数。
像上图所示,Camera Node、Image Processing Node 以及 Image Display Node 在建立时,首先都要向 ROS Master 提出注册,Master 才能为各个节点提供通讯和其他服务。
rosnode 命令
rosnode命令会显示当前运行的节点信息,这是它的一些功能(测试其功能之前,先用 roscore 打开 ROS ):
1
.
$ rosnode list % 列出目前的活跃节点
这时候会返回结果
/rosout
,这表示现在只有一个节点正在运行:rosout。这个节点用于收集和记录节点调试输出信息,所以只要打开 ROS 它就会运行。
2
.
$ rosnode info [节点名] %返回特定节点的相关信息
它会返回该节点的发布、订阅和服务信息。
话题通讯
ROS 为节点之间的通讯提供了两种通讯方式,
话题(Topic)
和
服务(Service)
,这里首先介绍话题通讯机制。
话题和消息
-
话题(Topic)
— 异步通信机制
1. 节点之间传输数据的重要总线;
2. 使用
发布/订阅
模型,数据由发布者传输到订阅者,
同一个话题的订阅者和发布者都可能不唯一
。 -
消息(Message)
— 话题传输的数据
1. 具有一定的
类型
和数据结构,包括 ROS提供的
标准类型
和用户
自定义类型
;
2. 使用编程语言无关的
.msg 文件
定义,编译过程中生成对应的代码文件。
ROS中有一些对话题和消息的命令,我们以 ROS 中自带的“
海龟”(Turtle)
功能包示例:
rqt_graph
rqt_graph 能够创建一个显示当前系统运行情况的动态图形。
在一个新终端运行:
$ rosrun rqt_graph rqt_graph
则会看到下图窗口,可见,/teleop_turtle 节点作为话题的发布者,发送了名为 /turtle1/cmd_vel 的消息,然后 /turtlesim 作为话题的订阅者,获取来自键盘的信息:
rostopic
rostopic 命令工具帮助获取有关 ROS 话题相关的信息,首先使用帮助选项查看 rostopic 下的子命令。
下面一次介绍常用的几个命令:
1. rostopic echo :
用来打印话题内容信息,用法:
rostopic echo [topic]
。这时候我们将这个命令作用到消息 /turtle1/cmd_vel ,然后用键盘控制海龟移动,那么就会在终端看到持续刷新的速度信息。.
这时候再通过rqt_graph 来查看节点信息,会发现有新的节点订阅了 /turtle1/cmd_vel,这就是rostopic echo 所订阅的。
2. rostopic list :
rostopic list 能够列出所有当前订阅和发布的话题。通过帮助选项,可以发现所能 list 出的选项,我们通过
-v (–verbose)
选项来列出所有信息。
3. rostopic pub :
rostopic pub可以把数据发布到当前某个正在广播的话题上,用法:
rostopic pub [topic] [msg_type] [args]
。
但是,海龟只能走一段,要想让海龟持续转圈,应以一定的频率持续发布命令,可以使用
rostopic pub -r [hz]
来发布一个稳定的命令流,这时候海龟做的是持续运动。
这时,打开 rqt_graph,会发现对于 /turtle1/cmd_vel这个话题多了一个发布者,这就是我们刚刚的 rostopic 发布器节点。
4. rostopic hz :
rostopic hz命令可以用来查看数据发布的频率,用法:
rostopic hz [topic]
。我们看一下turtlesim_node发布/turtle/pose时有多快:
现在我们知道了,turtlesim正以大约60Hz的频率发布数据给turtle。
引用
本文参考了ROS Wiki和古月居 ROS 21讲的教程。