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 入门阶段的核心逻辑:
3.7 常见问题与避坑
- Gazebo 启动后黑屏:检查显卡驱动,或者尝试
export LIBGL_ALWAYS_SOFTWARE=1强制使用软件渲染(性能会下降,但至少能跑)。 - 模型加载后没有螺旋桨转动:检查插件是否加载成功。在终端里看有没有
[INFO] [GazeboIMUPlugin] Loaded之类的日志。 - 无人机起飞后剧烈抖动:大概率是 PID 参数没调好,或者 SDF 文件里的转动惯量写错了。我遇到过最离谱的一次,是把
ixx和iyy写反了,结果无人机一离地就翻跟头。
一个小技巧:在 Gazebo 里按 Ctrl+T 可以打开主题选择器,查看所有正在发布的仿真话题。比如 /gazebo/model/iris/pose 就是无人机当前位姿,可以用来验证模型是否正确加载。