什么是ros2
什么是ros2ROS 2 是这套系统的**“神经系统”——它本身不控制电机也不做仿真但所有部件之间的对话都靠它**。一句话定位ROS 2 机器人专用的通信中间件工具生态就像互联网让电脑之间能传消息ROS 2 让机器人的各个软件模块能互相说话。为什么不用普通网络通信你当然可以直接写 Socket、用 MQTT、或者共享内存。但 ROS 2 解决了机器人特有的问题问题ROS 2 的解决方案传感器数据高频发布激光雷达 10Hz相机 30Hz话题Topic发布/订阅自动队列管理偶尔需要查询状态“现在电池多少”服务Service请求/响应长时间任务“去厨房到了告诉我”动作Action带反馈和取消多机协同小车 无人机 地面站DDS 中间件自动发现网络中的节点时间同步传感器和算法时钟不同步仿真时间/clock统一时基代码复用别人的算法怎么接进来标准化消息类型geometry_msgs/Twist、sensor_msgs/LaserScan等在你的小车系统里ROS 2 具体做什么┌────────────────────────────────────────────────────────────────┐ │ 你的算法层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 避障算法 │ │ 路径规划 │ │ 目标检测 │ │ │ │ (Python) │ │ (C) │ │ (Python) │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ │ └─────────────┼─────────────┘ │ │ ↓ │ │ ROS 2 通信层你写的代码 │ │ ┌─────────────────────────┐ │ │ │ 订阅 /scan → 处理 → 发布 /cmd_vel │ │ │ │ 订阅 /odom → 处理 → 发布 /goal_pose │ │ │ └─────────────────────────┘ │ │ │ │ └─────────────────────┼──────────────────────────────────────────┘ ↓ ┌────────────────────────────────────────────────────────────────┐ │ ROS 2 中间件自动运行 │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 话题总线 │←────→│ DDS 层 │←────→│ 话题总线 │ │ │ │ (节点A) │ │ (自动发现) │ │ (节点B) │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ 消息序列化、QoS 策略、跨网络传输、时间同步... │ └────────────────────────────────────────────────────────────────┘ │ ┌─────────────────────┼──────────────────────────────────────────┐ │ ↓ │ │ 驱动层 │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 电机驱动 │ │ 雷达驱动 │ │ 相机驱动 │ │ IMU驱动 │ │ │ │ 节点 │ │ 节点 │ │ 节点 │ │ 节点 │ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ │ │ ↓ ↓ ↓ ↓ │ │ GPIO/串口 USB/串口 USB I2C/串口 │ │ │ │ │ │ │ │ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ │ │ │ 电机 │ │雷达 │ │相机 │ │ IMU │ │ │ └─────┘ └─────┘ └─────┘ └─────┘ │ │ │ │ 仿真时Gazebo 插件替代这些驱动节点ROS 2 接口不变 │ └────────────────────────────────────────────────────────────────┘关键概念话题、服务、动作话题Topic—— 传感器数据流激光雷达节点 你的算法节点 ┌─────────┐ ┌─────────┐ │ 扫描一圈 │──→ /scan ────→│ 收到点云 │ │ 发布数据 │ (持续广播) │ 计算避障 │ │ 10Hz │ │ 发布指令 │ └─────────┘ └────┬────┘ │ ↓ /cmd_vel (Twist消息) {linear: {x: 0.5}, angular: {z: 0.0}}特点发布者不知道谁在听零耦合。你可以同时开 3 个算法节点都订阅/scan。服务Service—— 查询/设置你的节点 地图服务节点 ┌─────────┐ ┌─────────┐ │ 请求地图 │──→ /get_map ──→│ 查找文件 │ │ │ (等待响应) │ 加载地图 │ │ │←── 地图数据 ────│ │ └─────────┘ └─────────┘特点一对一实时响应适合低频操作。动作Action—— 长时间任务你的节点 导航节点 ┌─────────┐ ┌─────────┐ │ 去厨房 │──→ /navigate ─→│ 规划路径 │ │ │ (发送目标) │ 开始移动 │ │ │←── 实时反馈 ────│ 走了30% │ │ │←── 实时反馈 ────│ 走了60% │ │ │←── 完成/失败 ────│ 到了 │ │ 取消 │──→ (可随时取消) →│ 停止 │ └─────────┘ └─────────┘仿真 vs 实机ROS 2 让切换无缝这是 ROS 2 最大的价值场景驱动层算法层Gazebo 仿真Gazebo 插件发布/scan、/odom你的避障代码订阅/scan发布/cmd_vel真实小车雷达驱动节点发布/scan编码器节点发布/odom同样的代码同样的订阅/发布算法代码完全不用改只改一个参数use_sim_time。一个实际的 ROS 2 命令行演示# 1. 启动 Gazebo 仿真自动创建 ROS 2 节点ros2 launch my_robot gazebo.launch.py# 2. 看看系统里有哪些节点在运行ros2nodelist# /gazebo_ros_diff_drive# /gazebo_ros_lidar# 3. 看看有哪些话题ros2 topic list# /cmd_vel ← 你发速度指令的地方# /odom ← 小车位置反馈# /scan ← 激光雷达数据# /tf ← 坐标变换# 4. 实时查看激光雷达数据ros2 topicecho/scan# 5. 手动发速度指令测试ros2 topic pub /cmd_vel geometry_msgs/Twist{linear: {x: 0.5}, angular: {z: 0.0}}# 6. 查看消息类型定义ros2 interface show geometry_msgs/msg/Twist# 输出# Vector3 linear# float64 x# float64 y# float64 z# Vector3 angular# float64 x# float64 y# float64 z总结ROS 2 到底帮你省了什么没有 ROS 2有 ROS 2自己写 Socket 通信代码一行代码发布/订阅自己定义消息格式用标准sensor_msgs/LaserScan换传感器要重写接口驱动节点换一下算法不动仿真和实机两套代码同一套代码切换零成本多语言混写难以集成Python/C/MATLAB 节点无缝通信理解的关键点ROS 2 不是算法库——它不管你怎么做 SLAM、怎么避障ROS 2 是通信管道——它保证你的算法能拿到传感器数据能发出控制指令ROS 2 是接口标准——用标准消息类型你的代码就能和别人的代码对接