1. SITL 仿真环境搭建:ArduPilot 与 PX4 的安装与配置
做飞控优化,第一步不是调参数,而是先把仿真环境跑起来。我个人习惯把 SITL(Software In The Loop)看作是飞控开发的「试衣间」——代码写好了,先在里面走两圈,看看合不合身,再决定要不要「穿出去」飞真机。
这一章,咱们就手把手把 ArduPilot SITL 和 PX4 SITL 搭起来,再把地面站连上。嗯,这里要注意,两个框架的安装思路不太一样,但最终目标一致:让你的电脑变成一个虚拟的无人机。
1.1 为什么需要 SITL?
说白了,SITL 就是把飞控固件编译成可执行文件,跑在你的操作系统上。它用数学模型代替真实的传感器和电机,用虚拟的 GPS 信号代替卫星。你想想看,没有 SITL,每次改个参数都要去外场飞一次,那效率得多低?
核心价值:在零成本、零风险的环境下,验证飞控逻辑、调参、测试故障处理流程。
我在项目中遇到过最典型的场景:客户要求无人机在 GPS 丢失后自动切换为光流悬停。如果没有 SITL,我得先买光流模块、焊线、找空旷场地……有了 SITL,改几行代码,跑一次仿真,十分钟就知道方案行不行。
1.2 ArduPilot SITL 安装与配置
ArduPilot 的 SITL 环境,我个人觉得是最容易上手的。它原生支持 MAVProxy,一条命令就能起飞。
1.2.1 环境准备
先确认你的系统。我建议用 Ubuntu 20.04 或 22.04,Windows 也能跑,但坑比较多。
# 安装依赖
sudo apt update
sudo apt install git python3-pip python3-dev python3-wxgtk4.0
sudo pip3 install mavproxy pymavlink
# 克隆 ArduPilot 源码
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive
注意:git submodule 这一步容易卡住,因为要下载很多子模块。我曾经在公司网络下等了半小时没反应,后来换了手机热点才搞定。建议提前准备好稳定的网络环境。
1.2.2 启动仿真
进入 ardupilot 目录,直接运行模拟器:
# 启动四旋翼仿真
sim_vehicle.py -v ArduCopter --map --console
# 参数说明:
# -v ArduCopter:指定机型为四旋翼
# --map:打开地图窗口
# --console:打开控制台
第一次启动时,会自动编译固件,大概需要 5-10 分钟。编译完成后,你会看到 MAVProxy 的控制台界面,地图上出现一架虚拟无人机。
小技巧:如果不想每次等编译,可以先用 ./waf configure --board sitl 手动编译一次,之后启动就快多了。
1.3 PX4 SITL 安装与配置
PX4 的 SITL 走的是另一条路。它依赖 Gazebo 仿真器,模型更丰富,但安装步骤也更多一些。
1.3.1 安装 PX4 工具链
PX4 官方提供了一个一键安装脚本,但我建议你一步步来,出了问题好排查。
# 安装基础依赖
sudo apt install ninja-build exiftool python3-empy python3-toml python3-numpy
# 安装 Gazebo
sudo apt install gazebo11 libgazebo11-dev
# 克隆 PX4 源码
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
# 安装 Python 依赖
pip3 install -r requirements.txt
1.3.2 启动 PX4 SITL
# 启动四旋翼仿真(带 Gazebo 界面)
make px4_sitl gazebo
# 如果只想启动飞控,不带图形界面
make px4_sitl none_iris
启动后,Gazebo 会加载一个 Iris 四旋翼模型,飞控通过 UDP 端口 14540 发送 MAVLink 数据。
| 参数 | ArduPilot SITL | PX4 SITL |
|---|---|---|
| 默认端口 | UDP 14550 | UDP 14540 |
| 仿真器 | 内置模型 | Gazebo / jMAVSim |
| 地面站推荐 | MAVProxy + QGC | QGC |
| 编译方式 | sim_vehicle.py | make px4_sitl |
1.4 MAVProxy 与 QGroundControl 地面站连接
仿真跑起来了,但你看不到无人机状态,对吧?这时候就需要地面站了。
1.4.1 使用 MAVProxy 连接
MAVProxy 是 ArduPilot 的「亲儿子」地面站,命令行操作,适合脚本化控制。
# 在仿真启动后,MAVProxy 已经自动连接了
# 手动连接命令(如果断开):
mavproxy.py --master=tcp:127.0.0.1:5760 --out=udp:127.0.0.1:14550
# 常用命令:
# mode guided 切换到 GUIDED 模式
# arm throttle 解锁
# takeoff 10 起飞到 10 米
经验之谈:MAVProxy 的 script 命令可以批量执行指令。我经常写一个测试脚本,一键完成「解锁→起飞→悬停→降落」的全流程,省去了手动输入的麻烦。
1.4.2 使用 QGroundControl 连接
QGC 是图形化地面站,界面友好,适合观察飞行数据和地图。
- 下载 QGC:从官网下载 AppImage 或安装包
- 启动 QGC:直接运行,它会自动扫描本地 UDP 端口
- 连接仿真:
- ArduPilot:QGC 会自动检测到 14550 端口
- PX4:需要在 QGC 中手动添加 UDP 连接,地址 127.0.0.1:14540
避坑指南:我曾经在 PX4 仿真中遇到 QGC 连不上的问题,折腾了半天才发现是防火墙把 UDP 端口拦了。检查一下 sudo ufw status,确保 14540 和 14550 端口是放开的。
1.5 验证仿真是否正常工作
环境搭好了,怎么知道它真的能用?我一般做三个快速验证:
- 查看心跳:MAVProxy 控制台每隔 1 秒会显示
HEARTBEAT信息 - 检查 GPS:QGC 地图上应该显示无人机位置(默认在仿真起点)
- 执行简单指令:在 MAVProxy 中输入
mode guided,再输入arm throttle,看电机是否响应
小技巧:如果 QGC 地图上无人机不动,检查一下仿真时间是否在运行。ArduPilot 默认是实时仿真,PX4 可以用 --speed 1 参数控制仿真速度。
嗯,到这里,你的 SITL 仿真环境就搭好了。ArduPilot 和 PX4 两条路都通了,地面站也能看到数据了。接下来,你就可以在这个虚拟环境里放心大胆地调参数、改代码了。