1. SITL 仿真环境搭建:ArduPilot SITL 安装、MAVProxy 配置、仿真环境验证

做 MAVLink 数据流分析,第一步得有个能跑起来的仿真环境。我个人习惯用 ArduPilot 的 SITL(Software In The Loop),说白了就是把飞控固件当普通程序跑在电脑上,不用接硬件。你想想看,调试 MAVLink 消息的时候,能随时暂停、改参数、甚至故意制造异常,这比对着真实飞控方便太多了。

这一章我们就从零搭一套 SITL 环境。我会把安装步骤、配置要点、验证方法都过一遍,中间穿插一些我踩过的坑。

1.1 环境准备与依赖安装

先确认你的系统。我推荐 Ubuntu 20.04 或 22.04,Windows 用 WSL2 也行,但原生 Linux 最省心。

打开终端,先把基础依赖装上:

sudo apt update
sudo apt install git python3-pip python3-venv build-essential \
                 libtool autoconf automake pkg-config \
                 libexpat1-dev libz-dev libbz2-dev \
                 ccache gawk
小提示: 如果你在 WSL2 下操作,记得把项目放在 Linux 文件系统里(比如 ~/workspace),别放 /mnt/c/ 下,否则编译速度会慢得让你怀疑人生。

1.2 克隆 ArduPilot 源码

找个工作目录,把代码拉下来:

cd ~
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive

这里有个坑——git submodule update 这一步会下载很多子模块,网络不好容易超时。我建议用代理,或者直接加 --depth 1 参数只拉最新版本:

git submodule update --init --recursive --depth 1

嗯,这样快很多。不过如果你需要切换历史版本,就别加 --depth 了。

1.3 安装 MAVProxy

MAVProxy 是我们和 SITL 通信的桥梁。它是个 Python 工具,负责转发、过滤、记录 MAVLink 数据流。

pip3 install --user mavproxy

装完后验证一下:

mavproxy.py --version

如果提示找不到命令,检查 ~/.local/bin 是否在 PATH 里。我遇到过好几次这个问题,加一行到 ~/.bashrc 就行:

export PATH=$PATH:~/.local/bin

1.4 编译 SITL 固件

ArduPilot 支持多种机型。我们先用四旋翼(QuadPlane 或 Copter)做演示:

cd ~/ardupilot
./waf configure --board sitl
./waf copter

编译时间取决于机器性能,一般 5-15 分钟。第一次编译会下载工具链,后面就快了。

注意: 编译时如果报错缺少 Python 模块,手动装一下 pip3 install future lxml。我曾经在 Ubuntu 22.04 上遇到 future 模块缺失,折腾了半小时才发现。

1.5 启动 SITL 并连接 MAVProxy

编译成功后,启动仿真:

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

参数说明:

参数 作用
-v ArduCopter 指定机型为四旋翼
--map 打开地图窗口
--console 打开控制台窗口

启动后你会看到终端里不断输出 MAVLink 消息。默认情况下,SITL 在 UDP 端口 14550 上发送数据流。MAVProxy 会自动连接这个端口。

我个人习惯再加一个 --out 参数,把数据流转发到另一个端口,方便其他工具(比如 QGroundControl)同时连接:

./sim_vehicle.py -v ArduCopter --map --console --out 0.0.0.0:14551

1.6 验证仿真环境

环境搭好了,怎么确认它正常工作?我一般做三步验证:

  1. 检查 MAVProxy 输出:终端里应该能看到 HEARTBEAT 消息,频率 1Hz。这是最基本的存活信号。
  2. 发送指令测试:在 MAVProxy 终端输入 mode guided 切换模式,再输入 arm throttle 解锁。如果飞控响应了,说明通信链路没问题。
  3. 查看消息统计:输入 messages 命令,MAVProxy 会列出当前收到的所有 MAVLink 消息类型和频率。
关键验证点: 输入 status 命令,应该能看到飞控状态、GPS 锁定情况、电池电压等参数。如果全是 0 或者显示 "No GPS",说明仿真还没完全初始化,等几秒再试。

1.7 整体架构图

下面这张图展示了 SITL、MAVProxy 和我们分析工具之间的关系:

SITL 仿真环境架构 ArduPilot SITL UDP:14550 (默认) MAVProxy 消息转发/过滤/记录 分析工具 Python/MATLAB/... 转发端口 UDP:14551 (可选) QGroundControl 可视化地面站 说明: SITL 通过 UDP 14550 发送 MAVLink 数据流 → MAVProxy 接收并转发 → 分析工具或地面站从转发端口获取数据。MAVProxy 可同时连接多个下游工具。

1.8 常见问题与避坑

  • 端口被占用:如果启动时提示 Address already in use,说明 14550 端口被占用了。用 lsof -i :14550 查一下哪个进程在用,或者换个端口启动。
  • 仿真卡死:有时候 SITL 启动后没反应,可能是 sim_vehicle.py 找不到固件。检查一下 ~/ardupilot/build/sitl/bin/ 下有没有 arducopter 文件,没有就重新编译。
  • MAVProxy 连不上:输入 link add 手动指定端口试试,比如 link add udp:127.0.0.1:14550。
重要提醒: 每次启动 SITL 前,确保没有残留的 MAVProxy 进程。我习惯用 pkill -f mavproxy 清理一下,否则新实例会连到旧进程上,导致数据流混乱。