第二章 仿真环境搭建:基于PX4/ArduPilot的软件在环(SITL)仿真环境搭建,Gazebo/JSBSim物理引擎配置

说实话,很多做飞控的朋友一上来就怼硬件,结果炸机炸到怀疑人生。我个人的经验是——先让飞机在电脑里飞明白,再让它真飞。这就是SITL的价值所在。

软件在环仿真,说白了就是把飞控代码当成一个普通程序跑在你的电脑上,然后跟一个物理引擎通信。物理引擎负责模拟飞机的气动特性、重力、风等等。你想想看,这比每次调试都去外场爽多了吧?

核心逻辑:SITL = 飞控固件(PX4/ArduPilot) + 物理引擎(Gazebo/JSBSim) + 通信桥梁(MAVLink/UDP)

SITL仿真环境架构 飞控固件 PX4 / ArduPilot 物理引擎 Gazebo / JSBSim 通信桥梁 MAVLink / UDP 姿态控制 位置估计 传感器模型 故障注入 日志分析 故障注入贯穿整个仿真链路,从传感器层到控制层均可模拟异常 适用于:算法验证 · 边界测试 · 失效模式分析 · 回归测试

2.1 为什么我推荐先搭SITL

我在2018年带一个无人机项目时,团队里有个小伙子特别自信,代码写完直接上真机。结果呢?起飞三秒就翻了,螺旋桨碎了两副。后来查原因,就是一个很小的姿态解算bug。从那以后,我定了个规矩——所有代码改动必须先过SITL测试。

SITL的好处其实很明显:

  • 零炸机成本——随便摔,摔完重启就行
  • 时间加速——你可以跑比真实时间快几倍的仿真
  • 故障注入方便——模拟GPS丢失、电机卡死、传感器漂移,这些在真机上很难复现
  • 调试手段丰富——GDB断点、printf日志、可视化工具随便用

小技巧:我个人习惯在SITL里跑一套完整的"故障注入测试用例集",每次代码有改动就自动跑一遍。这叫回归测试,能帮你省下大量排查问题的时间。

2.2 PX4 SITL环境搭建

PX4的SITL搭建其实不复杂,但有几个坑要注意。我一步步说。

2.2.1 环境准备

先确认你的系统。我建议用Ubuntu 20.04或22.04,Windows用户可以用WSL2。Mac也行,但有些坑。

# 安装依赖
sudo apt update
sudo apt install git zip cmake build-essential genromfs ninja-build
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt install python3-pip python3-dev python3-numpy
sudo apt install protobuf-compiler libprotobuf-dev
sudo apt install libeigen3-dev libopencv-dev

# 克隆PX4源码
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
make px4_sitl_default gazebo

嗯,这里要注意——--recursive参数不能少。我见过有人忘了加,结果编译到一半报错找不到子模块,折腾了半天。

2.2.2 启动仿真

编译成功后,启动就很简单了:

# 启动带Gazebo的SITL
make px4_sitl gazebo

# 如果你想指定机型
make px4_sitl gazebo_iris  # 四旋翼
make px4_sitl gazebo_plane # 固定翼
make px4_sitl gazebo_standard_vtol # 垂直起降固定翼

启动后你会看到两个窗口:一个是Gazebo的3D场景,另一个是PX4的终端。终端里会打印飞控的启动日志,包括姿态估计、GPS状态、传感器校准等信息。

注意:第一次启动Gazebo会比较慢,因为它要下载模型文件。如果你在公司内网或者网络不好,可以手动下载gazebo_models放到~/.gazebo/models目录下。我曾经在客户现场演示时网络断了,场面一度很尴尬...

2.3 ArduPilot SITL环境搭建

ArduPilot的SITL跟PX4有些不同。它更轻量,而且对Windows的支持更好。

2.3.1 安装步骤

# 克隆代码
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

# 安装依赖
git submodule update --init --recursive
./Tools/environment_install/install-prereqs-ubuntu.sh -y

# 编译SITL
./waf configure --board sitl
./waf copter  # 四旋翼
# 或者 ./waf plane  # 固定翼

ArduPilot的SITL启动方式更灵活。你可以直接用命令行启动:

# 启动四旋翼SITL
sim_vehicle.py -v ArduCopter --map --console

# 启动固定翼SITL
sim_vehicle.py -v ArduPlane --map --console

--map参数会打开一个地图界面,--console会打开控制台。这两个工具对调试很有帮助。

2.4 物理引擎配置:Gazebo vs JSBSim

说到物理引擎,很多人会问:Gazebo和JSBSim到底选哪个?我的看法是——看你的应用场景。

特性 Gazebo JSBSim
主要用途 多旋翼、地面机器人 固定翼、直升机
气动模型 基于物理引擎,较通用 基于航空标准,更精确
传感器仿真 丰富(激光雷达、摄像头等) 基础(IMU、GPS、空速)
场景复杂度 高(支持复杂3D场景) 低(主要关注飞行性能)
与PX4集成 原生支持 需额外配置
与ArduPilot集成 支持 原生支持

2.4.1 Gazebo配置要点

Gazebo的配置主要通过.world文件和.sdf文件。我一般会修改几个关键参数:

<!-- 修改重力加速度,模拟不同星球 -->
<gravity>0 0 -9.81</gravity>

<!-- 添加风场 -->
<wind>
  <linear_velocity>5 3 0</linear_velocity>
</wind>

<!-- 修改地面摩擦系数 -->
<surface>
  <friction>
    <ode>
      <mu>0.8</mu>
    </ode>
  </friction>
</surface>

你想想看,在火星上飞无人机是什么感觉?把重力改成3.71,再调低大气密度,就能模拟了。我在做火星无人机预研时就是这么干的。

2.4.2 JSBSim配置要点

JSBSim的配置基于XML,核心是飞行器模型文件。一个典型的固定翼模型包含:

<!-- 气动系数定义 -->
<function name="aero/coefficient/CL">
  <description>升力系数</description>
  <product>
    <property>metrics/Sw-sqft</property>
    <property>aero/qbar-psf</property>
    <table>
      <independentVar>fcs/alpha-deg</independentVar>
      <tableData>
        -10.0  -0.5
        0.0    0.2
        5.0    0.6
        10.0   1.0
        15.0   1.3
        20.0   1.1  <!-- 失速区域 -->
      </tableData>
    </table>
  </product>
</function>

这里有个关键点——失速区域的建模。很多初学者只给了线性段的数据,结果仿真时飞机怎么拉杆都不失速,这显然不对。我建议至少给到失速后的数据,哪怕粗略估计也行。

实战建议:如果你做多旋翼,用Gazebo就够了。如果你做固定翼,尤其是需要精确气动分析的,JSBSim更合适。我个人的做法是——先用JSBSim验证飞控算法,再用Gazebo做视觉和传感器集成测试。

2.5 常见问题与避坑指南

搭建环境时总会遇到各种问题。我挑几个最常见的说说:

  • 编译报错找不到头文件——多半是子模块没更新。运行git submodule update --init --recursive试试。
  • Gazebo启动后黑屏——检查显卡驱动。我遇到过Ubuntu默认的nouveau驱动不兼容,换成NVIDIA官方驱动就好了。
  • SITL启动后飞控不响应——检查端口占用。有时候QGroundControl先启动了,占用了14550端口。
  • 仿真时间不同步——SITL默认是实时运行,如果电脑性能不够,可以加--speed 0.5降低速度。

调试技巧:我习惯在启动SITL时加上--debug参数,这样能看到更详细的日志。另外,用gazebo --verbose启动Gazebo也能看到物理引擎的详细输出,对排查问题很有帮助。

好了,环境搭好了,下一件事就是往里面注入故障了。不过那是后面章节的内容。先把基础打牢,后面才能玩得转。


公众号:蓝海资料掘金营,微信deep3321