4. 常用仿真环境搭建

硬件在环(HITL)测试的第一步,是让飞控固件运行在一个"可信的虚拟世界"里。这个虚拟世界由仿真器提供:它负责计算刚体动力学、传感器输出、环境扰动,并通过串口或 UDP 与真实飞控板交换数据。PX4 与 ArduPilot 对仿真器的支持策略并不相同,选错仿真器往往会在后续 HITL 联调时付出成倍代价。本节按"物理保真度—接口方式—适配对象"三个维度,梳理四类常用仿真环境的安装与配置要点。

四类仿真器的定位差异

Gazebo 是通用机器人仿真平台,基于 ODE/Bullet/DART 物理引擎,支持复杂场景、多机协同与传感器插件(相机、激光雷达、IMU、GPS),是 PX4 官方主推的仿真后端,通过 px4 的 sitl_gazebo 桥接。jMAVSim 是 PX4 自带的轻量 Java 仿真器,只做简单刚体动力学,启动快、依赖少,适合验证姿态控制与基础航线,但不提供真实传感器噪声模型。AirSim 基于 Unreal Engine,主打高保真视觉与深度相机,常用于视觉导航、避障算法验证,对显卡要求高。JSBSim 是气动模型仿真器,采用 XML 定义气动系数,适合固定翼与高保真飞行力学验证,ArduPilot 对其支持较成熟。

四类仿真器与 PX4 / ArduPilot 适配关系 飞控固件(HITL 目标) PX4 (px4_fmu-v5) ArduPilot (CubeOrange) 接口协议层 MAVLink over UDP / 串口 (HITL) MAVLink / JSBSim net_fdm Gazebo 物理引擎:ODE/Bullet 传感器:相机/雷达/IMU 适配:PX4 主推 ArduPilot:gazebo 插件 依赖:ROS2 / Gazebo 11 保真度:★★★★ 启动耗时:中 jMAVSim 物理引擎:简化刚体 传感器:理想化输出 适配:PX4 自带 ArduPilot:不推荐 依赖:Java 11+ 保真度:★★ 启动耗时:快 AirSim 物理引擎:Unreal/PhysX 传感器:深度/语义相机 适配:PX4 通过桥接 ArduPilot:社区支持 依赖:UE4/5 + 显卡 保真度:★★★★★ 启动耗时:慢 JSBSim 物理引擎:气动 XML 模型 传感器:飞行状态量 适配:ArduPilot 成熟 PX4:需自建桥接 依赖:C++ 编译环境 保真度:★★★★(固定翼) 启动耗时:中

Gazebo:PX4 的首选后端

PX4 官方推荐使用 Gazebo Classic 11 或 Gazebo Sim(Ignition)。以 Ubuntu 22.04 为例,先安装 Gazebo 与 ROS2 Humble,再克隆 PX4 源码并初始化子模块:

sudo apt install gazebo libgazebo-dev
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
make px4_sitl gazebo-classic

执行后 PX4 会以 SITL 模式启动,Gazebo 弹出 iris 四旋翼模型,终端出现 pxh> 提示符。此时在 QGroundControl 中应能看到载具解锁并起飞。若要做 HITL,需要把 px4_fmu-v5 固件烧录到真实飞控板,将飞控的 TELEM2 通过 USB-TTL 接到主机,并在 px4 参数中设置 SYS_HITL=1、SER_TEL2_BAUD=921600,Gazebo 侧改用 make px4_sitl_default none_iris 并指定 --model iris --world empty,让仿真器只负责物理计算,飞控负责状态估计与控制。

jMAVSim:快速验证姿态环

jMAVSim 无需额外安装,PX4 源码中已包含。启动命令为 make px4_sitl jmavsim。它默认监听 4560 端口,与 PX4 的 MAVLink 实例对接。由于 jMAVSim 不模拟传感器噪声与延迟,用它验证 HITL 时,姿态角速度环能跑通,但位置估计会过于理想,不能作为 EKF 收敛性的判据。适合在修改控制参数后做"冒烟测试":解锁、起飞 2 米、悬停 10 秒、降落,观察是否出现振荡或发散。

AirSim:视觉与避障场景

AirSim 需要先安装 Unreal Engine 4.27 或 5.x,再编译 AirSim 插件。典型流程是:从 GitHub 下载 AirSim 源码,运行 build.cmd(Windows)或 ./build.sh(Linux),然后在 UE 编辑器中打开 AirSim/Unreal/Environments/Blocks 工程并播放。PX4 侧通过 settings.json 配置:

{
  "SettingsVersion": 1.2,
  "SimMode": "Multirotor",
  "Vehicles": {
    "PX4": {
      "VehicleType": "PX4Multirotor",
      "UseSerial": false,
      "UdpPort": 14560,
      "ControlPortLocal": 14540,
      "ControlPortRemote": 14580
    }
  }
}

启动后 AirSim 会向 PX4 发送 HIL_SENSOR 与 HIL_GPS 消息,PX4 以 HITL 模式运行。此时可在 AirSim 的 Python API 中读取深度图、分割图,用于视觉算法闭环。注意 AirSim 对 GPU 显存要求较高,建议 8 GB 以上,且 UE 场景加载时间通常在 30 秒以上。

JSBSim:固定翼气动验证

ArduPilot 对 JSBSim 的支持通过 sim_vehicle.py -j 参数启用。先安装 JSBSim:

sudo apt install jsbsim
cd ardupilot/Tools/autotest
./sim_vehicle.py -v ArduPlane -j --console --map

JSBSim 使用 XML 描述气动系数,ArduPilot 自带 Rascal、Skywalker 等机型。HITL 时,将 SIM_JSBSIM 相关参数与真实飞控的 HIL_MODE 对齐,飞控通过串口接收 net_fdm 数据包。JSBSim 的优势在于能复现失速、螺旋等非线性气动现象,适合验证固定翼的包线保护逻辑。

选择建议:多旋翼 HITL 优先 Gazebo;快速回归测试用 jMAVSim;视觉/避障用 AirSim;固定翼气动验证用 JSBSim。四者并非互斥,可在同一台主机上共存,通过不同的启动脚本切换。

配置检查清单

检查项GazebojMAVSimAirSimJSBSim
MAVLink 端口14540/14580456014560net_fdm 5501
HITL 参数SYS_HITL=1SYS_HITL=1SYS_HITL=1HIL_MODE=1
串口波特率92160092160092160057600
典型启动耗时15–30 s3–5 s30–60 s10–20 s

完成安装后,建议先用 SITL 模式跑通一次完整起降,再切换到 HITL。切换时重点观察三处:飞控是否收到 HIL_SENSOR 心跳、QGC 中 EKF 是否收敛(水平位置方差小于 1 m²)、解锁后电机输出是否随仿真器姿态变化。若 EKF 不收敛,优先检查仿真器时间戳与飞控时钟是否同步,以及传感器噪声参数是否被正确注入。