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
关键数据流时序
- 用户发
goal到move_base接收 move_base查costmap判断这条路能否通行global_planner用A*算出全局路径,发布/planlocal_planner接收激光/scan加全局路径,算避障速度- 发布
/cmd_vel到base_controller,PID控制电机 - 编码器反馈
/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的实现