2. 创建机械臂URDF模型
任务目标
为六自由度关节型机械臂创建可在ROS2中使用的URDF模型,包含连杆几何、关节轴配置与可视化网格,并通过robot_state_publisher在RViz中正确显示。
环境依赖
- Ubuntu 22.04 + ROS2 Humble(或等效发行版)
- 安装包:
urdfdom,rviz2,robot_state_publisher,joint_state_publisher_gui
sudo apt install ros-$ROS_DISTRO-urdfdom ros-$ROS_DISTRO-rviz2 ros-$ROS_DISTRO-robot-state-publisher ros-$ROS_DISTRO-joint-state-publisher-gui
URDF模型实现
以下URDF定义了一个6自由度关节臂:基座固定于世界,5个旋转关节(肩部偏航/俯仰、肘部俯仰、腕部俯仰/偏航)加1个末端工具法兰。每个连杆使用简单几何体(圆柱/长方体)作为可视化,碰撞几何与可视化一致以保证仿真可用。
<?xml version="1.0"?>
<robot name="arm_6dof">
<!-- 基座 -->
<link name="base_link">
<visual>
<geometry><box size="0.2 0.2 0.1"/></geometry>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
</visual>
<collision>
<geometry><box size="0.2 0.2 0.1"/></geometry>
</collision>
</link>
<!-- 腰部:绕Z轴旋转 -->
<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="100" velocity="1.0"/>
</joint>
<link name="link1">
<visual>
<geometry><cylinder radius="0.05" length="0.3"/></geometry>
<origin xyz="0 0 0.15" rpy="0 0 0"/>
</visual>
<collision>
<geometry><cylinder radius="0.05" length="0.3"/></geometry>
</collision>
</link>
<!-- 肩部俯仰 -->
<joint name="joint2" type="revolute">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit lower="-2.0" upper="2.0" effort="100" velocity="1.0"/>
</joint>
<link name="link2">
<visual>
<geometry><box size="0.06 0.06 0.35"/></geometry>
<origin xyz="0 0 0.175" rpy="0 0 0"/>
</visual>
<collision>
<geometry><box size="0.06 0.06 0.35"/></geometry>
</collision>
</link>
<!-- 肘部俯仰 -->
<joint name="joint3" type="revolute">
<parent link="link2"/>
<child link="link3"/>
<origin xyz="0 0 0.35" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit lower="-2.5" upper="2.5" effort="80" 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>
<collision>
<geometry><cylinder radius="0.04" length="0.3"/></geometry>
</collision>
</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 1 0"/>
<limit lower="-2.0" upper="2.0" effort="50" velocity="1.0"/>
</joint>
<link name="link4">
<visual>
<geometry><box size="0.05 0.05 0.2"/></geometry>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
</visual>
<collision>
<geometry><box size="0.05 0.05 0.2"/></geometry>
</collision>
</link>
<!-- 腕部偏航 -->
<joint name="joint5" type="revolute">
<parent link="link4"/>
<child link="link5"/>
<origin xyz="0 0 0.2" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="30" velocity="1.0"/>
</joint>
<link name="link5">
<visual>
<geometry><cylinder radius="0.03" length="0.1"/></geometry>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
</visual>
<collision>
<geometry><cylinder radius="0.03" length="0.1"/></geometry>
</collision>
</link>
<!-- 末端工具法兰 -->
<joint name="tool_joint" type="fixed">
<parent link="link5"/>
<child link="tool0"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
</joint>
<link name="tool0">
<visual>
<geometry><box size="0.04 0.04 0.02"/></geometry>
<origin xyz="0 0 0.01" rpy="0 0 0"/>
</visual>
<collision>
<geometry><box size="0.04 0.04 0.02"/></geometry>
</collision>
</link>
</robot>
运行与验证
- 将上述URDF保存为
arm_6dof.urdf。 - 启动模型状态发布与可视化:
ros2 launch robot_state_publisher robot_state_publisher.launch.py model:=arm_6dof.urdf
- 另开终端启动关节控制与RViz:
ros2 run joint_state_publisher_gui joint_state_publisher_gui
ros2 run rviz2 rviz2
- 在RViz中:将Fixed Frame设为
base_link,点击Add添加RobotModel显示。
通过条件:RViz中完整显示6个连杆的几何模型;拖动joint_state_publisher_gui中的滑块时,对应关节平滑旋转,连杆间无错位或断裂;终端无TF或URDF解析错误。
常见问题
- RViz中模型不显示:确认Fixed Frame为
base_link,且robot_state_publisher正常发布TF(终端无报错)。 - 关节滑块拖动无反应:检查是否同时运行了
joint_state_publisher_gui,且未手动发布/joint_states话题。 - 连杆错位:检查URDF中
origin的xyz是否与上一连杆末端坐标匹配,确保父子关系连续。