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通信这个核心目标上。
图里很清楚了。左边是ArduPilot路线,轻量、快速,适合协议调试。右边是PX4路线,依赖重但仿真更真实。两条路最终都汇聚到底部——通过MAVLink与地面站或你的自定义脚本通信。
我个人建议,如果你是第一次接触SITL,先从ArduPilot入手。它启动快,出问题了容易排查。等把MAVLink消息流搞明白了,再上PX4做更复杂的仿真。别一上来就两个都装,容易把自己搞晕。