
容错强化学习八旋翼飞行器项目资讯项目正在进行中有首飞视频可看。若想持续关注可留意相关平台发布的更新。有人想从零开始打造一款定制八旋翼飞行器此前毫无硬件经验从有想法到让无人机飞起来仅用了 2.5 周。飞行器在 Fusion 360 中完成设计采用 G10 玻璃纤维和碳纤维经 CNC 铣削加工而成并通过手工进行组装。其最终目标是训练一个强化学习RL控制器使其在模拟环境中能够在单电机、双电机和四电机故障的情况下维持飞行并能零样本迁移至硬件设备。项目阶段以下是常见问题解答阶段一使用 CAD 设计定制八旋翼飞行器通过 CNC 切割并组装框架、电机和螺旋桨。阶段二连接电子设备让八旋翼飞行器像普通飞行器一样飞行。阶段三开发并训练一个 RL 策略使其能够支持八旋翼飞行器正常飞行并在双电机故障时保持稳定。阶段四完成从模拟到现实的过渡实现 RL 驱动的飞行。在实地测试中随机关闭两个电机后仍能维持飞行。建造日志第 30 天学习曲线2026 年 6 月 28 日无人机在单电机、双电机甚至部分三电机故障的情况下都能飞行但目前仅在模拟环境中实现且经历了很多学习过程。在使用领域随机化和各种优化手段训练大型策略之前先训练了一个仅用于模拟的策略在 CPU 上大约一个半小时就能完成。不过第一次尝试并不成功以下是详细过程的时间线序号尝试内容结果1采用基线近端策略优化算法PPO高探索率始终设置两个故障。训练持续了一整晚。失败。整个过程中熵从 11 攀升到 22在尝试保存时于 2000 万步时崩溃还好有检查点。2降低探索率保持始终两个故障且不使用课程学习直接进入双电机故障训练。这个似乎可行。在 200 万步时看起来有问题在第 7 步坠毁熵为负 —— 当方差缩小时高斯微分熵可能为负但最终还是完成了训练。故意终止了训练因为想先加入单电机故障的训练。3加入悬停 - 单电机 - 双电机的课程学习一切都乱了。结果发现课程学习中 400 万步的纯悬停暴露了两个潜在的错误从第 0 步开始的故障提供了足够的训练信号来掩盖这些错误。4非配置问题 —— 操作员失误前一晚的一个僵尸训练进程与新的训练进程同时运行且都在写入相同的检查点文件名。5采用残差动作u 悬停 动作。指令被推至 ±3达到饱和且不平衡 —— 在 7 步内就倾覆。6去除/重新添加课程学习低探索率。每个检查点的成功率都是 0% —— 而且每次都在第 7 步坠毁即使在纯悬停阶段也是如此。意识到这个问题肯定是系统性的。7采用以下两个真正的解决方案。成功。在 50 万步时学会了悬停在约 950 万步时悬停/单电机/双电机故障的生存率达到 100%。从第 3 项开始的所有尝试都是在处理两个潜在错误的症状1. 动作陷入停滞。高斯策略输出无界均值但环境将指令硬裁剪到 [0,1] 范围内而 PPO 在未裁剪的值上计算梯度 —— 所以一旦电机漂移超过裁剪边界就没有纠正梯度将其拉回它就会一直停在那里。对于 8 个电机来说这会导致不平衡的倾覆而且没有超参数可以解决这个问题因为这不是超参数的问题。解决方案是通过双曲正切函数tanh作为悬停油门的残差进行压缩这样指令就不会饱和未经训练的网络也能实现悬停。仅这一项就将未经训练时的生存步数从 7 步提高到了 205 步。2. 保持飞行没有奖励。开环悬停测试每一步都显示 r 0.00在约 190 万步时无人机实际上已经稳定下来但 0.1 的生存奖励正好被 -0.1 的高度惩罚抵消。由于无人机只是勉强稳定每个回合最终都会坠毁-10所以 “悬停 200 步然后坠毁” 和 “立即坠毁” 的回报是相同的。解决方案是将 r_survive 从 0.1 提高到 1.0这样悬停每步能获得 0.9 的奖励PPO 终于有了保持飞行的动力。最终策略是一个包含 43400 个参数的多层感知器MLP。该策略甚至能泛化到从未训练过的三电机故障情况只要物理上有可能恢复。即使关闭了 3 个相邻的电机物理上无法恢复它也能坚持 7.2 秒然后下沉而不是翻滚。一个惊喜发现是“无法补偿偏航” 的情况实际上并非无法补偿策略能将航向保持在每秒约 13° 以内 —— 只是缓慢漂移而不是自由旋转。下一步是开发真正可从模拟迁移到现实的策略第 25 天像物理学家一样把无人机挂在厨房桌子上2026 年 6 月 23 日设计并打印了一个 GPS 支架这是锁定整个系统质量所需的最后一个组件。现在无人机已完全组装完成能够收集其完整的系统识别数据。接下来主要是软件方面的工作希望能重新集中精力。以下是系统识别结果和计算虽不完全完美或科学但希望领域随机化能弥补不准确之处。使用了制造商提供的电机/推进器特性信息并且已经收集了质心信息。$I (T² · M · g · d²) / (8π² · L) → I 0.36974 · d² · T²$$M 1.177 kg$ $L 0.39552 m$ $d 半绳间距 (m)$ $T 20 次振荡时间 ÷ 20 (s)$测量数据每次试验记录 20 次振荡的时间$T 总时间 / 20$。绳间距测量为全宽并取半得到 $d$。每个轴进行 7 次试验粉色表示在取平均值前去掉的最差的 2 次。轴T1T2T3T4T5T6T7平均 20 次振荡时间 (s)T (s)绳间距 (mm)d (m)横滚12.9712.8713.1512.9212.912.8212.9212.9060.6453332.5920.166296俯仰12.7712.6412.8212.6312.7512.8412.8212.760.638332.5920.166296偏航13.8413.5213.5213.4713.5213.413.6513.5360.6768380.3140.190157结果轴T (s)d (m)I (kg·m²)横滚0.64530.1662960.004258俯仰0.63800.1662960.004162偏航0.67680.1901570.006125第 22 天坚持计划并做出改变2026 年 6 月 20 日无人机现在有 8 条腿用于降落这应该会让试飞不再那么令人提心吊胆。从现在起会更加关注每个组件的重量这 8 条腿总共重 7.67 克。还决定暂时不再使用单独的微控制器。原本计划在无人机上安装一个单独的伴侣计算机来运行 RL 策略并通过 MSP 向 Betaflight 发送电机指令 —— 最初考虑使用树莓派 4后来在树莓派不太合适的情况下考虑使用 Teensy。但问题在于无论选择哪种板卡架构都需要直接向 8 个电机发送指令而通过 MSP 这样做会与 Betaflight 的安全模型冲突电机在解除武装或失去连接时不能可靠地停止。所以放弃了单独的微控制器直接将策略编译到现有的 Betaflight 固件中这样还能大幅降低循环延迟。启发做出这个决定的论文有《Learning to Fly in Seconds》Eschmann 等人RA - L 2024和 NeuroflightKoch 等人2019。会先尝试这种方法如果遇到重大阻碍再重新评估。第 17 天雄鹰起飞2026 年 6 月 15 日今天距离最初有想法正好过去了 2.5 周正式完成了从概念到让八旋翼飞行器飞起来的整个流程而且此前没有任何硬件或 CAD 经验开始这个项目时甚至从未飞过无人机。目前只进行了悬停测试机上也没有安装微控制器所以这只是一架完全普通的八旋翼飞行器没有任何 RL 能力。在这架无人机能够安全飞行之前还有很多工作要做。需要说明的是目前如果这架无人机在飞行中失去一个电机它可能还能保持飞行。八旋翼飞行器以对单电机故障具有较高的容错性而闻名原因有两个1. 有巨大的推力冗余悬停时 8 个电机每个负载约 125 克这意味着失去一个电机后总推力容量从约 11000 克降至约 9750 克对于重量近 5 千克的无人机来说仍足以保持 2:1 的推力重量比无人机重 1 千克。2. Betaflight 的 PID 循环以数千赫兹的频率运行它不需要知道无人机倾斜的原因 —— 它只看到陀螺仪报告的横滚信息然后命令低侧的剩余电机加大推力。偏航不平衡会由 Betaflight 的混合器在幸存的顺时针CW和逆时针CCW电机之间重新分配油门来部分补偿。无人机可能会有缓慢的偏航漂移响应能力也会下降但通常不会从空中坠落除非发生其他严重问题。问题在于这种方法只对一个电机故障有效。一旦第二个电机出现故障尤其是两个同向旋转的电机成 90° 角静态混合器就会失效。它会继续向两个故障电机索要推力无人机将变得无法控制。这正是 RL 要解决的故障模式。另外在 Betaflight 中进行配置时将无人机的启动提示音设置为 Future 的《Mask Off》。而且这种扁平的八臂框架比典型的四旋翼具有更大的有效圆盘面积这意味着有很强的地面效应 —— 旋翼向下推动的空气会在地面上压缩并反弹产生额外的推力所以无人机在地面附近会感觉异常轻盈。常见问题为什么不使用模型预测控制MPC很多人在 X 上问过这个问题说实话主要原因是特别想做一个 RL 项目并围绕这个目标设计了这架无人机。提出容错八旋翼飞行器的概念是为了在真实硬件上学习 RL而不是相反。不过从工程角度来看使用 RL 也有一些实际的理由推理成本MPC 在每个时间步都要解决一个优化问题对于一个控制 8 个电机的树莓派来说这需要大量的计算比 RL 多RL 只需要通过一个约 50000 个参数的网络进行一次前向传播推理时间可能在 1 毫秒以下。未知故障状态据了解MPC 通常需要知道系统的运行状态如果没有专门的故障检测器这会带来额外的工作。而 RL 策略可以从指令和实际行为之间的差距中隐式推断出故障状态。模型不匹配容忍度MPC 的性能取决于其模型的准确性。使用的廉价电机可能并不完全相同测量得到的惯性张量也只是近似值。RL 训练中的大量领域随机化可以明确地让策略学会处理模型误差。而基于同样不确定模型构建的 MPC 控制器则无法自动获得这种能力。对于这样的项目MPC 可能是更可靠的选择但不是最有趣的选项。如果 RL 无法实现MPC 绝对是备用方案 —— 到那时可能会把这次尝试当作一次有用的数据收集为模型的构建提供参考。第 13 天下一步 —— 训练 RL 策略2026 年 6 月 11 日自从在 X 上发布相关内容后收到了很多私信询问接下来如何让无人机通过 RL 飞行。以下是目前的计划。最重要的是RL 策略将通过串行链路以 50 Hz 的频率直接向飞行控制器发送指令控制所有 8 个电机并且不使用传统的 PID 循环。这是唯一能让策略在电机故障时完全自主重新分配推力的架构。重点关注六种独特的故障类型忽略旋转等效情况单电机故障、相邻电机对45°混合 CW/CCW、90° 同向电机故障、135° 混合电机故障、180° 同向电机故障和全电子速度控制器ESC故障每个 ESC 控制一组四个电机。最困难的情况是 90° 同向电机故障因为它同时面临两个问题偏航扭矩不平衡两个故障电机旋转方向相同和剩余推力几何形状的空间不对称。失去两个同向旋转的电机后会有 2 个 CW 和 4 个 CCW 电机运行反之亦然在相同油门下偏航扭矩不平衡比例为 2:1。为了平衡偏航CW 电机的单电机推力需要达到 CCW 电机的 2 倍。每个电机的最大推力为 1393 克平衡偏航后的推力上限为 5572 克 —— 对于重量约 2.8 千克的无人机来说仍足以保持 2:1 的推力重量比无人机重 1 千克。剩下的 6 个电机分布在 270° 的弧形范围内所以仍然有横滚和俯仰控制能力。最坏的情况也是可以生存的 —— 无人机可能会旋转但仍然可以悬停并软着陆。状态8 电机全工作90° 同向电机故障6 个电机最大总推力11144 克5572 克偏航平衡后悬停时 CW 电机负载~9%~18%2:1 推力重量比下的最大无人机重量~5.6 千克~2.8 千克偏航控制能力完全接近零模拟环境使用 MuJoCo 构建模拟环境因为它在 CPU 上运行速度快而且使用的是 Mac这排除了 Isaac Lab 和几乎所有 NVIDIA 相关的工具。对于一个具有 8 个推力点的单刚体来说MuJoCo 已经足够可以在笔记本电脑上并行运行约 128 个环境。模型本身基于实际测量数据而不是 CAD 设计。将收集以下数据总质量、通过双线摆测试得到的惯性张量、电机推力曲线、电机时间常数、悬停油门点。还在模拟环境中加入了两个经常看到的会影响从模拟到现实迁移的因素1. 电机延迟实际电机需要 20 - 50 毫秒才能达到指令速度。在模拟中如果不进行建模推力会瞬间变化。一个在瞬间响应电机上学习的策略会学会频繁抖动。2. 循环延迟在实际无人机上从惯性测量单元IMU读取数据到推力实际变化之间约有 15 - 30 毫秒的延迟包括串行读取、推理、串行写入和 ESC 响应。如果在训练时不考虑延迟策略在应用到硬件上时会产生振荡。对其进行了大量随机化处理策略在每个回合中都会面对不同的延迟并且在回合内延迟也会抖动。其他物理因素也进行了随机化处理质量 ±10%、单电机推力常数 ±15%廉价电机并不完全相同有 8 组数据可以证明、质心、飞行过程中的电池电压下降、传感器噪声。训练使用 [PufferLib] 实现的 PPO 算法。也考虑过软演员 - 评论家算法SAC因为它样本效率更高但样本效率解决的不是面临的问题 —— 模拟步骤几乎是免费的。读过的几乎所有从模拟到现实飞行的论文都使用了带有大量并行环境的 PPO它在并行环境中扩展更简单并且在大量随机化带来的方差下更稳定。还从模拟到现实的文献中借鉴了两个决策1. 评论家可以获取额外信息。在训练过程中价值网络可以看到真实无人机永远无法获得的地面真值信息比如哪些电机故障、确切的推力常数和真实速度。而演员网络只能看到真实传感器提供的信息。训练结束后评论家网络会被丢弃所以在部署时不会产生额外成本。这被称为非对称演员 - 评论家算法了解到在物理环境高度随机化的情况下它会有很大的作用。2. 暂时不使用故障检测器。策略可以看到过去 5 个观察/动作帧需要自己从指令和无人机实际行为之间的差距中推断出故障情况。在同向双电机故障的情况下无人机在物理上无法保持航向 —— 任何油门组合都无法平衡扭矩。正确的做法是放弃对偏航的控制缓慢绕垂直轴旋转并保持水平。如果奖励函数惩罚旋转策略会为了追求一个无法实现的航向而牺牲横滚和俯仰控制。Mueller 和 DAndrea 在四旋翼失去一个电机的情况下也观察到了同样的现象 —— 他们的四旋翼在恢复过程中一直旋转。无人机也会故意这样做。部署如果策略在模拟环境中显示出有希望的生存率它将被导出为 ONNX 格式并在树莓派 4 上运行。网络大约有 45000 个参数推理时间不到 1 毫秒所以树莓派不会成为瓶颈。50 Hz 的循环会通过串行接口读取姿态和陀螺仪数据运行策略并写入 8 个电机指令。然后就是实际的实验飞行通过遥控器关闭电机看看数百万次模拟坠毁的训练是否让它学到了什么第 11 天内部故障2026 年 6 月 9 日固件刷新没有按计划进行H743 AeroSelfie 飞行控制器上的 USB - C 输入端口坏了。不过这不是什么天大的问题那块板上的所有东西都是预先焊接好的拆下来退货也很容易。麻烦的是一个坏的飞行控制器是关键环节在新的控制器到货之前项目无法继续推进。把支座和顶部机身板安装到无人机上想看看组装好后的整体样子并给组装好的无人机称重。安装电池后无人机正好重 1 千克这个重量包括除飞行控制器外的所有东西飞行控制器的重量可以忽略不计。每个电机在充满电的 6S 电池下70% 油门时大约能产生 950 克的推力全油门时可达 1393 克。8 个电机在 70% 油门时总推力为 7600 克 —— 即 7.6 千克而无人机重量仅为 1 千克推力重量比达到 7.6:1。悬停时每个电机只需要 125 克的推力大约是 15 - 20% 的油门。这意味着无人机在悬停状态下有很大的推力余量 —— 在 70% 油门时它产生的推力几乎是悬停所需的 8 倍。动力过剩的无人机在电机故障时会有更多的容错空间或者理想情况下能够完全恢复并保持正常飞行。在新的飞行控制器到货之前有点卡住了但提醒自己这是做硬件项目时难免会遇到的情况。虽然烦人但并不令人沮丧真的很期待看到这架无人机尽快实现悬停。第 9 天完成布线2026 年 6 月 7 日把飞行控制器、两个 ESC、GPS、电池线和接收器焊接在一起了理论上现在无人机可以悬停了但还没进行测试。焊接经验不足所以这部分比之前的 CAD 设计和组装工作花的时间都长。由于从未以这种方式组装过电子设备很难想象各个部件如何配合也很难把线焊得整齐。最后决定只使用一根电池线把它夹在两个 ESC 之间这样可以同时为它们供电。ESC 和飞行控制器叠放在一起以简化重心调整。当让这架无人机像普通八旋翼飞行器一样飞行时还需要在机上安装一个树莓派或 Jetson Nano 来运行推理。计划把这块板粘在顶部板的底部。在测试悬停之前需要为两个 ESC 刷新 Bluejay 固件配置 Betaflight将混合器设置为八旋翼扁平 X 模式ESC 协议设置为 DSHOT600启用加速度计并调整保守的速率和武装参数配置 RC 信号在飞行中丢失时的故障安全行为进行平衡检查找到能使质心居中的电池位置并固定好第 6 天用强力胶固定用胶带绑好准备焊接2026 年 6 月 4 日夹具一打印好就用它来对齐无人机的臂并在臂之间的缝隙中填充强力胶。强力胶固化后臂完全稳定了这意味着之前担心的臂对齐不完美导致的振动问题不会出现了。原本计划今天开始焊接所有电子设备但还在等烙铁到货。等材料到货且有时间后就会开始布线。在夹具中用强力胶固定臂时需要松开螺丝才能让臂完全放入夹具支撑中。其中一个螺丝卡住了断了不得不钻出来。不过还好对框架的损坏非常小第 4 天使用组装夹具2026 年 6 月 2 日继续进行组装工作把 8 个电机安装到臂上把 8 个螺旋桨安装到电机上。但有个小问题如果用力拉扯即使所有螺丝都拧紧了有些臂还是会有点晃动。认为这是因为在 CAD 中设置的切割公差为 0.1 毫米而不知道 CNC 铣床的精度如何。以后更好的公差应该是 0.05 毫米或 0.08 毫米。臂的任何晃动在飞行时都可能导致振动这可能会影响飞行动力学使基于 RL 的飞行变得不可能。解决方案是 3D 打印一个零公差的组装夹具在无人机中心用强力胶固定时将臂固定在完美的位置。第 3 天开始组装2026 年 6 月 1 日在尖峰国家公园度过一个周末后把无人机的机身组装起来了8 个臂、底板和中板。第 1 天CAD 设计、CNC 铣削项目开端2026 年 5 月 30 日最近在危地马拉度假时在阿蒂特兰湖岸边的吊床上想出了这个项目的主意。立刻在亚马逊上订购了大部分所需的零件并开始思考如何打造一架完全由 RL 驱动、具备智能容错能力的八旋翼飞行器。从未做过大型硬件项目从未使用过 CAD 软件只焊过一次电路对无人机飞行控制器、速度控制器或相关领域一无所知从未飞过无人机也从未训练过像这个项目所需的这么复杂的 RL 策略。多亏了在谷歌、Reddit、Claude 上花费的大量时间以及与 [Tomas] 的交流他是航空工程专业的帮解决了所有 CAD 和机加工车间的问题才得以开始这个项目。这个项目的前两个步骤在今天都已启动并完成。