第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属性可以随便起,但最好有意义。
<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>
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认识它?有两种方式:
- 直接加载URDF文件:用
robot_state_publisher发布模型 - 转换成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语法有问题。
1.5 知识体系结构图
下面这张图帮你理清本章的核心逻辑:
1.6 实战小贴士
写URDF时,有几个坑我踩过,分享给你:
- 坐标轴方向:ROS里x向前,y向左,z向上。别搞反了,否则机器人会倒着走。
- 单位统一:长度用米,质量用千克。我见过有人用厘米,结果模型小得看不见。
- 命名规范:link和joint的名字别用中文,也别用空格。用下划线连接,比如
left_wheel。
check_urdf命令检查URDF语法。我每次写完都会跑一遍,能省不少调试时间。
好了,URDF的基础就聊到这儿。记住:link是零件,joint是连接,两者配合才能组成完整的机器人。下一节咱们会深入URDF的进阶用法,包括如何添加传感器和传动装置。