4. 数据采集环境搭建:PX4/ArduPilot仿真环境搭建、QGC与仿真器连接
好,咱们进入第四章。前面几章我们把无人机数据采集的理论框架和传感器原理捋了一遍,从这章开始,要动真格的了——搭建仿真环境。
为什么非得先搭仿真?我个人的血泪教训是:真机调试一次炸机成本太高,而且很多极端工况(比如GPS丢星、电机堵转)在真机上测试风险极大。仿真环境能让你在电脑上跑完90%的调试工作,剩下的10%才是真机微调。说白了,仿真就是你的“数字试飞场”。
本章核心目标:在本地搭建一套完整的无人机数据采集仿真链路,包括PX4/ArduPilot固件、Gazebo/ArduPilot SITL仿真器,以及QGC地面站,并实现三者之间的数据互通。
4.1 仿真架构概览:数据是怎么流动的?
先别急着装软件,咱们得搞清楚数据在仿真环境里是怎么跑的。我画了张图,你看完就明白整个链路了。
你看,数据流其实很清晰:QGC 通过 MAVLink 协议给 PX4/ArduPilot 发指令,固件解算后把控制量传给 Gazebo/SITL 仿真器,仿真器模拟物理环境和传感器数据再反馈回固件,固件把状态打包发回 QGC 显示。这个闭环就是整个仿真调试的基础。
小提示:MAVLink 是无人机领域的“通用语言”。QGC、PX4、ArduPilot 都支持它。你只要记住端口号:udp:14550 是 QGC 监听固件数据的默认端口,udp:14540 是固件监听 QGC 指令的端口。
4.2 PX4 仿真环境搭建(基于 Gazebo)
我个人更常用 PX4 + Gazebo 的组合,因为 Gazebo 的物理引擎更成熟,传感器模型也更丰富。咱们一步步来。
4.2.1 环境依赖安装
嗯,这里要注意:PX4 官方推荐 Ubuntu 20.04 或 22.04。如果你用 Windows,建议装个 WSL2 或者直接上虚拟机。我踩过坑——Windows 原生跑 Gazebo 性能损失太大,画面卡得跟幻灯片似的。
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础依赖
sudo apt install -y \
git zip cmake build-essential genromfs ninja-build \
exiftool python3-pip python3-venv python3-dev \
python3-numpy python3-jinja2 python3-toml \
python3-empy python3-serial python3-pyparsing \
python3-packaging python3-setuptools
# 安装 Gazebo 11(PX4 官方推荐)
sudo apt install -y gazebo11 libgazebo11-dev
# 安装 PX4 编译工具链
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
make px4_sitl gazebo
第一次编译大概要 20-30 分钟,取决于你的网络和 CPU。趁这个时间,你可以去泡杯咖啡。我记得我第一次编译时,因为网络问题卡在下载依赖上,后来换了国内镜像源才搞定。
避坑指南:我曾经因为 Python 版本冲突导致编译失败——系统默认 Python 3.8,但 PX4 某些脚本需要 Python 3.10。建议用 python3-venv 创建独立虚拟环境,别污染系统 Python。
4.2.2 启动仿真并验证
编译成功后,启动仿真只需要一条命令:
# 启动 PX4 SITL + Gazebo,默认加载 iris 四旋翼模型
cd ~/PX4-Autopilot
make px4_sitl gazebo
你会看到 Gazebo 窗口弹出,一架 iris 四旋翼停在跑道上。同时终端里会打印 PX4 的启动日志,最后出现 [px4] startup complete 就说明成功了。
这时候你可以用键盘控制无人机起飞:
# 在另一个终端中
cd ~/PX4-Autopilot
python3 Tools/sitl_gazebo/scripts/takeoff.py
脚本会让无人机自动起飞到 2.5 米高度。如果看到无人机稳稳悬停,恭喜你,环境搭好了。
4.3 ArduPilot 仿真环境搭建(基于 SITL)
ArduPilot 的仿真方式跟 PX4 不太一样。它用的是自带的 SITL(Software In The Loop)模拟器,不需要额外装 Gazebo。说白了,ArduPilot 的 SITL 把飞控逻辑和简单的物理模型打包在一起了,轻量但功能足够。
4.3.1 安装 ArduPilot SITL
# 克隆 ArduPilot 代码
git clone https://github.com/ArduPilot/ardupilot.git
cd ardupilot
# 安装依赖
git submodule update --init --recursive
./Tools/environment_install/install-prereqs-ubuntu.sh -y
# 编译 SITL(以四旋翼为例)
./waf configure --board sitl
./waf copter
编译完成后,启动 SITL:
# 启动 ArduPilot SITL 四旋翼仿真
cd ardupilot
sim_vehicle.py -v ArduCopter --map --console
这个命令会启动三个窗口:SITL 终端、MAVProxy 控制台、以及一个简易地图界面。你可以在 MAVProxy 里输入 arm throttle 解锁,然后 takeoff 10 让无人机飞到 10 米高度。
小技巧:ArduPilot 的 SITL 默认监听 udp:14550 端口,跟 QGC 的默认端口一致。所以启动后 QGC 通常能自动发现,不需要额外配置。
4.4 QGC 与仿真器连接配置
环境搭好了,仿真器也跑起来了,接下来就是让 QGC 跟它们“对上话”。
4.4.1 QGC 安装
QGC 的安装很简单,去官网下载 AppImage 或者用 Snap 安装:
# 下载最新版 QGC AppImage
wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.AppImage
chmod +x QGroundControl.AppImage
./QGroundControl.AppImage
如果你是 Ubuntu 22.04,可能需要安装一些额外的库:
sudo apt install -y libfuse2 libxcb-xinerama0
4.4.2 连接 PX4 + Gazebo
启动 PX4 SITL 后,QGC 通常会自动检测到。如果没自动连接,手动配置一下:
- 打开 QGC,点击左上角 Q 图标 → Application Settings → Comm Links
- 点击 Add,选择 UDP 类型
- 填写:Listening Port =
14550,Target Host =127.0.0.1,Target Port =14540 - 点击 OK,然后选中该链接点击 Connect
连接成功后,QGC 主界面会显示无人机状态:GPS 信号、电池电压、姿态角等。你可以在 Analyze 视图里看到 MAVLink 消息的实时流。
4.4.3 连接 ArduPilot SITL
ArduPilot 的连接更简单。启动 SITL 后,QGC 通常会自动弹出连接提示。如果没有:
- 同样进入 Comm Links 设置
- 添加 UDP 链接:Listening Port =
14550,Target Host =127.0.0.1,Target Port =14551 - 连接即可
注意:ArduPilot SITL 默认使用 udp:14550 作为输出端口,但 QGC 也监听 14550,所以不会冲突。如果同时跑 PX4 和 ArduPilot,记得改端口,否则端口冲突会导致连接失败。
4.5 仿真环境对比与选型建议
很多初学者会纠结:到底学 PX4 还是 ArduPilot?我个人的建议是:
| 对比维度 | PX4 + Gazebo | ArduPilot SITL |
|---|---|---|
| 物理引擎 | Gazebo(ODE/DART),更真实 | 内置简化模型,轻量 |
| 传感器模型 | 丰富(IMU、GPS、激光雷达、相机等) | 基础传感器(IMU、GPS、气压计) |
| 启动速度 | 较慢(需加载 Gazebo 3D 场景) | 快(秒级启动) |
| 适用场景 | 视觉SLAM、避障、多机协同 | 飞控逻辑验证、参数调优 |
| 学习曲线 | 较陡(需了解 Gazebo 和 ROS) | 平缓(开箱即用) |
如果你做的是数据采集相关的课程项目,我建议先用 ArduPilot SITL 快速上手,等熟悉了 MAVLink 数据流和 QGC 分析功能后,再切换到 PX4 + Gazebo 做更复杂的仿真。
4.6 常见问题与排查
搭建环境时肯定会遇到问题。我把最常见的几个列出来,你遇到了直接对照排查:
- QGC 显示“No Heartbeat”:说明 QGC 没收到固件的心跳包。检查端口配置是否正确,或者防火墙是否拦截了 UDP 端口。
- Gazebo 启动后黑屏:通常是显卡驱动问题。试试
export SVGA_VGPU10=0再启动,或者用gazebo --verbose看日志。 - 编译 PX4 时卡在下载依赖:国内用户建议设置 Git 代理,或者用
px4-offboard的国内镜像。 - ArduPilot SITL 启动报错“No module named 'MAVProxy'”:运行
pip3 install MAVProxy安装即可。
核心检查清单:
- 仿真器是否正常运行?(终端有
startup complete或 SITL 提示) - QGC 的 Comm Links 配置是否正确?(端口号、IP 地址)
- 防火墙是否放行 UDP 端口?(
sudo ufw allow 14550/udp) - 是否同时运行了多个仿真实例?(端口冲突)