4、二次规划(QP)求解器选型:QP问题标准形式、常用QP求解器对比

做MPC控制,说白了就是在线解一个优化问题。而这个优化问题,绝大多数情况下都能写成二次规划(QP)的形式。所以,选一个趁手的QP求解器,就成了咱们工程师的必修课。

我个人习惯把求解器比作工具箱里的扳手。有的扳手轻巧灵活,适合拧小螺丝;有的扳手粗壮结实,能上大扭矩。选错了,要么拧不动,要么把螺丝拧花了。今天咱们就来聊聊这些“扳手”该怎么选。

4.1 QP问题的标准形式

先统一一下语言。MPC里遇到的QP问题,长这样:

minimize     0.5 * x^T * P * x + q^T * x
subject to   l <= A * x <= u

这里,P矩阵是Hessian矩阵,必须是对称半正定的。说白了,就是保证问题有最小值,而不是越解越大。q是梯度向量,A是约束矩阵,lu是上下界。

嗯,这里要注意一点。很多刚入行的朋友会把MPC里的状态量和控制量一股脑全塞进x里。结果矩阵P变得又大又稀疏,求解效率直线下降。我建议,尽量把问题化简,能用等式消去的就别留着

4.2 常用QP求解器对比

市面上QP求解器不少,但真正在MPC领域站稳脚跟的,也就那么几个。我挑四个最有代表性的聊聊。

求解器 算法核心 开源/商业 适用场景
OSQP ADMM(交替方向乘子法) 开源 大规模、稀疏问题
qpOASES 积极集法(Active Set) 开源 中小规模、热启动
CVXOPT 内点法(Interior Point) 开源 小规模、高精度
Gurobi 混合算法(内点+单纯形) 商业 通用、高可靠性

你想想看,这四个求解器,背后的数学原理完全不同。选哪个,得看你的MPC问题长什么样。

4.2.1 OSQP:大规模问题的首选

OSQP用的是ADMM算法。这个算法的好处是,能把一个大问题拆成几个小问题,分而治之。我在项目中遇到过,一个状态量上百、预测时域20步的MPC问题,用OSQP基本能在毫秒级搞定。

但OSQP有个小脾气——它对参数rho很敏感。调不好,收敛速度会慢得像蜗牛。我一般会先用默认参数跑一遍,如果发现收敛慢,再手动调一下rho

小技巧: OSQP支持不定矩阵,但如果你能保证P矩阵是正定的,求解速度会快很多。我习惯在构建问题时,给P矩阵加一个很小的单位阵,比如 P + 1e-6 * I,既保证了正定性,又不影响精度。

4.2.2 qpOASES:热启动的王者

qpOASES用的是积极集法。这算法有个绝活——热启动。说白了,就是上一时刻的解,可以作为下一时刻的初始点。对于MPC这种滚动优化的场景,简直是量身定做。

我记得有一次做车辆轨迹跟踪,MPC的采样周期是50ms。用qpOASES,第一次求解花了3ms,后续每次求解只需要0.5ms左右。为什么?因为车辆的运动是连续的,上一时刻的最优解,离下一时刻的最优解很近。

注意: qpOASES对约束数量比较敏感。如果你的MPC问题有大量不等式约束(比如超过1000个),积极集法的效率会急剧下降。这时候,我建议你考虑OSQP。

4.2.3 CVXOPT:精度至上

CVXOPT用的是内点法。这算法精度高,但速度慢。适合离线优化,或者对实时性要求不高的场景。

我个人很少在实时MPC里用CVXOPT。但做算法验证的时候,我经常用它。为什么?因为它能给出非常精确的解,可以用来验证其他求解器的结果对不对。

4.2.4 Gurobi:商业级的可靠性

Gurobi是商业求解器,贵,但真香。它内部集成了多种算法,能自动选择最适合当前问题的方法。如果你不想在求解器调参上花时间,Gurobi是最省心的选择。

我曾经在一个工业项目里用过Gurobi。客户要求99.9%的求解成功率,而且不能有数值异常。OSQP和qpOASES都试过,偶尔会出点小问题。换上Gurobi后,稳如老狗。当然,价格也感人。

4.3 求解器性能指标

选求解器,不能光看名气。得看三个硬指标:求解速度、内存占用、数值稳定性。

4.3.1 求解速度

对于MPC来说,求解速度就是生命。你的采样周期是10ms,求解器就得在5ms内搞定,剩下的时间还得留给传感器、执行器。

我一般这样测速度:

  • 跑1000次求解,取平均时间
  • 关注最差情况下的时间,而不是平均时间
  • 考虑热启动的影响

你想想看,平均时间1ms,但最差情况突然跳到10ms,控制器可能就崩了。

4.3.2 内存占用

嵌入式系统里,内存是稀缺资源。OSQP和qpOASES的内存占用都比较小,适合在MCU上跑。CVXOPT和Gurobi就比较吃内存了,一般得上Linux工控机。

我建议,在选型初期就估算一下内存需求。一个简单的办法:看问题规模。状态量n,约束数m,内存占用大致是O(n^2 + m^2)。

4.3.3 数值稳定性

数值稳定性是个玄学。有的求解器,换个平台(比如从x86换到ARM),结果就不一样了。有的求解器,矩阵条件数一大,直接报错。

我曾经在ARM Cortex-A72上跑OSQP,发现同样的参数,在x86上收敛,在ARM上就不收敛。后来排查了半天,发现是浮点精度的问题。解决办法:把OSQP的容差参数调松一点。

核心建议: 选求解器,先看你的问题规模。小规模(n<100)用qpOASES,中大规模(n>100)用OSQP。对可靠性要求极高,预算充足,上Gurobi。CVXOPT?留着做离线验证吧。

4.4 知识体系总览

下面这张图,是我对QP求解器选型逻辑的总结。你可以把它当作一个决策流程图来看。

QP求解器选型决策逻辑 MPC QP问题 问题规模? n < 100 qpOASES n >= 100 OSQP 可靠性高? Gurobi 继续qpOASES 实时性高? 继续OSQP Gurobi 注:CVXOPT适用于离线验证场景,未在决策图中展示

这张图的核心逻辑很简单:先看问题规模,再看可靠性或实时性要求。顺着箭头走,你就能找到最适合你的求解器。

最后说一句,求解器选型没有银弹。我见过有人用OSQP跑小规模问题,也见过有人用qpOASES硬扛大规模问题。关键是你得理解每个求解器的脾气,然后根据你的MPC问题特点,做出最合适的选择。


公众号:蓝海资料掘金营,微信deep3321