1. SITL仿真环境搭建:ArduPilot SITL安装、MAVProxy配置、仿真环境验证
做MAVLink报文分析,第一步得先把仿真环境跑起来。这就像你要拆解一台发动机,总得先让它转起来吧?
SITL(Software In The Loop)说白了就是把飞控固件当成一个普通程序在电脑上跑。没有硬件,没有螺旋桨,但所有MAVLink报文一个不少。我个人习惯用ArduPilot官方的SITL方案,配合MAVProxy做地面站,这套组合最稳。
1.1 环境准备:你需要什么
先看看你的电脑够不够格。其实要求不高,我甚至在一台8GB内存的旧笔记本上跑过,完全没问题。
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 / macOS 11 / Windows 10 | Ubuntu 22.04 |
| 内存 | 4 GB | 8 GB 以上 |
| 磁盘空间 | 5 GB | 20 GB(含日志) |
| Python版本 | 3.8 | 3.10 或 3.11 |
1.2 安装ArduPilot SITL
安装过程分三步走。别急,每一步我都踩过坑,给你标清楚了。
1.2.1 克隆代码仓库
# 先装git,如果你还没装的话
sudo apt update
sudo apt install git
# 克隆ArduPilot仓库
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
# 切换到稳定分支,别用master,有时候会翻车
git checkout Copter-4.5
1.2.2 安装依赖
ArduPilot的依赖管理用的是自己的脚本。你直接跑下面这条命令就行:
cd ardupilot
git submodule update --init --recursive
Tools/environment_install/install-prereqs-ubuntu.sh -y
这个脚本会帮你装好gcc、g++、Python库、MAVProxy等等。嗯,这里要注意,脚本执行时间取决于你的网络,大概10-20分钟。
1.2.3 验证安装
装完之后,试试能不能启动SITL:
cd ardupilot
sim_vehicle.py -w --console --map
如果看到终端里刷出一堆参数,然后弹出一个地图窗口,恭喜你,环境搭好了。
-w:擦除旧的参数,相当于飞控恢复出厂设置--console:打开MAVProxy控制台--map:打开地图界面
1.3 MAVProxy配置:你的报文窗口
MAVProxy是ArduPilot生态里最常用的地面站工具。它不像Mission Planner那样有花哨的界面,但胜在轻量和可编程。说白了,它就是你的MAVLink报文调试器。
1.3.1 启动MAVProxy
当你用sim_vehicle.py启动SITL时,MAVProxy已经自动运行了。但如果你想单独启动它,可以这样:
mavproxy.py --master tcp:127.0.0.1:5760 --out udp:127.0.0.1:14550
这条命令的意思是:
--master:连接SITL的TCP端口(5760是默认的)--out:把数据转发到UDP 14550端口,方便其他地面站(如QGroundControl)连接
1.3.2 常用MAVProxy命令
进入MAVProxy控制台后,你可以输入这些命令来观察报文:
| 命令 | 作用 | 我的使用场景 |
|---|---|---|
status |
查看飞控状态、GPS、电池等 | 每次启动后先跑一遍,确认连接正常 |
module load message |
加载报文查看模块 | 调试特定报文时必用 |
message HEARTBEAT |
实时显示HEARTBEAT报文 | 验证心跳是否正常 |
set heartbeat 0 |
关闭心跳显示(刷屏太烦) | 看其他报文时先关掉心跳 |
module load message加载后,输入message ?可以列出所有可监听的报文类型。我经常用这个来确认某个报文到底有没有被发送。
1.4 仿真环境验证:确认一切就绪
环境搭好了,怎么确认它真的能用?我一般做三个测试:
1.4.1 测试1:心跳报文
在MAVProxy控制台输入:
message HEARTBEAT
你应该能看到类似这样的输出:
HEARTBEAT {type : 2, autopilot : 3, base_mode : 81, custom_mode : 0, system_status : 4}
如果看到这个,说明SITL和MAVProxy之间的MAVLink链路是通的。每秒一条,雷打不动。
1.4.2 测试2:遥控器模拟
SITL默认没有遥控器输入。你可以用rc命令模拟:
rc 3 1500
这条命令把通道3(油门)设为1500。然后看看status里的RC RSSI有没有变化。
1.4.3 测试3:起飞与悬停
最后来点真格的。在MAVProxy里输入:
mode guided
arm throttle
takeoff 10
如果一切正常,地图上的飞机会缓缓升到10米高度并悬停。这时候你再看MAVLink报文,会发现GLOBAL_POSITION_INT、ATTITUDE、VFR_HUD等报文开始疯狂刷屏。
1.5 本章知识体系
下面这张图帮你理清整个环境的组件关系:
1.6 常见问题与解决
搭建过程中你可能会遇到这些问题,我帮你列出来:
- 问题:
sim_vehicle.py提示"module not found"
解决:重新运行install-prereqs-ubuntu.sh,或者手动pip安装缺失的包。我遇到过pymavlink没装上的情况,直接pip install pymavlink搞定。 - 问题:MAVProxy启动后地图一片空白
解决:检查网络连接,地图需要加载在线瓦片。如果在内网环境,可以加--no-map参数跳过地图加载。 - 问题:SITL启动后飞控一直报"Bad GPS 3D fix"
解决:这是正常的,SITL模拟的GPS需要几秒钟才能定位。等10秒再看,一般会自动恢复。