ROS2(Robot Operating System 2)接口详解

ROS2(Robot Operating System 2)采用 DDS(Data Distribution Service)作为底层通信中间件,提供了三种核心通信接口,分别适用于不同的应用场景。

1. ROS2 核心通信接口类型

ROS2 主要提供 Topics(话题)、Services(服务)和 Actions(动作) 三种通信接口 :

接口类型 通信模型 特点 适用场景
Topics 发布-订阅(Pub-Sub) 异步、多对多、单向数据流 传感器数据、状态流、高频数据
Services 请求-响应(Request-Response) 同步、一对一、阻塞调用 快速查询、配置设置、状态检查
Actions 目标-反馈-结果(Goal-Feedback-Result) 异步、可取消、带进度反馈 长时间任务、机器人动作控制

2. 底层架构:DDS 与 RMW

ROS2 使用 DDS(Data Distribution Service) 作为通信中间件,并设计了 RMW(ROS Middleware Interface) 抽象层来屏蔽不同 DDS 实现之间的差异 。

复制代码
┌─────────────────────────────────────┐
│        ROS2 应用层 (rclcpp/rclpy)   │
├─────────────────────────────────────┤
│      RMW 抽象层 (统一接口)           │
├─────────────────────────────────────┤
│  Fast DDS │ Cyclone DDS │ RTI DDS  │  ← 可替换的 DDS 实现
└─────────────────────────────────────┘

DDS 核心优势:

  • 去中心化架构:无需 ROS Master,节点自动发现
  • QoS(服务质量)策略:支持可靠性、持久性、历史深度等配置
  • 跨平台与实时性:支持嵌入式系统和实时操作系统

3. 三种接口详解

3.1 Topics(话题)

  • 特点:单向、异步、多对多通信
  • 典型应用 :LiDAR 扫描数据(/scan)、相机图像流、IMU/GPS 数据
  • 代码示例:
python 复制代码
# 发布者
self.publisher = self.create_publisher(String, 'topic', 10)
self.publisher.publish(msg)

# 订阅者  
self.subscription = self.create_subscription(String, 'topic', callback, 10)

3.2 Services(服务)

  • 特点:请求-响应模式,同步阻塞调用
  • 典型应用:查询电池电量、执行逆运动学计算、校准传感器
  • 代码示例:
python 复制代码
# 服务端
self.srv = self.create_service(AddTwoInts, 'add_two_ints', callback)

# 客户端
self.client = self.create_client(AddTwoInts, 'add_two_ints')
future = self.client.call_async(request)

3.3 Actions(动作)

  • 特点:适合长时间运行任务,支持目标设定、进度反馈和任务取消

  • 典型应用:机器人导航到目标点、机械臂抓取操作、充电过程

  • 接口定义 (.action 文件):

    Goal

    geometry_msgs/PoseStamped target_pose
    float32 max_velocity

    Result

    bool success
    string message

    Feedback

    float32 remaining_distance
    float32 current_velocity

4. 自定义接口定义

ROS2 允许通过 .msg、.srv 和 .action 文件自定义接口 :

复制代码
custom_interfaces/
├── msg/
│   ├── RobotStatus.msg      # 机器人状态消息
│   └── SensorData.msg       # 传感器数据
├── srv/
│   └── SetJointPosition.srv # 设置关节位置服务
└── action/
    └── Navigate.action      # 导航动作

构建与使用:

bash 复制代码
# 编译接口包
colcon build --packages-select custom_interfaces

# 查看接口定义
ros2 interface show custom_interfaces/msg/RobotStatus

# 测试发布
ros2 topic pub /robot_status custom_interfaces/msg/RobotStatus "{...}"

5. 接口选择指南

根据官方设计建议 :

  • 使用 Topics:连续数据流(传感器数据、机器人状态),发布者与订阅者解耦
  • 使用 Services:快速终止的远程过程调用(查询状态、快速计算),避免用于长时间运行或状态依赖的操作
  • 使用 Actions:需要反馈和取消能力的离散行为(移动机器人、长时间运行任务),动作服务器应始终实现抢占(preemption)机制

6. DDS 实现与配置

ROS2 支持多种 DDS 实现(如 Fast DDS、Cyclone DDS),可通过环境变量切换:

bash 复制代码
# 指定 DDS 实现
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

# 查看可用实现
ros2 doctor --report | grep middleware

# 配置 QoS(命令行示例)
ros2 topic pub /chatter std_msgs/msg/Int32 "data: 42" --qos-reliability best_effort

总结:ROS2 通过 DDS 提供了工业级的通信能力,三种接口(Topics/Services/Actions)覆盖了从实时数据流到复杂机器人任务的全场景需求,配合 QoS 策略可实现高度灵活的系统设计。

相关推荐
无敌最俊朗-10 小时前
【电感专题2:电感的感抗、电路的阻抗、电流的滞后】
单片机·嵌入式硬件·元器件·电感
wuyk55515 小时前
嵌入式故障诊断-Bug002-局部大数组压栈高温必死机
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·嵌入式实时数据库
Dev_XH18 小时前
【成品设计】基于沁恒单片机的电动汽车充电站智慧调度系统
stm32·单片机·嵌入式硬件·物联网
shimly12345619 小时前
(done) 嵌入式硬件电路图 (5) 重要的元器件特性之二极管三极管
嵌入式硬件
minglie121 小时前
esp32c3+atshell测试ov7670
单片机·嵌入式硬件
不脱发的程序猿21 小时前
STM32和VS1053制作电子琴
stm32·单片机·嵌入式硬件·midi·vs1053
shimly1234562 天前
(done) 嵌入式硬件电路图 (2) 熟悉常用元器件
嵌入式硬件
花月mmc2 天前
【FPGA】神经网络内容简介预告
嵌入式硬件·深度学习·神经网络·fpga开发
en.en..2 天前
STM32 HAL 库 | 核心知识点整理
单片机·嵌入式硬件
无敌贵点大王2 天前
从寄存器层面重学STM32(9)——DMA理论
stm32·单片机·嵌入式硬件