# 1. 概述:

常见的一些通信模式

(1)广播模型

所有节点都可以在通道上广播消息,并且节点都可以收到消息。这个模型解决了服务器地址的问题,而且通信双方也不用单

独建立连接,但是广播通道上的消息太多了,所有节点都必须关心每条消息,其实很多是和自己没有关系的。

(2)DDS 通信(以数据为中心模式)

以数据为中心的 DDS 模型与广播模型有些类似:所有节点都可以在数据总线上发布和订阅消息,但每个节点只关心自己感兴趣的消息,忽略与自己无关的消息。可以理解成一个有很多独立通道的传送带,我们只取自己需要的那些。

DDS(Data Distribution Service)本身是 OMG 制定的实时数据分发标准,不是 ROS 专属概念;ROS 2 只是选择 DDS 作为默认通信实现,并在其上封装了话题、服务、动作等 ROS 层接口。QoS(服务质量)是 DDS 的核心能力,用来描述消息在可靠性、时效性、持久性等方面的传递要求。

参考资料:ROS 2 关于 DDS 的官方说明About QoS

ROS2 软件架构

# 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: value
    data: 42
    name: "John"

    (5) --qos-reliability best_effort

  • 作用:指定服务质量策略中的可靠性设置

  • QoS(Quality of Service):ROS 2 的核心特性,控制消息传递的行为

  • 重要规则:发布方与订阅方的 QoS 必须 “兼容”, reliablebest_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 listros2 topic inforos2 topic hz 这几个官方 CLI 工具即可。

更新于 阅读次数 0

请我喝[茶]~( ̄▽ ̄)~*

bangdexuanyuan 微信支付

微信支付