我是靠谱客的博主 冷傲铅笔,最近开发中收集的这篇文章主要介绍基于二次规划的模型预测控制MPC方法(算法推导与MATLAB建模),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

公式推导参考链接,以下工作来自于b站Dr_can博士

一般情况下,状态空间,或者叫做动力学模型离散表达为:

x ( k + 1 ) = A x ( k ) + B u ( k ) x(k+1)=A x(k)+B u(k) x(k+1)=Ax(k)+Bu(k)

MPC是目前自动驾驶领域比较流行的控制框架,主要分为动力学预测,优化求解,滚动控制三个部分。其中,优化求解方法有多种,譬如说凸优化、二次规划等等。凸优化要求状态约束满足凸集的形式,也有相关凸化的方法,但是求解过程往往十分复杂,非常耗时。二次规划方法在求解方面有天然优势,因此受到了MPC控制框架的青睐。

对于约束部分,在二次规划问题中,只能处理线性约束,譬如等式约束或者是不等式约束,需要考虑实际的情况。在简单情况下,也可以不考虑相关线性约束。

MPC需要使用动力学模型对状态量进行预测,设定预测步数为N,那么状态量表示为:

X ( k ) = [ x ( k ∣ k ) x ( k + 1 ∣ k ) ⋮ x ( k + i ∣ k ) ⋮ x ( k + N ∣ k ) ] {X(k)}=left[begin{array}{c}x(k mid k) \x(k+1 mid k) \vdots \x(k+i mid k) \vdots \x(k+N mid k)end{array}right] X(k)=x(kk)x(k+1k)x(k+ik)x(k+Nk)

控制量表示为:

U ( k ) = [ u ( k ∣ k ) u ( k + 1 ∣ k ) ⋮ u ( k + i ∣ k ) ⋮ u ( k + N − 1 ∣ k ) ] boldsymbol{U}(k)=left[begin{array}{c}boldsymbol{u}(k mid k) \boldsymbol{u}(k+1 mid k) \vdots \boldsymbol{u}(k+i mid k) \vdots \boldsymbol{u}(k+N-1 mid k)end{array}right] U(k)=u(kk)u(k+1k)u(k+ik)u(k+N1k)

将预测过程写入到矩阵中,方便进行优化求解,则有如下:

X ( k ) = M x ( k ) + C U ( k ) X(k)=Mx(k)+CU(k) X(k)=Mx(k)+CU(k)

其中,

M = [ I n × n A n × n A 2 ⋮ A N ] boldsymbol{M}=left[begin{array}{c}boldsymbol{I}_{n times n} \boldsymbol{A}_{n times n} \boldsymbol{A}^{2} \vdots \boldsymbol{A}^{N}end{array}right] M=In×nAn×nA2AN

C = [ 0 0 … 0 ⋮ ⋮ … ⋮ 0 0 0 B 0 … 0 A B B … 0 ⋮ ⋮ ⋱ 0 A N − 1 B A N − 2 B … B ] C=left[begin{array}{cccc}0 & 0 & ldots & 0 \vdots & vdots & ldots & vdots \0 & 0 & & 0 \B & 0 & ldots & 0 \A B & B & ldots & 0 \vdots & vdots & ddots & 0 \A^{N-1} B & A^{N-2} B & ldots & Bend{array}right] C=00BABAN1B000BAN2B00000B

因此,考虑到控制燃料最优,最终点约束和预测状态约束等问题,惩罚函数为:

J = ∑ i = 0 N − 1 ( x ( k + i ∣ k ) T Q x ( k + i ∣ k ) + u ( k + i ∣ k ) T R u ( k + i ∣ k ) ) + x ( k + N ∣ k ) T F x ( k + N ∣ k ) J=sum_{i=0}^{N-1}left(boldsymbol{x}(k+i mid k)^{T} boldsymbol{Q} boldsymbol{x}(k+i mid k)+boldsymbol{u}(k+i mid k)^{T} boldsymbol{R} boldsymbol{u}(k+i mid k)right)+boldsymbol{x}(k+N mid k)^{T} boldsymbol{F} boldsymbol{x}(k+N mid k) J=i=0N1(x(k+ik)TQx(k+ik)+u(k+ik)TRu(k+ik))+x(k+Nk)TFx(k+Nk)

转换成为二次规划的形式,如下:

J = x ( k ) T G x ( k ) + U ( k ) T H U ( k ) + 2 x ( k ) T E U ( k ) J=boldsymbol{x}(k)^{T} boldsymbol{G} boldsymbol{x}(k)+boldsymbol{U}(k)^{T} boldsymbol{H} boldsymbol{U}(k)+2 boldsymbol{x}(k)^{T} boldsymbol{E} boldsymbol{U}(k) J=x(k)TGx(k)+U(k)THU(k)+2x(k)TEU(k)

其中,

G ˉ = M T Q ˉ M E ˉ = C T Q ˉ M H ˉ = C T Q ˉ C + R ˉ begin{array}{l} bar{G}={M^{T} bar{Q} M} \ bar{E}=C^{T} bar{Q} M \ bar{H}=C^{T} bar{Q} C+bar{R} end{array} Gˉ=MTQˉMEˉ=CTQˉMHˉ=CTQˉC+Rˉ

其中,

Q ‾ = [ Q ⋯ ⋮ Q ⋮ ⋯ F ] R ‾ = [ R ⋯ ⋮ ⋱ ⋮ ⋯ R ] overline{boldsymbol{Q}}=left[begin{array}{ccc}boldsymbol{Q} & cdots & \vdots & boldsymbol{Q} & vdots \& cdots & boldsymbol{F}end{array}right] quad overline{boldsymbol{R}}=left[begin{array}{ccc}boldsymbol{R} & cdots & \vdots & ddots & vdots \& cdots & boldsymbol{R}end{array}right] Q=QQFR=RR

在代价函数中,第一项对于二次规划无关紧要可以忽略。第二、三项即为二次规划的一般形式。通过二次规划求解,就能获得优化控制量 U k U_k Uk,选取第一个控制量作为系统的输入,进行求解即可。

举例,具体形式为:

[ x 1 ( k + 1 ) x 2 ( k + 1 ) ] = [ 1 0.1 0 2 ] [ x 1 ( k ) x 2 ( k ) ] + [ 0 0.5 ] u ( k ) left[begin{array}{l}x_{1}(k+1) \x_{2}(k+1)end{array}right]=left[begin{array}{cc}1 & 0.1 \0 & 2end{array}right]left[begin{array}{l}x_{1}(k) \x_{2}(k)end{array}right]+left[begin{array}{c}0 \0.5end{array}right] u(k) [x1(k+1)x2(k+1)]=[100.12][x1(k)x2(k)]+[00.5]u(k)

设定初始值,并进行求解控制量即可,相关代码如下。

如果有完整的动力学模型,可以进行第三步—滚动优化,将每次优化得到的 u k u_k uk作为控制量实现滚动控制。这里省略相关动力学模型更新,传感器观测等建模过程。

A = [1,0.1;0,2];
B = [0;0.5];
N = 10;
x_k = [5;5];
Q = [1,0;0,1];
R = [0.1];
F = Q;
[M,C,Q_bar,R_bar,G,E,H,U_k] = MPC_Zero_Ref1(A,B,N,x_k,Q,R,F)
function [M,C,Q_bar,R_bar,G,E,H,U_k] = MPC_Zero_Ref1(A,B,N,x_k,Q,R,F)
n = size(A,1);
p = size(B,2);
M = [eye(n);zeros(N*n,n)];
C = zeros((N+1)*n,N*p);
tmp = eye(n);
for i = 1:N
rows = i*n+(1:n);
C(rows,:) = [tmp*B,C(rows-n,1:end-p)];
tmp = A*tmp;
M(rows,:) = tmp;
end
S_q = size(Q,1);
S_r = size(R,1);
Q_bar = zeros((N+1)*S_q,(N+1)*S_q);
for i = 0:N
Q_bar(i*S_q+1:(i+1)*S_q,i*S_q+1:(i+1)*S_q) = Q;
end
Q_bar(N*S_q+1:(N+1)*S_q,N*S_q+1:(N+1)*S_q) = R;
R_bar = zeros(N*S_r,N*S_r);
for i = 0:N-1
R_bar(i*S_r+1:(i+1)*S_r,i*S_r+1:(i+1)*S_r) = R;
end
G = M'*Q_bar*M;
E = C'*Q_bar*M;
H = C'*Q_bar*C + R_bar;
f = (x_k'*E')';
U_k = quadprog(H,f);
end

最后

以上就是冷傲铅笔为你收集整理的基于二次规划的模型预测控制MPC方法(算法推导与MATLAB建模)的全部内容,希望文章能够帮你解决基于二次规划的模型预测控制MPC方法(算法推导与MATLAB建模)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部