ESC
输入关键词搜索文章标题和内容

ROS架构全景图从传感器到电机的7层数据流

本文由 linuxROS 整理发布,首发于 linuxros.cn,转载请注明出处。

ROS架构全景图从传感器到电机的7层数据流

导读:写ROS代码绕不开一个问题——数据从传感器到电机,到底经过了哪些节点?本文用一张全景图加一次导航请求追踪,讲清楚ROS机器人7层数据流。每个节点标注了清晰的输入输出,5分钟看懂ROS架构。


一、7层架构全景图与导航功能分层拆解

ROS将导航功能拆成7个层次,每层各司其职。激光扫描一圈,数据依次穿过这7层,最终变成电机的转速指令。

flowchart TB Start(["🔴 开始"]) S1["传感器层<br/>激光相机IMU"] S2["融合层<br/>robot_pose_ekf"] S3["地图层<br/>slam_toolbox"] S4["定位层<br/>amcl"] S5["代价地图层<br/>costmap_2d"] S6["规划层<br/>move_base"] S7["控制执行层<br/>base_controller"] End(["✅ 电机转动"]) Start --> S1 S1 -->|"scan/imu"| S2 S1 -->|"scan"| S3 S2 -->|"tf/odom"| S4 S3 -->|"map"| S4 S3 -->|"map"| S5 S4 -->|"pose"| S5 S5 -->|"costmap"| S6 S6 -->|"cmd_vel"| S7 S7 --> End style Start fill:#FFEBEE,stroke:#C62828 style S1 fill:#E3F2FD,stroke:#1976D2 style S2 fill:#E3F2FD,stroke:#1976D2 style S3 fill:#E3F2FD,stroke:#1976D2 style S4 fill:#FFF8E1,stroke:#F57C00 style S5 fill:#FFF8E1,stroke:#F57C00 style S6 fill:#F3E5F5,stroke:#7B1FA2,stroke-width:3px style S7 fill:#E8F5E9,stroke:#388E3C style End fill:#E8F5E9,stroke:#388E3C

7层职责速记

层 输入 输出 一句话
①传感器 物理信号 /scan /image 把光声变成数字信号
②融合 多传感器数据 /tf /odom 多传感器拼成一个坐标系
③定位 激光加地图 map→base_link 回答机器人在哪
④地图 激光加里程 /map 画出周围环境
⑤代价地图 地图加传感器 栅格代价值 标记哪里能走
⑥规划 代价加目标 /cmd_vel 决定怎么走
⑦控制 速度指令 电机转动 把指令变成动作

二、导航请求旅程与数据流时序追踪

说"去厨房"这三个字,背后数据走了一条怎样的路?下面追踪一次move_base导航请求的完整数据流。

flowchart TB Start(["🔴 发送目标"]) MB["move_base<br/>接收目标"] GP["global_planner<br/>A*全局路径"] LP["local_planner<br/>DWA避障"] SCAN["激光/scan<br/>实时输入"] VEL["cmd_vel<br/>线/角速度"] BC["base_controller<br/>PID控电机"] AMCL["amcl定位<br/>更新位置"] CHECK{"到达目标?"} End(["✅ 完成"]) Start --> MB MB --> GP GP --> LP SCAN --> LP LP --> VEL VEL --> BC BC --> AMCL AMCL --> CHECK CHECK -->|"否"| MB CHECK -->|"是"| End style Start fill:#FFEBEE,stroke:#C62828 style MB fill:#F3E5F5,stroke:#7B1FA2,stroke-width:3px style GP fill:#E8F5E9,stroke:#388E3C style LP fill:#FFF8E1,stroke:#F57C00 style SCAN fill:#E3F2FD,stroke:#1976D2 style VEL fill:#E3F2FD,stroke:#1976D2 style BC fill:#E8F5E9,stroke:#388E3C style AMCL fill:#FFF8E1,stroke:#F57C00 style CHECK fill:#FFF8E1,stroke:#F57C00 style End fill:#E8F5E9,stroke:#388E3C

关键数据流时序

  1. 用户发goal到move_base接收
  2. move_base查costmap判断这条路能否通行
  3. global_planner用A*算出全局路径,发布/plan
  4. local_planner接收激光/scan加全局路径,算避障速度
  5. 发布/cmd_vel到base_controller,PID控制电机
  6. 编码器反馈/odom到amcl更新位置,回到第1步形成闭环

三、节点通信机制与DDS执行器调度

ROS2底层通信基于DDS(Data Distribution Service),节点之间通过话题、服务、动作三种通信模型协作。导航7层之间的数据传递,本质是DDS在不同节点间投递消息。

来自 linuxros.cn · linuxROS

通信三模型

模型 适用场景 导航栈实例
Topic话题 异步流式数据 /scan /cmd_vel /tf
Service服务 同步短请求 全局路径规划请求
Action动作 长时带反馈 /move_base导航目标

执行器模型

ROS2节点用Executor调度回调。单线程执行器适合传感器驱动这类轻量节点,多线程执行器适合move_base这种需要并发处理规划与控制的节点。Reentrant回调组允许同类型回调并行执行,避免激光数据阻塞规划。

ROS2的nav2栈用bt_navigator替代move_base,基于行为树调度规划与控制,但7层架构的本质没有变化,依然是传感器数据流向电机的管道模型。


四、架构本质与数据管道总结

记一个口诀就够了:传感→融合→定位→地图→代价→规划→控制→执行。

整个ROS导航系统的本质就是数据管道:原始传感器数据从管道一头进去,经过7层加工,从另一头出来变成电机转速。理解这个管道,就理解了ROS架构。


参考来源

  • ros-planning/navigation:ROS1导航栈参考实现
  • ros-planning/navigation2:ROS2导航栈重构实现,bt_navigator替代move_base
  • slam_toolbox:开源2D SLAM建图工具包
  • robot_localization:ROS2 EKF融合替代robot_pose_ekf的实现

版权声明

作者linuxROS
协议本作品采用 CC BY-NC-SA 4.0 许可协议:署名-非商业性使用-相同方式共享
关注欢迎关注微信公众号 linuxROS,获取更多机器人 / 嵌入式 / Linux 干货
返回首页