Apollo MPC OSQP Solver
Apollo MPC算法之前使用qpOASES Solver, 现在替换为OSQP, 二次规划问题的求解速度和怎么构造优化问题有一定的联系, 要想提升整体的求解速度和求解成功率, 应该尽量少的使用等式约束。
OSQP Benchmark
使用qpOASES Solver构造二次规划问题的形式与OSQP Solver构造二次规划问题的形式不相同,关于qpOASES Solver是如何构造二次规划问题的可以参考:
qpOASES QP Formulation
关于Apollo使用的基于道路进行线性化的车辆动力学公式以及离散化方式请参考:
Linearized Lateral Error Dynamics
现在假设在采样时刻 k k k 我们已经得到如下车辆Error Dynamics 线性系统状态方程
x k + 1 = A ( k ) x k + B ( k ) u k + C ( k ) x_{k + 1} = A(k)x_{k} +B(k)u_{k} + C(k) xk+1=A(k)xk+B(k)uk+C(k)
同时, 我们状态量和输入量的上下限 x m i n x_{min} xmin, x m a x x_{max} xmax, u m i n u_{min} umin, u m a x u_{max} umax已经规定好, Q ( k ) Q(k) Q(k)和 R ( k ) R(k) R(k)为 k k k时刻的状态惩罚矩阵和输入惩罚矩阵。 A k A_{k} Ak, B k B_{k} Bk和 C k C_{k} Ck分别为 k k k时刻 Linearized Error Dynamics的系统矩阵, 输入矩阵和干扰矩阵。
在 k k k时刻,将这些量带入初始化OSQP Solver:
MpcOsqp::MpcOsqp(const Eigen::MatrixXd &matrix_a,
const Eigen::MatrixXd &matrix_b,
const Eigen::MatrixXd &matrix_q,
const Eigen::MatrixXd &matrix_r,
const Eigen::MatrixXd &matrix_initial_x,
const Eigen::MatrixXd &matrix_u_lower,
const Eigen::MatrixXd &matrix_u_upper,
const Eigen::MatrixXd &matrix_x_lower,
const Eigen::MatrixXd &matrix_x_upper,
const Eigen::MatrixXd &matrix_x_ref, const int max_iter,
const int horizon, const double eps_abs)
: matrix_a_(matrix_a),
matrix_b_(matrix_b),
matrix_q_(matrix_q),
matrix_r_(matrix_r),
matrix_initial_x_(matrix_initial_x),
matrix_u_lower_(matrix_u_lower),
matrix_u_upper_(matrix_u_upper),
matrix_x_lower_(matrix_x_lower),
matrix_x_upper_(matrix_x_upper),
matrix_x_ref_(matrix_x_ref),
max_iteration_(max_iter),
horizon_(horizon),
eps_abs_(eps_abs) {
state_dim_ = matrix_b.rows();
control_dim_ = matrix_b.cols();
ADEBUG << "state_dim" << state_dim_;
ADEBUG << "control_dim_" << control_dim_;
num_param_ = state_dim_ * (horizon_ + 1) + control_dim_ * horizon_;
}
参数对应表格:
参数 | 代码变量名称 |
---|---|
A k A_{k} Ak | matrix_a |
B k B_{k} Bk | matrix_b |
Q k Q_{k} Qk | matrix_q |
R k R_{k} Rk | matrix_r |
x k x_{k} xk | matrix_initial_x |
x m a x x_{max} xmax | matrix_x_upper |
x m i n x_{min} xmin | matrix_x_lower |
u m a x u_{max} umax | matrix_u_upper |
u m i n u_{min} umin | matrix_u_lower |
优化目标函数和约束
Apollo MPC使用如下优化目标函数,
u 0 ∗ = min x k , u k ∑ k = 0 N ( x k − x r ) T Q ( x k − x r ) + ∑ k = 0 N − 1 u k T R u k x k + 1 = A x k + B u k x m i n ≤ x k ≤ x m a x u m i n ≤ x k ≤ u m a x x 0 = x ˉ u_{0} ^{*} = \min_{x_{k}, u_{k}} \sum_{k=0}^{N} (x_k-x_r)^T Q (x_k-x_r) + \sum_{k=0}^{N - 1}u_k^T R u_k \\ x_{k+1} = A x_k + B u_k \\ x_{\rm min} \le x_k \le x_{\rm max} \\ u_{\rm min} \le x_k \le u_{\rm max} \\ x_{0} = \bar{x} u0∗=xk,ukmink=0∑N(xk−xr)TQ(xk−xr)+k=0∑N−1ukTRukxk+1=Axk+Bukxmin≤xk≤xmaxumin≤xk≤umaxx0=xˉ
其中 N N N为prediction horizon。
OSQP 二次规划标准形式
OSQP优化问题的标准形式如下:
min x 1 2 x T P x + q T x s u b j e c t t o l ≤ A c x ≤ u \min_{x}~~~~\dfrac{1}{2}x^{T}Px + q^{T}x \\ subject~to~ l \leq A_{c}x \leq u xmin 21xTPx+qTxsubject to l≤Acx≤u
上述二次规划问题只包括不等式约束不包括等式约束,对于等式约束 A e q x = b e q A_{eq}x = b_{eq} Aeqx=beq,应该对其进行如下变换,将其化为不等式约束:
b e q ≤ A e q x ≤ b e q b_{eq} \leq A_{eq}x \leq b_{eq} beq≤Aeqx≤