一、先告诉你一句话真相
MoveIt Servo / MoveIt 本身不直接发指令给真机械臂,
它只发指令给:
controller_manager → 你的 Action Server → 真机械臂
你要做的只有一件事:
让 controller_manager 把轨迹指令转发给你自定义的 action server

二、指令流完整路径(你必须懂)
plaintext
你的视觉程序
↓
moveit_servo 计算轨迹
↓
controller_manager (ros2_control)
↓
【你自定义的 Action Server】
↓
真实机械臂硬件

你现在缺的就是:让 controller_manager 找你写的 action。

三、如何让 launch 文件把指令发给你的 action server?
只需要改 2 个文件:
1. moveit_controllers.yaml
2. 你的 ros2_controllers.yaml
我直接给你正确配置。

1. 修改:moveit_controllers.yaml
这个文件告诉 MoveIt:“轨迹要发给 xxx_controller 这个控制器”
yaml
controller_names:
-
arm_controller
arm_controller:
action_ns:
follow_joint_trajectory
type:
FollowJointTrajectory
default: true
joints:
-
JM0
- JM1-2
- JM4-3
-
JM4
-
JM5
-
YB
重点:
• action_ns: follow_joint_trajectory
• 你自己写的 Action Server 必须监听这个话题:
/arm_controller/follow_joint_trajectory
2. 修改:ros2_controllers.yaml(关键)
这个文件告诉 ros2_control:“用 joint_trajectory_controller,并且把指令转发给 action”
yaml
controller_manager:
ros__parameters:
update_rate: 100
arm_controller:
type:
joint_trajectory_controller/JointTrajectoryController
joint_state_broadcaster:
type:
joint_state_broadcaster/JointStateBroadcaster
arm_controller:
ros__parameters:
command_interfaces:
-
position
state_interfaces:
-
position
-
velocity
joints:
-
JM0
- JM1-2
- JM4-3
-
JM4
-
JM5
-
YB
这个配置的作用:
joint_trajectory_controller 内部自带 action server!
它会自动:
• 订阅 /arm_controller/follow_joint_trajectory
• 接收 MoveIt 发的轨迹
• 然后你只需要订阅这个 action 就能拿到指令
四、你自己写的 Action Server 要写什么?
你只需要写一个 FollowJointTrajectory.action 的服务器:
plaintext
/arm_controller/follow_joint_trajectory

你一监听这个话题,所有 MoveIt/Servo 指令都会发给你!
这就是 ROS2 控制真实机械臂的标准方式。

五、launch 文件不需要大改!
你原来的 launch 文件 99% 都不用改
只需要保证:
python


运行




moveit_config = (
MoveItConfigsBuilder
("collaborativearm")
.trajectory_execution(file_path="config/moveit_controllers.yaml") # 这个文件对就行
.to_moveit_configs()
)

然后启动:
• controller_manager
• arm_controller
• joint_state_broadcaster
指令就会自动流到你的 action!

六、最终指令流(你现在马上就能实现)
plaintext
视觉程序 → moveit_servo → controller_manager → arm_controller → 【你的 action】 → 真机