一、终极一句话结论
MoveIt Servo 输出关节速度 → 发给你的机器人驱动 → 驱动控制电机 → 真实机械臂动起来
你不需要关心雅可比、IK,只需要把链路打通。
二、控制真实机械臂的完整数据流(必须背下来)
plaintext
你的控制指令
↓
MoveIt Servo 节点(计算关节速度)
↓
FollowJointTrajectory / 关节速度话题
↓
你的机器人驱动节点(如 ros2_control)
↓
控制器/电机驱动器
↓
真实机械臂运动
MoveIt Servo 只管算速度,不负责驱动电机。 驱动由你的机器人固件 / 驱动节点完成。
三、控制真实机械臂的 4 个必备条件
-
机械臂已完成 URDF + MoveIt 配置
- 坐标系正确
- 关节名称匹配
- 能在 RViz 里正常显示
-
有可用的 ROS 2 驱动
- 支持
ros2_control - 能接收关节速度 / 位置指令
- 支持
-
启动了 ros2_control 控制器
joint_state_broadcastervelocity_controller或position_controller
-
MoveIt Servo 配置正确
- 能正确获取关节状态
- 能正确下发指令
四、MoveIt Servo 控制真实机械臂 标准步骤(一步一步做)
1. 启动真实机械臂驱动
bash
运行
ros2 launch your_robot bringup.launch.py
这个启动:
- 电机上电
- 发布
/joint_states - 启动
/ros2_control
2. 启动 MoveIt(含运动规划)
bash
运行
ros2 launch your_robot_moveit moveit.launch.py
3. 启动 MoveIt Servo 节点
bash
运行
ros2 launch moveit_servo servo_server.launch.py planning_group:=arm
或用你自己的 launch。
4. 启动你的手柄 / 控制节点
bash
运行
ros2 run your_package xbox_servo_node
现在推摇杆 → 真实机械臂就会动!
五、MoveIt Servo 下发的指令类型
Servo 可以输出两种指令,都能驱动真实机械臂:
① 速度指令(默认,最顺滑)
- 话题:
/joint_interfaces/commands - 类型:关节速度
- 适合:实时控制、手柄
② 位置指令(通过伪逆积分)
- 话题:
/joint_trajectory_controller/joint_trajectory - 适合:低性能控制器
99% 真实机械臂用速度模式。
六、最关键:Servo 如何与你的驱动通信?
MoveIt Servo 默认支持 ros2_control,不需要改代码!
它会自动:
- 订阅
/joint_states→ 获取真实关节角度 - 发布
/joint_interfaces/commands→ 给驱动发速度指令
只要你的驱动支持 ros2_control ,就能直接用。
七、真实机械臂必备的 Servo 配置(必须改)
在 servo_config.yaml 中:
yaml
planning_group: "arm"
base_frame: "base_link"
ee_frame: "end_effector"
# 发布速度给 ros2_control
command_out_type: "velocity" # 关键!
publish_joint_positions: false
publish_joint_velocities: true # 关键!
# 真实机械臂必须限速
max_linear_velocity: 0.1 # 慢一点!
max_angular_velocity: 0.3
collision_check: true # 真实机械臂必须开!
joint_limit_avoid: true # 防止超限位
八、真实机械臂安全规则(非常重要)
- 第一次运行必须 手按急停
- 速度调到极低(0.05 m/s 以下)
- 打开碰撞检测
- 先在 Gazebo 仿真调通,再上真实机
- 不要和 MoveIt 同时发指令