说明: 本文记录 2026-07-02 晚从零搭建 PX4 SITL 仿真的全过程。全程在 AI(WorkBuddy)指导下完成,我只负责执行指令和观察现象。IP 地址等敏感信息已脱敏处理。

🔧 1. 环境搭建

1.1 检查 WSL2

Windows 上打开 PowerShell,确认 WSL2 已安装:

PowerShell
wsl --list --verbose

预期输出:

output
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2

如果未安装,管理员 PowerShell 执行 wsl --install -d Ubuntu,重启后完成设置。

1.2 克隆 PX4 源码

从 Gitee 镜像克隆(国内速度快):

WSL2 — bash
# 进 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 官方依赖安装脚本:

WSL2 — bash
bash ./Tools/setup/ubuntu.sh

此脚本自动安装 GCC、CMake、Python 依赖、Gazebo 仿真器等。安装完成后会看到大量 Setting up ... 的输出。

⚙️ 2. PX4 SITL 编译与运行

2.1 首次编译

WSL2 — make
make px4_sitl

首次编译耗时约 10-30 分钟,编译完成后会看到:

output — PX4 boot
[1156/1156] Linking CXX shared library ...
______  __   __    ___
| ___ \ \ \ / /   /   |
| |_/ /  \ V /   / /| |
|  __/   /   \  / /_| |
| |     / /^\ \ \___  |
\_|     \/   \/     |_/

px4 starting.

2.2 启动 Gazebo 仿真

WSL2 — bash
make px4_sitl gz_x500

启动后:

PX4 启动页面
PX4 SITL 启动成功,Gazebo 窗口 + PX4 控制台

📡 3. 连接 QGroundControl

3.1 安装 QGC

Windows 端下载安装:QGroundControl 官网

3.2 MAVLink 广播配置

PX4 默认 MAVLink 只监听 127.0.0.1(WSL2 内部本地),需要配置跨网络通信。

pxh> 控制台输入:

pxh> MAVLink 配置
# 停止原有 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.1Windows 宿主 IP(以 ip route | grep default 查询为准)

验证连接:

WSL2 — 验证
# 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:

字段
TypeUDP
Port14550
Server AddressesWSL2_IP:14550
✅ 自动连接
WSL 中 PX4 控制台界面
WSL2 中 PX4 控制台 + QGC 已连接

🚁 4. 仿真飞行与操作

4.1 Gazebo 视图操作

操作效果
鼠标滚轮向前放大
鼠标滚轮向后缩小
按住鼠标右键拖动旋转视角
按住鼠标中键拖动平移视角
关闭右侧 Entity 面板扩大 3D 视图区域

4.2 起飞流程

  1. 等待就绪:GPS 锁定、EKF2 收敛、电池状态正常
  2. 解锁(Arm):QGC 左下角锁按钮 或 Shift + A
  3. 起飞:左侧工具栏 Takeoff 按钮,设置高度(如 10m)
  4. 飞行控制:虚拟摇杆或键盘 W/A/S/D / Q/E
  5. 降落:Land 模式或按 T

键盘快捷键

按键功能
Shift + A解锁/上锁
T一键起飞/降落
W/S/A/D前后左右
Q/E逆时针/顺时针旋转
↑/↓油门升降
Gazebo Sim 无人机降落界面
Gazebo 仿真中无人机降落

📊 5. EKF2 参数探索实验

IMU Accel + Gyro GNSS Position + Vel Baro / Mag Altitude + Heading EKF2 Extended Kalman Filter Position · Velocity Attitude · Biases PX4 Flight Controller Motor Output MAVLink / QGC GPS:5

5.1 查看 EKF2 参数

在 QGC 中进入 Parameters → 搜索 EKF2_,可看到所有 EKF2 相关参数。

重要参数速查表

参数名默认值含义分类
EKF2_ACC_NOISE0.35 m/s²加速度计观测噪声 R观测噪声
EKF2_GYR_NOISE0.008 rad/s陀螺仪观测噪声 R观测噪声
EKF2_ACC_B_NOISE0.003 m/s³加速度计零偏过程噪声 Q过程噪声
EKF2_GYR_B_NOISE0.001 rad/s²陀螺零偏过程噪声 Q过程噪声
EKF2_ANGERR_INIT5.73°初始对准角度误差 1σ初始化
EKF2_HEAD_NOISE0.3 rad初始航向噪声初始化
EKF2_GPS_CTRL5GPS 辅助控制位(0=禁用,1=位置,4=速度,5=全开)GPS
EKF2_GPS_POS_X1.0 mGPS 位置观测噪声 X 方向GPS
EKF2_GPS_V_NOISE0.3 m/sGPS 速度观测噪声GPS
EKF2_BARO_NOISE3.5 m气压计高度观测噪声气压计
EKF2_MAG_NOISE0.05 Gauss磁力计观测噪声磁力计

5.2 QGC 在线调参

pxh> 参数操作
# 查看参数
param show EKF2_ACC_NOISE

# 修改参数
param set EKF2_GPS_CTRL 0
param save

🧪 6. 纯惯导 vs GNSS/INS 融合对比实验

6.1 实验目的

理解 GNSS 对 INS 的关键约束作用,亲眼观察纯惯导发散。

6.2 实验步骤

  1. 正常起飞:Arm → Takeoff → 悬停在 10-15m 高度
  2. 保留 GPS 辅助后起飞:设 EKF2_GPS_CTRL=1(仅位置辅助)
  3. 飞行中禁用 GPS:悬停稳定后设 EKF2_GPS_CTRL=0(即时生效)
  4. 观察悬停:纯惯导在零机动下发散较慢,基本稳定
  5. 施加机动:左右晃动、前后推拉——动作执行完后,位置开始不可逆地漂移
  6. 尝试纠正:反向打舵——无法纠正,EKF 位置估计已偏
  7. 模式切换:自动切换到 Altitude Hold,水平位置无约束
  8. 飞走阶段:约 2 分 40 秒后水平偏移达 800 多米
  9. 恢复 GPS:降落 → param set EKF2_GPS_CTRL 5 → 重新起飞
  10. 返航:QGC 点击 Return/Home,无人机自动返回起飞点
QGroundControl 去掉 GPS 试验截图
关 GPS 后无人机位置偏移,地图上持续偏离
起飞点 GNSS/INS 融合 (稳定) GPS OFF 纯惯导漂移 (发散) ~800m 偏移 (2min40s)

6.3 实验结果

关键结论:

• 纯惯性导航在消费级 IMU(如 ICM20602)下,几十秒内就会发散到不可用

• 高度因气压计约束,相对稳定

• GPS 位置/速度观测是水平定位的主要约束源

• GNSS/INS 松组合的精度取决于:IMU 质量 + GPS 精度 + EKF 参数调优

🗺️ 7. 后续学习路线

第一阶段:调参入门

第二阶段:接入真实 IMU

第三阶段:自研飞控

8. 常见问题

Q1: make px4_sitl jmavsimninja: unknown target

新版本 PX4(v1.17+)改用 Gazebo(gz-sim),旧语法已弃用。改用:

WSL2 — bash
make px4_sitl gz_x500

Q2: QGC 连不上 PX4 SITL

排查步骤:

  1. WSL2 中 ss -tunlp | grep 14550 确认端口监听
  2. Windows 中 ping WSL2_IP 确认网络通
  3. Test-NetConnection WSL2_IP -Port 14550 检查 UDP 可达
  4. 确认 MAVLink 配置了 -t Windows_IP 参数
  5. 检查 Windows 防火墙未拦截

Q3: 关 GPS 后无法解锁

安全机制禁止无 GNSS 情况下起飞。在 pxh> 下强制解锁:

pxh>
commander arm -f

Q4: 参数修改后不生效

📝 后记

2026年7月2日

今晚在 workbuddy 的帮助下,我再次把 PX4 安装到 WSL 上了。不像之前到处查资料、反复折腾,一切都比较丝滑。是的,我应该把主要精力放在 PX4 的开发上。而不是折腾环境、和 Linux 反复拉扯。

只有自己有机会调试无人机系统的每个参数,才能真正搞懂纯惯性发散的含义——哪些参数影响收敛速度?IMU 噪声水平怎么体现到位置漂移上?GPS 观测权重设多少能让融合既不"拖后腿"也不"太激进"?这些问题在真实测试中往往被封装在黑盒里,但在 SITL 仿真中,每个 slider 都可以推,每个效果都可以亲眼验证。

我坚信这条路能走通,我也坚信自己能掌握所有核心原理。做一个懂理论、会测试、能验证的工程师。最好的那种。

加油!

2026-07-02 晚,长沙