3. Gazebo仿真环境基础

Gazebo是PX4开发中最常用的机器人仿真平台,它提供了刚体动力学、传感器噪声模拟、光照与地形渲染以及物理碰撞检测能力。与纯数学仿真(如jMAVSim)不同,Gazebo能够加载复杂的三维环境模型,支持多机器人协同,并且允许用户自定义传感器插件。在PX4的仿真体系中,Gazebo通常作为“外部物理引擎”存在,PX4的SITL(Software In The Loop)进程通过MAVLink与Gazebo中的模型通信,形成“飞控逻辑在PC上运行、物理世界在Gazebo中模拟”的闭环。理解Gazebo的安装、启动流程、世界文件与模型格式,以及PX4的集成方式,是后续进行视觉避障、目标跟踪和复杂任务验证的前提。

① 模型层 ② 世界层 ③ 通信层 PX4 无人机模型 (iris_base.sdf) 传感器插件 (IMU/GPS/相机) URDF/SDF 描述 插件加载物理/视觉 世界文件 (empty.world) 环境元素 (地面/光照/建筑) 定义物理引擎参数 静态/动态物体 MAVLink (UDP 14540) PX4 SITL (姿态/位置控制) 传感器数据上行 控制指令下行 ④ 启动集成层 make px4_sitl gazebo gazebo --verbose QGroundControl MAVSDK/ROS2 PX4 SITL 通过 UDP 与 Gazebo 通信,Gazebo 负责物理仿真,PX4 负责飞控逻辑 世界文件加载模型,模型通过插件与 Gazebo 核心交互

上图展示了PX4与Gazebo集成的整体架构。左侧是模型层,包含无人机本体描述(SDF/URDF)和传感器插件;中间是世界层,定义了仿真环境的地形、光照和物理参数;右侧是通信层,MAVLink协议负责在PX4 SITL和Gazebo之间传递传感器数据与控制指令;底部是启动集成层,通过make px4_sitl gazebo命令一键拉起整个仿真链路。下面我们将从安装开始,逐步深入每个环节。

3.1 Gazebo的安装与启动

3.1.1 安装方式与版本选择

Gazebo的安装通常有两种途径:一是通过PX4的自动化脚本安装,二是手动安装ROS/Gazebo发行版。对于PX4开发而言,推荐使用Ubuntu LTS系统(20.04或22.04),并安装Gazebo 11(对应ROS Noetic)或Gazebo Classic(Ubuntu 22.04默认)。PX4官方脚本ubuntu_sim_common_deps.sh会自动安装匹配的Gazebo版本,避免依赖冲突。

# 方式一:PX4官方脚本(推荐)
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
bash ./Tools/setup/ubuntu.sh

# 方式二:手动安装Gazebo 11
sudo apt-get update
sudo apt-get install gazebo11 libgazebo11-dev
版本兼容性风险:Gazebo 9与PX4旧版本兼容,但新版本PX4(v1.13+)已默认使用Gazebo 11。若混用Gazebo Garden或Ignition版本,会导致模型加载失败或传感器插件不兼容。务必使用gazebo --version确认版本。

3.1.2 启动流程与验证

安装完成后,可以通过以下命令验证Gazebo是否正常工作:

# 启动空世界
gazebo --verbose worlds/empty.world

# 若使用PX4集成,直接运行
cd PX4-Autopilot
make px4_sitl gazebo

启动后,Gazebo窗口应显示一个灰色地面和默认光照。PX4终端会输出INFO [commander] Ready for takeoff,表示飞控已初始化。此时可以通过QGroundControl地面站连接UDP端口14550,看到无人机模型在三维世界中静止悬浮。

检查项命令/方法预期结果
Gazebo版本gazebo --versionGazebo 11.x
PX4 SITL进程ps aux | grep px4px4进程运行中
MAVLink连接QGC查看通信绿色连接,姿态数据更新
模型加载Gazebo左侧模型列表iris模型可见

3.1.3 常见启动问题排查

  • 模型不显示:检查~/.gazebo/models路径是否包含PX4模型,或设置GAZEBO_MODEL_PATH环境变量。
  • 端口冲突:若14540端口被占用,使用netstat -tulpn | grep 14540查找并释放。
  • 图形渲染失败:在虚拟机中需启用3D加速,或使用LIBGL_ALWAYS_SOFTWARE=1强制软件渲染。

3.2 世界文件(.world)的结构与定制

3.2.1 世界文件的核心组成

世界文件是Gazebo仿真环境的“总谱”,它定义了物理引擎参数、光照、地面、以及需要加载的模型集合。一个典型的.world文件包含以下关键部分:

<?xml version="1.0" ?>
<sdf version="1.6">
  <world name="px4_world">
    <physics type="ode">  <!-- 物理引擎 -->
      <max_step_size>0.001</max_step_size>
      <real_time_factor>1</real_time_factor>
    </physics>
    <include>  <!-- 加载地面 -->
      <uri>model://ground_plane</uri>
    </include>
    <include>  <!-- 加载光照 -->
      <uri>model://sun</uri>
    </include>
    <include>  <!-- 加载无人机模型 -->
      <uri>model://iris</uri>
      <pose>0 0 0.5 0 0 0</pose>
    </include>
  </world>
</sdf>

3.2.2 自定义世界环境的操作流程

  1. 复制默认世界:从PX4-Autopilot/Tools/sitl_gazebo/worlds复制empty.world为my_world.world。
  2. 添加障碍物:在<world>标签内添加<include>,引用已有的模型库模型(如model://cinder_block),或自定义模型。
  3. 调整物理参数:修改<gravity>、<wind>等标签,模拟不同环境。
  4. 保存并启动:使用gazebo my_world.world启动,或通过PX4启动参数指定世界文件。
实战技巧:在视觉仿真中,常需要添加纹理丰富的建筑或树木模型。可以从Gazebo模型库下载,或使用blender导出为SDF格式。注意模型面数不宜过高,否则会拖慢仿真速度。

3.2.3 世界文件与PX4的关联

PX4通过PX4_SITL_WORLD环境变量指定世界文件。例如:

export PX4_SITL_WORLD=$HOME/PX4-Autopilot/Tools/sitl_gazebo/worlds/my_world.world
make px4_sitl gazebo

若未设置,PX4默认加载empty.world。在视觉避障测试中,通常需要加载包含障碍物的世界文件,以验证无人机的感知与规划能力。

3.3 模型文件:SDF与URDF的解析与转换

3.3.1 SDF与URDF的核心差异

特性SDF(Simulation Description Format)URDF(Unified Robot Description Format)
适用场景Gazebo原生格式,支持物理/传感器ROS标准格式,偏运动学描述
物理属性内置摩擦、阻尼、碰撞需额外配置gazebo插件
传感器支持原生支持相机、IMU、激光雷达需通过gazebo_plugins扩展
多模型支持一个文件可包含多个模型一个文件仅描述一个机器人

PX4默认使用SDF格式,因为其传感器插件集成更直接。但若团队已有URDF模型(如从MoveIt导出),可通过gz sdf -p model.urdf > model.sdf命令转换。

3.3.2 模型文件的关键元素

<model name="iris">
  <link name="base_link">
    <inertial>  <!-- 质量与惯性矩阵 -->
      <mass>1.5</mass>
    </inertial>
    <visual>  <!-- 视觉外观 -->
      <geometry><mesh><uri>model://iris/meshes/iris.stl</uri></mesh></geometry>
    </visual>
    <collision>  <!-- 碰撞检测 -->
      <geometry><box><size>0.4 0.4 0.2</size></box></geometry>
    </collision>
  </link>
  <plugin name="imu_plugin" filename="libgazebo_imu_plugin.so"/>
</model>

3.3.3 模型调试案例

场景:在Gazebo中加载自定义四旋翼模型时,无人机起飞后剧烈抖动并翻倒。

分析过程:首先检查inertial参数,发现质量矩阵对角线值过小(ixx=0.001),导致角加速度过大。其次检查collision几何体,发现与visual网格不匹配,造成碰撞检测异常。

解决步骤:

  1. 将ixx/iyy/izz调整为0.02左右,匹配实际物理特性。
  2. 将碰撞盒尺寸改为与视觉模型一致(0.4×0.4×0.2)。
  3. 重启仿真,无人机稳定悬停。
经验总结:模型抖动90%以上源于惯性参数不合理或碰撞几何体错误。建议先用gz model --info检查模型参数,再逐步调整。

3.4 PX4与Gazebo的集成方式

3.4.1 集成原理与通信链路

PX4 SITL与Gazebo的集成基于UDP通信。PX4通过端口14540发送传感器数据(IMU、GPS、气压计)到Gazebo,Gazebo中的传感器插件接收后计算物理反馈,再通过端口14541将控制指令(电机转速)返回PX4。整个链路中,MAVLink协议负责数据封装,QGroundControl通过14550端口与PX4通信,实现地面站监控。

# 通信端口分配
14540: PX4 → Gazebo(传感器数据)
14541: Gazebo → PX4(电机指令)
14550: PX4 → QGC(遥测数据)

3.4.2 启动集成的方式对比

启动方式命令适用场景
一键启动make px4_sitl gazebo快速验证,默认加载iris模型
指定世界PX4_SITL_WORLD=xxx.world make px4_sitl gazebo自定义环境测试
多机仿真make px4_sitl gazebo-classic PX4_NUM_VEHICLES=3编队飞行测试
ROS集成roslaunch px4 posix_sitl.launch需要ROS话题通信时

3.4.3 集成调试的完整案例

背景:某团队需要验证PX4在强风环境下的抗扰动能力,但默认的empty.world没有风场模型。

实施过程:

  1. 在my_world.world中添加风场插件:
<plugin name="wind_plugin" filename="libgazebo_wind_plugin.so">
  <force>5 0 0</force>  <!-- 5N 沿X轴 -->
</plugin>
  1. 启动PX4并设置风速参数:param set WIND_VEL_X 5。
  2. 通过QGC观察无人机位置偏移,发现X方向漂移约1.2m。
  3. 调整PX4位置控制器的MPC_XY_P参数从1.0增至1.5,漂移减小至0.3m。

结果对比:风场插件生效后,无人机姿态角从0.5°增大至2.3°,但位置保持精度提升。该测试验证了PX4在外部扰动下的鲁棒性。

风险提示:风场插件会显著增加计算负载,若仿真帧率低于60Hz,可能导致控制不稳定。建议在性能较好的主机上运行,或降低风场强度。

3.4.4 集成中的常见误区

  • 误区一:认为Gazebo中的模型必须与真实无人机完全一致。实际上,只要质量、惯性和推力系数匹配,仿真结果就有参考价值。
  • 误区二:忽略real_time_factor设置。若该值小于1,仿真速度变慢,影响控制参数调试。
  • 误区三:在无图形界面的服务器上直接运行make px4_sitl gazebo会失败。应使用HEADLESS=1参数:HEADLESS=1 make px4_sitl gazebo。