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
在图形界面中按以下步骤操作:
- 创建新配置包:点击“Create New MoveIt Configuration Package”
- 加载URDF:点击“Browse”选择
simple_arm.urdf文件,点击“Load Files” - 生成自碰撞矩阵:进入“Self-Collisions”页,点击“Generate Collision Matrix”按钮,使用默认采样密度
- 添加规划组:进入“Planning Groups”页,点击“Add Group”创建规划组:
- Group Name:
arm_group - Kinematic Solver:
KDLKinematicsPlugin - Group Type:
Kinematic Chain - Base Link:
base_link - Tip Link:
tool0
- Group Name:
- 设置预设位姿:进入“Robot Poses”页,添加一个名为
home的位姿,所有关节值设为0 - 配置末端执行器:进入“End Effectors”页,添加末端执行器:
- Name:
tool0_eef - Group:
arm_group - Link:
tool0
- Name:
- 生成配置包:进入“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可忽略此配置)