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会自动发现它。

如果没自动连接,手动添加:

  1. 打开QGC,点击左上角Q图标
  2. 选择Application Settings → Comm Links
  3. 点击Add,类型选UDP,端口填14550
  4. 点击Connect

连接成功后,QGC的地图上会出现一个飞机图标,姿态仪表盘也会实时更新。

验证连接:在MAVProxy中输入takeoff 10,如果QGC地图上的飞机开始上升,说明通信正常。

1.3.3 多地面站同时连接

有时候你需要同时用MAVProxy和QGC。SITL默认支持多个UDP客户端,你不需要做任何额外配置。直接打开QGC就能连上。

我曾经在调试一个复杂的姿态问题时,同时开着MAVProxy看日志、QGC看轨迹、还有一个Python脚本在后台记录数据。三个客户端同时连一个SITL,完全没问题。

1.4 整体架构图

下面这张图展示了SITL、MAVProxy、QGC三者之间的关系:

SITL仿真环境架构图 ArduPilot SITL MAVProxy QGroundControl 用户(你) SITL通过UDP 14550端口广播MAVLink数据,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 验证环境

环境搭好了,我们来验证一下:

  1. 启动SITL:./sim_vehicle.py -v ArduCopter --map --console
  2. 在MAVProxy控制台中输入arm throttle,看到ARMED提示
  3. 输入takeoff 10,飞机起飞到10米
  4. 打开QGC,确认地图上飞机在10米高度悬停
  5. 在QGC中切换到Land模式,飞机自动降落

如果以上步骤都成功了,恭喜你,SITL仿真环境已经搭建完成。你可以开始调参了。

一个小建议:每次启动SITL后,先让飞机悬停一分钟,观察姿态角和高度是否稳定。如果漂移很大,可能是仿真参数没配好,后面我们会讲到怎么校准。