1. 课程导入

在机器人系统中,传感器是“感官”,中间件是“神经”。激光雷达、深度相机、IMU、GNSS、轮式里程计等设备持续产生高频、异构、带时间戳的数据;而 ROS2 通过 DDS 中间件、话题、服务、动作、参数、TF 变换、QoS 策略等机制,把这些数据组织成可组合、可观测、可部署的软件系统。本课程的目标不是孤立地讲解某个 API,而是建立一条从“传感器原始数据”到“中间件可靠传输”再到“工程化系统集成”的完整能力链。

一、学习目标:从会用到会调、会诊断、会设计

完成本课程后,你应当能够独立完成以下任务:

  • 理解 ROS2 节点、话题、服务、动作、参数与执行器的基本模型,并能用 C++ 或 Python 编写传感器驱动节点。
  • 掌握 DDS 中间件的基本概念,包括域、参与者、发布者、订阅者、QoS 策略与发现机制。
  • 能够为不同传感器配置合适的 QoS,例如激光雷达使用 SensorDataQoS,地图与静态数据使用 TransientLocal。
  • 能够使用 ros2 topic hz、ros2 topic delay、ros2 doctor、rqt_graph 等工具定位数据断流、延迟、丢包与 QoS 不匹配问题。
  • 能够设计多传感器时间同步方案,理解时间戳、时钟源、message_filters 与 TF 树之间的关系。
  • 能够把传感器数据链路封装为可复用的 launch、参数文件与组件容器,并考虑实时性与资源占用。
核心判断标准:当传感器数据异常时,你能区分问题出在硬件、驱动、DDS 传输、QoS 配置、时间同步还是下游算法,而不是盲目重启节点。

二、核心概念:数据、中间件与时间三条主线

本课程围绕三条主线展开。第一条是数据主线:传感器原始数据如何被采集、编码为 ROS2 消息、发布到话题。第二条是中间件主线:DDS 如何完成发现、匹配、序列化、传输与 QoS 约束。第三条是时间主线:时间戳、时钟源、TF 变换与多传感器融合如何保证数据在时间上对齐。

这三条主线不是并列的,而是相互耦合。例如,一个深度相机节点发布 sensor_msgs/msg/Image 和 sensor_msgs/msg/CameraInfo,如果 QoS 设置为 Reliable 而订阅端使用 BestEffort,就会出现“节点在运行但收不到数据”的典型故障;如果时间戳使用系统时钟而 IMU 使用硬件时钟,融合时就会出现漂移。因此,理解中间件不能只背概念,必须结合具体传感器数据流来观察。

ROS2 传感器数据与中间件工程整体框架 传感器层 → 中间件层 → 应用层,时间主线贯穿全链路 传感器层 激光雷达 LaserScan / PointCloud2 深度相机 Image / CameraInfo IMU Imu / MagneticField GNSS NavSatFix 轮式里程计 Odometry 驱动节点 C++ / Python 中间件层(DDS) 发现机制 Domain / Participant 发布 / 订阅 Publisher / Subscriber QoS 策略 Reliability / Durability 序列化 CDR / IDL 话题 / 服务 / 动作 Topic / Service / Action 参数与执行器 Parameter / Executor TF 变换与时间同步 tf2 / message_filters / Clock 调试工具链 ros2 topic / doctor / rqt_graph 应用层 多传感器融合 EKF / 因子图 SLAM 与定位 建图 / 重定位 感知与规划 检测 / 避障 数据记录与回放 ros2 bag 部署与监控 Launch / 组件容器 性能与实时性 延迟 / 抖动 / 资源 发布 订阅 时间主线:时间戳 → 时钟源 → TF 树 → 多传感器对齐 → 融合输出 贯穿传感器采集、DDS 传输、应用融合全过程

三、方法流程:一条可复用的传感器接入链路

面对任何新传感器,建议按以下流程推进,而不是直接写业务逻辑:

  1. 确认硬件接口与数据协议:USB、网口、串口、CAN,以及厂商 SDK 的输出格式与频率。
  2. 选择或编写 ROS2 驱动节点:优先使用官方或社区成熟驱动,确认其发布的话题名、消息类型与 QoS。
  3. 用命令行验证数据:先确认话题存在、频率稳定、消息内容合理,再接入下游。
  4. 配置 QoS 与时间戳:根据数据特性选择 Reliability、Durability、History、Depth,并确认时间戳来源。
  5. 接入 TF 与融合模块:确保坐标系命名规范,时间同步策略明确。
  6. 封装 launch 与参数:把话题名、频率、QoS、外参等做成可配置项,便于复现与部署。
# 典型验证命令
ros2 topic list
ros2 topic info /scan --verbose
ros2 topic hz /scan
ros2 topic echo /imu/data --once
ros2 doctor --report

四、案例场景:激光雷达与 IMU 的 QoS 不匹配排障

假设你启动了一个激光雷达驱动和一个建图节点,ros2 topic list 能看到 /scan,但建图节点始终没有输出。此时不要急着重启,按以下顺序排查:

排查步骤 命令或方法 预期结果与判断
确认话题是否存在 ros2 topic list 能看到 /scan,说明发布端已注册
查看发布者与订阅者数量 ros2 topic info /scan --verbose 若订阅者数量为 0,说明 QoS 不匹配或节点未订阅
检查频率 ros2 topic hz /scan 有稳定频率说明数据在传输;无输出说明链路中断
检查 QoS 配置 对比发布端与订阅端的 Reliability、Durability 发布端 BestEffort、订阅端 Reliable 时无法匹配
检查时间戳 ros2 topic echo /scan --once 时间戳为 0 或明显偏移,会导致 TF 查询失败
经验法则:传感器高频数据优先使用 SensorDataQoS(BestEffort、KeepLast),地图、静态 TF、参数等低频但需要补发的数据使用 TransientLocal。QoS 不匹配是 ROS2 中最常见也最容易被误判为“驱动坏了”的问题。

五、常见误区与复盘

初学者最容易陷入三个误区。第一,把 ROS2 当成“带话题的 ROS1”,忽略 DDS 的发现机制与 QoS 语义,导致跨机器通信失败却找不到原因。第二,只关注消息内容,不关注时间戳与坐标系,导致融合结果在静态时正常、运动时漂移。第三,把所有节点塞进一个进程,忽略执行器模型与回调组,导致高频传感器数据阻塞低频控制指令。

复盘建议:每次传感器接入失败后,记录“现象—命令—输出—判断—修复”五列,形成自己的排障手册。这比记住某个具体 API 更有长期价值。

本课程后续将沿着“传感器层—中间件层—应用层”的框架逐层展开,每一节都会围绕真实数据链路、可执行命令与可复现配置进行讲解。你现在需要建立的不是零散知识点,而是一张能够定位问题、设计链路、评估性能的工程地图。