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