4. 飞控硬件平台

说实话,我第一次接触ArduPilot的时候,最头疼的就是每次改完代码都要往飞控里烧录,然后跑到室外试飞。炸机是家常便饭,有一次还把桨叶打到了自己手上……疼了好几天。

后来我发现了SITL——软件在环仿真。说白了,就是在电脑上跑一个虚拟的飞控。你不需要任何硬件,就能完成90%的调试和测试工作。我个人习惯,现在每写一个新功能,先在SITL里跑三遍,再上真机。

核心观点:SITL不是玩具,是专业开发者的必备工具。它能帮你把炸机成本降到零,把调试效率提升10倍。

4.1 SITL是什么?为什么需要它?

SITL,全称Software In The Loop。它模拟了一整架无人机:飞控、传感器、GPS、甚至风力和磁场干扰。你可以在电脑上运行完整的ArduPilot固件,然后通过地面站或者MAVSDK跟它交互。

你想想看,如果没有SITL,你每次改个PID参数都要:

  • 编译固件 → 烧录 → 装桨 → 出门 → 起飞 → 看它晃不晃 → 回家改参数
  • 一个循环至少半小时,炸一次机还得修飞机

有了SITL,流程变成:

  • 改参数 → 启动仿真 → 观察 → 再改 → 再启动
  • 一个循环只要30秒,炸机?不存在的

我在项目里遇到过最典型的场景:客户要求无人机在强风环境下执行精准悬停。我直接在SITL里设置风速8m/s,反复调参,调好了再上真机验证。一次过,没炸机。

4.2 SITL的安装与配置

嗯,这里要注意。SITL的安装方式取决于你的操作系统。我推荐在Linux(Ubuntu 20.04/22.04)下使用,Windows和macOS也能跑,但坑比较多。

4.2.1 环境准备

你需要先装好这些基础工具:

# Ubuntu下执行
sudo apt update
sudo apt install git python3-pip python3-dev python3-wxgtk4.0
sudo apt install gcc-arm-none-eabi g++-arm-none-eabi
pip3 install --user mavproxy pymavlink dronekit

我曾经在Windows上折腾了整整两天,最后发现WSL2才是最稳的方案。如果你用Windows,我建议直接装WSL2 + Ubuntu。

4.2.2 下载ArduPilot源码

git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive

这里有个坑:git submodule update这一步会下载很多依赖库,网络不好的话容易超时。我建议用代理,或者直接下载release包。

4.2.3 启动SITL

以四旋翼为例,启动命令很简单:

cd ardupilot
sim_vehicle.py -v ArduCopter --map --console

这条命令会:

  • 编译ArduCopter固件(第一次会慢一些)
  • 启动SITL仿真
  • 打开一个地图窗口(--map)
  • 打开一个控制台(--console)

看到终端输出 Ready to fly 就说明成功了。这时候你可以用Mission Planner或者QGroundControl连接 tcp:127.0.0.1:5760,就像连接真飞控一样。

小技巧:如果你只想跑仿真不想看地图,可以去掉 --map 参数。我平时调试代码时只用控制台,省资源。

4.3 使用SITL进行飞行仿真测试

仿真环境跑起来了,接下来就是真正的测试环节。我一般把测试分为三个层次:

测试层次 测试内容 典型场景
基础功能 解锁、起飞、悬停、降落 验证固件能否正常运行
模式切换 Loiter、AltHold、Auto、RTL 验证飞行模式逻辑
故障注入 GPS丢失、电池低压、传感器故障 验证应急处理逻辑

4.3.1 基础飞行测试

启动SITL后,在MAVProxy控制台输入:

# 解锁
arm throttle
# 起飞到10米高度
mode guided
takeoff 10
# 悬停观察
# 降落
mode land

你会看到地图上的飞机图标开始移动。我个人习惯先做三次这样的基础起降,确认姿态控制没问题。

4.3.2 自动航线测试

这是SITL最实用的场景。你可以在Mission Planner里画一条航线,然后上传到SITL:

# 在MAVProxy中加载航线
wp load test.mission
# 切换到Auto模式
mode auto

飞机就会按照你设定的航点飞行。我记得有一次,客户要求无人机在山区执行测绘任务,航线有50多个航点。我直接在SITL里跑了一遍,发现有两个航点的高度设置不合理——一个在山脊背面,GPS信号会被遮挡。改完再飞,完美。

注意:SITL默认使用理想传感器模型。实际飞行中GPS会有漂移、气压计会有噪声。所以SITL测试通过后,一定要在真机上做低空悬停验证。

4.3.3 故障注入测试

这是SITL的杀手锏。你可以模拟各种故障,看看飞控的反应:

# 模拟GPS丢失
param set SIM_GPS_DISABLE 1
# 模拟电池低压
param set SIM_BAT_VOLTAGE 10.5
# 模拟强风
param set SIM_WIND_SPEED 15
param set SIM_WIND_DIR 180

我曾经用这个功能测试过一套应急降落逻辑。模拟GPS丢失后,飞控应该自动切换到RTL模式并降落。第一次测试发现逻辑有bug——飞控在RTL模式下一直盘旋,找不到降落点。如果在真机上遇到这种情况,飞机就丢了。但在SITL里,我只需要按Ctrl+C,改代码,重新跑。

4.4 SITL仿真架构图

下面这张图展示了SITL的完整工作流程。我建议你仔细看看,理解每个组件之间的关系:

SITL仿真架构图 用户输入 地面站 (MP/QGC) MAVProxy SITL 仿真核心 ArduPilot固件 + 传感器模型 + 物理引擎 传感器模型 物理引擎 环境模拟 仿真输出:姿态、位置、速度、状态 说明:用户通过地面站或MAVProxy发送指令,SITL核心运行固件并调用传感器/物理/环境模型,最终输出仿真结果

4.5 常见问题与避坑指南

用SITL时间长了,总会遇到一些奇奇怪怪的问题。我整理了几个最常见的:

问题1:SITL启动后,地面站连接不上

检查端口号。默认是 tcp:127.0.0.1:5760。如果你同时开了多个SITL实例,端口会递增。我曾经因为开了三个终端,连错了端口,折腾了半小时才发现。

问题2:仿真速度太慢

SITL默认是实时仿真。如果你只想快速测试逻辑,可以用 --speedup 10 参数加速10倍。我测试长航线时经常开到20倍速,几分钟跑完原本需要一小时的航线。

问题3:编译失败,提示缺少依赖

最常见的是 wxPython 没装好。我建议用 pip3 install wxPython==4.2.0 指定版本。另外,如果你在WSL2下运行,记得先装好 libx11-dev 和 libgl1-mesa-dev。

嗯,SITL的内容差不多就这些。你可能会觉得,不就是个仿真吗,有什么好学的?但我想说的是,SITL是ArduPilot开发中最被低估的工具。我见过太多人,代码写完了直接上真机,炸了再回来改。如果你能养成「先SITL,再真机」的习惯,你的开发效率至少翻一倍。