第三节:模型基础——模型概念、文件格式与放置方法

各位同学,今天我们来聊聊Gazebo仿真里的“模型”。

模型是什么?说白了,就是机器人的“数字替身”。你想想看,真机调试多贵啊——摔一次几千块,烧一块板子可能上万。仿真模型就是让你在虚拟世界里随便折腾,零成本试错。

我个人习惯把模型分成三类:机器人本体模型(比如你设计的四轮小车)、环境模型(地面、墙壁、障碍物)、传感器模型(激光雷达、摄像头)。这三类在Gazebo里都是用同一种方式描述的,只是用途不同。

3.1 模型文件格式:SDF vs URDF

Gazebo支持两种模型格式:SDF(Simulation Description Format)和URDF(Unified Robot Description Format)。

我在项目中遇到过不少新手上来就问:“到底学哪个?”我的建议是:URDF是ROS的亲儿子,SDF是Gazebo的亲儿子。如果你主要用ROS,从URDF入手;如果你直接操作Gazebo,SDF更原生。

特性 URDF SDF
起源 ROS社区 Gazebo团队
支持物理属性 有限(需扩展) 原生完整支持
支持多机器人 单文件单机器人 单文件多机器人
闭链结构 不支持 支持
推荐场景 ROS + MoveIt 纯Gazebo仿真

嗯,这里要注意:URDF其实不能直接描述摩擦力、阻尼这些物理参数。Gazebo会通过一个叫gazebo_ros_control的插件来补充。而SDF天生就带这些,省事不少。

3.2 模型文件结构解剖

不管用哪种格式,核心结构都差不多。我拿一个最简单的“盒子模型”来拆解:

<!-- SDF格式示例 -->
<?xml version="1.0" ?>
<sdf version="1.6">
  <model name="my_box">
    <link name="body">
      <collision name="collision">
        <geometry>
          <box>
            <size>0.5 0.5 0.5</size>
          </box>
        </geometry>
      </collision>
      <visual name="visual">
        <geometry>
          <box>
            <size>0.5 0.5 0.5</size>
          </box>
        </geometry>
        <material>
          <ambient>1 0 0 1</ambient>
        </material>
      </visual>
      <inertial>
        <mass>1.0</mass>
        <inertia>
          <ixx>0.083</ixx>
          <iyy>0.083</iyy>
          <izz>0.083</izz>
        </inertia>
      </inertial>
    </link>
  </model>
</sdf>

看到没?一个模型由link(刚体部件)组成。每个link有三个关键部分:

  • collision:碰撞检测用的几何体。Gazebo用这个算物理碰撞,不是用visual。
  • visual:你看到的形状和颜色。可以比collision更精细,但物理上不参与。
  • inertial:质量、惯性张量。这个决定了物体怎么被推动、怎么旋转。
⚠️ 我曾经踩过的坑: 有一次我忘了给link加inertial标签,结果模型一加载就飘在天上,怎么推都不动。后来才发现——没有惯性,物理引擎就当它是“空气”。所以,每个link都必须有inertial,哪怕质量设成0.001都行。

3.3 从模型库加载模型

Gazebo自带一个在线模型库,里面有好几百个现成模型。怎么用?

  1. 打开Gazebo,点击左侧的“Insert”选项卡
  2. 你会看到一堆分类:Robots、Objects、Buildings...
  3. 点一下想要的模型,然后在场景里点一下,就放上去了

但说实话,在线加载有时候很慢。我个人习惯先把常用模型下载到本地:

# 下载模型库到本地
git clone https://github.com/osrf/gazebo_models.git ~/.gazebo/models

# 然后设置环境变量
export GAZEBO_MODEL_PATH=$HOME/.gazebo/models

这样加载速度会快很多。你想想看,每次仿真都要从GitHub拉模型,网络一卡就等半天,多耽误事。

3.4 手动放置模型

手动放置模型有两种方式:图形界面拖拽和命令行/代码控制。

图形界面方式:

  • 点击“Insert” → 选择模型 → 在场景中点击放置
  • 放置后可以用“Translate”工具(快捷键T)移动
  • 用“Rotate”工具(快捷键R)旋转
  • 按Ctrl+Z可以撤销操作

命令行方式(更精确):

# 通过ros服务放置模型
rosservice call /gazebo/spawn_sdf_model "{
  model_name: 'my_robot',
  model_xml: '<?...>',
  initial_pose: {
    position: {x: 1.0, y: 2.0, z: 0.5},
    orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}
  }
}"
💡 小技巧: 如果你要精确放置多个模型(比如搭建一个仓库环境),建议用Python脚本调用rospy的spawn_model函数。我曾经帮一个客户搭建物流仿真环境,手动拖了50个货架,累得手酸。后来写了个循环脚本,3秒搞定。

3.5 模型知识体系总览

下面这张图是我自己整理的模型知识结构,帮你快速建立全局认知:

Gazebo 模型知识体系 模型 (Model) 文件格式 URDF(ROS生态) SDF(Gazebo原生) 模型组成 Link(刚体部件) Joint(关节连接) Plugin(插件扩展) 加载方式 在线模型库 本地文件加载 手动拖拽放置

📌 核心要点回顾:

  • 模型 = link(部件)+ joint(关节)+ plugin(插件)
  • 每个link必须有collision、visual、inertial三件套
  • URDF适合ROS用户,SDF适合纯Gazebo用户
  • 模型加载优先用本地库,避免网络延迟

好了,模型基础就讲到这里。记住一句话:模型是仿真的基石。模型建得不对,后面所有仿真结果都是错的。我见过太多人花几周调控制算法,最后发现是模型参数写错了——白白浪费时间。

可可精品资料库