3. 创建MoveIt2配置包

任务目标

为自定义URDF机器人生成MoveIt2配置包,使其能够被MoveIt2的move_group节点加载并用于运动规划。本案例使用一个简单的6自由度机械臂URDF作为输入,通过MoveIt Setup Assistant生成完整的MoveIt2配置包。

环境准备

  • Ubuntu 22.04 + ROS 2 Humble(或更高版本ROS 2发行版)
  • 已安装MoveIt2:sudo apt install ros-humble-moveit
  • 已安装MoveIt Setup Assistant:sudo apt install ros-humble-moveit-setup-assistant
  • 自定义机器人URDF文件(本案例使用simple_arm.urdf)

输入URDF文件

创建文件simple_arm.urdf,内容如下(6自由度关节臂,含末端执行器):

<robot name="simple_arm">
  <link name="base_link">
    <visual>
      <geometry><box size="0.2 0.2 0.1"/></geometry>
    </visual>
  </link>

  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <origin xyz="0 0 0.1" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-3.14" upper="3.14" effort="10" velocity="1.0"/>
  </joint>

  <link name="link1">
    <visual>
      <geometry><cylinder radius="0.05" length="0.4"/></geometry>
      <origin xyz="0 0 0.2" rpy="0 0 0"/>
    </visual>
  </link>

  <joint name="joint2" type="revolute">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz="0 0 0.4" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <limit lower="-2.0" upper="2.0" effort="10" velocity="1.0"/>
  </joint>

  <link name="link2">
    <visual>
      <geometry><cylinder radius="0.05" length="0.4"/></geometry>
      <origin xyz="0 0 0.2" rpy="0 0 0"/>
    </visual>
  </link>

  <joint name="joint3" type="revolute">
    <parent link="link2"/>
    <child link="link3"/>
    <origin xyz="0 0 0.4" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <limit lower="-2.0" upper="2.0" effort="10" velocity="1.0"/>
  </joint>

  <link name="link3">
    <visual>
      <geometry><cylinder radius="0.04" length="0.3"/></geometry>
      <origin xyz="0 0 0.15" rpy="0 0 0"/>
    </visual>
  </link>

  <joint name="joint4" type="revolute">
    <parent link="link3"/>
    <child link="link4"/>
    <origin xyz="0 0 0.3" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-3.14" upper="3.14" effort="10" velocity="1.0"/>
  </joint>

  <link name="link4">
    <visual>
      <geometry><cylinder radius="0.04" length="0.3"/></geometry>
      <origin xyz="0 0 0.15" rpy="0 0 0"/>
    </visual>
  </link>

  <joint name="joint5" type="revolute">
    <parent link="link4"/>
    <child link="link5"/>
    <origin xyz="0 0 0.3" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    <limit lower="-2.0" upper="2.0" effort="10" velocity="1.0"/>
  </joint>

  <link name="link5">
    <visual>
      <geometry><cylinder radius="0.03" length="0.2"/></geometry>
      <origin xyz="0 0 0.1" rpy="0 0 0"/>
    </visual>
  </link>

  <joint name="joint6" type="revolute">
    <parent link="link5"/>
    <child link="tool0"/>
    <origin xyz="0 0 0.2" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-3.14" upper="3.14" effort="10" velocity="1.0"/>
  </joint>

  <link name="tool0">
    <visual>
      <geometry><box size="0.05 0.05 0.05"/></geometry>
    </visual>
  </link>
</robot>

使用MoveIt Setup Assistant生成配置包

启动Setup Assistant图形界面:

ros2 run moveit_setup_assistant moveit_setup_assistant

在图形界面中按以下步骤操作:

  1. 创建新配置包:点击“Create New MoveIt Configuration Package”
  2. 加载URDF:点击“Browse”选择simple_arm.urdf文件,点击“Load Files”
  3. 生成自碰撞矩阵:进入“Self-Collisions”页,点击“Generate Collision Matrix”按钮,使用默认采样密度
  4. 添加规划组:进入“Planning Groups”页,点击“Add Group”创建规划组:
    • Group Name: arm_group
    • Kinematic Solver: KDLKinematicsPlugin
    • Group Type: Kinematic Chain
    • Base Link: base_link
    • Tip Link: tool0
  5. 设置预设位姿:进入“Robot Poses”页,添加一个名为home的位姿,所有关节值设为0
  6. 配置末端执行器:进入“End Effectors”页,添加末端执行器:
    • Name: tool0_eef
    • Group: arm_group
    • Link: tool0
  7. 生成配置包:进入“Configuration Files”页,设置输出目录为~/ws_moveit/src/simple_arm_moveit_config,点击“Generate Package”

验证配置包

生成的配置包应包含以下关键文件:

simple_arm_moveit_config/
├── CMakeLists.txt
├── package.xml
├── config/
│   ├── simple_arm.srdf
│   ├── joint_limits.yaml
│   ├── kinematics.yaml
│   ├── moveit_controllers.yaml
│   ├── ompl_planning.yaml
│   ├── pilz_industrial_motion_planner_planning.yaml
│   ├── simple_arm_moveit_controller_manager.yaml
│   └── simple_arm_moveit_sensor_manager.yaml
├── launch/
│   ├── demo.launch.py
│   ├── move_group.launch.py
│   ├── setup_assistant.launch.py
│   ├── spawn_controllers.launch.py
│   └── warehouse_settings.launch.py
└── srdf/
    └── simple_arm.srdf

编译并运行demo验证配置包是否可用:

cd ~/ws_moveit
colcon build --packages-select simple_arm_moveit_config
source install/setup.bash
ros2 launch simple_arm_moveit_config demo.launch.py

通过条件:RViz正常启动,左侧Panel显示simple_arm机器人模型,MotionPlanning面板中Planning Group选择arm_group后,拖动交互标记设置目标位姿并点击“Plan”按钮,能够成功规划出无碰撞的运动轨迹。

常见问题

  • URDF加载失败:检查URDF中所有link和joint是否成对出现,parent/child命名是否一致
  • 规划失败:确认自碰撞矩阵已生成,且joint_limits.yaml中的关节限位与URDF一致
  • move_group无法启动:检查是否已source ROS 2环境,以及moveit_controllers.yaml中的控制器配置是否与机器人驱动匹配(纯仿真demo可忽略此配置)