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
小技巧: 第一次编译会比较慢,大概 5-10 分钟。你可以加 -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 核心流程总览

我把整个流程画了张图,方便你对照着操作:

ArduPilot SITL 环境搭建流程 ArduPilot SITL 环境搭建流程 1. 获取源码 2. 安装编译依赖 3. 配置板型 (--board sitl) 4. 编译固件 (./waf copter) 5. 启动 SITL 仿真 关键命令速查 git clone + submodule install-prereqs-ubuntu.sh ./waf configure --board sitl ./waf copter && sim_vehicle.py

3.6 常见问题与避坑

我整理了几个新手最容易踩的坑,你遇到了可以直接对照:

问题 1:编译时报错 "Python 版本过低"
原因:ArduPilot 要求 Python 3.6 以上。我曾经在一台 Ubuntu 16.04 机器上折腾了半天,最后发现系统自带的 Python 还是 3.5。
解决:sudo apt install python3.8,然后用 python3.8 替代 python3。
问题 2:sim_vehicle.py 启动后地图窗口空白
原因:MAVProxy 的地图组件依赖 python3-wxgtk4.0 包。我遇到过好几次,安装脚本没把这个包装上。
解决:sudo apt install python3-wxgtk4.0,然后重新启动。
问题 3:解锁后电机不转
原因:SITL 默认的仿真参数里,SIM_GPS_DISABLE 可能没设对,或者 ARMING_CHECK 太严格。
解决:在 MAVProxy 控制台输入 param set ARMING_CHECK 0 临时关闭安全检查,先验证仿真是否正常。

3.7 验证仿真是否正常工作

启动 SITL 后,我一般会做三个快速测试:

  1. 查看姿态数据:在 MAVProxy 控制台输入 status,看 roll、pitch、yaw 是否在合理范围(初始应为 0 左右)。
  2. 发送遥控指令:输入 rc 3 1500 模拟油门摇杆中位,看电机输出是否有变化。
  3. 切换飞行模式:输入 mode guided,看控制台是否返回 Mode: GUIDED。

这三个测试都通过,说明你的 SITL 环境已经搭建好了。接下来就可以用它做算法验证、参数调优,甚至跑完整的任务航线了。

我的习惯: 每次搭建完新环境,我都会跑一遍 Copter 的 takeoff 和 land 指令,确认整个链路没问题。这花不了两分钟,但能避免后面调试时怀疑环境有问题。