第2章 ROS通信机制——常用命令与通信机制比较

2.4 常用命令

机器人系统中启动的节点少则几个,多则十几个、几十个,不同的节点名称各异,通信时使用话题、服 务、消息、参数等等都各不相同,一个显而易见的问题是: 当需要自定义节点和其他某个已经存在的节 点通信时,如何获取对方的话题、以及消息载体的格式呢?

在 ROS 同提供了一些实用的命令行工具,可以用于获取不同节点的各类信息,常用的命令如下:

  • rosnode : 操作节点
  • rostopic : 操作话题
  • rosservice : 操作服务
  • rosmsg : 操作msg消息
  • rossrv: 操作srv消息
  • rosparam : 操作参数

作用

和之前介绍的文件系统操作命令比较,文件操作命令是静态的,操作的是磁盘上的文件,而上述命令是 动态的,在ROS程序启动后,可以动态的获取运行中的节点或参数的相关信息。

2.4.1 rosnode

rosnode 是用于获取节点信息的命令

1
2
3
4
5
6
rosnode ping    测试到节点的连接状态
rosnode list 列出活动节点
rosnode info 打印节点信息
rosnode machine 列出指定设备上节点
rosnode kill 杀死某个节点
rosnode cleanup 清除不可连接的节(启动乌龟节点,然后 ctrl + c 关闭,该节点并没被彻底清除,可以使用cleanup清除节点)

2.4.2 rostopic

rostopic包含rostopic命令行工具,用于显示有关ROS 主题的调试信息,包括发布者,订阅者,发布频 率和ROS消息。它还包含一个实验性Python库,用于动态获取有关主题的信息并与之交互。

1
2
3
4
5
6
7
8
9
rostopic bw     显示主题使用的带宽
rostopic delay 显示带有 header 的主题延迟
rostopic echo 打印消息到屏幕
rostopic find 根据类型查找主题
rostopic hz 显示主题的发布频率
rostopic info 显示主题相关信息
rostopic list 显示所有活动状态下的主题
rostopic pub 将数据发布到主题
rostopic type 打印主题类型
  • rostopic list(-v)

直接调用即可,控制台将打印当前运行状态下的主题名称

rostopic list -v : 获取话题详情(比如列出:发布者和订阅者个数…)

  • rostopic pub

可以直接调用命令向订阅者发布消息 为roboware 自动生成的 发布/订阅 模型案例中的 订阅者 发布一条字符串

1
2
rostopic pub /主题名称 消息类型 消息内容
rostopic pub /chatter std_msgs gagaxixi

为 小乌龟案例的 订阅者 发布一条运动信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist
"linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 2.0"
//只发布一次运动信息
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist
"linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 2.0"
// 以 10HZ 的频率循环发送运动信息

2.4.3 rosmsg

rosmsg是用于显示有关 ROS消息类型的 信息的命令行工具。

1
2
3
4
5
6
rosmsg show    显示消息描述
rosmsg info 显示消息信息
rosmsg list 列出所有消息
rosmsg md5 显示 md5 加密后的消息
rosmsg package 显示某个功能包下的所有消息
rosmsg packages 列出包含消息的功能包
  • rosmsg package

列出某个包下的所有msg

1
2
//rosmsg package 包名 
rosmsg package turtlesim

rosmsg show

显示消息描述

1
2
//rosmsg show 消息名称 
rosmsg show turtlesim/Pose

2.4.4 rosservice

rosservice包含用于列出和查询ROSServices的rosservice命令行工具。

调用部分服务时,如果对相关工作空间没有配置 path,需要进入工作空间调用 source ./devel/ setup.bash

1
2
3
4
5
6
7
rosservice args    打印服务参数
rosservice call 使用提供的参数调用服务
rosservice find 按照服务类型查找服务
rosservice info 打印有关服务的信息
rosservice list 列出所有活动的服务
rosservice type 打印服务类型
rosservice uri 打印服务的 ROSRPC uri
  • rosservice args
1
2
// rosservice args 服务
rosservice args /spawn
  • rosservice call

调用服务 为小乌龟的案例生成一只新的乌龟

1
2
3
4
5
rosservice call /spawn "x: 1.0
y: 2.0
theta: 0.0
name: 'xxx'"
//生成一只叫 xxx 的乌龟

2.4.5 rossrv

rossrv是用于显示有关ROS服务类型的信息的命令行工具,与 rosmsg 使用语法高度雷同。

1
2
3
4
5
6
rossrv show    显示服务消息详情
rossrv info 显示服务消息相关信息
rossrv list 列出所有服务信息
rossrv md5 显示 md5 加密后的服务消息
rossrv package 显示某个包下所有服务消息
rossrv packages 显示包含服务消息的所有包

2.4.6 rosparam

rosparam包含rosparam命令行工具,用于使用YAML编码文件在参数服务器上获取和设置ROS参数。

1
2
3
4
5
6
rosparam set    设置参数
rosparam get 获取参数
rosparam load 从外部文件加载参数
rosparam dump 将参数写出到外部文件
rosparam delete 删除参数
rosparam list 列出所有参数
  • rosparam set

设置参数

1
2
//rosparam set 参数名 参数
rosparam set name huluwa
  • rosparam get

获取参数

1
2
//rosparam get 参数名
rosparam get name
  • rosparam delete

删除参数

1
2
//rosparam delete 参数名
rosparam delete name
  • rosparam load(先准备 yaml 文件)

从外部文件加载参数

1
rosparam load xxx.yaml
  • rosparam dump

将参数写出到外部文件

1
rosparam dump yyy.yaml

2.5 通信机制比较

三种通信机制中,参数服务器是一种数据共享机制,可以在不同的节点之间共享数据,话题通信与服务通信是在不同的节点之间传递数据的,三者是ROS中最基础也是应用最为广泛的通信机制。

这其中,话题通信和服务通信有一定的相似性也有本质上的差异,在此将二者做一下简单比较:

二者的实现流程是比较相似的,都是涉及到四个要素:

  • 要素1: 消息的发布方/客户端(Publisher/Client)
  • 要素2: 消息的订阅方/服务端(Subscriber/Server)
  • 要素3: 话题名称(Topic/Service)
  • 要素4: 数据载体(msg/srv)

可以概括为: 两个节点通过话题关联到一起,并使用某种类型的数据载体实现数据传输。

二者的实现也是有本质差异的,具体比较如下:

Topic Service
通信模式 发布/订阅 请求/响应
同步性 异步 同步
底层协议 ROSTCP/ROSUDP ROSTCP/ROSUDP
缓冲区
实时性
节点关系 多对多 一对多
通信数据 msg srv
使用场景 连续高频的数据发布与接收:雷达、里程计 偶尔调用或执行某一项特定功能:拍照、语音识别

不同通信机制有一定的互补性,都有各自适应的应用场景。尤其是话题与服务通信,需要结合具体的应 用场景与二者的差异,选择合适的通信机制。