尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

robust-tube-mpc完整架构剖析:5个核心类如何协作求解一个QP

robust-tube-mpc完整架构剖析:5个核心类如何协作求解一个QP robust-tube-mpc完整架构剖析5个核心类如何协作求解一个QP【免费下载链接】robust-tube-mpcExample implementation for robust model predictive control using tube项目地址: https://gitcode.com/gh_mirrors/ro/robust-tube-mpcrobust-tube-mpc 是一个用 MATLAB 实现的tube 模型预测控制tube-MPC鲁棒 MPC示例项目。它展示了如何让控制器在存在有界外部扰动的情况下依然稳定、可靠地把系统状态送入目标区域。本文将用通俗的方式拆解它的 5 个核心类带你看清它们是如何分工协作把系统动态 扰动 约束最终拼装成一个可求解的 QP二次规划问题的。 先搞懂tube MPC 为什么鲁棒普通 MPC 假设系统完全按预测运行一旦出现扰动预测就脱轨约束可能被违反。tube MPC 的思路非常巧妙它不再追踪精确轨迹而是计算一条标称轨迹nominal trajectory并在其周围留出一条管道tube真实状态只要落在这条管道内就一定满足原始约束管道的宽度由扰动不变集 Z决定——只要扰动落在给定凸集 W 内Z 就能兜底。上图为运行示例后生成的动画截图品红色是原始状态约束Xc红色是收缩后的鲁棒约束Xc⊖Z浅绿色半透明区域就是包裹标称轨迹的 tube灰色是终端约束集。可以看到真实状态蓝点在扰动作用下始终不越界。 5 个核心类一览整个项目的核心代码都在src/目录下只有 5 个关键类类名职责源文件LinearSystem系统建模动态方程、LQR 增益、闭环矩阵src/LinearSystem.mDisturbanceLinearSystem加入扰动集 W计算扰动不变集 Zsrc/DisturbanceLinearSystem.mConstraintManager统一登记、增删、合并所有约束src/ConstraintManager.mOptimalControler组装 QP 目标与约束矩阵调用求解器src/OptimalControler.mTubeModelPredictiveControl顶层编排鲁棒收缩 前馈反馈合成src/TubeModelPredictiveControl.m依赖关系是单向的TubeModelPredictiveControl→OptimalControler/DisturbanceLinearSystem→LinearSystem中间由ConstraintManager贯穿约束管理。 LinearSystem系统建模的地基LinearSystem是基类构造时只需传入四个对象状态矩阵A、输入矩阵B、状态代价Q、输入代价R。它做两件关键的事调用dlqr解连续/离散 LQR 问题得到反馈增益K和最优代价矩阵P并计算闭环矩阵Ak A BK提供compute_MPIset方法通过反复取交集迭代收敛出最大正不变集MPI set它将被用作终端约束集。这样设计的好处是后续所有类都只关心闭环动态Ak而不用重复推导稳定性的问题。️ DisturbanceLinearSystem算出兜底的扰动不变集 Z这个类继承自LinearSystem额外接收扰动凸集W例如一个正方形由 4 个顶点定义。理论上的扰动不变集是一个无穷级数Z W ⊕ Ak·W ⊕ Ak²·W ⊕ …Minkowski 加法的无限和直接精确计算是不可行的。代码采用了 Raković 等人的外层逼近算法见src/DisturbanceLinearSystem.m中的compute_mrpi_set迭代计算支撑函数直到精度满足epsilon再用有限项 Minkowski 和乘放大系数得到 Z 的近似。这个 Z 就是后续所有鲁棒收缩的标尺。它的propagate方法还会从 W 中均匀随机抽取一个扰动加到状态更新上——这正是示例动画里真实状态抖动的来源。 ConstraintManager一张约束账本QP 的约束来自四面八方动态方程等式、状态/输入范围不等式、初始条件、终端集……如果全部硬编码在一个类里会非常混乱。ConstraintManager的思路极简用两张containers.Map分别按 key 存放等式约束{C_eq1, C_eq2}和不等式约束{C_ineq1, C_ineq2}任何模块想加约束就调用add_eq_constraint/add_ineq_constraint求解前调用combine_all_*把所有分块纵向拼接成完整的约束矩阵。这个解耦是架构上最见功力的地方OptimalControler不需要知道约束从哪来TubeModelPredictiveControl也不用关心 QP 长什么样。 OptimalControler把控制问题翻译成 QPOptimalControler是数学核心。它把预测时域 N 内的最优控制问题写成标准 QP 形式决策变量s [x(0), x(1), …, x(N), u(0), …, u(N-1)]目标函数二次型V(s) sᵀHs其中H由Q、R的分块对角阵加上终端P拼成construct_costfunction等式约束逐步动力学A·x(k) − x(k1) B·u(k) 0construct_dynamics_constraint不等式约束多面体约束通过src/utils/convert_Poly2Mat.m转成F·x G·u ≤ 1的形式construct_ineq_constraint。最后solve()方法把所有约束交给 MATLAB 的quadprog求解器再把解 reshape 回轨迹序列。整个类对约束从哪里来零假设——全部来自ConstraintManager的账本。 TubeModelPredictiveControl顶层粘合剂一切鲁棒性的魔法都在这个类的构造函数里完成鲁棒收缩Xc_robust Xc − Z、Uc_robust Uc − K·Z即标称轨迹必须在收缩后的更严格区域内运行给扰动留出余量用收缩后的约束构造OptimalControler计算基于鲁棒约束的 MPI 集通过add_terminal_constraint加为终端约束每个时刻调用solve(x_init)先以x_init Z作为初始集约束解出标称轨迹再合成实际控制量u u_前馈(标称输入) K·(x_真实 − x_标称)前馈保证跟踪反馈把真实状态拉回管道内——这就是 tube MPC 鲁棒性的工程实现。⚙️ 一次闭环迭代完整流程走读把 5 个类串起来每个控制周期只需 3 步mpc.solve(x)—— 顶层类更新初始约束内部 QP 求解出标称轨迹合成输出控制量disturbance_system.propagate(x, u)—— 系统沿闭环动态演化并叠加随机扰动mpc.show_prediction()—— 绘制约束集、标称轨迹与 tube可选。示例example/example_tubeMPC.m的主循环正是这三行的 15 次重复即可复现开头的动画效果。 快速上手指南环境依赖见README.mdMATLAB Optimization ToolboxquadprogMATLAB Control System ToolboxdlqrMulti-Parametric Toolbox 3提供Polyhedron多面体运算推荐学习路径先跑example/example_MPC.m无扰动的普通 MPC直观感受 QP 求解过程再跑example/example_tubeMPC.m对比有扰动时的鲁棒表现最后看example/example_dist_inv_set.m单独验证扰动不变集 Z 如何保证鲁棒性辅助工具可参考src/utils/convert_Poly2Mat.m多面体到矩阵和src/Graphics.m绘图封装。 架构启示这个项目用不到 500 行代码展示了工业级 MPC 代码的经典分层——模型层LinearSystem 家族负责数学、约束层ConstraintManager负责解耦、求解层OptimalControler负责优化、编排层TubeModelPredictiveControl负责策略。理解这条链路你就能读懂绝大多数开源 MPC 工具包的源码结构。【免费下载链接】robust-tube-mpcExample implementation for robust model predictive control using tube项目地址: https://gitcode.com/gh_mirrors/ro/robust-tube-mpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表