跳转到内容

PX4 无人机学习路线

推荐路径位置 6/6:学习路线总览 → ROS 2 → PX4(当前)。可在满足对应阶段前置能力时直接进入本路线。

这份路线用于 PX4 方向入门,适合以下情况:

  • 会一种编程语言,但不一定接触过飞控;
  • 能使用基本的 Linux 命令;
  • 以多旋翼为第一种机型;
  • 最终希望具备仿真、飞控开发、伴随计算机开发和基础真机调试能力。

是否进入下一阶段只看验收项,不按固定时间推进。

这条路线不要求一开始把空气动力学、控制理论或 PX4 源码全部学完。先建立可运行、可观察、可解释的闭环,再按课题补充理论。

完成主线后,应能独立完成:

  1. 说明飞控、地面站、仿真器、遥控器、伴随计算机之间的关系;
  2. 搭建 PX4 SITL + Gazebo + QGroundControl 环境;
  3. 在仿真中完成起飞、悬停、航点任务、返航和降落;
  4. 解释常见飞行模式、解锁检查和失效保护;
  5. 看懂 PX4 的模块、uORB、参数和 ULog 基本工作流;
  6. 编写一个简单的 PX4 模块或 MAVSDK 程序;
  7. 使用 ROS 2 与 PX4 通信,并在仿真中完成一次安全的 Offboard 控制;
  8. 按双人复核流程完成真机基础配置、无桨台架检查和首次飞行;
  9. 遇到问题时提交包含版本、复现步骤、日志和初步判断的调试记录。

优先复现实验室已有环境:

  • PX4 v1.16.2;
  • Ubuntu 22.04;
  • Gazebo Harmonic;
  • ROS 2 Humble;
  • QGroundControl;
  • Micro XRCE-DDS Agent v2.4.3;
  • px4_msgs release/1.16。

安装步骤参考 PX4 v1.16 Ubuntu 开发环境与Gazebo 仿真官方文档。

截至本文更新时,PX4 官方文档已将 v1.17 标为稳定版,但实验室现有指南使用 v1.16.2。入门阶段应先固定版本,不要混用 main、v1.17 和 v1.16 的命令、消息定义及依赖。需要升级时,应单独建立升级任务并重新验证整条工具链。

  • 操作系统和版本;
  • PX4 Git 分支、标签和提交哈希;
  • Gazebo、ROS 2、QGroundControl 版本;
  • 飞控板型号和固件版本(涉及真机时);
  • 实际执行的命令;
  • 预期结果、实际结果和日志位置。

每个阶段都采用同一个循环:

  1. 先理解:能画出对象及数据流;
  2. 再复现:按照文档完成最小示例;
  3. 做改动:改变一个变量,观察系统响应;
  4. 故障注入:在仿真中主动制造一个失败;
  5. 留证据:保存命令、配置、截图、代码和日志;
  6. 能讲清:不看教程向其他人复述原因和结果。

“命令运行成功”只代表开始;能解释数据从哪里来、为什么这样变化、失败后如何定位,才算真正过关。

  • Linux:目录、权限、进程、环境变量、串口和网络端口;基础不足时先完成 Linux 工程实践学习路线;
  • Git:clone、branch、checkout、status、diff、commit;
  • 编程:Python 基础,能够阅读现代 C++;C++ 前置不足时先完成 C++ 机器人开发学习路线;
  • 构建工具:了解 CMake、Make、编译和链接的区别;
  • 数学:向量、矩阵、欧拉角、四元数的用途;
  • 坐标系:NED、ENU、FRD、FLU,角度与弧度;
  • 控制基础:反馈、设定值、测量值、误差、PID;
  • 估计基础:IMU、磁力计、气压计、GNSS 和状态估计的作用;
  • 多旋翼硬件:机架、飞控、电调、电机、螺旋桨、电源、遥控器、数传和 GNSS。

这些知识先学到“能识别和使用”,遇到控制、估计或驱动课题时再深入推导。

  • 能说明姿态环、速度环和位置环的大致关系;
  • 能解释坐标系混用为什么会让飞机向错误方向运动;
  • 能说出解锁、上桨和真机测试前最重要的风险点。
  • PX4 Autopilot:运行在飞控或 SITL 中的飞行栈;
  • QGroundControl:配置、任务规划、监控和日志下载;
  • Gazebo:车辆和环境的物理仿真;
  • MAVLink:飞控、地面站和外部程序之间的通信协议;
  • MAVSDK:对 MAVLink 常见能力的上层开发接口;
  • uORB:PX4 内部模块间的发布/订阅消息总线;
  • ROS 2 与 uXRCE-DDS:伴随计算机与 PX4 交换消息的通路。

拿到一个故障描述时,能先判断问题更可能位于 PX4、Gazebo、QGroundControl、MAVLink 还是 ROS 2 链路。

  • SITL 与 HITL 的区别;
  • PX4 的构建目标、机型和世界;
  • QGroundControl 的连接、地图、飞行视图和任务视图;
  • Takeoff、Position、Hold、Mission、Return、Land 等模式;
  • 解锁前检查和模式切换条件。
  • 能从全新终端独立启动整套环境;
  • 能说明每个飞行模式依赖哪些状态估计或外部信号;
  • 能在飞机不按预期行动时先停止任务,再查看状态和消息,而不是反复强制解锁。
  • 机架、传感器、遥控器、飞行模式和电源配置;
  • 参数的名称、单位、默认值和版本差异;
  • 电池、遥控链路、数传、位置和 Offboard 丢失保护;
  • 地理围栏、返航和降落行为;
  • ULog、QGroundControl 日志下载和 Flight Review;
  • 振动、估计异常、控制饱和和设定值跟踪误差的基本判断方法。

真机日志可能包含位置和设备信息。上传到公开日志分析服务前必须确认可以公开;入门阶段优先使用仿真日志或经过批准的样例。

  • 能区分“现象、证据、猜测和结论”;
  • 能指出触发失效保护的条件、延时和最终动作;
  • 不通过关闭解锁检查或失效保护来掩盖问题。
  • 飞行栈与中间件的职责划分;
  • commander、navigator、EKF2、各级控制器、控制分配和驱动的职责;
  • PX4 模块、任务和 Work Queue;
  • uORB 发布/订阅;
  • 参数、启动脚本、机型配置和板级配置;
  • 从消息和模块反向追踪数据流的方法。

建议先认识这些源码目录:

PX4-Autopilot/
├── src/modules/ # 飞行栈和系统模块
├── src/drivers/ # 传感器与外设驱动
├── msg/ # uORB 消息定义
├── ROMFS/ # 启动脚本和系统资源
├── boards/ # 板级配置
├── Tools/ # 构建、仿真和开发工具
└── test/ # 测试
  • 能解释一个模块如何启动、接收消息、运行并退出;
  • 能沿着 uORB 主题找到数据生产者和消费者;
  • 能在 SITL 中编译并运行自己的最小模块;
  • 不直接把入门代码用于电机或执行器控制。

MAVSDK 比直接处理 MAVLink 数据包更适合作为外部控制的第一步。先用 MAVSDK 完成常见任务,再根据项目需要学习 MAVLink 消息、命令、任务和参数微服务。

  • MAVLink 的 system ID、component ID、消息、命令和心跳;
  • 遥测流与需要确认的命令之间的区别;
  • MAVSDK 的连接、Telemetry、Action、Mission 和 Offboard 接口;
  • 异步程序、超时、重试、拒绝解锁和异常处理。
  • 程序不会在连接未建立或状态不健康时直接解锁;
  • 每个关键动作都有超时和失败分支;
  • 能说明自己的代码最终触发了哪些 PX4 模式或 MAVLink 行为。

进入本阶段前,应已经会使用 ROS 2 的工作空间、包、节点、topic、service、QoS、launch 和 colcon。如果这些概念还不熟,先完成 ROS 2 机器人开发学习路线 的对应阶段,不要直接在 PX4 工程中边猜边改。

  • PX4 uXRCE-DDS client 与 Micro XRCE-DDS Agent;
  • px4_msgs 与 PX4 固件消息版本的对应关系;
  • /fmu/out/*、/fmu/in/* 方向;
  • ROS 2 QoS 和消息频率;
  • NED/FRD 与 ENU/FLU 坐标转换;
  • OffboardControlMode、TrajectorySetpoint、VehicleCommand;
  • Offboard 心跳、进入条件和链路丢失保护。

PX4 Offboard 模式要求外部控制器持续发送有效的“存活”信号。官方 v1.16 文档要求频率高于 2 Hz,并在信号中断后退出 Offboard。因此,节点设计必须把消息频率、超时和失效动作当作核心功能,而不是完成轨迹后再补。

  • 能解释从 ROS 2 发布一个 setpoint 到 PX4 控制器接收它的完整路径;
  • 能用工具证明消息是否到达、频率是否合格,而不是只看飞机是否移动;
  • 节点异常退出后,飞机能按预设策略进入安全模式;
  • 在仿真完成故障注入前,不把 Offboard 程序用于真机。

阶段 7:真机基础配置与首次飞行

Section titled “阶段 7:真机基础配置与首次飞行”

首次上电、首次上桨和首次自主飞行必须执行现场双人复核,不得单人操作。复核时必须覆盖供电、接线、参数、失效保护、遥控接管和中止条件。

进入真机阶段前,团队必须完成并记录:

  • 现役飞控、机架、遥控器、数传和伴随计算机清单已经确认;
  • 飞行场地、空域和活动所需的审批或授权已经确认;
  • 飞前检查表、停止条件、事故与失联处置流程已经批准;
  • 飞手、观察员、现场负责人的职责和人员隔离区域已经明确;
  • 机型、固件、参数、遥控链路和人工接管方式已经在仿真或无桨台架验证;
  • 电池、消防、人员隔离和天气限制符合团队安全要求。

任一条件未满足时,只能继续仿真、HITL 或无桨台架实验,不进入上桨和飞行环节。

  1. 台架配置、刷写、校准和电机方向检查时必须拆除螺旋桨;
  2. 不用关闭解锁检查、传感器检查或失效保护来换取“先飞起来”;
  3. 每次参数、固件、接线或载荷变化都要留下记录并重新检查相关项目;
  4. 自主飞行前必须验证人工接管、Return、Land 和链路丢失行为;Kill/flight termination 只能先在仿真或无桨台架验证,不在首飞中主动触发。
  1. 核对机架、电机、电调、电源、飞控方向、GNSS、遥控器和数传接线;
  2. 不装桨上电,确认供电电压、电流、温度、传感器和通信正常;
  3. 刷写已批准版本的固件,选择正确机架;
  4. 完成传感器、遥控器、电源和执行器配置;
  5. 无桨检查电机序号、方向和急停或 flight termination 配置;
  6. 配置飞行模式、返航、地理围栏和各类失效保护;
  7. 完成飞前检查表,由第二人复核;
  8. 在合规、空旷、可控的场地进行低高度人工首飞;
  9. 降落后立即下载日志,确认振动、估计和控制状态;
  10. 基础飞行稳定后,再逐步尝试任务或伴随计算机控制。
  • 能解释所有关键接线和参数的作用;
  • 能在不上桨的情况下完成完整台架检查;
  • 首飞记录包含检查表、环境、配置、飞手、观察员和日志;
  • 任何异常都有明确的停止条件,不带病继续飞行。

主线完成后选择一个方向深入,不要求同时学习全部内容。

  • 多旋翼动力学、级联 PID、前馈和滤波;
  • EKF2、传感器噪声、创新量和故障判定;
  • 控制器、轨迹生成和控制分配;
  • ULog 分析、系统辨识、仿真回放和参数调优。
  • 外部定位、VIO、光流、深度相机和点云;
  • 坐标变换、时间同步和传感器标定;
  • 轨迹规划、避障、任务状态机和多机命名空间;
  • 仿真到真机的延迟、频率和失效保护。
  • NuttX、任务调度、Work Queue 和内存限制;
  • I2C、SPI、UART、CAN/DroneCAN;
  • PX4 驱动框架、板级配置、启动脚本和外部模块;
  • 硬件调试、性能分析和自动化测试。
  • MAVLink 消息和微服务;
  • MAVSDK、任务上传、参数管理和相机/载荷控制;
  • 多机连接、日志、网络和权限管理;
  • 地面端状态机与异常恢复。
  • 固定翼气动与舵面;
  • 空速、TECS、起飞、盘旋和降落;
  • VTOL 转换逻辑和 Quad-chute;
  • 对应机型的专用配置、调参与安全策略。

固定翼和 VTOL 不应直接沿用多旋翼的控制、场地和安全假设。

  • 阶段 0~1 建立安全意识和系统模型,通过验收后再进入飞行仿真。
  • 阶段 2~3 的仿真、失效保护和日志分析通过验收后,再开始阅读源码和开发外部控制程序。
  • 阶段 4~6 的 PX4 应用、MAVLink/MAVSDK 和 ROS 2 Offboard 可以按项目方向取舍,但所选链路必须完成故障注入和安全状态验证。
  • 进入阶段 7 前,阶段 0~6 的相关验收必须完成,并具备合适真机、场地、双人复核和明确的中止方案。不满足条件时继续使用 SITL、HITL 和仿真故障注入。
  • 阶段 8 只选择与实际需求相关的专项方向,不要求全部完成。

每个阶段按下面四级判断:

等级 表现
未开始 不能独立复现,也说不清关键对象
已复现 跟随文档能完成,但遇到变化容易卡住
可独立 能从空环境复现、解释并处理常见失败
可交接 能把过程写成别人可复现的文档,并审查他人的结果

进入真机阶段前,阶段 0~3 至少达到“可独立”;承担某一专项任务前,对应阶段至少达到“可独立”。

遇到问题时,不只发一张报错截图。至少提供:

目标:我想完成什么?
环境:系统、PX4/Gazebo/ROS 2/QGC 版本和 Git 哈希
复现:从干净终端开始执行了哪些命令?
预期:应该看到什么?
实际:实际现象和完整错误是什么?
证据:终端输出、参数、日志、topic 频率、截图
尝试:已经验证或排除了什么?
判断:目前认为最可能的问题在哪一层?为什么?

以下早期项目记录可用于理解外部定位传感器与飞控的接入场景,但所用飞控、协议和软件版本不一定与当前 PX4 环境一致。

学习时优先使用与实验版本一致的官方文档,再参考论坛、博客和视频。旧教程中的 Gazebo Classic、Fast RTPS、ROS 1 或旧版启动命令不能直接套用到当前环境。