说明: 本文记录 2026-07-02 晚从零搭建 PX4 SITL 仿真的全过程。全程在 AI(WorkBuddy)指导下完成,我只负责执行指令和观察现象。IP 地址等敏感信息已脱敏处理。
🔧 1. 环境搭建
1.1 检查 WSL2
Windows 上打开 PowerShell,确认 WSL2 已安装:
wsl --list --verbose
预期输出:
NAME STATE VERSION
* Ubuntu-22.04 Running 2
如果未安装,管理员 PowerShell 执行
wsl --install -d Ubuntu,重启后完成设置。
1.2 克隆 PX4 源码
从 Gitee 镜像克隆(国内速度快):
# 进 WSL2
wsl
cd ~
# 克隆 PX4(含子模块)
git clone https://gitee.com/jundx11/PX4-Autopilot.git --recursive
cd PX4-Autopilot
# 验证子模块完整性
git submodule status
所有子模块应有 commit hash 前缀(无 - 符号),表示克隆完整。
1.3 安装依赖
PX4 官方依赖安装脚本:
bash ./Tools/setup/ubuntu.sh
此脚本自动安装 GCC、CMake、Python 依赖、Gazebo 仿真器等。安装完成后会看到大量 Setting up ... 的输出。
⚙️ 2. PX4 SITL 编译与运行
2.1 首次编译
make px4_sitl
首次编译耗时约 10-30 分钟,编译完成后会看到:
[1156/1156] Linking CXX shared library ...
______ __ __ ___
| ___ \ \ \ / / / |
| |_/ / \ V / / /| |
| __/ / \ / /_| |
| | / /^\ \ \___ |
\_| \/ \/ |_/
px4 starting.
2.2 启动 Gazebo 仿真
make px4_sitl gz_x500
启动后:
- Gazebo 3D 仿真窗口弹出,显示 x500 四旋翼在苏黎世场景中
- PX4 控制台
pxh>提示符出现 - 日志显示
INFO [init] Gazebo 8.14.0和模型加载信息
📡 3. 连接 QGroundControl
3.1 安装 QGC
Windows 端下载安装:QGroundControl 官网
3.2 MAVLink 广播配置
PX4 默认 MAVLink 只监听 127.0.0.1(WSL2 内部本地),需要配置跨网络通信。
在 pxh> 控制台输入:
# 停止原有 MAVLink 实例
mavlink stop -u 18570
# 启动新实例,绑定到 Windows 宿主 IP
mavlink start -u 14550 -o 14550 -r 4000000 -t 172.21.112.1
| 参数 | 说明 |
|---|---|
-u 14550 | 本地 UDP 端口 |
-o 14550 | 远端 UDP 端口 |
-r 4000000 | 最大发送速率 4MB/s |
-t 172.21.112.1 | Windows 宿主 IP(以 ip route | grep default 查询为准) |
验证连接:
# WSL2 中确认端口监听
ss -tunlp | grep 14550
# 输出: udp UNCONN 0.0.0.0:14550 users:(("px4",...))
# 查看 MAVLink 实例状态
mavlink status
# 应显示 Broadcast enabled: YES
3.3 QGC 配置
打开 QGC → Application Settings → Comm Links → Add:
| 字段 | 值 |
|---|---|
| Type | UDP |
| Port | 14550 |
| Server Addresses | WSL2_IP:14550 |
| ✅ 自动连接 |
🚁 4. 仿真飞行与操作
4.1 Gazebo 视图操作
| 操作 | 效果 |
|---|---|
| 鼠标滚轮向前 | 放大 |
| 鼠标滚轮向后 | 缩小 |
| 按住鼠标右键拖动 | 旋转视角 |
| 按住鼠标中键拖动 | 平移视角 |
| 关闭右侧 Entity 面板 | 扩大 3D 视图区域 |
4.2 起飞流程
- 等待就绪:GPS 锁定、EKF2 收敛、电池状态正常
- 解锁(Arm):QGC 左下角锁按钮 或
Shift + A - 起飞:左侧工具栏 Takeoff 按钮,设置高度(如 10m)
- 飞行控制:虚拟摇杆或键盘
W/A/S/D/Q/E - 降落:Land 模式或按
T
键盘快捷键
| 按键 | 功能 |
|---|---|
Shift + A | 解锁/上锁 |
T | 一键起飞/降落 |
W/S/A/D | 前后左右 |
Q/E | 逆时针/顺时针旋转 |
↑/↓ | 油门升降 |
📊 5. EKF2 参数探索实验
5.1 查看 EKF2 参数
在 QGC 中进入 Parameters → 搜索 EKF2_,可看到所有 EKF2 相关参数。
重要参数速查表
| 参数名 | 默认值 | 含义 | 分类 |
|---|---|---|---|
EKF2_ACC_NOISE | 0.35 m/s² | 加速度计观测噪声 R | 观测噪声 |
EKF2_GYR_NOISE | 0.008 rad/s | 陀螺仪观测噪声 R | 观测噪声 |
EKF2_ACC_B_NOISE | 0.003 m/s³ | 加速度计零偏过程噪声 Q | 过程噪声 |
EKF2_GYR_B_NOISE | 0.001 rad/s² | 陀螺零偏过程噪声 Q | 过程噪声 |
EKF2_ANGERR_INIT | 5.73° | 初始对准角度误差 1σ | 初始化 |
EKF2_HEAD_NOISE | 0.3 rad | 初始航向噪声 | 初始化 |
EKF2_GPS_CTRL | 5 | GPS 辅助控制位(0=禁用,1=位置,4=速度,5=全开) | GPS |
EKF2_GPS_POS_X | 1.0 m | GPS 位置观测噪声 X 方向 | GPS |
EKF2_GPS_V_NOISE | 0.3 m/s | GPS 速度观测噪声 | GPS |
EKF2_BARO_NOISE | 3.5 m | 气压计高度观测噪声 | 气压计 |
EKF2_MAG_NOISE | 0.05 Gauss | 磁力计观测噪声 | 磁力计 |
5.2 QGC 在线调参
- 双击参数值可修改,飞行中大部分参数被锁定
- 降落 → 上锁后即可修改
- 修改后点击右上角 保存(Save)
- 也可在
pxh>控制台使用param set命令:
# 查看参数
param show EKF2_ACC_NOISE
# 修改参数
param set EKF2_GPS_CTRL 0
param save
🧪 6. 纯惯导 vs GNSS/INS 融合对比实验
6.1 实验目的
理解 GNSS 对 INS 的关键约束作用,亲眼观察纯惯导发散。
6.2 实验步骤
- 正常起飞:Arm → Takeoff → 悬停在 10-15m 高度
- 保留 GPS 辅助后起飞:设
EKF2_GPS_CTRL=1(仅位置辅助) - 飞行中禁用 GPS:悬停稳定后设
EKF2_GPS_CTRL=0(即时生效) - 观察悬停:纯惯导在零机动下发散较慢,基本稳定
- 施加机动:左右晃动、前后推拉——动作执行完后,位置开始不可逆地漂移
- 尝试纠正:反向打舵——无法纠正,EKF 位置估计已偏
- 模式切换:自动切换到 Altitude Hold,水平位置无约束
- 飞走阶段:约 2 分 40 秒后水平偏移达 800 多米
- 恢复 GPS:降落 →
param set EKF2_GPS_CTRL 5→ 重新起飞 - 返航:QGC 点击 Return/Home,无人机自动返回起飞点
6.3 实验结果
关键结论:
• 纯惯性导航在消费级 IMU(如 ICM20602)下,几十秒内就会发散到不可用
• 高度因气压计约束,相对稳定
• GPS 位置/速度观测是水平定位的主要约束源
• GNSS/INS 松组合的精度取决于:IMU 质量 + GPS 精度 + EKF 参数调优
🗺️ 7. 后续学习路线
第一阶段:调参入门
- 修改
EKF2_ACC_NOISE/EKF2_GYR_NOISE观察对姿态估计灵敏度的影响 - 修改
EKF2_GPS_POS_X(放大 GPS 噪声)模拟恶劣环境 - 使用
ulog2csv导出飞行日志,用 Python/Matlab 分析 EKF2 状态量
第二阶段:接入真实 IMU
- 通过 MAVLink 外发协议,将 STM32 + ICM20602 数据送入 PX4 SITL
- 实现 HITL(Hardware In The Loop)
- 对比真实 IMU vs Gazebo 理想 IMU 的 EKF 表现差异
第三阶段:自研飞控
- 基于 PX4 EKF2 源码移植自己的 INS/GNSS 融合算法
- 购买 Pixhawk 硬件或自制 STM32 飞控
- 真机飞行验证
❓ 8. 常见问题
Q1: make px4_sitl jmavsim 报 ninja: unknown target
新版本 PX4(v1.17+)改用 Gazebo(gz-sim),旧语法已弃用。改用:
make px4_sitl gz_x500
Q2: QGC 连不上 PX4 SITL
排查步骤:
- WSL2 中
ss -tunlp | grep 14550确认端口监听 - Windows 中
ping WSL2_IP确认网络通 Test-NetConnection WSL2_IP -Port 14550检查 UDP 可达- 确认 MAVLink 配置了
-t Windows_IP参数 - 检查 Windows 防火墙未拦截
Q3: 关 GPS 后无法解锁
安全机制禁止无 GNSS 情况下起飞。在 pxh> 下强制解锁:
commander arm -f
Q4: 参数修改后不生效
- 检查是否在飞行中(需降落上锁)
- 部分参数需要重启 PX4(
shutdown退出后重新make px4_sitl gz_x500) - 确认已执行
param save写入配置文件
📝 后记
2026年7月2日
今晚在 workbuddy 的帮助下,我再次把 PX4 安装到 WSL 上了。不像之前到处查资料、反复折腾,一切都比较丝滑。是的,我应该把主要精力放在 PX4 的开发上。而不是折腾环境、和 Linux 反复拉扯。
只有自己有机会调试无人机系统的每个参数,才能真正搞懂纯惯性发散的含义——哪些参数影响收敛速度?IMU 噪声水平怎么体现到位置漂移上?GPS 观测权重设多少能让融合既不"拖后腿"也不"太激进"?这些问题在真实测试中往往被封装在黑盒里,但在 SITL 仿真中,每个 slider 都可以推,每个效果都可以亲眼验证。
我坚信这条路能走通,我也坚信自己能掌握所有核心原理。做一个懂理论、会测试、能验证的工程师。最好的那种。
加油!
2026-07-02 晚,长沙