Moveit2对接硬件
本文待完善(2025.11.25)
一、介绍
本部分关注右侧,Moveit2与硬件的连接:

在 MoveIt2 中,机械臂的规划与执行分为两个体系:
- 左侧(Planning 端):MoveIt2 负责运动学求解、碰撞检测、路径规划、笛卡尔路径等高级功能
- 右侧(Hardware 端):真正驱动电机的硬件控制器,例如伺服驱动器、舵机、步进电机
为了让这两个部分协同工作,需要一个中间层把“规划结果”变成“真实电机命令”,这个中间层就是:ros2_control
二、控制流程
ros2_control 负责把 MoveIt2 的输出(关节目标)转成对硬件的指令。结构如下:

简单来说可以总结为:
MoveIt2(规划层)
|
| JointTrajectory(轨迹)
v
ros2_control(控制层)
|
| 实时控制指令(PWM / 电流 / 位置环)
v
硬件驱动器(执行层)2.1 MoveIt2 —— 规划层
MoveIt2 的职责:
- 逆运动学求解(IK)
- 碰撞检测(Collision Checking)
- 路径规划(OMPL / Pilz)
- 笛卡尔路径计算(computeCartesianPath)
- 生成标准轨迹消息:
trajectory_msgs/JointTrajectory
MoveIt2 并不会控制电机,它只生成轨迹,例如:
joint1: 0 → 0.4 → 0.8
joint2: -0.1 → 0.2 → 0.6
…这些轨迹由 “规划执行管理器” 交给下一层的 ros2_control。
2.2 ros2_control —— 控制层
图中的“中间控制模块”就是 ros2_control。
它是 MoveIt2 接硬件的唯一官方方式。主要由两个核心插件构成:
hardware_interface
负责接入真实硬件,例如:
- 通过串口控制舵机
- 通过 CAN 控制伺服电机
- 通过 EtherCAT 驱动多轴机械臂
- 自己用 C++ 写一个硬件桥接文件
controllers(控制器)
常用控制器:
| 控制器类型 | 说明 | MoveIt2 是否支持 |
|---|---|---|
| JointStateController | 发布所有关节状态 | ✅ 必须 |
| JointTrajectoryController | 接收 MoveIt 轨迹,执行控制 | ✅ MoveIt 标准执行器 |
MoveIt2 执行规划时,本质上是将轨迹发给:
/joint_trajectory_controller/joint_trajectoryros2_control 控制器则将轨迹解析成:
- 电流给定
- PWM 输出
- CAN 命令
- EtherCAT 帧
- RS485 命令
最后发给你的真实电机。
2.3 硬件(执行层 Hardware Layer)
电机驱动器(伺服/步进/舵机)是真正执行关节运动的部分。
ros2_control 定义了三种常见硬件接口:
| 类型 | 说明 | 适用场景 |
|---|---|---|
| position interface | 系统下发“目标角度”,驱动器内部跑位置环 | 伺服驱动器、舵机 |
| velocity interface | 下发“目标速度” | 有速度环的驱动器 |
| effort interface | 下发“力矩/电流” | 高级力控机械臂 |
自研机械臂几乎都是 position interface。
三、ros2_control 的典型文件结构
控制器配置:
config/ros2_controllers.yaml
yaml
controller_manager:
ros__parameters:
update_rate: 200
joint_trajectory_controller:
type: joint_trajectory_controller/JointTrajectoryController
joints: [joint1, joint2, joint3]
state_publish_rate: 50
command_interfaces: ["position"]
state_interfaces: ["position", "velocity"]硬件插件配置:
config/my_robot.hardware.xacro
xml
<ros2_control name="RobotHardware" type="system">
<hardware>
<plugin>my_robot_hardware/MyHardwareInterface</plugin>
</hardware>
<joint name="joint1">
<command_interface name="position"/>
<state_interface name="position"/>
</joint>
</ros2_control>HardwareInterface C++ 实现(核心桥梁)
cpp
hardware_interface::CallbackReturn MyHardware::write(...) {
// 将 position 命令发送给电机,例如 RS485 / CAN / EtherCAT
send_pos_to_motor(joint_position_command[i]);
}这是 ros2_control 电机的最关键内容。
