1. SITL 仿真环境搭建:从零跑通你的第一个仿真

说实话,很多朋友学 ArduPilot 第一步就卡在环境搭建上。我见过太多人下载了源码,装了一堆依赖,最后跑起来报错,然后就放弃了。

这一章,我带你一步步把 SITL 环境搭好。保证你能在 30 分钟内看到无人机在电脑屏幕上飞起来。

什么是 SITL?为什么非它不可?

SITL,全称 Software In The Loop。说白了,就是把飞控代码直接在你的电脑上跑,模拟出一架完整的无人机。

你想想看,没有 SITL 的时候,改一行代码就要编译、烧录、上电、试飞。万一炸机了,还得修硬件。有了 SITL,你可以在电脑上随便折腾,参数调错了?重启一下就好。

我个人习惯:每次开发新功能前,先在 SITL 里跑三天,把边界情况都测一遍,再上真机。这个习惯帮我省了至少五架飞机的钱。

核心价值:SITL 让你用零成本、零风险的方式,体验完整的飞控开发流程。从参数调优到航线规划,从故障注入到模式切换,全都能在电脑上完成。

Windows 环境准备

我知道大部分初学者用的是 Windows。别担心,虽然 ArduPilot 官方推荐 Linux,但 Windows 下一样能跑得很顺。

1. 安装 Cygwin(关键一步)

ArduPilot 的编译工具链依赖 POSIX 环境。Windows 下最稳的方式就是用 Cygwin。

  • 去 cygwin.com 下载 setup-x86_64.exe
  • 安装时记得选这些包:gcc-g++、make、cmake、git、python3、python3-pip
  • 安装路径不要有中文和空格,我一般放 C:\cygwin64

我曾经踩过的坑:第一次装 Cygwin 时漏选了 gcc-g++,结果编译报错找了半天。建议你对照列表一个一个勾,别偷懒。

2. 克隆 ArduPilot 源码

打开 Cygwin 终端,执行:

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

这个过程会下载所有子模块,大概 1-2 个 G。网速慢的话,建议找个咖啡时间慢慢等。

3. 安装 Python 依赖

ArduPilot 的 SITL 启动脚本和 MAVProxy 都依赖 Python。我建议用 Python 3.8 以上版本。

python3 -m pip install --upgrade pip
python3 -m pip install mavproxy pyserial future lxml

小技巧:如果 pip 下载慢,可以加 -i https://pypi.tuna.tsinghua.edu.cn/simple 用清华镜像。

Linux 环境准备(Ubuntu 22.04 为例)

如果你用 Linux,那恭喜你,过程会顺畅很多。我个人也更推荐在 Linux 下做飞控开发。

1. 一键安装依赖

ArduPilot 官方提供了一个安装脚本,省心不少:

sudo apt update
sudo apt install git python3 python3-pip python3-venv
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
Tools/environment_install/install-prereqs-ubuntu.sh -y

这个脚本会自动装好 gcc、cmake、wxWidgets 等一堆东西。跑完后重启一下终端。

2. 配置 MAVSDK-Python

MAVSDK 是我们后面写控制程序要用到的库。安装很简单:

python3 -m pip install mavsdk

验证一下:

python3 -c "import mavsdk; print(mavsdk.__version__)"

如果输出版本号,说明装好了。

首次启动 SITL 仿真

环境搭好了,咱们来跑第一个仿真。我选 Copter 机型做演示,因为四旋翼最直观。

1. 编译 Copter 固件

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

编译时间取决于你的电脑配置,一般 5-10 分钟。第一次编译会慢一些,后面改代码再编译就快多了。

2. 启动仿真

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

你会看到三个窗口弹出来:

  • 控制台:显示飞控的实时日志和状态信息
  • 地图:显示无人机的位置和姿态
  • 终端:MAVProxy 的命令行界面

成功了! 你现在看到的就是一架在电脑里飞行的无人机。虽然它没有螺旋桨,但它的飞控代码和真机完全一样。

3. 让无人机起飞

在 MAVProxy 终端里输入以下命令:

STABILIZE> arm throttle
STABILIZE> takeoff 10

第一行是解锁,第二行是起飞到 10 米高度。你会看到地图上的无人机缓缓上升。

嗯,这里要注意:如果提示 Pre-arm: GPS not ready,别慌。在终端输入 param set SIM_GPS_DISABLE 1 关掉 GPS 检测就行。仿真环境里我们不需要真 GPS。

SITL 架构速览

为了让你对 SITL 有个整体认识,我画了张图:

SITL 仿真架构图 用户代码层 MAVSDK / DroneKit / MAVProxy 脚本 MAVLink 通信层 UDP 端口 14550 / TCP 端口 5760 飞控核心层 (ArduPilot) 姿态控制 / 位置控制 / 导航 / EKF 融合 仿真环境层 JSBSim 物理引擎 / 传感器模拟 / 地形 / 风场 你的 Python 程序 通过 MAVSDK 控制飞机 和真机完全相同的 飞控代码

从这张图你能看到,SITL 把整个飞控栈都跑在你的电脑上。最上层是你的控制程序,中间是 MAVLink 通信,核心是完整的 ArduPilot 飞控,底层是物理仿真引擎。

验证环境是否正常

跑完上面的步骤后,我建议你做几个快速验证:

检查项 预期结果 如果失败怎么办
MAVProxy 终端能输入命令 显示 STABILIZE> 提示符 检查 sim_vehicle.py 是否正常启动
地图窗口显示无人机图标 能看到蓝色箭头或飞机图标 检查 --map 参数是否加上
arm throttle 成功 显示 Armed 检查 Pre-arm 报错,按提示处理
takeoff 10 成功 高度从 0 上升到 10 检查是否已解锁,油门是否归零

我的经验:第一次跑 SITL 时,如果地图窗口没出来,多半是 wxPython 没装好。在 Cygwin 里重新装一下 python3-wxPython 就好。

常见问题速查

我整理了几个新手最容易碰到的问题:

  • 编译报错找不到头文件:多半是子模块没更新完。重新跑 git submodule update --init --recursive。
  • 启动后闪退:检查端口是否被占用。有时候之前没关干净的仿真进程还占着 14550 端口。
  • MAVSDK 连不上:确认 SITL 启动时加了 --out 127.0.0.1:14540,MAVSDK 默认连这个端口。