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>

运行与验证

  1. 将上述URDF保存为arm_6dof.urdf。
  2. 启动模型状态发布与可视化:
ros2 launch robot_state_publisher robot_state_publisher.launch.py model:=arm_6dof.urdf
  1. 另开终端启动关节控制与RViz:
ros2 run joint_state_publisher_gui joint_state_publisher_gui
ros2 run rviz2 rviz2
  1. 在RViz中:将Fixed Frame设为base_link,点击Add添加RobotModel显示。

通过条件:RViz中完整显示6个连杆的几何模型;拖动joint_state_publisher_gui中的滑块时,对应关节平滑旋转,连杆间无错位或断裂;终端无TF或URDF解析错误。

URDF连杆-关节树结构 base_link joint1 (Z轴旋转) link1 joint2 (Y轴旋转) link2 joint3 (Y轴旋转) link3 joint4 (Y轴旋转) link4 joint5 (Z轴旋转) 结构说明 • 6个连杆 + 6个关节 • 5个旋转关节 + 1个固定 • 关节1/5:绕Z轴偏航 • 关节2/3/4:绕Y轴俯仰 • tool0为末端法兰 • 每个link含visual+ collision几何 • 红色:基座 • 蓝色:运动连杆 • 橙色:旋转关节

常见问题

  • RViz中模型不显示:确认Fixed Frame为base_link,且robot_state_publisher正常发布TF(终端无报错)。
  • 关节滑块拖动无反应:检查是否同时运行了joint_state_publisher_gui,且未手动发布/joint_states话题。
  • 连杆错位:检查URDF中origin的xyz是否与上一连杆末端坐标匹配,确保父子关系连续。