1. 课程导入

本课程围绕“把神经网络控制器真正部署到 PX4 飞控上”这一目标展开。它不是单纯的深度学习课程,也不是单纯的 PX4 二次开发课程,而是一门把飞行动力学、神经网络建模、机载实时推理、PX4 模块化架构与实验验证方法打通的工程实践课。学完本课程,你应当能够独立完成从数据采集、模型训练、模型量化、PX4 模块编写、SITL 仿真到实机悬停测试的完整闭环。

学习目标可以概括为四句话:看得懂 PX4 的控制链路,写得出机载神经网络模块,训得出可用的控制策略,验得了仿真与实飞的性能差异。

一、核心概念:神经网络控制与 PX4 的结合点

PX4 的默认姿态与位置控制采用级联 PID,结构清晰、可解释性强,但在强风扰、模型参数漂移、载荷变化等场景下,固定增益难以兼顾所有工况。神经网络控制的核心思路,是用一个可学习的映射替代或补偿部分控制律,例如:

  • 策略网络:输入姿态误差、角速率、速度等状态,直接输出归一化力矩或推力增量。
  • 残差补偿网络:保留 PID 主控制律,网络只输出补偿量,降低训练难度与实飞风险。
  • 系统辨识网络:学习气动阻尼、电机响应等未建模动态,为控制器提供前馈项。

在机载部署层面,关键约束是实时性与确定性。PX4 的控制主循环通常运行在 250 Hz~1 kHz,神经网络推理必须在该周期内完成,且不能引入不可控的抖动。因此本课程采用“轻量 MLP + 定点/浮点混合推理 + 固定内存分配”的工程路线,而不是直接部署大型 Transformer 或卷积网络。

二、整体框架:从训练到飞行的数据流

整个实验工程可以拆成五段:数据采集、离线训练、模型转换、机载集成、实验验证。它们之间的数据流与依赖关系如下图所示。

数据采集 SITL / 实飞日志 uORB 话题录制 离线训练 PyTorch / 监督+RL 损失与约束设计 模型转换 ONNX → 权重导出 量化 / 定点化 机载集成 PX4 模块 + uORB 推理线程与调度 实验验证闭环 SITL 回归 → 半实物 → 系留悬停 → 自由飞行 指标:跟踪误差 / 超调 / 推理耗时 / CPU 占用 迭代:误差分析 → 再训练

图中虚线表示迭代回路:实验验证中发现的跟踪误差、振荡或推理超时,会反向驱动数据采集与训练策略调整。这条回路是本课程最重要的工程习惯——神经网络控制器不是一次训练就结束,而是持续迭代的系统工程。

三、实验环境概览

课程实验环境分为三层:开发主机、仿真环境与机载目标。开发主机负责训练与代码编辑;仿真环境用于低成本快速验证;机载目标用于最终实时性验证。推荐配置如下表。

层级 典型配置 主要用途 关键指标
开发主机 Ubuntu 22.04 + Python 3.10 + PyTorch 数据清洗、模型训练、权重导出 训练收敛、验证集误差
仿真环境 PX4 SITL + Gazebo + MAVROS/MAVSDK 控制律回归、故障注入、批量测试 跟踪误差、仿真步长
机载目标 Pixhawk 6X / 6C,STM32H7 系列 实时推理、uORB 通信、实飞验证 推理耗时、CPU 占用、内存
地面站 QGroundControl + 日志分析脚本 参数配置、飞行监控、日志回放 日志完整性、时间同步

环境搭建的关键命令示例:

# 克隆 PX4 与仿真依赖
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
make px4_sitl gazebo-classic

# 启动 MAVROS 桥接
ros2 launch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"

# 导出训练好的权重为 C 头文件
python export_weights.py --ckpt policy.pt --out nn_weights.h

四、方法流程:一次完整实验的推进顺序

  1. 定义控制目标:明确是姿态角跟踪、角速率跟踪还是位置保持,确定输入输出维度与归一化范围。
  2. 采集与标注数据:在 SITL 中注入风扰、质量偏移等扰动,录制 uORB 话题,形成状态-动作对。
  3. 训练与约束:除均方误差外,加入动作幅值约束、平滑性约束,避免网络输出剧烈抖动。
  4. 导出与集成:将权重转为头文件,编写 PX4 模块,在固定周期内完成前向推理并发布控制量。
  5. 分层验证:先 SITL 批量回归,再半实物,最后系留悬停与自由飞行,逐级放行。
建议第一版控制器采用“PID + 神经网络残差补偿”结构,而不是纯网络端到端控制。这样即使网络输出异常,PID 仍能维持基本稳定,显著降低炸机风险。

五、常见误区与复盘

  • 误区一:只看训练损失,不看实时性。 训练集误差很小,但推理耗时超过控制周期,实飞必然振荡。必须把推理耗时作为一等指标。
  • 误区二:忽略归一化一致性。 训练时的均值方差与机载部署时不一致,会导致输出饱和。建议把归一化参数一并写入头文件。
  • 误区三:直接端到端替代 PID。 初期风险极高,应先用残差补偿验证链路,再逐步扩大网络权限。
  • 误区四:仿真通过就上实飞。 仿真无法完全复现电机延迟、振动与传感器噪声,必须经过系留或限高保护测试。
机载神经网络模块必须避免动态内存分配与阻塞式调用。推理缓冲区应在模块初始化时静态分配,推理线程优先级需低于姿态控制主循环,防止抢占导致控制抖动。