一、URDF 简介

URDF(Unified Robot Description Format)即统一机器人描述格式,是 ROS(Robot Operating System)中用于描述机器人模型的 XML 语言。它可以定义机器人的各个部分,包括连杆(links)、关节(joints)、惯性属性、视觉外观和碰撞属性等,让 ROS 系统能够理解机器人的结构和特性,进而实现运动规划、仿真和控制等功能。

二、六轴机械臂模型的构建步骤

(一)确定机械臂结构

在开始编写 URDF 文件前,需明确六轴机械臂的结构,包括各连杆的尺寸、形状,关节的类型(旋转关节或平移关节)、位置和运动范围等。假设我们的六轴机械臂由 6 个连杆和 6 个旋转关节组成,每个关节控制一个连杆的转动。

(二)创建 URDF 文件基础结构

新建一个.urdf文件,例如six_axis_robot.urdf,文件开头需声明 XML 版本和 URDF 命名空间:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="six_axis_robot">
  <!-- 机械臂模型内容将在此处填写 -->
</robot>

<robot>标签是 URDF 文件的根元素,name属性指定机器人的名称。

(三)定义连杆

  1. 第一个连杆(base_link):以第一个连杆base_link为例,在<robot>标签内添加如下代码:
<link name="base_link">
  <inertial>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <mass value="1"/>
    <inertia ixx="100" ixy="0" ixz="0" iyy="100" iyz="0" izz="100"/>
  </inertial>
  <visual>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <box size="0.2 0.2 0.1"/>
    </geometry>
    <material name="Blue">
      <color rgba="0 0 1 1"/>
    </material>
  </visual>
  <collision>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <box size="0.2 0.2 0.1"/>
    </geometry>
  </collision>
</link>
  • name属性为连杆命名。
  • <inertial>标签描述连杆的惯性属性。<origin>标签定义连杆质心相对于连杆坐标系的位置和姿态,xyz表示平移,rpy表示欧拉角旋转;<mass>标签的value属性指定连杆质量;<inertia>标签定义惯性矩和惯性积,对于简单形状,可参考 URDF 文档获取对应值,这里假设的数值仅为示例。
  • <visual>标签用于设置连杆的可视化属性。<geometry>标签内的<box>标签表示连杆形状为立方体,size属性指定长、宽、高;<material>标签定义连杆的材质,<color>标签的rgba属性设置颜色,四个值分别代表红、绿、蓝和透明度,取值范围为[0, 1] 。
  • <collision>标签描述连杆的碰撞属性,结构与<visual>类似,<geometry>中的形状用于碰撞检测,这里采用与可视化相同的立方体形状。
  1. 其余连杆(link1 - link5):按照相同方式定义其余连杆,根据实际尺寸和特性调整参数。例如link1
<link name="link1">
  <inertial>
    <origin xyz="0 0 0.1" rpy="0 0 0"/>
    <mass value="0.5"/>
    <inertia ixx="50" ixy="0" ixz="0" iyy="50" iyz="0" izz="50"/>
  </inertial>
  <visual>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <cylinder radius="0.05" length="0.2"/>
    </geometry>
    <material name="Red">
      <color rgba="1 0 0 1"/>
    </material>
  </visual>
  <collision>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <cylinder radius="0.05" length="0.2"/>
    </geometry>
  </collision>
</link>

此处link1形状为圆柱体,通过<cylinder>标签定义半径和长度,材质颜色设为红色。

(四)定义关节

  1. 第一个关节(joint1):在<robot>标签内,于base_linklink1定义之后添加关节定义:
    <joint name="joint1" type="revolute">
      <origin xyz="0 0 0.1" rpy="0 0 0"/>
      <parent link="base_link"/>
      <child link="link1"/>
      <axis xyz="0 0 1"/>
      <limit lower="-1.57" upper="1.57" effort="100" velocity="1"/>
    </joint>

  2. name属性为关节命名,type属性指定关节类型,revolute表示旋转关节,还有prismatic(平移关节)等类型。
  3. <origin>标签定义关节在父连杆坐标系中的位置和姿态。
  4. <parent><child>标签分别指定关节的父连杆和子连杆。
  5. <axis>标签定义关节的旋转轴,xyz表示轴的方向向量。
  6. <limit>标签设置关节的运动范围,lowerupper指定角度下限和上限(单位为弧度),effort表示关节最大驱动力矩,velocity表示关节最大运动速度。
  1. 其余关节(joint2 - joint5):类似地定义其余关节,根据机械臂实际结构调整参数。例如joint2
<joint name="joint2" type="revolute">
  <origin xyz="0 0 0.3" rpy="0 0 0"/>
  <parent link="link1"/>
  <child link="link2"/>
  <axis xyz="0 1 0"/>
  <limit lower="-1.57" upper="1.57" effort="100" velocity="1"/>
</joint>

这里joint2连接link1link2,旋转轴方向为y轴,运动范围与joint1相同(实际应用中应根据机械臂设计调整)。

(五)完成第六个连杆和关节

重复连杆和关节的定义步骤完成最后一个连杆link6和关节joint6的定义:

<link name="link6">
  <inertial>
    <origin xyz="0 0 0.1" rpy="0 0 0"/>
    <mass value="0.2"/>
    <inertia ixx="20" ixy="0" ixz="0" iyy="20" iyz="0" izz="20"/>
  </inertial>
  <visual>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <sphere radius="0.03"/>
    </geometry>
    <material name="Green">
      <color rgba="0 1 0 1"/>
    </material>
  </visual>
  <collision>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <sphere radius="0.03"/>
    </geometry>
  </collision>
</link>

<joint name="joint6" type="revolute">
  <origin xyz="0 0 0.1" rpy="0 0 0"/>
  <parent link="link5"/>
  <child link="link6"/>
  <axis xyz="0 0 1"/>
  <limit lower="-3.14" upper="3.14" effort="50" velocity="1"/>
</joint>

link6形状为球体,joint6连接link5link6,运动范围更大。

三、使用 URDF 模型

(一)在 RViz 中显示

  1. 启动 ROS 核心:在终端输入roscore并回车。
  2. 安装joint_state_publisherrobot_state_publisher:如果未安装,使用sudo apt-get install ros - <distro> - joint - state - publisher ros - <distro> - robot - state - publisher命令安装,<distro>为 ROS 版本,如melodic
  3. 发布关节状态:新建终端,输入rosrun joint_state_publisher joint_state_publisher,它会随机发布关节角度,用于显示机械臂的动态效果。
  4. 发布机器人状态:再新建终端,输入rosrun robot_state_publisher robot_state_publisher <path_to_urdf>/six_axis_robot.urdf,将 URDF 模型发布到 ROS 系统。
  5. 启动 RViz:打开新终端,输入rosrun rviz rviz,在 RViz 中添加RobotModel显示项,即可看到六轴机械臂模型。

(二)在 Gazebo 中仿真

  1. 安装 Gazebo 和相关插件:根据 ROS 版本安装对应版本的 Gazebo,以及ros - <distro> - gazebo - ros - packagesros - <distro> - gazebo - ros - control等插件。
  2. 创建 Gazebo 世界文件:例如world.world,定义仿真环境,如地面、光源等。
  3. 在 Gazebo 中加载机械臂模型:修改world.world文件,添加<include>标签加载 URDF 模型:
<include>
  <uri>model://six_axis_robot</uri>
  <pose>0 0 0 0 0 0</pose>
</include>
  1. 启动 Gazebo 仿真:在终端输入roslaunch gazebo_ros empty_world.launch world_name:=$(rospack find <package_name>)/worlds/world.world<package_name>为包含 URDF 文件和世界文件的 ROS 包名,即可在 Gazebo 中看到机械臂模型并进行仿真。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐