1. 课程导入
本课程围绕“把神经网络控制器真正部署到 PX4 飞控上”这一目标展开。它不是单纯的深度学习课程,也不是单纯的 PX4 二次开发课程,而是一门把飞行动力学、神经网络建模、机载实时推理、PX4 模块化架构与实验验证方法打通的工程实践课。学完本课程,你应当能够独立完成从数据采集、模型训练、模型量化、PX4 模块编写、SITL 仿真到实机悬停测试的完整闭环。
学习目标可以概括为四句话:看得懂 PX4 的控制链路,写得出机载神经网络模块,训得出可用的控制策略,验得了仿真与实飞的性能差异。
一、核心概念:神经网络控制与 PX4 的结合点
PX4 的默认姿态与位置控制采用级联 PID,结构清晰、可解释性强,但在强风扰、模型参数漂移、载荷变化等场景下,固定增益难以兼顾所有工况。神经网络控制的核心思路,是用一个可学习的映射替代或补偿部分控制律,例如:
- 策略网络:输入姿态误差、角速率、速度等状态,直接输出归一化力矩或推力增量。
- 残差补偿网络:保留 PID 主控制律,网络只输出补偿量,降低训练难度与实飞风险。
- 系统辨识网络:学习气动阻尼、电机响应等未建模动态,为控制器提供前馈项。
在机载部署层面,关键约束是实时性与确定性。PX4 的控制主循环通常运行在 250 Hz~1 kHz,神经网络推理必须在该周期内完成,且不能引入不可控的抖动。因此本课程采用“轻量 MLP + 定点/浮点混合推理 + 固定内存分配”的工程路线,而不是直接部署大型 Transformer 或卷积网络。
二、整体框架:从训练到飞行的数据流
整个实验工程可以拆成五段:数据采集、离线训练、模型转换、机载集成、实验验证。它们之间的数据流与依赖关系如下图所示。
图中虚线表示迭代回路:实验验证中发现的跟踪误差、振荡或推理超时,会反向驱动数据采集与训练策略调整。这条回路是本课程最重要的工程习惯——神经网络控制器不是一次训练就结束,而是持续迭代的系统工程。
三、实验环境概览
课程实验环境分为三层:开发主机、仿真环境与机载目标。开发主机负责训练与代码编辑;仿真环境用于低成本快速验证;机载目标用于最终实时性验证。推荐配置如下表。
| 层级 | 典型配置 | 主要用途 | 关键指标 |
|---|---|---|---|
| 开发主机 | 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
四、方法流程:一次完整实验的推进顺序
- 定义控制目标:明确是姿态角跟踪、角速率跟踪还是位置保持,确定输入输出维度与归一化范围。
- 采集与标注数据:在 SITL 中注入风扰、质量偏移等扰动,录制 uORB 话题,形成状态-动作对。
- 训练与约束:除均方误差外,加入动作幅值约束、平滑性约束,避免网络输出剧烈抖动。
- 导出与集成:将权重转为头文件,编写 PX4 模块,在固定周期内完成前向推理并发布控制量。
- 分层验证:先 SITL 批量回归,再半实物,最后系留悬停与自由飞行,逐级放行。
建议第一版控制器采用“PID + 神经网络残差补偿”结构,而不是纯网络端到端控制。这样即使网络输出异常,PID 仍能维持基本稳定,显著降低炸机风险。
五、常见误区与复盘
- 误区一:只看训练损失,不看实时性。 训练集误差很小,但推理耗时超过控制周期,实飞必然振荡。必须把推理耗时作为一等指标。
- 误区二:忽略归一化一致性。 训练时的均值方差与机载部署时不一致,会导致输出饱和。建议把归一化参数一并写入头文件。
- 误区三:直接端到端替代 PID。 初期风险极高,应先用残差补偿验证链路,再逐步扩大网络权限。
- 误区四:仿真通过就上实飞。 仿真无法完全复现电机延迟、振动与传感器噪声,必须经过系留或限高保护测试。
机载神经网络模块必须避免动态内存分配与阻塞式调用。推理缓冲区应在模块初始化时静态分配,推理线程优先级需低于姿态控制主循环,防止抢占导致控制抖动。