2. URDF机器人模型构建

任务目标

本案例将使用URDF(Unified Robot Description Format)创建一个三连杆机械臂模型,包含两个旋转关节和一个固定基座,并在RViz中完成可视化验证。通过本案例,你将掌握URDF中与的核心语法,以及机器人状态发布器(robot_state_publisher)在模型显示中的作用。

实现方案

我们创建一个包含3个连杆(基座、连杆1、连杆2)和2个旋转关节的简单机械臂。每个连杆通过标签定义几何形状(圆柱体或长方体),关节通过和建立运动学树形结构。使用标签确定关节相对父连杆的位置偏移,使用定义旋转轴。

环境依赖

  • Ubuntu 22.04 + ROS2 Humble(或更高版本)
  • 安装包:sudo apt install ros-humble-urdf-tutorial ros-humble-joint-state-publisher-gui ros-humble-rviz2
  • 需要robot_state_publisher包(ROS2基础安装通常已包含)

完整URDF代码

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

<?xml version="1.0"?>
<robot name="simple_arm">
  <!-- 基座:固定在地面 -->
  <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>
  </link>

  <!-- 关节1:基座与连杆1之间的旋转关节 -->
  <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>

  <!-- 连杆1:垂直柱体 -->
  <link name="link1">
    <visual>
      <geometry>
        <cylinder radius="0.03" length="0.3"/>
      </geometry>
      <origin xyz="0 0 0.15" rpy="0 0 0"/>
    </visual>
  </link>

  <!-- 关节2:连杆1与连杆2之间的旋转关节 -->
  <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="-1.57" upper="1.57" effort="10" velocity="1.0"/>
  </joint>

  <!-- 连杆2:水平柱体 -->
  <link name="link2">
    <visual>
      <geometry>
        <cylinder radius="0.02" length="0.25"/>
      </geometry>
      <origin xyz="0 0 0.125" rpy="0 1.5708 0"/>
    </visual>
  </link>
</robot>

运行与验证

按以下步骤在终端中执行:

# 1. 启动机器人状态发布器,将URDF发布到/tf和/robot_description
ros2 run robot_state_publisher robot_state_publisher simple_arm.urdf

# 2. 启动关节状态GUI(用于手动拖动关节角度)
ros2 run joint_state_publisher_gui joint_state_publisher_gui

# 3. 启动RViz
rviz2

在RViz中完成以下设置:

  1. 将Fixed Frame设置为 base_link。
  2. 点击Add,选择RobotModel,确认Description Topic为 /robot_description。
  3. 点击Add,选择TF,显示坐标系变换关系。

通过判定标准

  • RViz中显示三个连杆的3D模型,颜色为默认灰色,无红色报错。
  • TF树中显示 base_link → link1 → link2 的层级关系。
  • 在joint_state_publisher_gui窗口中拖动joint1和joint2的滑块,RViz中的机械臂模型应实时跟随运动,且连杆之间无分离或错位。

关键说明

  • <origin>中的xyz表示子连杆坐标系原点在父连杆坐标系中的位置偏移,rpy为旋转角(弧度)。连杆2的rpy="0 1.5708 0"使其绕Y轴旋转90°,从而让圆柱体呈水平姿态。
  • 关节的<limit>标签对revolute类型为必填,定义了角度范围(弧度)、最大力矩和速度。
  • 若RViz中模型不显示,检查终端1是否正常输出TF信息(可用ros2 run tf2_tools view_frames生成TF树PDF确认)。