2. URDF机器人模型构建

任务目标

使用URDF(Unified Robot Description Format)定义一个三自由度机械臂模型,包含基座、三个连杆和三个旋转关节,并在RViz中正确显示该模型。

环境依赖

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

实现步骤

创建ROS功能包并编写URDF文件。URDF使用XML格式描述机器人的运动学树:<link>定义刚体(含视觉/碰撞几何),<joint>定义连杆间的连接关系与运动类型。

完整URDF代码

创建文件 arm.urdf,内容如下:

<?xml version="1.0"?>
<robot name="three_dof_arm">
  <!-- 基座 -->
  <link name="base_link">
    <visual>
      <geometry><box size="0.1 0.1 0.05"/></geometry>
      <origin xyz="0 0 0.025"/>
    </visual>
  </link>

  <!-- 关节1:基座到连杆1,绕Z轴旋转 -->
  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <origin xyz="0 0 0.05"/>
    <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.02" length="0.2"/></geometry>
      <origin xyz="0 0 0.1"/>
    </visual>
  </link>

  <!-- 关节2:连杆1到连杆2,绕Y轴旋转 -->
  <joint name="joint2" type="revolute">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz="0 0 0.2"/>
    <axis xyz="0 1 0"/>
    <limit lower="-1.57" upper="1.57" effort="10" velocity="1.0"/>
  </joint>

  <link name="link2">
    <visual>
      <geometry><cylinder radius="0.02" length="0.2"/></geometry>
      <origin xyz="0 0 0.1"/>
    </visual>
  </link>

  <!-- 关节3:连杆2到连杆3,绕Y轴旋转 -->
  <joint name="joint3" type="revolute">
    <parent link="link2"/>
    <child link="link3"/>
    <origin xyz="0 0 0.2"/>
    <axis xyz="0 1 0"/>
    <limit lower="-1.57" upper="1.57" effort="10" velocity="1.0"/>
  </joint>

  <link name="link3">
    <visual>
      <geometry><sphere radius="0.03"/></geometry>
      <origin xyz="0 0 0.03"/>
    </visual>
  </link>
</robot>

运行与验证

在终端中依次执行以下命令(需先 source /opt/ros/noetic/setup.bash):

# 启动URDF模型显示(自动加载RViz)
roslaunch urdf_tutorial display.launch model:=arm.urdf

若需手动调整关节角度,另开终端运行:

rosrun joint_state_publisher_gui joint_state_publisher_gui

通过条件

  • RViz窗口中出现机械臂模型,基座为长方体,连杆1/2为圆柱体,末端为球体。
  • 拖动GUI中的关节滑条(joint1~joint3),机械臂各连杆应绕对应轴实时转动,且连杆间无分离或错位。
  • RViz左侧的RobotModel显示绿色(表示URDF解析成功,无缺失link/joint)。

常见问题

  • 模型不显示:检查终端是否有URDF解析报错,确认model:=后路径正确。
  • 关节无法转动:确认joint_state_publisher_gui已启动,且RViz中Fixed Frame设为base_link。
  • 连杆错位:检查<origin>的xyz值是否与父子link的几何尺寸匹配(子link的origin是相对父link的偏移)。