MoveIt2 Servo → MoveGroup → Action Client → arm_controller → RViz2 这条完整链路。
你现在最关心的:/arm_controller/joint_trajectory 到底发给谁?怎么经过 MoveGroup?怎么到 RViz?
我直接画数据流全链路,每一步都对应你能看到的 topic。
一、终极链路(一句话版)
plaintext
MoveIt2 Servo
↓(发布)
/arm_controller/joint_trajectory
↓(MoveGroup 内部转发,不修改)
MoveGroup 构建 Action 指令
↓(Action 发送)
/arm_controller/follow_joint_trajectory (Action)
↓(Action Client 发送给)
arm_controller (ros2_control)
↓(执行电机)
真实机器人 / 仿真机器人
↓(回传状态)
/joint_states → /tf → RViz2 显示机器人动起来
二、逐行详细解释(你一定能看懂)
1. MoveIt2 Servo 计算出轨迹
Servo 实时计算末端 / 关节速度,输出:
plaintext
/arm_controller/joint_trajectory
这是轨迹点消息,不是 Action。
2. MoveGroup 不是 "接收者",而是 "转发者"
MoveGroup 做的事情只有一件:把 Servo 发的轨迹消息 → 包装成 Action 指令
它不重新规划 ,只是转发。
3. MoveGroup 发送 Action 给控制器
MoveGroup 会调用:
plaintext
/arm_controller/follow_joint_trajectory
这是一个 Action,不是普通 topic。
结构:
- Action Client:MoveGroup
- Action Server:arm_controller(ros2_control)
4. arm_controller 真正执行运动
控制器收到 Action 后:
- 把轨迹转成电机指令
- 发给电机 / 仿真器
- 机器人开始运动
5. RViz2 怎么看到机器人动?
机器人运动后:
-
驱动 / 仿真器发布 plaintext
/joint_states -
robot_state_publisher 转成 plaintext
/tf -
RViz2 订阅
/tf和/robot_description→ 显示机器人模型实时位置
三、你问的三个核心问题,直接给答案
1. /arm_controller/joint_trajectory 发给谁?
发给 MoveGroupMoveGroup 订阅这个 topic,把它转成 Action。
2. 如何经过 MoveGroup?
不规划,只转发 + 包装成 ActionMoveGroup = 快递中转站,不是工厂。
3. 如何发给 Action Client?
MoveGroup 本身就是 Action Client它直接发送 Action 给控制器的 Action Server。
4. 如何到 RViz2?
通过状态回传:
plaintext
机器人 → /joint_states → /tf → RViz2
四、最精简记忆版(背下来就懂)
plaintext
Servo 发轨迹
↓
MoveGroup 转 Action
↓
控制器执行
↓
状态回传到 RViz
五、你现在的话题里,真正参与运动的只有 5 个
/servo_demo_node/delta_twist_cmds(你给的指令)/arm_controller/joint_trajectory(Servo 输出)/arm_controller/follow_joint_trajectory(Action)/joint_states(状态回传)/tf(RViz 显示)