3. ArduPilot SITL 环境搭建:从源码到仿真
这一章,我们直接动手。说实话,很多初学者卡在环境搭建这一步,不是因为代码多难,而是因为流程不熟。我当年第一次编译 ArduPilot 时,光依赖库就装了三次才全。今天咱们把这条路走通,你跟着我的步骤来,基本不会翻车。
3.1 获取 ArduPilot 源码
源码管理用的是 Git。我个人习惯把工作目录放在 ~/workspace 下,方便管理多个项目。
cd ~/workspace
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive
这里有个坑——submodule update 这一步很容易因为网络问题失败。我曾经在公司内网环境下,卡了整整一下午。解决办法有两个:
- 用代理:
git config --global http.proxy http://你的代理地址:端口 - 或者直接换国内镜像源(如果你在墙内)
modules/ 目录下是否有 waf、MAVProxy 等关键文件夹。如果为空,重新执行 git submodule update --init --recursive。
3.2 安装编译依赖
ArduPilot 官方提供了自动化安装脚本。我个人推荐用 Tools/environment_install/install-prereqs-ubuntu.sh,它会把所有需要的包一次性装好。
cd ardupilot
Tools/environment_install/install-prereqs-ubuntu.sh -y
脚本跑完后,记得重新加载一下环境变量:
. ~/.profile
嗯,这一步很多人会忘。忘了的话,后面 waf 命令会找不到。
3.3 编译 Copter / Rover / Plane 固件
ArduPilot 的编译工具是 waf,不是 CMake。我第一次用的时候还愣了一下,心想怎么不用 CMake?后来发现 waf 在嵌入式交叉编译场景下确实更轻量。
编译前先配置目标板。SITL 仿真用的是 sitl 板型:
./waf configure --board sitl
配置成功后,就可以编译具体机型了。我一般三个都编一遍,方便后面切换测试:
| 机型 | 编译命令 | 生成目标 |
|---|---|---|
| Copter | ./waf copter |
build/sitl/bin/arducopter |
| Rover | ./waf rover |
build/sitl/bin/ardurover |
| Plane | ./waf plane |
build/sitl/bin/arduplane |
-j4 参数并行编译:./waf copter -j4。我笔记本是 8 核的,一般用 -j6,速度能快一倍。
3.4 SITL 模式启动与配置
编译完成后,启动 SITL 其实就一行命令。以 Copter 为例:
cd ~/workspace/ardupilot
sim_vehicle.py -w --map --console
参数说明:
-w:擦除旧的参数,相当于飞控恢复出厂设置。我第一次跑 SITL 时没加这个参数,结果参数表里残留了上一轮的数据,导致仿真行为异常。后来我养成了习惯,每次新仿真都加-w。--map:打开地图窗口,方便看飞机位置。--console:打开 MAVProxy 控制台,可以实时发指令。
启动后你会看到类似这样的输出:
Ready to fly
AP: ArduCopter V4.5.0-dev (e1f2c3d4)
AP: Frame: QUAD
GPS: 1 satellites (simulated)
...
看到 Ready to fly 就说明仿真环境跑起来了。这时候你可以用 MAVProxy 发送指令:
# 解锁
arm throttle
# 起飞到 10 米高度
takeoff 1000
注意高度单位是厘米,所以 takeoff 1000 就是 10 米。
3.5 核心流程总览
我把整个流程画了张图,方便你对照着操作:
3.6 常见问题与避坑
我整理了几个新手最容易踩的坑,你遇到了可以直接对照:
原因:ArduPilot 要求 Python 3.6 以上。我曾经在一台 Ubuntu 16.04 机器上折腾了半天,最后发现系统自带的 Python 还是 3.5。
解决:
sudo apt install python3.8,然后用 python3.8 替代 python3。
原因:MAVProxy 的地图组件依赖
python3-wxgtk4.0 包。我遇到过好几次,安装脚本没把这个包装上。解决:
sudo apt install python3-wxgtk4.0,然后重新启动。
原因:SITL 默认的仿真参数里,
SIM_GPS_DISABLE 可能没设对,或者 ARMING_CHECK 太严格。解决:在 MAVProxy 控制台输入
param set ARMING_CHECK 0 临时关闭安全检查,先验证仿真是否正常。
3.7 验证仿真是否正常工作
启动 SITL 后,我一般会做三个快速测试:
- 查看姿态数据:在 MAVProxy 控制台输入
status,看roll、pitch、yaw是否在合理范围(初始应为 0 左右)。 - 发送遥控指令:输入
rc 3 1500模拟油门摇杆中位,看电机输出是否有变化。 - 切换飞行模式:输入
mode guided,看控制台是否返回Mode: GUIDED。
这三个测试都通过,说明你的 SITL 环境已经搭建好了。接下来就可以用它做算法验证、参数调优,甚至跑完整的任务航线了。
takeoff 和 land 指令,确认整个链路没问题。这花不了两分钟,但能避免后面调试时怀疑环境有问题。