1. SITL仿真环境搭建:ArduPilot SITL环境配置、MAVProxy安装与使用、QGroundControl地面站连接
各位同学,欢迎来到《攻克SITL仿真中的姿态调参难题》的第一章。
说实话,做飞控调参最怕什么?最怕炸机。我刚入行那会儿,在真机上调PID,一个参数设大了,飞机直接翻了个跟头,桨叶碎了一地。从那以后,我养成了一个习惯——所有参数先在SITL里跑一遍。
SITL,全称Software In The Loop,说白了就是在电脑上跑一个虚拟的飞控。它不需要任何硬件,就能模拟出真实的传感器数据、GPS信号和物理模型。你调的参数,跟刷进真飞控的效果几乎一样。
这一章,我就带你把这个环境搭起来。一共三样东西:ArduPilot SITL、MAVProxy、QGroundControl。我们一个一个来。
本章核心目标:在Ubuntu 22.04系统上,完成SITL仿真环境的完整搭建,并实现地面站与虚拟飞控的通信。
1.1 ArduPilot SITL环境配置
ArduPilot的SITL支持Linux、macOS和Windows(WSL)。我个人推荐Ubuntu 22.04 LTS,因为它的依赖库最全,踩坑最少。
1.1.1 安装依赖
打开终端,先更新包管理器:
sudo apt update
sudo apt upgrade -y
然后安装编译工具和Python依赖:
sudo apt install git build-essential python3-pip python3-dev -y
sudo pip3 install future pymavlink MAVProxy
嗯,这里有个坑。我记得有一次我在Ubuntu 20.04上装pymavlink,死活装不上,后来发现是Python版本太旧。所以建议你确保Python 3.8以上。
1.1.2 克隆ArduPilot源码
git clone --recurse-submodules https://github.com/ArduPilot/ardupilot.git
cd ardupilot
--recurse-submodules这个参数很重要,它会一并拉取子模块。如果你忘了加,后面编译时会报一堆缺失文件的错误。
1.1.3 编译SITL
我们以Copter为例:
cd ardupilot
./waf configure --board sitl
./waf copter
编译时间取决于你的机器配置,一般5到15分钟。你可以趁这个时间去泡杯咖啡。
小技巧:如果你只需要SITL,不需要编译所有机型,用./waf copter只编译四旋翼,能省不少时间。
1.1.4 启动SITL
编译完成后,启动虚拟飞控:
cd ardupilot/Tools/autotest
./sim_vehicle.py -v ArduCopter --map --console
参数说明:
| 参数 | 作用 |
|---|---|
-v ArduCopter |
指定机型为四旋翼 |
--map |
打开地图窗口(基于MAVProxy) |
--console |
打开控制台窗口,显示飞控日志 |
启动成功后,你会看到控制台里不断刷出GPS定位、姿态角、高度等信息。这说明SITL已经在跑了。
注意:第一次启动时,SITL会下载一些地形数据,需要联网。如果下载失败,检查你的网络或代理设置。
1.2 MAVProxy安装与使用
MAVProxy是一个轻量级的MAVLink地面站,也是ArduPilot官方推荐的命令行工具。它不像QGC那样有图形界面,但调试参数时非常高效。
其实刚才启动SITL时,MAVProxy已经自动运行了。你看到的那个--map和--console窗口,就是MAVProxy提供的。
1.2.1 手动安装MAVProxy
如果你需要单独安装:
pip3 install MAVProxy
1.2.2 常用命令
在MAVProxy控制台中,你可以直接输入命令控制虚拟飞控:
| 命令 | 作用 |
|---|---|
arm throttle |
解锁电机 |
takeoff 10 |
起飞到10米高度 |
mode loiter |
切换到悬停模式 |
param show |
查看所有参数 |
param set <名称> <值> |
修改参数 |
rc 3 1500 |
设置遥控器通道3(油门)为1500 |
举个例子,你想看看当前的PID参数:
param show | grep PID
这会列出所有包含"PID"的参数,包括ATC_RAT_RLL_P、ATC_RAT_PIT_P等。后面调参时,这个命令你会用得很频繁。
我的习惯:我会把常用的MAVProxy命令写成一个脚本,每次启动SITL后自动执行。比如自动解锁、起飞到5米、切换到悬停。省得每次手动敲。
1.3 QGroundControl地面站连接
MAVProxy虽然强大,但毕竟没有图形界面。想看飞机姿态、轨迹、参数曲线,还是得用QGroundControl(简称QGC)。
1.3.1 下载与安装
QGC支持Windows、macOS、Linux、iOS和Android。我建议你在宿主机上安装,而不是在虚拟机里,因为QGC需要GPU加速渲染地图。
Ubuntu安装方式:
sudo snap install qgroundcontrol --stable
或者去官网下载AppImage:
chmod +x QGroundControl.AppImage
./QGroundControl.AppImage
1.3.2 连接SITL
默认情况下,SITL在UDP端口14550上广播MAVLink数据。QGC会自动发现它。
如果没自动连接,手动添加:
- 打开QGC,点击左上角Q图标
- 选择Application Settings → Comm Links
- 点击Add,类型选UDP,端口填14550
- 点击Connect
连接成功后,QGC的地图上会出现一个飞机图标,姿态仪表盘也会实时更新。
验证连接:在MAVProxy中输入takeoff 10,如果QGC地图上的飞机开始上升,说明通信正常。
1.3.3 多地面站同时连接
有时候你需要同时用MAVProxy和QGC。SITL默认支持多个UDP客户端,你不需要做任何额外配置。直接打开QGC就能连上。
我曾经在调试一个复杂的姿态问题时,同时开着MAVProxy看日志、QGC看轨迹、还有一个Python脚本在后台记录数据。三个客户端同时连一个SITL,完全没问题。
1.4 整体架构图
下面这张图展示了SITL、MAVProxy、QGC三者之间的关系:
从图中可以看出,SITL是核心,它模拟了飞控和物理模型。MAVProxy和QGC都是客户端,通过MAVLink协议与SITL通信。你可以同时使用它们,互不干扰。
1.5 常见问题与避坑
环境搭建过程中,有几个问题我几乎每次都会遇到:
- 端口被占用:如果启动SITL时提示
Address already in use,说明14550端口被占用了。用lsof -i :14550查看哪个进程在用,然后kill掉它。 - Python依赖冲突:我建议用
pip3 install --user安装MAVProxy,避免与系统Python包冲突。 - QGC无法连接:检查防火墙是否放行了UDP 14550端口。Ubuntu上可以用
sudo ufw allow 14550/udp。 - SITL启动后没有地图:确保你加了
--map参数。如果地图窗口是空白的,可能是网络问题,MAVProxy需要联网加载地图瓦片。
曾经有一次,我在一台新电脑上搭环境,SITL启动后QGC死活连不上。折腾了两个小时,最后发现是QGC版本太旧,不支持新的MAVLink协议。升级到最新版就好了。所以,请务必使用QGC的最新稳定版。
1.6 验证环境
环境搭好了,我们来验证一下:
- 启动SITL:
./sim_vehicle.py -v ArduCopter --map --console - 在MAVProxy控制台中输入
arm throttle,看到ARMED提示 - 输入
takeoff 10,飞机起飞到10米 - 打开QGC,确认地图上飞机在10米高度悬停
- 在QGC中切换到
Land模式,飞机自动降落
如果以上步骤都成功了,恭喜你,SITL仿真环境已经搭建完成。你可以开始调参了。
一个小建议:每次启动SITL后,先让飞机悬停一分钟,观察姿态角和高度是否稳定。如果漂移很大,可能是仿真参数没配好,后面我们会讲到怎么校准。