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 对其支持较成熟。
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 的优势在于能复现失速、螺旋等非线性气动现象,适合验证固定翼的包线保护逻辑。
配置检查清单
| 检查项 | Gazebo | jMAVSim | AirSim | JSBSim |
|---|---|---|---|---|
| MAVLink 端口 | 14540/14580 | 4560 | 14560 | net_fdm 5501 |
| HITL 参数 | SYS_HITL=1 | SYS_HITL=1 | SYS_HITL=1 | HIL_MODE=1 |
| 串口波特率 | 921600 | 921600 | 921600 | 57600 |
| 典型启动耗时 | 15–30 s | 3–5 s | 30–60 s | 10–20 s |
完成安装后,建议先用 SITL 模式跑通一次完整起降,再切换到 HITL。切换时重点观察三处:飞控是否收到 HIL_SENSOR 心跳、QGC 中 EKF 是否收敛(水平位置方差小于 1 m²)、解锁后电机输出是否随仿真器姿态变化。若 EKF 不收敛,优先检查仿真器时间戳与飞控时钟是否同步,以及传感器噪声参数是否被正确注入。