1. SITL仿真环境搭建:从源码编译ArduPilot SITL,配置MAVProxy与仿真参数

好,咱们直接进入正题。SITL仿真,说白了就是在一台普通电脑上跑飞控固件,让它以为自己真的挂在一架飞机上。我刚开始接触这个的时候也觉得挺神奇——没有硬件,没有传感器,代码怎么知道自己“飞”起来了?

嗯,其实原理不复杂。ArduPilot的SITL把真实的硬件驱动层替换成了仿真接口,再配合一个叫MAVProxy的地面站工具,就能模拟出完整的飞控行为。今天这一章,我就带你亲手搭一套能用的环境。

本章目标:从零开始,在Ubuntu 22.04上编译ArduPilot SITL,配置MAVProxy,验证仿真器能正常启动。

1.1 环境准备:你需要什么

我个人习惯用Ubuntu 22.04 LTS,当然20.04也行。Windows用户可以用WSL2,但说实话,原生Linux体验好得多。你至少需要:

  • 操作系统:Ubuntu 22.04 / 20.04,或Debian 11+
  • 磁盘空间:至少10GB空闲
  • 内存:4GB以上(8GB更稳)
  • 网络:能访问GitHub和PyPI

我的经验:有一次我在一台只有4GB内存的笔记本上编译,swap分区没配好,编译到一半直接OOM了。建议提前配好4GB swap,省得中途翻车。

1.2 从源码编译ArduPilot SITL

这一步是核心。我们直接拉最新的稳定分支,然后编译Copter固件。为什么选Copter?因为电机解锁的流程在旋翼机上最典型,后面章节都会基于这个机型展开。

1.2.1 安装依赖

先把基础工具链装好。打开终端,执行:

sudo apt update
sudo apt install git python3-pip python3-venv build-essential \
                 libtool autoconf automake pkg-config \
                 libexpat1-dev libsdl2-dev libsdl2-image-dev \
                 libsdl2-ttf-dev libsdl2-gfx-dev \
                 libfreetype6-dev libjpeg-dev libtiff-dev \
                 libcurl4-openssl-dev libxml2-dev \
                 rapidjson-dev libzmq3-dev libczmq-dev \
                 libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

这里有个坑——libsdl2-dev 这组库是SITL图形界面需要的,如果你漏装了,编译能过但仿真窗口打不开。我曾经排查了半天才发现是SDL2没装全。

1.2.2 克隆代码并编译

cd ~
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git checkout Copter-4.5.7  # 我用的是这个稳定版
git submodule update --init --recursive

子模块更新这一步比较慢,取决于网络。我建议用代理或者提前把子模块缓存好。接下来编译:

./waf configure --board sitl
./waf copter

编译时间取决于你的CPU。我的i7-12700大概需要8分钟。如果看到 Build commands will be executed 和最后的 'build/sitl' finished successfully,说明编译通过。

注意:编译过程中如果报错 Python.h: No such file or directory,说明缺python3-dev。装一下 sudo apt install python3-dev 就行。别问我怎么知道的——我踩过。

1.3 配置MAVProxy

MAVProxy是ArduPilot生态里最常用的地面站工具,轻量、可脚本化。我个人觉得它比Mission Planner更适合做仿真调试,因为所有操作都能在终端里完成。

1.3.1 安装MAVProxy

pip3 install mavproxy --user

装完后确认一下版本:

mavproxy.py --version

如果提示 command not found,检查一下 ~/.local/bin 是否在PATH里。加一行到 ~/.bashrc:

export PATH=$PATH:$HOME/.local/bin
source ~/.bashrc

1.3.2 启动仿真并连接MAVProxy

先启动SITL仿真器。在ardupilot目录下执行:

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

参数说明:

参数 作用
-v ArduCopter 指定机型为Copter
--map 打开2D地图窗口
--console 打开MAVProxy控制台

启动后你会看到MAVProxy的终端界面,输入 status 查看飞控状态。如果显示 armed: False,说明仿真器正常运行,电机还没解锁——这正是我们后面要讲的内容。

小技巧:如果地图窗口不显示,检查一下 --map 参数是否拼写正确。我有一回手滑打成了 --mapp,窗口死活不出来,排查了十分钟才发现多打了个p。

1.4 仿真参数配置

默认的SITL参数已经能跑,但为了后续电机解锁流程更贴近真实,我建议调整几个关键参数。用MAVProxy的 param set 命令:

param set ARMING_CHECK 0
param set SIM_SPEEDUP 1
param set FS_GPS_ENABLE 0
param set GPS_TYPE 0

这些参数的含义:

参数名 值 说明
ARMING_CHECK 0 关闭所有解锁前检查,方便调试
SIM_SPEEDUP 1 仿真速度倍率,1倍速最稳定
FS_GPS_ENABLE 0 关闭GPS故障保护
GPS_TYPE 0 禁用GPS,室内仿真不需要

注意:ARMING_CHECK设为0只是为了教学方便。实际真机调试时千万别这么干——跳过安全检查等于把命交给运气。我见过有人忘了开GPS保护,仿真里没事,真机一解锁直接翻跟头。

1.5 验证环境是否就绪

环境搭好了,咱们验证一下。在MAVProxy终端输入:

arm throttle

如果看到 ARMED 状态变为 True,说明仿真器响应正常。然后输入 disarm 解锁。整个过程应该没有报错。

再检查一下仿真参数是否生效:

param show ARMING_CHECK

返回值应该是 0。如果不对,重新 param set 一次。

1.6 本章知识体系

下面这张图把整个环境搭建的流程串起来了,你可以对照着检查自己走到哪一步:

SITL仿真环境搭建流程 安装系统依赖 克隆ArduPilot源码 编译SITL固件 安装MAVProxy 启动仿真并连接 配置仿真参数 验证解锁/锁定 ⚠ 常见问题 • 编译缺Python.h → 装python3-dev • MAVProxy找不到 → 检查PATH • 地图不显示 → 检查SDL2库

到这步,你的SITL仿真环境就搭好了。后面我们会在这个环境里一步步走完电机解锁的完整流程——从参数检查到解锁成功,每一步我都会把原理和实操掰开揉碎讲清楚。