3、SITL仿真环境搭建:ArduPilot SITL安装、PX4 SITL安装、仿真环境配置

好,咱们进入第三章。这一章我打算手把手带你搭环境。

说实话,做MAVLink开发,最头疼的就是硬件。飞控贵不说,炸机了还得修。所以SITL(Software In The Loop)就成了我的救命稻草。你想想看,在电脑上就能跑完整的飞控逻辑,还能跟真实硬件用一样的MAVLink协议通信,多爽。

目前主流的开源飞控就两家:ArduPilot和PX4。它们都支持SITL,但安装方式、依赖环境、启动流程差别不小。我当年刚接触时,两个混着装,踩了不少坑。今天咱们就一个一个来,把环境捋清楚。

核心观点:SITL不是模拟器,它是把飞控的C++代码直接编译成PC可执行文件。所以它跑的就是真飞控的逻辑,MAVLink消息也跟真机一模一样。这也是为什么我们能用它来调试地面站和通信协议。

3.1 ArduPilot SITL 安装

ArduPilot的SITL我用的最多。它的安装脚本做得比较成熟,基本上一键搞定。但有个前提——你得在Linux或者macOS下跑。Windows虽然能用WSL,但我个人不建议,网络配置容易出幺蛾子。

3.1.1 环境准备

先装依赖。ArduPilot官方推荐Ubuntu 20.04或22.04。我习惯用22.04,Python版本新,省事。

# 更新系统
sudo apt update
sudo apt upgrade -y

# 安装基础工具
sudo apt install git python3-pip python3-venv -y

# 安装ArduPilot依赖
sudo apt install g++-arm-linux-gnueabihf g++-aarch64-linux-gnu -y

嗯,这里要注意。很多人装完依赖就直接去clone代码了,结果编译报错。为什么?因为缺了wxPython和MAVProxy。这两个是ArduPilot SITL的标配。

# 安装MAVProxy(地面站代理,后面会细讲)
pip3 install MAVProxy

# 安装wxPython(用于图形化控制台)
pip3 install wxPython

3.1.2 下载与编译

代码量不小,建议找个网好的时段。

git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot

# 更新子模块(这一步很关键,缺了它编译不过)
git submodule update --init --recursive

子模块下载完,就可以编译了。以四旋翼为例:

./waf configure --board sitl
./waf copter

编译时间取决于你的机器。我当年用一台老笔记本,等了快20分钟。现在换了新机器,3分钟搞定。你可以去泡杯咖啡。

我的经验:编译时如果报错Python.h: No such file or directory,说明缺Python开发头文件。执行sudo apt install python3-dev即可。我曾经在这个坑里卡了半小时,后来发现是环境太干净了。

3.1.3 启动验证

编译成功后,启动SITL:

cd ArduCopter
../Tools/autotest/sim_vehicle.py -v ArduCopter --map --console

看到终端输出AP: ArduCopter V4.5.0之类的版本号,并且弹出一个地图窗口,说明安装成功。这时候你可以用mavproxy.py连接本地的tcp:127.0.0.1:5760,就能看到MAVLink消息了。

3.2 PX4 SITL 安装

PX4的SITL跟ArduPilot思路不同。它依赖Gazebo或jMAVSim作为仿真器,飞控代码通过make命令编译并启动。我个人觉得PX4的安装流程更「工程化」,但依赖也更重。

3.2.1 自动安装脚本

PX4官方提供了一个自动化脚本,我建议直接用这个。省心。

git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
bash ./Tools/setup/ubuntu.sh

这个脚本会装一堆东西:gcc、cmake、Python库、Gazebo……跑完大概要10-15分钟。中间可能会让你输密码,别走开。

注意:如果你用的是Ubuntu 22.04,Gazebo默认装的是Gazebo Garden(新版)。但PX4目前对Gazebo Classic(旧版)支持更好。我建议装完脚本后,手动确认一下Gazebo版本。如果发现是Garden,可以降级:

sudo apt install gazebo11
sudo apt remove gz-garden

3.2.2 编译与启动

装完依赖,编译PX4 SITL:

cd PX4-Autopilot
make px4_sitl gazebo-classic

第一次编译会下载一些模型文件,耐心等。成功后会自动弹出Gazebo窗口,里面有一架四旋翼。同时终端会显示INFO [commander] Ready for takeoff!。

这时候,PX4已经在本地开启了MAVLink通道。默认是udp:127.0.0.1:14540。你可以用QGroundControl连接它,或者用mavlink-router转发消息。

3.3 仿真环境配置对比

两个SITL我都用过,各有优劣。我整理了一张表,方便你对比:

对比项 ArduPilot SITL PX4 SITL
依赖复杂度 低,只需Python + MAVProxy 高,需要Gazebo/jMAVSim
启动速度 快,秒级启动 慢,Gazebo加载模型需10-30秒
默认MAVLink通道 TCP 5760 UDP 14540
可视化 内置地图(需MAVProxy) Gazebo 3D仿真
多机仿真 支持,需手动配置实例 原生支持,通过make px4_sitl gazebo-classic_iris__
我的推荐场景 MAVLink协议调试、单机测试 视觉SLAM、多机协同、传感器仿真

3.4 环境配置的避坑指南

搭建环境这件事,说白了就是跟依赖和路径斗智斗勇。我把自己踩过的坑列出来,你遇到了直接抄答案。

  • Python版本冲突:ArduPilot的MAVProxy要求Python 3.8+,但如果你系统默认Python是3.10,某些旧版库可能不兼容。我建议用python3 -m venv创建虚拟环境,把MAVProxy装在里面。
  • Gazebo黑屏:PX4启动后Gazebo窗口一片黑,通常是显卡驱动问题。试试export SVGA_VGPU10=0,或者用gazebo --verbose看日志。
  • 端口被占用:SITL默认端口是5760/14540。如果你同时跑多个实例,记得用--instance参数指定不同端口。我曾经忘了改端口,两个SITL互相抢消息,地面站显示的数据乱七八糟。
  • 子模块下载失败:ArduPilot的git submodule update经常因为网络问题中断。我习惯用git submodule update --init --recursive --depth 1,只拉最新版本,减少下载量。

一个小技巧:如果你两个SITL都想装,建议先装ArduPilot再装PX4。因为PX4的自动脚本会更新一些系统库,可能会破坏ArduPilot的依赖。反过来装,冲突少很多。

3.5 本章知识体系

为了让你对本章内容有个整体印象,我画了一张结构图。它展示了ArduPilot和PX4两条安装路径,以及它们最终如何汇聚到MAVLink通信这个核心目标上。

SITL仿真环境搭建知识体系 SITL仿真环境搭建知识体系 MAVLink通信仿真 ArduPilot SITL 依赖:Python3 + MAVProxy 编译:./waf configure --board sitl 启动:sim_vehicle.py -v ArduCopter MAVLink通道:TCP 5760 PX4 SITL 依赖:Gazebo + cmake 编译:make px4_sitl gazebo-classic 启动:自动弹出Gazebo窗口 MAVLink通道:UDP 14540 地面站 / MAVProxy / 自定义脚本 两条路径,一个目标

图里很清楚了。左边是ArduPilot路线,轻量、快速,适合协议调试。右边是PX4路线,依赖重但仿真更真实。两条路最终都汇聚到底部——通过MAVLink与地面站或你的自定义脚本通信。

我个人建议,如果你是第一次接触SITL,先从ArduPilot入手。它启动快,出问题了容易排查。等把MAVLink消息流搞明白了,再上PX4做更复杂的仿真。别一上来就两个都装,容易把自己搞晕。