1.前言
上一节课我们讲了Node节点的相关内容,这一节我们来学习ROS2里的另一个重要概念:Topic话题。
2.Topic话题概念
Topic是ROS2中的一种单向消息通道,包含发布者(Publisher)和订阅者(Subscriber),它有以下特点:
- 单向:Publisher → Topic → Subscriber;订阅者不能直接发消息给发布者
- 一对多 / 多对多:一个话题可以多个发布者、多个订阅者
- 异步:发布者只管不停发,不需要等订阅者回复,无应答
- 数据有消息类型:每个话题绑定唯一消息类型,类型不匹配就收不到
- 基于 DDS 底层传输:持续流式数据(摄像头图像、IMU、里程计、速度指令),高频持续推送
3.Topic核心3要素
1. 话题名称
我们还是官方小海龟为例
ros2 run turtlesim turtlesim_node新打开一个终端 ros2 run turtlesim turtle_teleop_key# 查看话题列表ros2 topic list返回了话题名称:
2. 话题类型
# 加了-t 参数会返回话题类型ros2 topic list-t
话题类型格式:包名/msg/消息名
3. QoS(服务质量策略)
QoS 就是一套发布者和订阅者之间约定好的通信规则,规定消息怎么发、丢了怎么办、消息存多久、超时怎么处理。只有两端 QoS 配置兼容,话题才能正常收发数据。
ROS2 的 QoSProfile 由 6 个独立策略组成,每一项两端都要做兼容性匹配校验。
| 字段名称 | 含义 | 可选枚举值 | 说明 |
|---|---|---|---|
| History(历史策略) | 消息缓存队列的管理方式 | KEEP_LAST/KEEP_ALL | KEEP_LAST:只保留最近N条(depth队列深度);KEEP_ALL:全部缓存,直到内存耗尽,慎用 |
| Reliability(可靠性) | 是否丢包重传 | RELIABLE/BEST_EFFORT | RELIABLE:可靠传输,丢包自动重传,保证送达;BEST_EFFORT:尽力传输,不重传,追求低延迟 |
| Durability(持久性) | 新加入的订阅者能否收到历史消息 | VOLATILE/TRANSIENT_LOCAL | VOLATILE:新来的订阅只能收到之后新发的消息;TRANSIENT_LOCAL:发布者本地保留最后一条消息,新订阅上线立刻补发(静态配置、地图很常用) |
| Deadline(截止时间) | 消息最大发送间隔 | 时间值,默认无限 | 比如设置200ms:必须200ms内发一条消息,超时会触发QoS事件回调 |
| Lifespan(消息寿命) | 单条消息的有效期 | 时间值,默认无限 | 消息生成之后,超过这个时间还没被收到,直接丢弃 |
| Liveliness(活跃度) | 节点/发布者存活检测机制 | AUTOMATIC/MANUAL_BY_TOPIC等 | 检测发布端是否掉线、崩溃,超时后订阅侧收到掉线事件 |
Reliability 兼容矩阵
| Publisher \ Subscriber | RELIABLE | BEST_EFFORT |
|---|---|---|
| RELIABLE | ✅ 兼容 | ✅ 兼容 |
| BEST_EFFORT | ❌ 不兼容 | ✅ 兼容 |
Durability 兼容矩阵
| Publisher \ Subscriber | VOLATILE | TRANSIENT_LOCAL |
|---|---|---|
| VOLATILE | ✅ | ✅ |
| TRANSIENT_LOCAL | ✅ | ✅ |
4.Topic相关命令
4.1查看topic正在发布的消息:ros2 topic echo
语法: ros2 topicecho<topic_name># 实际操作ros2 topicecho/turtle1/cmd_vel4.2查看话题信息: ros2 topic info
ros2 topic info /turtle1/cmd_vel# 查看话题更多详细信息# 将返回 发布者/订阅者节点名称、命名空间、话题类型、QoS profileros2 topic info /turtle1/cmd_vel-verbose(-v)4.3 查看话题类型细节:ros2 interface show
前面我们用ros2 topic list -t 查看了话题的类型,如下:
我们可以进一步查看话题/turtle1/cmd_vel 的类型geometry_msgs/msg/Twist的细节:
ros2 interface show geometry_msgs/msg/Twist解释一下上面的返回:
This expresses velocity in free space broken into its linear and angular parts.
翻译:该消息表示自由空间中的速度,分为线速度(linear)和角速度(angular)两部分
1. linear:线速度(平移速度,单位:m/s 米每秒)
Vector3代表三维向量 x,y,z
linear.x:前进 / 后退- 正数 = 向前
- 负数 = 向后
linear.y:左右平移- 正数 = 向左
- 负数 = 向右
linear.z:上下方向平移- 地面移动机器人几乎永远是 0;无人机、机械臂才会用到 z
2. angular:角速度(旋转速度,单位:rad/s 弧度 / 秒)
angular.x:绕 X 轴翻滚(roll),地面机器人一般 = 0angular.y:绕 Y 轴俯仰(pitch),地面机器人一般 = 0angular.z:原地转向(偏航 yaw),最常用!- 正数:逆时针左转(从机器人上方俯视)
- 负数:顺时针右转
| 字段 | 含义 | 地面小车常用值 |
|---|---|---|
| linear.x | 前后平移速度(m/s) | 正数前进、负数后退 |
| linear.y | 左右平移速度(m/s) | 差分轮固定0,麦轮可用 |
| linear.z | 上下平移速度(m/s) | 固定0 |
| angular.x | 绕X轴翻滚(rad/s) | 固定0 |
| angular.y | 绕Y轴俯仰(rad/s) | 固定0 |
| angular.z | 原地旋转(rad/s) | 正数左转,负数右转 |
4.4 向话题发布消息:ros2 topic pub
语法:
ros2 topic pub<topic_name><msg_type>'<args>'# 发送的数据要以YML字符串的格式ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist"{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"# 上面的发送数据也可以简写为:只写想改变的数据部分,不改动的数据可省略ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist"{linear: {x: 2.0}, angular: {z: 1.8}}"# 发送空数据ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist# 这相当于发送默认数据:ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist"{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"--rate1# 用TAB键自动完成参数输入ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist<TAB>弹出的参数可以通过光标修改数值,完成后点击回车,就会执行参数。
4.5 统计话题的发布频率:ros2 topic hz
ros2 topic hz /turtle1/pose4.6 统计话题的带宽:ros2 topic bw /xxx
ros2 topic bw /turtle1/pose4.7 根据消息类型,查询当前图中所有使用该类型的活跃话题:ros2 topic find
ros2 topicfindgeometry_msgs/msg/Twist小结
上面介绍了关于topic相关的内容,topic是ROS2中使用非常频繁的概念,我们要熟练使用它。