MoveIt2 整套控制数据流拓扑图
整体层级划分
plaintext
【上层应用层】 ├─ MoveGroupInterface / RViz 目标规划 └─ 键盘遥操 / 视觉跟随 / 手动微调 【中间调度层】 ├─ /move_group 节点(全局规划) └─ /servo_node 节点(实时伺服) 【底层执行层】 └─ ros2_control 控制器组 └─ joint_trajectory_controller ├─ FollowJointTrajectory Action Server └─ 实时位置/速度指令 Topic数据流 1:MoveGroup + ActionClient 标准规划流程(离线整段轨迹)
plaintext
应用程序 ↓ MoveGroupInterface ↓ 1. 调用 move_group 规划器做无碰撞路径规划 2. 生成完整 JointTrajectory 轨迹 ↓ move_group 内部内置 **FollowJointTrajectory Action Client** ↓ ===== Action 通信链路 ===== joint_trajectory_controller 内部 Action Server ↓ 解析整条轨迹 → 插值 → 逐点执行 ↓ 机器人硬件驱动 → 关节运动特点
- 走Action 协议,有状态反馈、可暂停 / 取消
- 先规划再执行,运动平顺、全局避障
- 低频调用,适合定点抓取、点位搬运
数据流 2:MoveIt2 Servo 实时伺服流程(在线动态控制)
plaintext
键盘遥操节点 / 视觉节点 ↓ 发布话题: /delta_joint_cmds (JointJog 关节速度) /delta_twist_cmds (TwistStamped 末端速度) /servo_node/joint_trajectory (伺服模式轨迹) ↓ /servo_node 节点 1. 实时IK逆解 2. 实时碰撞/奇异点校验 3. 速度平滑、限幅 4. 不经过move_group,**自有下发逻辑** ↓ servo 直接下发高频控制指令(Topic为主) ↓ joint_trajectory_controller 实时接收指令 ↓ 硬件驱动 → 机械臂实时微动/拖动特点
- 纯话题高频通信,无 Action 握手
- 无全局重规划,只做局部实时修正
- 100~1000Hz 低延迟,适合手拖、键盘操控、视觉跟随
- 完全独立,不调用 move_group 的任何 ActionClient
双模式并行关系图
plaintext
应用层指令 ├─ 点位规划 → move_group → 内置ActionClient → 控制器ActionServer └─ 实时微调 → servo_node → 高频Topic指令 → 控制器实时入口 底层控制器(唯一执行端) ┌─────────────┴─────────────┐ ActionServer入口(整段轨迹) 实时Topic入口(速度/微动)核心区别对照表
表格
| 项目 | move_group + ActionClient | moveit2_servo |
|---|---|---|
| 通信方式 | Action 服务 | ROS Topic 高频发布 |
| 控制形式 | 整条预规划轨迹 | 实时速度 / 增量 / 短轨迹 |
| 延迟 | 高 (规划耗时) | 极低 (微秒~毫秒级) |
| 是否依赖对方 | 互不依赖,平行运行 | 互不依赖 |
| 能否手拖柔顺 | 不行 | 原生支持零重力拖动 |
| 适用场景 | 定点作业、批量点位 | 键盘操控、视觉跟随、示教 |
| 你当前代码走哪条 | 不走这条 | 完全走 servo 链路 |
关键结论
move_group自带的FollowJointTrajectory ActionClient只负责规划后整段轨迹执行moveit2_servo是独立实时控制单元,内部没有借用 move_group 的 Action 客户端- 同一套机械臂可同时启两个节点:定点用 move_group,微调拖动用 servo
- 你发送
JointTrajectory给/servo_node/joint_trajectory,属于伺服短轨迹跟随,依旧属于 servo 体系,和 move_group 的 Action 通路无关
