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的完整工作流程。我建议你仔细看看,理解每个组件之间的关系:
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,再真机」的习惯,你的开发效率至少翻一倍。