2. ArduPilot SITL 环境搭建:Windows/Linux 下的编译与启动、MAVProxy 基础使用
好,咱们直接进入正题。这一章,我带你亲手把 ArduPilot 的 SITL 环境跑起来。
很多人觉得环境搭建是体力活,照着文档敲命令就行。但我在项目里见过太多人卡在这一步——编译报错、Python 依赖冲突、MAVProxy 连不上……一卡就是半天。所以这一章,我会把那些「文档里没写」的坑,一个一个给你指出来。
本章核心目标:在 Windows 和 Linux 上分别完成 SITL 编译与启动,并熟练使用 MAVProxy 进行基础通信控制。
2.1 环境选择:Windows 还是 Linux?
我个人习惯用 Linux 做 SITL 开发。为什么?因为 ArduPilot 的编译工具链在 Linux 上最原生,依赖问题最少。但我也知道,很多飞控工程师的日常工作机是 Windows。
所以我的建议是:
| 平台 | 推荐方式 | 适合场景 | 我的评价 |
|---|---|---|---|
| Windows | WSL2 (Ubuntu 22.04) | 日常办公为主,偶尔仿真 | 能用,但注意文件系统性能 |
| Windows | Cygwin | 老项目兼容 | 不推荐,坑太多 |
| Linux | Ubuntu 22.04/24.04 原生 | 专职开发、持续集成 | 最稳,我主力用这个 |
我的经验:如果你用 Windows,一定把代码放在 WSL2 的文件系统里(比如 /home/username/),不要放在 /mnt/c/ 下。否则编译速度能慢 3-5 倍,我踩过这个坑。
2.2 Linux 环境搭建(Ubuntu 22.04)
咱们先从 Linux 开始。这是最干净的方式。
2.2.1 安装依赖
打开终端,执行以下命令。我建议你一行一行来,别一次性复制粘贴——万一哪行报错,你能立刻知道问题在哪。
# 更新包列表
sudo apt update
# 安装基础编译工具
sudo apt install git build-essential python3 python3-pip python3-venv
# 安装 ArduPilot 编译依赖
sudo apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf
# 安装 SITL 仿真依赖
sudo apt install libtool automake autoconf libexpat1-dev libsdl2-dev
# 安装 MAVProxy
pip3 install mavproxy --user
注意:Python 版本必须 ≥ 3.8。Ubuntu 22.04 自带 Python 3.10,没问题。如果你用 Ubuntu 20.04,记得先升级 Python。
2.2.2 克隆 ArduPilot 源码
我个人习惯把代码放在 ~/ardupilot 下。
cd ~
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
# 更新子模块(这一步很关键,容易忘)
git submodule update --init --recursive
这里有个细节:git submodule update --init --recursive 会下载所有依赖库,大概 1-2GB。网络不好的话,可以用 --depth 1 只拉最新版本。
2.2.3 编译 SITL 二进制
ArduPilot 的编译系统基于 waf。我第一次用的时候也觉得有点怪,但用顺手了会发现它比 Makefile 灵活很多。
# 配置编译环境
./waf configure --board sitl
# 编译(以 Copter 为例)
./waf copter
# 编译完成后,二进制在 build/sitl/bin/ 下
编译时间取决于你的 CPU。我的笔记本大概 3-5 分钟。如果报错,90% 是依赖没装全,检查一下上一步的 apt 安装。
2.3 Windows 环境搭建(WSL2 方式)
好,Windows 用户看这里。我推荐 WSL2,因为它和原生 Linux 几乎一样。
2.3.1 安装 WSL2
以管理员身份打开 PowerShell,执行:
# 启用 WSL
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 启用虚拟机平台
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 重启后,设置 WSL2 为默认版本
wsl --set-default-version 2
# 安装 Ubuntu 22.04
wsl --install -d Ubuntu-22.04
重启后,你会进入 Ubuntu 终端。设置用户名和密码,然后执行和 Linux 部分完全相同的步骤。
关键提醒:在 WSL2 里,sudo apt update 可能会因为网络问题失败。如果遇到,换个国内镜像源:
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
2.3.2 图形界面配置(可选)
如果你想在 WSL2 里看到 SITL 的图形窗口(比如模拟器的 3D 视图),需要安装 VcXsrv 或 WSLg。我个人建议直接用 WSLg,Windows 11 自带,省事。
2.4 启动 SITL 仿真
环境搭好了,咱们跑起来看看。
2.4.1 使用 sim_vehicle.py
ArduPilot 提供了一个超级好用的启动脚本:sim_vehicle.py。它在 Tools/autotest/ 目录下。
cd ~/ardupilot
# 启动 Copter SITL,默认地图
python3 Tools/autotest/sim_vehicle.py -v ArduCopter --map --console
参数说明:
-v ArduCopter:指定机型,可选 ArduPlane、ArduSub 等--map:打开 MAVProxy 的地图窗口--console:打开控制台窗口
启动后,你会看到类似这样的输出:
Starting simulator...
SIM_VEHICLE: Using defaults
APM: ArduCopter V4.5.0-dev
APM: Frame: QUAD
APM: Calibrating barometer
APM: Barometer calibration complete
APM: GPS 1: detected as u-blox at 115200 baud
...
Ready to fly
看到 "Ready to fly" 就说明成功了。这时候你的虚拟无人机已经在地面待命。
我的习惯:每次启动 SITL 时,我都会加 -w 参数(--wipe),清除之前的参数和日志。这样每次都是干净状态,避免旧参数干扰。
python3 Tools/autotest/sim_vehicle.py -v ArduCopter --map --console -w
2.5 MAVProxy 基础使用
MAVProxy 是 ArduPilot 生态里最核心的地面站工具之一。它不像 Mission Planner 那样有华丽的 GUI,但它的命令行控制能力极强——说白了,它是给「懂行」的人用的。
2.5.1 连接与基本命令
当你用 sim_vehicle.py 启动 SITL 时,MAVProxy 已经自动连接上了。它的命令行界面就是你的控制台。
常用命令:
| 命令 | 功能 | 示例 |
|---|---|---|
mode |
切换飞行模式 | mode GUIDED |
arm |
解锁电机 | arm throttle |
takeoff |
起飞到指定高度 | takeoff 10 |
rc |
发送遥控通道值 | rc 3 1500 |
param |
查看/修改参数 | param show ARMING_CHECK |
status |
查看无人机状态 | status |
2.5.2 实操:让虚拟无人机起飞
咱们来飞一下。在 MAVProxy 命令行里依次输入:
# 1. 切换到 GUIDED 模式
mode GUIDED
# 2. 解锁
arm throttle
# 3. 起飞到 10 米高度
takeoff 10
你会看到控制台输出:
GUIDED
ARMED
Takeoff started
APM: Takeoff to 10.0m
APM: Altitude 1.0m
APM: Altitude 5.0m
APM: Altitude 10.0m
Reached target altitude
同时,地图窗口上会显示无人机的位置和轨迹。嗯,第一次看到自己「飞」起来,还是挺有成就感的。
注意:如果你在 WSL2 下运行,地图窗口可能打不开。别慌,这是图形转发的问题。你可以用 --no-map 参数启动,然后通过 status 命令看数据。
2.5.3 日志与数据流
MAVProxy 默认会记录所有 MAVLink 消息到日志文件。你可以在启动目录下找到 mav.log 文件。
我个人经常用 script 命令录制操作过程,方便回放分析:
# 开始录制
script start my_flight
# 执行操作...
# 停止录制
script stop
录制的文件可以用 script replay 回放,这对调试非常有用。
2.6 常见问题与避坑
我把这些年遇到的高频问题列出来,你遇到了直接对照:
- 编译报错 "Python.h not found":安装
python3-dev包。 - MAVProxy 启动后闪退:检查 Python 版本,不要用 Python 2。
- 地图窗口空白:WSL2 下需要安装 VcXsrv,或者直接用
--no-map。 - 解锁失败 "Pre-arm check failed":用
param show ARMING_CHECK查看具体原因,通常是罗盘或 GPS 未校准。
我曾经遇到过一个特别隐蔽的问题:在 WSL2 里编译 SITL,每次编译到 80% 就卡死。查了两天,发现是 Windows Defender 实时扫描干扰了文件写入。解决方案:把 ardupilot 目录加入 Defender 排除列表。