# 1. 概述:
常见的一些通信模式
(1)广播模型
所有节点都可以在通道上广播消息,并且节点都可以收到消息。这个模型解决了服务器地址的问题,而且通信双方也不用单
独建立连接,但是广播通道上的消息太多了,所有节点都必须关心每条消息,其实很多是和自己没有关系的。
(2)DDS 通信(以数据为中心模式)
以数据为中心的 DDS 模型与广播模型有些类似:所有节点都可以在数据总线上发布和订阅消息,但每个节点只关心自己感兴趣的消息,忽略与自己无关的消息。可以理解成一个有很多独立通道的传送带,我们只取自己需要的那些。
DDS(Data Distribution Service)本身是 OMG 制定的实时数据分发标准,不是 ROS 专属概念;ROS 2 只是选择 DDS 作为默认通信实现,并在其上封装了话题、服务、动作等 ROS 层接口。QoS(服务质量)是 DDS 的核心能力,用来描述消息在可靠性、时效性、持久性等方面的传递要求。
参考资料:ROS 2 关于 DDS 的官方说明、About QoS

# 2.DDS 实际应用场景:
比如说我们对外循环发送 42 这个数据
ros2 topic pub /chatter std_msgs/msg/Int32 "data: 42" --qos-reliability best_effort |
(1) ros2 topic pub 这里的 pub 其实是 publish 的省略,是出版发送的意思
- 作用:ROS 2 的命令行工具,用于向指定话题发布消息
- 类比:就像你在微信群里发送一条消息
- 替代工具:也可以使用编程方式(Python/C++ 节点)发布消息
(2) /chatter 这个通道的名称可以是任意的,是自己起的名字
- 作用:话题名称,消息将被发布到这个 "通道"
- 命名约定:
- 以斜杠
/开头,形成命名空间 - 通常使用小写字母和下划线
- 示例:
/robot/speed、/sensor/temperature
- 以斜杠
- 实际场景:可以是任何节点订阅的话题名
(3) std_msgs/msg/Int32
-
作用:消息类型,定义了数据的结构
-
官方格式:
<package>/<interface type>/<interface name>,例如std_msgs/msg/Int32 -
分解:
std_msgs:标准消息包(ROS 2 内置)msg:包内的消息目录Int32:具体的消息类型(32 位整数)
-
查看消息结构:
bash
# 查看Int32消息的定义
ros2 interface show std_msgs/msg/Int32
# 输出:
# int32 data# ↓ ↓
# 类型 字段名
-
常用消息类型:
std_msgs/msg/String # 字符串
std_msgs/msg/Float32 # 32位浮点数
geometry_msgs/msg/Twist # 速度指令(线速度和角速度)
sensor_msgs/msg/LaserScan # 激光雷达数据
# ✅ 标准消息
std_msgs/msg/String
geometry_msgs/msg/Twist
sensor_msgs/msg/LaserScan
(4)
"data: 42" -
作用:消息的具体内容,采用 YAML 格式
-
语法:
字段名: 值 -
注意:
ros2 topic pub默认只发布一次,想要持续发送需要加--rate 1(每秒 1 次),否则另一个终端的echo可能只看到一条消息就结束 -
对应关系:
yaml
# Int32消息只有一个字段"data"data: 42
# 复杂消息示例(Twist消息)
linear:x: 0.5
y: 0.0
z: 0.0
angular:x: 0.0
y: 0.0
z: 0.2
-
特殊值:
bash
# 发布空消息
ros2 topic pub /topic std_msgs/msg/Empty ""
# 布尔值
ros2 topic pub /topic std_msgs/msg/Bool "data: true"
# 字符串(注意引号)
ros2 topic pub /topic std_msgs/msg/String "data: 'Hello ROS 2'"
# 数组
ros2 topic pub /topic std_msgs/msg/Int32MultiArray "data: [1, 2, 3, 4]"
- 需要注意的地方
在发送语句里面
ros2 topic pub /character std_msgs/msg/Int32 "data: 56" --qos-reliability best_effort
如果不加空格的话,那么虚拟机终端就会返回
u@u-virtual-machine:~$ ros2 topic pub /fasong std_msgs/msg/Int32 "data:42" --qos-reliability best_effort
The passed value needs to be a dictionary in YAML format
data:42报错的原因不是单纯 “缺一个空格”:YAML 里data: 42会被解析成字典{"data": 42},而data:42会被当作普通字符串,命令行工具要求传入的是字典格式,所以提示The passed value needs to be a dictionary in YAML format。因此冒号后必须留一个空格,这是 YAML 语法要求# ✅ 正确语法(冒号后必须有空格)
key: valuedata: 42
name: "John"
(5)
--qos-reliability best_effort -
作用:指定服务质量策略中的可靠性设置
-
QoS(Quality of Service):ROS 2 的核心特性,控制消息传递的行为
-
重要规则:发布方与订阅方的 QoS 必须 “兼容”,
reliable和best_effort不能互通,这是 ROS 2 里很常见的调试问题
# 可靠性策略选项:
| 策略 | 含义 | 适用场景 | 性能影响 |
|---|---|---|---|
best_effort |
尽力而为 | 高频传感器数据(摄像头、激光雷达) | 低延迟,可能丢失消息 |
reliable |
可靠传输 | 控制指令、配置信息 | 保证送达,可能有延迟 |
# 实际对比:
# 场景1:发布激光雷达数据(允许偶尔丢失) | |
ros2 topic pub /lidar sensor_msgs/msg/LaserScan "..." --qos-reliability best_effort | |
# 场景2:发布紧急停止指令(必须送达) | |
ros2 topic pub /emergency_stop std_msgs/msg/Bool "data: true" --qos-reliability reliable |
其他常用 QoS 参数:
# 设置持久性(新订阅者能否收到历史消息) | |
--qos-durability volatile # 不保存(默认,新订阅者只能收到订阅之后的消息) | |
--qos-durability transient_local # 保存最后一条,晚到的订阅者也能收到 | |
# 设置历史深度(保存多少条消息) | |
--qos-depth 10 # 保存10条历史消息 | |
# 设置存活策略(检测发布者是否存活) | |
--qos-liveliness automatic # 自动检测 | |
--qos-liveliness manual_by_topic # 手动声明 | |
# 设置截止时间(消息必须在指定时间内送达) | |
--qos-deadline 1000 # 1000毫秒(1秒) |
# 3.ROS 2 接口规范
完整的消息类型格式为:
[包名]/[接口类型]/[具体类型名] |
ROS 2 有三种类型的接口,必须明确指定:
# 消息(Message) → 必须有 /msg/ | |
std_msgs/msg/Int32 # 数据消息 | |
# 服务(Service) → 必须有 /srv/ | |
example_interfaces/srv/AddTwoInts | |
# 动作(Action) → 必须有 /action/ | |
example_interfaces/action/Fibonacci |
# 4. 实际通讯
其中一个终端,运行
ros2 topic pub /chatter std_msgs/msg/Int32 "data: 42" --qos-reliability best_effort |
另一个终端负责接收
ros2 topic echo /chatter --qos-reliability best_effort |
echo 是一个完整的英文单词,就是回显的意思,其实就是发送者发什么,你显示什么
ros2 topic echo # 回显话题内容(一看就懂) | |
ros2 topic list # 列出当前所有话题 | |
ros2 topic info /chatter # 查看话题的类型、发布者、订阅者数量 | |
ros2 topic hz /chatter # 统计消息发布频率 |
更正:之前写的
ros2 topic print不是 ROS 2 的命令,正确命令是ros2 topic echo。需要排查话题时,用ros2 topic list、ros2 topic info、ros2 topic hz这几个官方 CLI 工具即可。