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
我的经验:Windows用户建议用WSL2,别直接在cmd里折腾。我曾经在原生Windows上编译ArduPilot,遇到一堆路径问题,换了WSL2后半小时搞定。

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-2GB数据。网速慢的话,建议用代理或者换个时间段。我曾经在公司网络下克隆了三次都中断,最后用手机热点才搞定。

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有没有变化。

避坑指南:我曾经忘记设置遥控器通道,结果飞机一直报"Pre-Arm: RC not calibrated"。折腾了半小时才发现是没给油门通道赋值。记住,SITL里所有RC通道默认都是0。

1.4.3 测试3:起飞与悬停

最后来点真格的。在MAVProxy里输入:

mode guided
arm throttle
takeoff 10

如果一切正常,地图上的飞机会缓缓升到10米高度并悬停。这时候你再看MAVLink报文,会发现GLOBAL_POSITION_INT、ATTITUDE、VFR_HUD等报文开始疯狂刷屏。

1.5 本章知识体系

下面这张图帮你理清整个环境的组件关系:

SITL仿真环境架构图 用户(你) MAVProxy MAVLink 报文流(TCP/UDP) ArduPilot SITL 四旋翼动力学模型 传感器仿真(GPS/IMU) 环境仿真(风/磁场) 说明:MAVProxy是用户与SITL之间的桥梁,所有报文都经过它转发和显示

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秒再看,一般会自动恢复。
一句话总结:环境搭建的核心就是让ArduPilot SITL跑起来,让MAVProxy连上去,然后确认MAVLink报文能正常收发。这三步走通,后面的报文分析才有基础。