21m/s!UZH RPG组T-RO新作AC-MPC:微分MPC赋能强化学习,实现超人级无人机竞速

21m/s!UZH RPG组T-RO新作AC-MPC:微分MPC赋能强化学习,实现超人级无人机竞速

「MPC+RL」

目录

01 主要方法

 1. 整体架构:RL决策 + MPC执行

 2. Actor设计:学习代价而非动作

3. Critic设计与模型预测价值扩展

02  实验结果

1.训练效率与极限性能:学得更快,飞得更猛

 2.鲁棒性:无惧风扰与参数偏差

 3.可解释性:打开 RL 的黑盒

 4.真实世界部署:零样本迁移的 21m/s

03  总结


在机器人控制领域,长期存在着模型驱动(MPC)与数据驱动(RL)的路线之争。前者理论完备但依赖人工调参,后者探索力强却受困于黑盒不可解释性。苏黎世大学 RPG 组的这项 T-RO 最新工作,为这一争论提供了一个优雅的融合解

论文提出的 AC-MPC 架构,创造性地将可微 MPC嵌入到 Actor-Critic 框架的策略网络末端。这不仅让无人机跑出了 21m/s 的超人级速度,更重要的是解决了两大痛点:

1. 鲁棒性突破:利用 MPC 内置的动力学先验,算法在面对风扰和模型参数失配等 OOD场景时,展现出了纯神经网络无法比拟的稳定性。 

2. 理论可解释性:论文通过实证分析揭示了一个惊人的数学联系,Critic 网络学到的 Value Function 的 Hessian 矩阵,与 MPC 学到的 Cost 矩阵高度相关。这意味着 RL 真正学会了控制成本的二阶曲率,打通了价值函数与优化目标之间的壁垒。

这篇文章不仅是工程上的胜利,更是对学习型控制(Learning-based Control)内部机理的一次精彩剖析。

图片

图1| MPC与RL对比图

01 主要方法

论文提出了一种将模型预测控制(MPC)作为可微层嵌入到强化学习(RL)Actor-Critic框架中的新方法。其核心思想并非用神经网络直接输出控制量,而是让神经网络学习当前状态下最优的控制目标是什么,然后交由内置动力学模型的MPC求解器去计算具体的控制指令。

 1. 整体架构:RL决策 + MPC执行

传统RL直接从观测映射到动作,缺乏物理约束;传统MPC依赖人工设计的Cost Function,难以适应复杂任务。AC-MPC结合两者:Critic网络负责长期的价值评估,Actor网络被拆解为神经代价图(Neural Cost Map)和“可微MPC(Differentiable MPC)两部分。

图片

图2| AC-MPC 架构图解。与传统RL不同,AC-MPC的Actor网络并不直接输出动作。它首先通过一个神经网络预测出当前最优的二次型代价函数参数,然后将这些参数连同当前状态输入到一个可微MPC层中。该层利用四旋翼动力学模型求解优化问题,最终输出满足物理约束的控制指令。

 2. Actor设计:学习代价而非动作

AC-MPC 的 Actor 不直接学习控制策略,而是学习一个从观测到 MPC 代价函数的映射。具体流程为 Actor 接收当前观测(如状态、赛道门位置),输出定义 MPC 优化目标的二次型参数

$Q_k$

$p_k$

。这相当于让 Actor 在每一时刻动态调整 MPC 的优化目标。

在获得 Actor 输出的二次型参数后,AC-MPC 通过求解以下最优控制问题来生成动作。由于 AC-MPC 可微,该 Actor 的输出支持梯度反向传播。优化目标公式如下:

$ J_{QP}(x) = \sum_{k=0}^{N} \left( \begin{bmatrix} x_k \\ u_k \end{bmatrix}^T Q_k(s) \begin{bmatrix} x_k \\ u_k \end{bmatrix} + p_k(s)^T \begin{bmatrix} x_k \\ u_k \end{bmatrix} \right) $

其中,

$s_k$

是 Actor 的观测输入,

$Q_k(s)$

$p_k(s)$

是神经网络的输出,

$x_k, u_k$

分别是系统状态和控制动作,满足动力学约束

$x_{k+1} = f(x_k, u_k)$

最终的控制动作为 MPC 的最优解,为了实现充分探索,AC-MPC 在训练阶段会叠加高斯噪声,在部署阶段则直接执行 MPC 解。

3. Critic设计与模型预测价值扩展

为了进一步提高采样效率,论文引入了模型预测价值扩展(MPVE)技术。由于MPC求解器会预测未来 H 步的状态序列,这些预测信息被用来辅助Critic的学习,减少对真实环境采样的依赖,并缓解价值估计的方差。MPVE的价值估计公式如下:

$\hat{V}(s_0) = \sum_{t=0}^{H-1} \gamma^t \hat{r}(s_t, u_t) + \gamma^H V_\omega(\hat{s}_H)$

其中,

$\hat{s}$

$\hat{r}$

来自 MPC 内部模型的预测,而非环境交互。这种设计使得 Critic 能更准确地评估当前策略的长期价值,同时利用 MPC 的预测能力加速训练收敛。


图3| 价值函数与飞行轨迹可视化。图中颜色代表Critic网络评估的价值(黄色为高价值区)。可以看到,AC-MPC学到的价值函数就像一个势能场,引导无人机穿越赛道门。当无人机穿过一个门后,高价值区域会迅速切换指向下一个门,体现了Critic通过学习Cost Function实现了类似离散模式切换的高级决策能力。

02  实验结果

论文在仿真环境和真实世界中进行了广泛的验证,不仅证明了 AC-MPC 能达到与 SOTA 强化学习同等的超人级速度,更在鲁棒性和数据效率上展现了压倒性优势。

1.训练效率与极限性能:学得更快,飞得更猛

在无人机竞速任务中,AC-MPC 展现了极高的采样效率。特别是在高难度的 SplitS(垂直S弯) 和 Vertical(垂直飞行) 赛道中,AC-MPC 能够利用 MPC 内部的动力学先验,比纯神经网络(AC-MLP)更快地收敛到高分奖励区域。此外,在控制指令层面,AC-MPC 能够更一致地触及无人机的物理极限(如推力饱和),通过极致地压榨性能来实现时间最优飞行。

图片

图4| 推力指令饱和度对比。AC-MPC(橙线)能够持续且稳定地将推力打到最大值(饱和),充分利用无人机的物理性能;而 AC-MLP(绿线)的推力输出则显得犹豫和波动,难以维持极限飞行。

图片

图5| 不同赛道下的训练曲线对比。在简单的水平赛道(左)上两者表现相当;但在高难度的垂直赛道(中)和 SplitS 赛道(右)中,AC-MPC(蓝/黄线)凭借动力学先验,展现出了比 AC-MLP(红线)更高的采样效率和最终性能上限。

 2.鲁棒性:无惧风扰与参数偏差

由于MPC具有较强的抗扰动能力,即使面对在训练中未见过的强风干扰,或者无人机自身的质量、惯量发生巨大变化时,AC-MPC 依然能保持极高的成功率,而无需重新训练。

图片

图6| 抗干扰能力可视化。(A) 在垂直飞行中施加 1.5 倍重力的侧向风扰。纯 RL 方法(AC-MLP)和传统 MPC 均告坠毁,只有自适应 L1-MPC 和本文的 AC-MPC 成功穿越,且 AC-MPC 速度更快。(B) 面对初始位置的随机变化,AC-MPC(中)的轨迹一致性显著优于 AC-MLP(左)。

图片

图7| 动力学参数泛化测试。在未重新训练的情况下,测试不同质量(Mass)和转动惯量(Inertia)下的飞行成功率。红线为训练时的标称值。可以看到,AC-MPC(橙线)在参数大幅偏离标称值时仍能保持近 100% 的成功率,而 AC-MLP(蓝线)则迅速崩溃。

 3.可解释性:打开 RL 的黑盒

除性能验证外,论文还深入探究了Critic 网络到底学到了什么。通过线性探测实验,作者发现 Critic 网络学到的价值函数的 Hessian 矩阵,与 Actor 网络学到的 MPC 代价矩阵高度相关。这证明了 RL 确实学到了符合物理直觉的控制代价。

图片

图8| 价值函数与 MPC 代价矩阵的关联性分析。(A) 预测的 Q 矩阵与真实的 Q 矩阵高度吻合,说明 Critic 深刻理解了控制任务的代价结构。(B) 3D 视图下,MPC 的代价函数曲面(上)与 Critic 的价值函数曲面(下)形状惊人一致,验证了两者在数学本质上的统一性。

 4.真实世界部署:零样本迁移的 21m/s

最终,基于 AC-MPC 训练好的策略在无任何处理的情况下,通过零样本迁移直接部署在真实的竞速无人机上。在复杂的 SplitS 赛道中,AC-MPC 达到了 21m/s 的峰值速度,不仅追平了 SOTA 的纯 RL 方法,更证明了该架构在现实物理世界中的可行性与安全性。

图片

图9| 真实世界飞行轨迹。AC-MPC 在圆形赛道(左)和 SplitS 赛道(右)的真实飞行数据(实线)与仿真数据(虚线)高度重合。AC-MPC在真实环境中跑出了 21m/s 的峰值速度,实现了从仿真到现实的完美复刻。

03  总结

UZH RPG组的 AC-MPC 工作提出了一种将可微MPC无缝嵌入到Actor-Critic 强化学习框架的全新范式。该方法打破了传统学习动作的桎梏,转而让策略网络学习 MPC 的内部代价函数,从而在保留 RL 强大探索与端到端优化能力的同时,充分利用了物理模型处理约束和动态规划的优势。

实验证明,AC-MPC 不仅在真实世界无人机竞速中实现了与 SOTA 纯 RL 方法持平的 21m/s 超人级速度,更在抗风扰和参数泛化等非分布场景下展现出压倒性的鲁棒性,为机器人从仿真到现实的零样本迁移提供了一条可解释且高效的新路径。

论文题目:Actor-Critic Model Predictive Control: Differentiable Optimizationmeets Reinforcement Learning for Agile Flight

论文作者:Angel Romero, Elie Aljalbout, Yunlong Song, Davide Scaramuzza

论文地址:https://ieeexplore.ieee.org/document/11301631

代码地址:https://github.com/uzh-rpg/acmpc public

Read more

前端代码质量保证:让你的代码更可靠

前端代码质量保证:让你的代码更可靠 毒舌时刻 代码质量?听起来就像是前端工程师为了显得自己很专业而特意搞的一套复杂流程。你以为随便写几个测试就能保证代码质量?别做梦了!到时候你会发现,测试代码比业务代码还多,维护起来比业务代码还麻烦。 你以为ESLint能解决所有问题?别天真了!ESLint只能检查代码风格,无法检查逻辑错误。还有那些所谓的代码质量工具,看起来高大上,用起来却各种问题。 为什么你需要这个 1. 减少错误:代码质量保证可以帮助你发现和修复代码中的错误,减少生产环境中的问题。 2. 提高可维护性:高质量的代码更容易理解和维护,减少后期的维护成本。 3. 促进团队协作:统一的代码质量标准可以便于团队成员之间的协作,减少沟通成本。 4. 提高开发效率:高质量的代码可以减少调试和修复错误的时间,提高开发效率。 5. 提升代码安全性:代码质量保证可以帮助你发现和修复安全漏洞,提升代码的安全性。 反面教材 // 这是一个典型的代码质量问题示例 // 1. 代码风格不一致 function getUser(id) { return fetch(`/api/

WebVOWL:OWL本体可视化的终极指南与完整教程

WebVOWL:OWL本体可视化的终极指南与完整教程 【免费下载链接】WebVOWLVisualizing ontologies on the Web 项目地址: https://gitcode.com/gh_mirrors/we/WebVOWL 想要直观理解复杂的OWL本体结构吗?WebVOWL就是你的完美解决方案!🎯 这款基于Web的开源工具专门用于OWL本体的可视化展示,让语义网技术变得触手可及。无论你是语义网初学者还是资深开发者,WebVOWL都能帮助你快速掌握本体知识。 🔍 什么是WebVOWL? WebVOWL是一个强大的Web应用程序,采用VOWL(Visual Notation for OWL Ontologies)可视化符号,将抽象的OWL本体概念转化为直观的图形表示。通过节点、链接和不同形状的可视化元素,你可以轻松理解类、属性、实例之间的复杂关系。 核心功能亮点: * 🎨 基于VOWL标准的可视化表示 * 🌐 纯Web技术实现,无需安装复杂软件 * 📊 支持多种本体格式和实时交互 * 🖼️ 一键导出SVG、JSON等多种格式 �

【Web】深入解析C3P0反序列化漏洞——Hex字节码加载与防御策略

1. C3P0反序列化漏洞概述 C3P0作为Java生态中广泛使用的JDBC连接池组件,其反序列化漏洞近年来在安全领域备受关注。这个漏洞的特殊之处在于,它允许攻击者在不出网(无需外部网络连接)的情况下,通过精心构造的Hex字节码实现远程代码执行。我在实际渗透测试中多次遇到这个漏洞,发现它常与Fastjson、Jackson等流行框架组合出现,形成完整的攻击链。 漏洞的核心在于WrapperConnectionPoolDataSource类对userOverridesAsString属性的处理机制。当这个属性以"HexAsciiSerializedMap"开头时,C3P0会将其后的十六进制字符串转换为字节数组并进行反序列化操作。这种设计原本是为了支持连接池配置的灵活存储,却意外成为了安全突破口。 2. Hex字节码加载机制深度解析 2.1 漏洞触发流程分析 让我们通过一个真实案例来理解漏洞触发过程。去年在某次企业安全评估中,我发现一个使用Fastjson 1.2.47的Web服务,配合C3P0 0.9.5.2版本,形成了完美的攻击面。攻击者只需要发送如下JSON数据: {

前端组件库:别再重复造轮子了

前端组件库:别再重复造轮子了 毒舌时刻 这组件写得跟拼凑似的,一点都不统一。 各位前端同行,咱们今天聊聊前端组件库。别告诉我你还在手动编写所有组件,那感觉就像在没有工具的情况下盖房子——能盖,但效率低得可怜。 为什么你需要组件库 最近看到一个项目,每个组件都要手动编写,样式不统一,维护困难。我就想问:你是在做组件还是在做重复劳动? 反面教材 // 反面教材:手动编写组件 // Button.jsx import React from 'react'; function Button({ children, onClick }) { return ( <button onClick={onClick} style={{ padding: '10px 20px', backgroundColor: '#007bff', color: '