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是约束矩阵,l和u是上下界。
嗯,这里要注意一点。很多刚入行的朋友会把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。
P + 1e-6 * I,既保证了正定性,又不影响精度。
4.2.2 qpOASES:热启动的王者
qpOASES用的是积极集法。这算法有个绝活——热启动。说白了,就是上一时刻的解,可以作为下一时刻的初始点。对于MPC这种滚动优化的场景,简直是量身定做。
我记得有一次做车辆轨迹跟踪,MPC的采样周期是50ms。用qpOASES,第一次求解花了3ms,后续每次求解只需要0.5ms左右。为什么?因为车辆的运动是连续的,上一时刻的最优解,离下一时刻的最优解很近。
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的容差参数调松一点。
4.4 知识体系总览
下面这张图,是我对QP求解器选型逻辑的总结。你可以把它当作一个决策流程图来看。
这张图的核心逻辑很简单:先看问题规模,再看可靠性或实时性要求。顺着箭头走,你就能找到最适合你的求解器。
最后说一句,求解器选型没有银弹。我见过有人用OSQP跑小规模问题,也见过有人用qpOASES硬扛大规模问题。关键是你得理解每个求解器的脾气,然后根据你的MPC问题特点,做出最合适的选择。
公众号:蓝海资料掘金营,微信deep3321