Skip to content

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_trajectory

ros2_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 电机的最关键内容。