第1章:机器人模型URDF基础

大家好,我是你们的老朋友。今天咱们聊聊URDF——这个在Gazebo仿真里绕不开的话题。

URDF全称是Unified Robot Description Format,说白了就是用来描述机器人长什么样的文件格式。你想想看,要让机器人在仿真环境里动起来,总得先告诉计算机它长什么样吧?URDF就是干这个的。

1.1 URDF语法概览

URDF基于XML语法。如果你写过HTML,那上手会很快。我个人习惯把URDF文件看作机器人的「身份证」——它记录了每个零件的名字、尺寸、位置,以及它们之间的连接关系。

一个最基本的URDF文件长这样:

<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.2 0.2 0.1"/>
      </geometry>
    </visual>
  </link>
</robot>

嗯,这里要注意:<robot>是根标签,所有内容都得包在里面。name属性可以随便起,但最好有意义。

小技巧:我刚开始写URDF时,经常忘记加<robot>标签,结果Gazebo一直报错。后来我养成了一个习惯——先写根标签,再往里填内容。

1.2 link的定义

link就是机器人的「零件」。一个轮子、一个手臂、一个摄像头——每个刚体部件都是一个link。每个link可以包含三部分:

  • visual:视觉显示,就是你在Gazebo里看到的样子
  • collision:碰撞检测,决定了机器人能不能穿过障碍物
  • inertial:惯性参数,影响运动时的物理表现

我记得有一次做移动机器人项目,只定义了visual没定义collision,结果机器人直接穿墙而过。嗯,那场面挺尴尬的。

来看一个完整的link示例:

<link name="wheel">
  <visual>
    <geometry>
      <cylinder radius="0.05" length="0.02"/>
    </geometry>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <material name="black">
      <color rgba="0 0 0 1"/>
    </material>
  </visual>
  <collision>
    <geometry>
      <cylinder radius="0.05" length="0.02"/>
    </geometry>
  </collision>
  <inertial>
    <mass value="0.1"/>
    <inertia ixx="0.0001" ixy="0" ixz="0"
             iyy="0.0001" iyz="0"
             izz="0.0001"/>
  </inertial>
</link>
避坑指南:我曾经把collision的几何体设得比visual大很多,结果机器人还没碰到障碍物就停下了。后来我养成了习惯——visual和collision用同样的几何体,省心。

1.3 joint的定义

joint是连接两个link的「关节」。没有joint,机器人就是一盘散沙。joint有几种常见类型:

类型 说明 典型用途
fixed 固定连接,不能动 底盘和支架
revolute 旋转关节,有角度限制 机械臂关节
continuous 连续旋转,无限制 车轮
prismatic 滑动关节 升降台

来看一个joint的例子:

<joint name="wheel_joint" type="continuous">
  <parent link="base_link"/>
  <child link="wheel"/>
  <origin xyz="0.1 0 0" rpy="0 0 0"/>
  <axis xyz="0 1 0"/>
</joint>

这里parent是父link,child是子link。origin定义了子link相对于父link的位置。axis指定了旋转轴。你想想看,如果轴设错了,轮子可能横着转——我在项目里真遇到过。

1.4 在Gazebo中加载机器人模型

写好了URDF,怎么让Gazebo认识它?有两种方式:

  1. 直接加载URDF文件:用robot_state_publisher发布模型
  2. 转换成SDF格式:Gazebo原生支持SDF,URDF会自动转换

我个人推荐用第一种,因为URDF更通用,ROS生态里大部分工具都支持URDF。

启动命令很简单:

roslaunch gazebo_ros empty_world.launch
rosrun gazebo_ros spawn_model -file my_robot.urdf -urdf -model my_robot

嗯,这里要注意:spawn_model会把模型放到Gazebo世界里。如果模型没出现,八成是URDF语法有问题。

核心要点:URDF是机器人的「骨架」,link是「骨头」,joint是「关节」。写URDF时,先想清楚机器人的运动链,再动手写代码。

1.5 知识体系结构图

下面这张图帮你理清本章的核心逻辑:

URDF机器人模型 link 定义 visual 视觉显示 collision 碰撞检测 inertial 惯性参数 joint 定义 parent/child 关系 origin 位置偏移 axis 旋转轴 Gazebo加载 spawn_model 命令 robot_state_publisher URDF → SDF 转换

1.6 实战小贴士

写URDF时,有几个坑我踩过,分享给你:

  • 坐标轴方向:ROS里x向前,y向左,z向上。别搞反了,否则机器人会倒着走。
  • 单位统一:长度用米,质量用千克。我见过有人用厘米,结果模型小得看不见。
  • 命名规范:link和joint的名字别用中文,也别用空格。用下划线连接,比如left_wheel。
调试技巧:用check_urdf命令检查URDF语法。我每次写完都会跑一遍,能省不少调试时间。

好了,URDF的基础就聊到这儿。记住:link是零件,joint是连接,两者配合才能组成完整的机器人。下一节咱们会深入URDF的进阶用法,包括如何添加传感器和传动装置。

可可精品资料库