ROS --- 话题通讯机制

节点与节点管理器

  机器人开发中,我们经常将机器人的整个系统划分为不同的模块,每个模块中也可能包含不同的处理单元。在ROS系统中,也采用了相似的任务处理方式,这就引入了ROS中比较重要的一个概念:节点(Node),通俗的来说,一个节点即为一个可执行文件,就是一个任务执行单元;此外,ROS中还有一个节点管理器(Master) 作为控制中心,来管理节点之间的通讯。

节点(Node)

  • 执行具体任务的进程、独立运行的可执行文件
  • 不同节点可以使用不同的编程语言,可以分布式地运行在不同的主机;
  • 节点在系统中的名称必须是唯一的。

节点管理器(Master)

  • 为节点提供命名和注册服务
  • 跟踪和记录话题/服务通信,辅助节点之间相互查找、建立连接;
  • 提供参数服务器,节点使用此服务器存储和检索运行时的参数。

ROS --- 话题通讯机制
   像上图所示,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 --- 话题通讯机制
      ROS中有一些对话题和消息的命令,我们以 ROS 中自带的“ 海龟”(Turtle) 功能包示例:

rqt_graph

  rqt_graph 能够创建一个显示当前系统运行情况的动态图形。
  在一个新终端运行:$ rosrun rqt_graph rqt_graph
  则会看到下图窗口,可见,/teleop_turtle 节点作为话题的发布者,发送了名为 /turtle1/cmd_vel 的消息,然后 /turtlesim 作为话题的订阅者,获取来自键盘的信息:
ROS --- 话题通讯机制

rostopic

  rostopic 命令工具帮助获取有关 ROS 话题相关的信息,首先使用帮助选项查看 rostopic 下的子命令。
ROS --- 话题通讯机制
  下面一次介绍常用的几个命令:

1. rostopic echo :

  用来打印话题内容信息,用法: rostopic echo [topic]。这时候我们将这个命令作用到消息 /turtle1/cmd_vel ,然后用键盘控制海龟移动,那么就会在终端看到持续刷新的速度信息。.
ROS --- 话题通讯机制
  这时候再通过rqt_graph 来查看节点信息,会发现有新的节点订阅了 /turtle1/cmd_vel,这就是rostopic echo 所订阅的。
ROS --- 话题通讯机制

2. rostopic list :

  rostopic list 能够列出所有当前订阅和发布的话题。通过帮助选项,可以发现所能 list 出的选项,我们通过 -v (–verbose) 选项来列出所有信息。
ROS --- 话题通讯机制

3. rostopic pub :

  rostopic pub可以把数据发布到当前某个正在广播的话题上,用法: rostopic pub [topic] [msg_type] [args]
ROS --- 话题通讯机制
但是,海龟只能走一段,要想让海龟持续转圈,应以一定的频率持续发布命令,可以使用 rostopic pub -r [hz]来发布一个稳定的命令流,这时候海龟做的是持续运动。
ROS --- 话题通讯机制
  这时,打开 rqt_graph,会发现对于 /turtle1/cmd_vel这个话题多了一个发布者,这就是我们刚刚的 rostopic 发布器节点。
ROS --- 话题通讯机制

4. rostopic hz :

  rostopic hz命令可以用来查看数据发布的频率,用法: rostopic hz [topic]。我们看一下turtlesim_node发布/turtle/pose时有多快:
ROS --- 话题通讯机制
  现在我们知道了,turtlesim正以大约60Hz的频率发布数据给turtle。

引用

   本文参考了ROS Wiki和古月居 ROS 21讲的教程。