3、Gazebo仿真器入门:安装、启动与无人机模型加载

Gazebo 这东西,说白了就是飞控开发者的「虚拟试飞场」。我在做 PX4 原生固件调试那会儿,真机炸过两次,一次是参数写错,一次是传感器没校准。从那以后,我养成了个习惯——先在 Gazebo 里跑三圈,再上真机。这一章,咱们就把这个虚拟试飞场搭起来。

3.1 安装 Gazebo:别踩这些坑

Gazebo 的安装其实不复杂,但版本问题容易让人头疼。我个人习惯用 Gazebo 11,它和 ROS Noetic 配合最稳。

核心原则:Gazebo 版本必须与 ROS 版本匹配。Noetic 配 Gazebo 11,Melodic 配 Gazebo 9。混着装,启动时会报一堆找不到插件的错。

安装命令很简单,一行搞定:

sudo apt install gazebo11 gazebo11-plugin-base libgazebo11-dev

装完之后,验证一下:

gazebo --version
# 输出应该类似:Gazebo multi-robot simulator, version 11.x.x

我曾经遇到过:装完 Gazebo 后启动黑屏,折腾了半天才发现是显卡驱动问题。如果你在虚拟机里跑,记得开启 3D 加速;如果是双系统,确保 NVIDIA/AMD 驱动正常。Gazebo 对 OpenGL 依赖很重,驱动不对直接罢工。

3.2 启动 Gazebo:空世界与加载模型

先启动一个空世界,看看环境是否正常:

gazebo --verbose worlds/empty.world

你会看到一个灰色的地面网格,中间什么都没有。嗯,这就是我们的「空白画布」。

接下来,加载无人机模型。我用的是 PX4 官方推荐的 Iris 四旋翼:

gazebo --verbose ~/PX4-Autopilot/Tools/sitl_gazebo/worlds/iris.world

如果一切正常,你会看到一架 Iris 无人机静静地停在地面上。这时候别急着点「Play」——先看看它的模型文件长什么样。

3.3 理解 URDF 与 SDF:模型文件的「基因」

Gazebo 里模型描述有两种格式:URDF(Unified Robot Description Format)和 SDF(Simulation Description Format)。

特性 URDF SDF
出身 ROS 原生格式 Gazebo 原生格式
支持多机器人 ❌ 只能描述单个机器人 ✅ 支持多机器人、世界环境
物理属性 需要额外 <gazebo> 标签扩展 原生支持摩擦、阻尼、碰撞
文件扩展名 .urdf .sdf
适用场景 ROS 生态内的模型描述 Gazebo 仿真环境

说白了,URDF 是 ROS 的「身份证」,SDF 是 Gazebo 的「户口本」。Iris 模型在 PX4 里用的是 SDF 格式,因为 Gazebo 需要完整的物理仿真参数。

3.4 拆解 Iris 的 SDF 文件

找到 Iris 的 SDF 文件:

~/PX4-Autopilot/Tools/sitl_gazebo/models/iris/iris.sdf

打开它,你会看到这样的结构:

<?xml version="1.0" ?>
<sdf version="1.6">
  <model name="iris">
    <!-- 1. 链接(Link):机身、电机、螺旋桨 -->
    <link name="base_link">
      <inertial>...</inertial>
      <visual>...</visual>
      <collision>...</collision>
    </link>

    <!-- 2. 关节(Joint):连接机身与电机 -->
    <joint name="rotor_0_joint" type="revolute">
      <parent>base_link</parent>
      <child>rotor_0</child>
      <axis>...</axis>
    </joint>

    <!-- 3. 插件(Plugin):飞控与仿真器的桥梁 -->
    <plugin name="gazebo_imu_plugin" filename="libgazebo_imu_plugin.so">
      ...
    </plugin>
  </model>
</sdf>

我刚开始看 SDF 文件时,觉得它又臭又长。后来发现,其实就三个核心部分:

  • Link(链接):定义每个部件的物理属性——质量、惯性、碰撞形状、视觉外观。Iris 有 1 个机身 + 4 个电机 + 4 个螺旋桨,一共 9 个 link。
  • Joint(关节):定义部件之间的连接方式。电机和机身之间是旋转关节(revolute),螺旋桨和电机之间是固定关节(fixed)。
  • Plugin(插件):这是最关键的。插件把 Gazebo 里的传感器数据(IMU、GPS、磁力计)传给飞控,同时接收飞控的电机控制指令。没有插件,无人机就是个 3D 模型,飞不起来。

我的经验:如果你想自定义无人机,比如换个大电池或者改机臂长度,直接改 SDF 文件里的 <inertial> 和 <visual> 就行。但注意,改完一定要重新计算转动惯量,否则仿真里飞起来会抖得跟筛子一样。

3.5 从 URDF 到 SDF:格式转换

有时候你拿到的是 URDF 文件(比如从 ROS 社区下载的机器人模型),但 Gazebo 需要 SDF。别慌,Gazebo 自带转换工具:

# 将 URDF 转换为 SDF
gz sdf -p your_model.urdf > your_model.sdf

不过要注意,转换后的 SDF 文件可能缺少物理参数。URDF 里没有摩擦系数、阻尼系数这些信息,转换后需要手动补充。我曾经偷懒直接用转换结果跑仿真,结果无人机一启动就原地打转——因为轮子的摩擦系数是 0。

3.6 本章知识体系

下面这张图帮你理清 Gazebo 入门阶段的核心逻辑:

Gazebo 仿真器入门知识体系 安装 Gazebo 11 验证安装版本 启动空世界 加载 Iris 无人机 理解 SDF 结构 对比 URDF vs SDF Link(链接) Joint(关节) Plugin(插件) 自定义模型:修改 SDF → 重新计算惯量 → 验证仿真 💡 核心逻辑:安装环境 → 加载模型 → 理解结构 → 动手自定义

3.7 常见问题与避坑

  • Gazebo 启动后黑屏:检查显卡驱动,或者尝试 export LIBGL_ALWAYS_SOFTWARE=1 强制使用软件渲染(性能会下降,但至少能跑)。
  • 模型加载后没有螺旋桨转动:检查插件是否加载成功。在终端里看有没有 [INFO] [GazeboIMUPlugin] Loaded 之类的日志。
  • 无人机起飞后剧烈抖动:大概率是 PID 参数没调好,或者 SDF 文件里的转动惯量写错了。我遇到过最离谱的一次,是把 ixx 和 iyy 写反了,结果无人机一离地就翻跟头。

一个小技巧:在 Gazebo 里按 Ctrl+T 可以打开主题选择器,查看所有正在发布的仿真话题。比如 /gazebo/model/iris/pose 就是无人机当前位姿,可以用来验证模型是否正确加载。