【ROS2】ROS2通讯机制Topic常用命令行
ROS 系列学习教程(总目录)
ROS2 系列学习教程(总目录)
目录
- 1. ros2 topic bw
- 2. ros2 topic delay
- 3. ros2 topic echo
- 4. ros2 topic find
- 5. ros2 topic hz
- 6. ros2 topic info
- 7. ros2 topic list
- 8. ros2 topic pub
- 9. ros2 topic type
ros2 topic bw 显示主题使用的带宽
ros2 topic delay 显示带header的topic的网络延迟
ros2 topic echo 将消息打印到屏幕
ros2 topic find 按类型查找主题
ros2 topic hz 显示主题的发布率
ros2 topic info 打印关于活动主题的信息
ros2 topic list 打印活动主题的列表
ros2 topic pub 将数据发布到主题
ros2 topic type 打印主题类型
1. ros2 topic bw
用于测量和显示指定主题(Topic)的数据传输带宽。它的核心功能是统计该主题在单位时间内接收到的消息数据量,并将其以人类易读的形式(如 KB/s、MB/s)输出。
带宽反映的是命令创建的订阅上的接收速率,可能会受到平台资源和QoS配置的影响,并且可能与发布者的带宽不完全匹配。
命令语法:
ros2 topic bw [options] <topic_name>
常用参数:
参数 | 必须 | 说明 |
---|---|---|
-w <window_size> , --window <window_size> | 否 | 设置统计窗口的大小。默认值是 100。会计算最近 window_size 条消息的平均带宽。增大此值可以使输出更平滑,但响应变化更慢;减小此值则更灵敏,但波动可能更大。 |
--spin-time <spin_time> | 否 | 设置命令发现阶段等待时间,float类型,单位:s。如果没有指定 --spin-time ,ros2 topic bw 在启动后不进行任何等待,立即返回。当设置了此参数(例如 `–spin-time 2.5),命令会等待2.5s用于发现消息。 |
-s , --use-sim-time | 否 | 使用 ROS 2 的“模拟时间”(Simulation Time)而不是主机的“挂钟时间”(Wall Clock)来进行带宽计算。 |
<topic_name> | 是 | 要测量带宽的主题名称。 |
使用示例:
其中,
m B/s from n messages
:最近 n 条消息的平均带宽为 m B/s。n可通过 -w
选项设置。
mean
:从开始通信到现在,每次通信的平均数据量。
min
:从开始通信到现在,最小的一次通信数据量。
max
:从开始通信到现在,最大的一次通信数据量。
使用 -w
选项设置统计窗口的大小,可以看到消息个数到10后就不变了。
工作原理
- 订阅主题:
ros2 topic bw
命令首先创建一个订阅者(Subscriber)来订阅你指定的主题。 - 监听消息:每当有消息发布到该主题时,这个订阅者的回调函数就会被触发。
- 数据记录:回调函数会记录当前时间戳和收到消息的序列化长度(即消息的实际字节数)。
- 计算带宽:
- 工具会维护一个固定大小的窗口(默认为最近100条消息)。
- 它使用这个窗口内所有消息的总字节数除以第一条消息和最后一条消息之间的时间差。
- 计算公式大致为:
Bandwidth = (Total Bytes in Window) / (Time of last msg - Time of first msg in Window)
。
- 输出结果:将计算出的带宽(字节/秒)转换为合适的单位(B/s, KB/s, MB/s)并打印到终端。
与 hz
和 delay
的关系:
ros2 topic hz
:测量的是主题的发布频率(消息数量/秒)。ros2 topic delay
:测量的是消息的端到端延迟。ros2 topic bw
:测量的是主题的数据吞吐量(字节数/秒)。- 这三个命令经常结合使用,来全面评估一个主题的性能。
带宽 (bw) ≈ 频率 (hz) × 平均消息大小
。
2. ros2 topic delay
显示带header的topic的网络延迟(因为header会记录msg发出时的时间戳),即msg从advertiser发出到subscriber接收经过的时间。
命令语法:
ros2 topic delay [options] <topic_name>
常用参数:
参数 | 必须 | 说明 |
---|---|---|
-w <window_size> , --window <window_size> | 否 | 设置统计窗口的大小。默认值是 10000。会计算最近 window_size 条消息的平均延迟。增大此值可以使输出更平滑,但响应变化更慢;减小此值则更灵敏,但波动可能更大。 |
--spin-time <spin_time> | 否 | 设置命令发现阶段等待时间,float类型,单位:s。如果没有指定 --spin-time ,ros2 topic delay 在启动后不进行任何等待,立即返回。当设置了此参数(例如 `–spin-time 2.5),命令会等待2.5s用于发现消息。 |
-s , --use-sim-time | 否 | 使用 ROS 2 的“模拟时间”(Simulation Time)而不是主机的“挂钟时间”(Wall Clock)来进行带宽计算。 |
<topic_name> | 是 | 要计算延迟的主题名称。 |
使用示例:
自己写一个测试topic /test_topic_delay
代码如下:
#!/usr/bin/env python3import rclpy
from rclpy.node import Node
from geometry_msgs.msg import PoseStampedclass SimplePublisher(Node):def __init__(self):super().__init__('test_topic_delay_node')self.publisher_ = self.create_publisher(PoseStamped, '/test_topic_delay', 10)self.timer = self.create_timer(0.1, self.timer_callback)self.counter = 0self.get_logger().info("Test Topic Delay Publisher started.")def timer_callback(self):msg = PoseStamped()msg.header.stamp = self.get_clock().now().to_msg()msg.header.frame_id = f"frame_{self.counter}"self.publisher_.publish(msg)self.counter += 1def main(args=None):rclpy.init(args=args)node = SimplePublisher()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()
发布 /test_topic_delay
后,执行如下命令:
其中,
average delay
:从开始通信到现在,所有通信的平均延迟时间,单位:s
min
:从开始通信到现在,所有通信中延迟时间最小的一次
max
:从开始通信到现在,所有通信中延迟时间最大的一次
std dev
:从开始通信到现在,所有通信延迟数据的标准差,表征延迟数据的波动大小,标准差越小表示延迟数据波动越小。
window
:用于计算的通信个数,最大限制为 10000。
3. ros2 topic echo
实时显示指定主题上发布的消息内容
命令语法:
ros2 topic echo [options] <topic_name>
常用参数:
选项 | 缩写 | 说明 |
---|---|---|
--spin-time SPIN_TIME | 设置命令发现阶段等待时间,float类型,单位:s。如果没有指定 --spin-time ,ros2 topic echo 在启动后不进行任何等待,立即返回。当设置了此参数(例如 `–spin-time 2.5),命令会等待2.5s用于发现消息。 | |
--use-sim-time | -s | 使用 ROS 2 的“模拟时间”(Simulation Time)而不是主机的“挂钟时间”(Wall Clock)来进行带宽计算。 |
--no-daemon | 不使用已运行的守护进程 | |
--qos-profile PROFILE | QoS 预设配置,PROFILE 可选值如下:sensor_data : 传感器数据(默认)services_default : 服务默认 parameters : 参数parameter_events : 参数事件action_status_default : 动作状态system_default : 系统默认 | |
--qos-depth N | 队列深度设置,覆盖预设配置。echo输出时,是从临时队列里读取的,当队列被塞满,会丢弃旧数据,所以有如下建议: 高频主题(传感器数据):小深度(5-10) 低频重要主题(系统状态、诊断信息等):大深度(50-100) 参数事件(需要完整历史记录):大深度(100-1000) | |
--qos-history TYPE | 历史记录策略,TYPE 可选值如下:system_default :使用系统默认设置keep_last :()只保留最新的 N 条消息,配合 --qos-depth 使用keep_all :保留所有收到的消息 | |
--qos-reliability TYPE | 可靠性设置,TYPE 可选值如下:reliable : 可靠传输best_effort : 尽力而为 | |
--qos-durability TYPE | 持久性设置,TYPE 可选值如下:transient_local : 临时本地volatile : 易失性 | |
--csv | 以 CSV 格式输出,逗号分隔值格式,适合数据分析 | |
--field FIELD | 只显示指定字段 | |
--full-length | -f | 显示完整内容(不截断) |
--truncate-length N | -l N | 截断长度设置,默认128 |
--no-arr | 不显示数组字段 | |
--no-str | 不显示字符串字段 | |
--flow-style | 使用块样式显示集合 | |
--lost-messages | 已弃用:无作用。默认报告丢失的信息 | |
--no-lost-messages | 不报告丢失的消息 | |
--raw | 输出原始二进制表示 | |
--filter FILTER_EXPR | Python 表达式过滤消息 | |
--once | 只显示第一条消息然后退出 |
QoS服务质量预设配置:
预设配置 | 适用场景 | Reliability | Durability | History | Depth |
---|---|---|---|---|---|
sensor_data | 传感器数据 | Best effort | Volatile | Keep last | 10 |
services_default | 服务通信 | Reliable | Volatile | Keep last | 10 |
parameters | 参数服务 | Reliable | Volatile | Keep last | 1000 |
parameter_events | 参数事件 | Reliable | Volatile | Keep last | 1000 |
action_status_default | 动作状态 | Reliable | Volatile | Keep last | 10 |
system_default | 系统默认 | 自动匹配 | 自动匹配 | Keep last | 10 |
使用示例:
# 基本使用:查看主题消息
ros2 topic echo /chatter# 开始执行命令时,等待5.3s再打印输出
ros2 topic echo /hello_world_topic --spin-time 5.3# 只显示特定字段:例如只显示位置信息
ros2 topic echo /odom --field pose.pose.position# CSV 格式输出:适合导出到电子表格
ros2 topic echo /sensor_data --csv# 过滤消息:只显示数据大于 0.5 的消息
ros2 topic echo /sensor_data --filter "m.data > 0.5"# 设置 QoS:使用可靠传输
ros2 topic echo /important_topic --qos-reliability reliable# 只显示一次:获取一条消息后退出
ros2 topic echo /topic --once# 显示完整内容:不截断长消息
ros2 topic echo /image_data --full-length# 复杂字段选择:显示嵌套字段
ros2 topic echo /robot_state --field "pose.pose.position.x"# 自定义截断长度
ros2 topic echo /long_data --truncate-length 200
4. ros2 topic find
按照 topic
的消息类型查找运行的 topic
。
命令语法:
ros2 topic find [options] <msg-type>
使用示例:
5. ros2 topic hz
显示主题的发布率
命令语法:
ros2 topic hz [options] <msg-type>
使用示例:
其中,
average rate
:从开始通信到现在,所有通信的平均发布率,单位:Hz
min
:从开始通信到现在,所有通信中发布周期最小的一次
max
:从开始通信到现在,所有通信中发布周期最大的一次
std dev
:从开始通信到现在,所有通信发布周期的标准差,表征发布周期的波动大小,标准差越小表示波动越小。
window
:从开始通信到现在接收数据的次数,默认队列限制大小10000。
6. ros2 topic info
打印关于活动主题的信息
命令语法:
ros2 topic info [options] <topic-name>
使用示例:
与ROS1不同的是,ROS2默认只打印Topic的消息类型和发布者订阅者的数量,ROS2要想打印更详细的信息,需要使用-v
选项。
其中,
Type
:主题所传输消息的数据类型
Publisher count
:该主题的发布者数量
Topic端点信息块(一个发布者或订阅者成为一个端点)
Endpoint type
:端点类型,PUBLISHER
或 SUBSCRIPTION
Node name
:此端点位于的节点的名称
Node namespace
:节点所在的命名空间
Topic type
:端点关联的主题类型,与顶部的 Type
一致
GID
:全局唯一标识符。这是 ROS 2 底层中间件(如 DDS)为这个特定的发布者端点分配的一个唯一标识符。它用于在分布式网络中唯一地识别和管理通信端点。这个值通常是自动生成的,用户一般不需要关心。
QoS profile
:服务质量配置
- Reliability: RELIABLE
- 可靠性策略:可靠。
- 该模式类似于 TCP 协议。发布者会确保消息送达所有订阅者,必要时会重传丢失的消息。这是为了确保关键的日志信息不会丢失。另一种模式是
BEST_EFFORT
(尽力而为),类似于 UDP,速度更快但不保证送达。
- History (Depth): UNKNOWN
- 历史记录策略的深度:未知。
- 通常,历史记录深度(
Depth
)定义了当新订阅者加入时,它最多能接收多少条之前的(缓存的历史)消息。常见的设置是KEEP_LAST
和一个具体的深度值(例如 10)。这里显示UNKNOWN
可能是该特定主题或工具输出的一个特性。
- Durability: TRANSIENT_LOCAL
- 持久性策略:临时本地。
- 这非常重要。它意味着发布者会为晚连接的订阅者保留消息。如果一个订阅者在发布者发布了一些日志消息之后才启动,订阅者仍然可以收到发布者之前发送的最后几条消息(具体条数由
History Depth
决定)。这对于像/rosout
这样的诊断/日志主题非常有用,因为你可能希望在节点启动后查看之前的错误日志。另一种模式是VOLATILE
(易失的),晚连接的订阅者不会收到任何历史消息。
- Lifespan: 10000000000 nanoseconds
- 消息的生存时间: 10 秒。
- 发布者发出的每条消息在从本地缓存中移除之前,最多存活 10 秒。这主要用于清理过期数据。超过此期限后,即使是为了
TRANSIENT_LOCAL
持久性,消息也不会被发送给新的订阅者。
- Deadline: Infinite
- 期限:无限。
- 这定义了发布者承诺发布消息的速率。
Infinite
意味着没有预期的发布周期,发布者可以随时随意发布消息。如果设置了期限(例如 100ms),而发布者未能在此期限内发布新消息,系统可能会触发一个回调通知。
- Liveliness: AUTOMATIC
- 活跃度策略:自动。
- 这是由 ROS 2 管理节点“存活”状态的方式。
AUTOMATIC
意味着只要节点进程还在运行,ROS 2 就认为该节点是“活跃”的。另一种模式是MANUAL_BY_TOPIC
,需要节点显式地声明自己是否存活。
- Liveliness lease duration: Infinite
- 活跃度租约期限:无限。
- 这是订阅者判断发布者是否“存活”的等待时间。
Infinite
意味着订阅者会永远等待,直到明确得知发布者不再存在。如果设置了具体的期限,而发布者在此期限内未证明其活跃性,订阅者会认为该发布者已经“死亡”。
7. ros2 topic list
打印有关活动主题的信息
命令语法:
ros2 topic list [options]
使用示例:
常用选项:
显示topic类型
ros2 topic list -t
显示更多详细信息
ros2 topic list -v
8. ros2 topic pub
将数据发布到主题
命令语法:
ros2 topic pub [options] <topic-name> <message-type> [datas]
使用示例:
关于topic发布的三种模式
- publishing mode
- 持续发布
- 默认这个模式
- once mode
- 发布一条消息后立即退出
- 使用
-1
或--once
选项
- rate mode
- 可以自定义消息的发布频率
- 使用
-r N
或--rate N
选项,单位:Hz,默认1Hz
关于topic命令行发布消息的数据源
命令行参数(最常用的方法)
rostopic pub /topic_name std_msgs/String "hello"
管道输入
rostopic echo /chatter | rostopic pub /bar std_msgs/String
这个没发现有什么好用的场景,就是把/chatter的消息内容转发给/bar了。
通过YAML文件输入
首先要有一个存有msg的文件,可以重定向topic内容:
rostopic echo /chatter > chatter.bagy
然后使用-f参数选项将文件内容输入到topic
rostopic pub -f chatter.bagy /bar std_msgs/String
关于YAML格式在ROS中的使用,见 YAML on the ROS command line
9. ros2 topic type
打印topic类型
命令语法:
rostopic type <topic-name>
使用示例: