2. URDF机器人模型构建

任务目标

使用URDF(Unified Robot Description Format)创建一个三连杆机械臂模型,包含两个旋转关节,并在RViz中正确显示。该模型将作为后续视觉抓取案例的机器人基础。

环境依赖

  • Ubuntu 20.04 / 22.04 + ROS Noetic / ROS2 Humble(本案例以ROS Noetic为例)
  • 安装包:ros-noetic-urdf-tutorial、ros-noetic-joint-state-publisher-gui、ros-noetic-rviz

URDF模型文件

创建文件 simple_arm.urdf,定义基座、连杆1、连杆2三个刚体,以及两个旋转关节。每个连杆使用圆柱体+颜色可视化,关节轴分别绕Y轴旋转。

<?xml version="1.0"?>
<robot name="simple_arm">
  <!-- 基座 -->
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.1 0.1 0.05"/>
      </geometry>
      <origin xyz="0 0 0.025" rpy="0 0 0"/>
      <material name="gray">
        <color rgba="0.5 0.5 0.5 1.0"/>
      </material>
    </visual>
  </link>

  <!-- 关节1:基座与连杆1 -->
  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <origin xyz="0 0 0.05" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-3.14" upper="3.14" effort="10" velocity="1.0"/>
  </joint>

  <!-- 连杆1 -->
  <link name="link1">
    <visual>
      <geometry>
        <cylinder radius="0.02" length="0.2"/>
      </geometry>
      <origin xyz="0 0 0.1" rpy="0 0 0"/>
      <material name="blue">
        <color rgba="0.2 0.4 0.8 1.0"/>
      </material>
    </visual>
  </link>

  <!-- 关节2:连杆1与连杆2 -->
  <joint name="joint2" type="revolute">
    <parent link="link1"/>
    <child link="link2"/>
    <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>

  <!-- 连杆2 -->
  <link name="link2">
    <visual>
      <geometry>
        <cylinder radius="0.02" length="0.15"/>
      </geometry>
      <origin xyz="0 0 0.075" rpy="0 0 0"/>
      <material name="red">
        <color rgba="0.8 0.2 0.2 1.0"/>
      </material>
    </visual>
  </link>
</robot>

运行与显示

启动RViz并加载URDF模型,同时启动关节状态发布器以手动调节关节角度:

# 终端1:启动RViz并加载模型
roslaunch urdf_tutorial display.launch model:=/path/to/simple_arm.urdf

# 终端2:启动关节状态GUI发布器(若未自动启动)
rosrun joint_state_publisher_gui joint_state_publisher_gui

若使用ROS2,将上述命令替换为对应的ros2 launch urdf_tutorial display.launch.py model:=...及ros2 run joint_state_publisher_gui joint_state_publisher_gui。

验证方法

  • 模型完整性:RViz中应显示三个连杆(灰色基座、蓝色连杆1、红色连杆2),且连杆间通过关节正确连接,无错位或悬空。
  • 关节运动:在joint_state_publisher_gui界面中拖动joint1和joint2的滑块,观察对应连杆绕Z轴旋转,且运动连续无跳变。
  • TF树检查:在RViz左侧Display面板添加TF显示,应能看到base_link→link1→link2的父子变换关系。
  • 无报错:终端无URDF解析错误或缺失link/joint的警告。

常见问题

  • 模型不显示:检查URDF文件路径是否正确,以及display.launch中model:=参数是否指向实际文件。
  • 关节无法拖动:确认已启动joint_state_publisher_gui,且没有其他节点抢占/joint_states话题。
  • 连杆位置偏移:检查每个link的<origin>是否与父关节的<origin>匹配,确保子link的视觉原点与关节位置一致。