1. SITL 仿真环境搭建:ArduPilot SITL 简介、环境配置与首次启动

各位同学,欢迎来到第一课。做飞控数据采集,第一步不是焊板子,也不是调 PID,而是先把仿真环境跑起来。我个人习惯把 SITL 叫做“软件在环仿真”,说白了就是用一台电脑模拟一架无人机。你想想看,真机炸一次几千块,仿真里随便炸,重启就行。

我刚开始接触 ArduPilot 时,总觉得仿真不如真机靠谱。后来有一次在真机上调试一个偏航角数据采集逻辑,结果飞控意外重启,飞机直接侧翻。从那以后,我再也不敢跳过 SITL 验证了。嗯,这章我们就来把环境搭好。

1.1 ArduPilot SITL 是什么?

SITL(Software In The Loop)是 ArduPilot 提供的一套纯软件仿真方案。它不依赖任何硬件,直接在 PC 上运行飞控固件,并通过 MAVLink 协议与地面站通信。

核心价值:你可以在没有飞控板、没有 GPS、没有遥控器的情况下,完整模拟一架四旋翼的飞行行为,并采集到与真机几乎一致的传感器数据流。

它的工作逻辑是这样的:

  • 飞控固件:编译为本地可执行文件,运行在 PC 上
  • 仿真模型:模拟物理引擎(重力、空气阻力、电机响应)
  • MAVLink 桥接:通过 UDP/TCP 对外输出飞控数据
  • 地面站/脚本:通过 MAVLink 接收数据,或发送指令
SITL 仿真架构图 ArduPilot SITL 飞控固件(本地进程) 仿真模型 物理引擎 + 传感器模拟 MAVLink 数据流 UDP/TCP 端口输出 控制指令 传感器反馈 数据封装 地面站 / 数据采集脚本 MAVProxy / Mission Planner / Python UDP 14550 遥控指令 说明:SITL 不依赖任何硬件,所有传感器数据由仿真模型生成,适合数据采集算法验证

1.2 Windows 环境配置

我建议 Windows 用户优先使用 WSL2(Windows Subsystem for Linux)。为什么?因为 ArduPilot 的原生编译工具链在 Linux 下最稳定。我在 Windows 上直接编译踩过不少坑,后来切到 WSL2 就再也没折腾过。

1.2.1 安装 WSL2

# 以管理员身份打开 PowerShell,执行:
wsl --install -d Ubuntu-22.04

# 安装完成后重启,设置用户名和密码
# 更新软件源
sudo apt update && sudo apt upgrade -y

小技巧:WSL2 默认安装在 C 盘。如果你 C 盘空间紧张,可以在安装前用 wsl --export 和 wsl --import 迁移到 D 盘。我曾经因为 C 盘爆满导致编译失败,折腾了一下午才找到原因。

1.2.2 安装依赖

# 安装编译工具和 Python
sudo apt install -y git build-essential python3 python3-pip

# 安装 ArduPilot 编译依赖
sudo apt install -y g++-arm-linux-gnueabihf g++-aarch64-linux-gnu

# 安装 MAVProxy
pip3 install mavproxy --user

1.3 Linux 环境配置(原生)

如果你用的是 Ubuntu 20.04 或 22.04,可以直接在宿主机上搭建。我个人更推荐这种方式,因为性能损耗更小,IO 响应更快。

# 安装基础工具
sudo apt update
sudo apt install -y git build-essential python3 python3-pip

# 安装 ArduPilot 编译依赖
sudo apt install -y g++-arm-linux-gnueabihf g++-aarch64-linux-gnu

# 安装 MAVProxy
pip3 install mavproxy --user

# 将用户 bin 目录加入 PATH
echo 'export PATH=$PATH:$HOME/.local/bin' >> ~/.bashrc
source ~/.bashrc

注意:如果你使用的是 Ubuntu 24.04,Python 版本可能默认为 3.12,部分 MAVProxy 依赖可能不兼容。建议使用虚拟环境或降级到 Python 3.10。

1.4 MAVProxy 安装与使用

MAVProxy 是 ArduPilot 生态里一个轻量级的地面站工具。它不像 Mission Planner 那样有图形界面,但胜在灵活——你可以用命令行精确控制数据流。我平时做数据采集时,90% 的场景都用 MAVProxy 而不是 Mission Planner。

1.4.1 安装验证

# 检查 MAVProxy 是否安装成功
mavproxy.py --version

# 如果显示版本号,说明安装成功
# 例如:MAVProxy 1.8.70

1.4.2 常用命令速查

命令 功能 我常用的场景
mavproxy.py --master tcp:127.0.0.1:5760 连接 SITL 飞控 启动仿真后立即连接
module load log 加载数据记录模块 开始采集前加载
log list 查看已记录的日志 检查采集是否正常
set streamrate 10 设置数据流频率 调整采集密度
arm throttle 解锁电机 准备起飞前执行

1.5 首次启动仿真

好,环境都配好了,我们来跑第一个仿真。我会带你走一遍完整流程,从编译到起飞。

1.5.1 克隆 ArduPilot 源码

# 进入你的工作目录
cd ~
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

# 更新子模块(这一步比较耗时,耐心等待)
git submodule update --init --recursive

避坑指南:我曾经因为网络问题,子模块下载到一半中断了。建议使用代理或在国内镜像站下载。如果中断了,重新执行 git submodule update --init --recursive 即可,不会重复下载已完成的模块。

1.5.2 编译 SITL 固件

# 进入四旋翼仿真目录
cd ardupilot/ArduCopter

# 编译 SITL 版本(第一次编译较慢,约 10-15 分钟)
sim_vehicle.py -w

# -w 参数表示清空之前的编译缓存,首次编译必须加

编译完成后,你会看到类似这样的输出:

Build succeeded. Built 1 targets.
Ready to fly. GPS: 3D Fix, Vcc: 5.0V

嗯,看到 "Ready to fly" 就说明编译成功了。

1.5.3 启动仿真并连接 MAVProxy

# 启动 SITL 仿真(默认四旋翼模型)
sim_vehicle.py --console --map

# 参数说明:
# --console:显示控制台
# --map:显示地图窗口

启动后,你会看到三个窗口:

  • 终端窗口:显示飞控状态信息
  • 控制台窗口:显示传感器数据
  • 地图窗口:显示飞机位置

此时,SITL 默认在 UDP 端口 14550 输出 MAVLink 数据。我们打开另一个终端,用 MAVProxy 连接:

# 连接 SITL
mavproxy.py --master tcp:127.0.0.1:5760

# 连接成功后,你会看到 MAVLink 数据开始流动
# 输入 'arm throttle' 解锁电机
# 输入 'takeoff 10' 起飞到 10 米高度

验证是否成功:在地图窗口中,你应该能看到飞机从地面起飞,高度逐渐增加到 10 米。同时,MAVProxy 终端会持续输出姿态、高度、GPS 等数据。这就是我们后续要采集的原始数据。

1.5.4 数据采集验证

为了确认数据能正常采集,我们在 MAVProxy 中加载日志模块:

# 在 MAVProxy 终端中执行
module load log

# 开始记录日志
log start

# 飞行一段时间后,停止记录
log stop

# 查看记录的日志文件
log list

日志文件默认保存在 ~/ardupilot/ArduCopter/logs 目录下,格式为 .bin 或 .log。这些文件包含了飞控的所有传感器数据,是我们后续分析的基础。

注意:首次启动时,如果遇到 "Bind failed" 或 "Address already in use" 错误,说明端口被占用了。可以用 lsof -i :14550 查看占用进程,或者修改 SITL 的端口号:sim_vehicle.py -w --out 127.0.0.1:14551。