Gazebo
Gazebo 中的 URDF、XACRO 与 SDF:机器人建模核心格式解析
一、URDF(Unified Robot Description Format):机器人结构描述的基础
定义:URDF 是 ROS(机器人操作系统)中用于描述机器人三维结构、关节连接和运动学特性的 XML 格式,由 ROS 社区开发,广泛用于机器人仿真与控制。
核心组成与应用场景
-
关键元素
- Link(连杆):定义机器人的刚性部件,包含几何形状(如 box、cylinder、mesh)、质量、惯性矩阵等物理属性。
- Joint(关节):连接两个连杆,支持旋转(revolute)、滑动(prismatic)、固定(fixed)等运动类型,可设置运动范围和动力学参数。
- Visual(视觉模型):描述连杆的外观,用于仿真可视化。
- Collision(碰撞模型):定义连杆的碰撞形状,用于物理引擎计算。
-
示例片段
<robot name="my_robot">
<link name="base_link">
<inertial>
<mass value="1.0"/>
<!-- 惯性矩阵省略 -->
</inertial>
<visual>
<geometry><box size="0.2 0.2 0.1"/></geometry>
</visual>
<collision>
<geometry><box size="0.2 0.2 0.1"/></geometry>
</collision>
</link>
<joint name="base_to_wheel" type="revolute">
<parent link="base_link"/>
<child link="wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
</robot>
- 优缺点
- 优点:结构简单,与 ROS 生态深度集成,适合描述刚体机器人的运动学模型。
- 缺点:缺乏对传感器、灯光等仿真环境元素的描述,复杂模型编写繁琐。
二、XACRO(XML Macro):URDF 的高级扩展工具
定义:XACRO 是基于 URDF 的宏语言,通过变量定义、参数化建模和模块复用,简化复杂机器人模型的编写,本质是 URDF 的预处理格式。
核心特性与应用
-
关键功能
-
变量与参数化:通过
<property>
或<param>
定义可复用的数值(如长度、质量),避免重复编写。 -
宏定义(Macro ):将重复模块封装为宏,如定义轮子模型后多次实例化:
<macro name="wheel" params="name xyz rpy">
<!-- 轮子模型定义 -->
</macro>
<wheel name="left_wheel" xyz="0.1 0.05 0" rpy="0 0 0"/> -
条件编译:通过
<if>
<else>
根据参数动态生成模型,适合多版本机器人配置。
-
-
优势
- 代码复用:减少重复代码,如四足机器人的四条腿可通过宏实例化,只需修改参数。
- 维护性:集中管理全局参数(如机器人高度、关节限制),修改一处即可应用于整个模型。
三、SDF(Simulation Description Format):Gazebo 仿真的专属格式
定义:SDF 是 Gazebo 物理引擎使用的场景描述格式,支持机器人模型、环境元素(如地形、光源)、传感器和物理规则的完整定义,由 Open Robotics 开发。
核心组成与 Gazebo 集成
-
关键元素(对比 URDF)
- World(世界):包含多个模型、物理引擎配置(如重力、摩擦系数)、环境属性(如天空盒、风速)。
- Model(模型):可包含多个 Link 和 Joint,与 URDF 结构类似,但扩展了传感器(如 Camera、LiDAR)和动态属性(如关节电机控制参数)。
- Plugin(插件):通过 C++/Python 插件扩展功能,如定义关节控制器、传感器数据输出接口。
-
SDF 与 URDF 的关系
- 兼容与扩展:SDF 可直接导入 URDF 模型,但 URDF 缺乏的传感器、物理引擎参数需在 SDF 中补充。
- 示例对比:URDF 定义机器人结构,SDF 在此基础上添加 Gazebo 特有的仿真参数(如关节阻尼、传感器噪声模型)。
-
典型结构
<sdf version="1.9">
<world name="default">
<include>
<uri>model://my_robot</uri> <!-- 引用机器人模型 -->
</include>
<physics name="default_physics">
<gravity>0 0 -9.81</gravity>
<ode>
<solver>
<type>quick</type>
</solver>
</ode>
</physics>
<model name="my_robot">
<!-- 机器人Link和Joint定义,类似URDF -->
<sensor name="camera_sensor" type="camera">
<pose>0 0 0.5 0 0 0</pose>
<camera>
<horizontal_fov>1.57</horizontal_fov>
<image>
<width>640</width>
<height>480</height>
</image>
</camera>
</sensor>
</model>
</world>
</sdf>