1.前言

上一节课我们讲了Node节点的相关内容,这一节我们来学习ROS2里的另一个重要概念:Topic话题。

2.Topic话题概念

Topic是ROS2中的一种单向消息通道,包含发布者(Publisher)和订阅者(Subscriber),它有以下特点:

  1. 单向:Publisher → Topic → Subscriber;订阅者不能直接发消息给发布者
  2. 一对多 / 多对多:一个话题可以多个发布者、多个订阅者
    在这里插入图片描述
    在这里插入图片描述
  3. 异步:发布者只管不停发,不需要等订阅者回复,无应答
  4. 数据有消息类型:每个话题绑定唯一消息类型,类型不匹配就收不到
  5. 基于 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_ALLKEEP_LAST:只保留最近N条(depth队列深度);KEEP_ALL:全部缓存,直到内存耗尽,慎用
Reliability(可靠性)是否丢包重传RELIABLE / BEST_EFFORTRELIABLE:可靠传输,丢包自动重传,保证送达;BEST_EFFORT:尽力传输,不重传,追求低延迟
Durability(持久性)新加入的订阅者能否收到历史消息VOLATILE / TRANSIENT_LOCALVOLATILE:新来的订阅只能收到之后新发的消息;TRANSIENT_LOCAL:发布者本地保留最后一条消息,新订阅上线立刻补发(静态配置、地图很常用)
Deadline(截止时间)消息最大发送间隔时间值,默认无限比如设置200ms:必须200ms内发一条消息,超时会触发QoS事件回调
Lifespan(消息寿命)单条消息的有效期时间值,默认无限消息生成之后,超过这个时间还没被收到,直接丢弃
Liveliness(活跃度)节点/发布者存活检测机制AUTOMATIC / MANUAL_BY_TOPIC 等检测发布端是否掉线、崩溃,超时后订阅侧收到掉线事件

Reliability 兼容矩阵

Publisher \ SubscriberRELIABLEBEST_EFFORT
RELIABLE✅ 兼容✅ 兼容
BEST_EFFORT❌ 不兼容✅ 兼容

Durability 兼容矩阵

Publisher \ SubscriberVOLATILETRANSIENT_LOCAL
VOLATILE✅✅
TRANSIENT_LOCAL✅✅

4.Topic相关命令

4.1查看topic正在发布的消息:ros2 topic echo

语法:
ros2 topic echo <topic_name>

# 实际操作
ros2 topic echo /turtle1/cmd_vel 

在这里插入图片描述

4.2查看话题信息: ros2 topic info

ros2 topic info /turtle1/cmd_vel

在这里插入图片描述

# 查看话题更多详细信息
# 将返回 发布者/订阅者节点名称、命名空间、话题类型、QoS profile
ros2 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),地面机器人一般 = 0
  • angular.y:绕 Y 轴俯仰(pitch),地面机器人一般 = 0
  • angular.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}}" --rate 1
# 用TAB键自动完成参数输入
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist <TAB>

弹出的参数可以通过光标修改数值,完成后点击回车,就会执行参数。
在这里插入图片描述

4.5 统计话题的发布频率:ros2 topic hz

ros2 topic hz /turtle1/pose

在这里插入图片描述

4.6 统计话题的带宽:ros2 topic bw /xxx

ros2 topic bw /turtle1/pose

在这里插入图片描述

4.7 根据消息类型,查询当前图中所有使用该类型的活跃话题:ros2 topic find

ros2 topic find geometry_msgs/msg/Twist

在这里插入图片描述

小结

上面介绍了关于topic相关的内容,topic是ROS2中使用非常频繁的概念,我们要熟练使用它。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐