mpc:MPC算法学习(1) 2024-04-17 23:23:28 0 0 目录 一、了解MPC 1.MPC → Model PredictIve Control 2.MPC基本工作原理 二、MPC设计 1.MPC参数设计 2.MPC使用范围 3.MPC速度优化 三、MPC推导 1.基于单位脉冲响应的公式推导 2.基于状态空间的推导 四、仿真实例 1.SISO系统 2.MIMO系统 3.基于simulink的仿真 4.车辆横向运动状态空间模型的推导 5.自适应MPC 五、多种MPC类型拓展 1.非线性MPC(nonlinear MPC\NMPC) 2.线性时变MPC(LTV MPC) 一、了解MPC 1.MPC → Model PredictIve Control (1)处理对象:输入输出之间有交互作用的多输入多输出系统(MIMO System) (2)PID 对于该类型系统的局限性: ① 如上图所示,两个回路之间没有交叉,就像二者是相互独立一样 ② 如果系统(Plant)足够大,因为调参十分困难 MPC的优势: ① 可以处理多变量问题 ② 可以添加约束 e.g.在驾驶时,汽车有期望的轨迹,同时有加速约束 ③ 有预览功能(类似前馈),以改善控制器性能 (3)MPC硬件条件 需要功能强大的,内存大的处理器,因为每个时间步骤都需要在线优化问题 2.MPC基本工作原理 以如图的过程为例,期望汽车沿中线运动: MPC在该过程中的作用如下: (1)首先,预测一条p步之后可以到达中线的路径(这里有个问题,这个p如何选择呢?选择过少会不会导致无解?过多会不会降低效率?)该过程涉及了汽车模型本身的使用。 显然这种路径有无穷多条,我们选择“代价(cost)"最小的一条,该过程由优化器(optimizer)完成。对于这种情况,对应的cost包括: ① 汽车在此p步中,每一步的位置都会与中线有一个相对应的偏差值,我们想要这个偏差值之和最小 ② 汽车每一次的打舵量要尽可能的小,否则会让乘客十分不舒服,即打舵量之和应该也最小 综上,应该让二者加权和最小,即: (4)在新的起点重复以上过程,下一次预测的结果可能与上次的预测不同,因为可能有干扰的存在(风,湿滑的路面) 根据上述过程,我们可知,我们每次运动后都在预测未来p步的路径,因此我们所谓的”预测视界“是向前运动的,因此MPC也被称为后退视界控制。 二、MPC设计 1.MPC参数设计 (1)基本参数 ① 采样时间 ③ 控制范围:控制移动到时间步长m的次数 步长m较大时,可以获得更好的预测,但是会增加复杂性,我们甚至可以是控制范围与预测范围相同,但是一般只有前几个控制动作才对输出行为有影响,因此控制范围最好是预测范围的10%到20%,至少2-3步 进一步理解: 假如”我“是一个学生,“我”的能力对于导师而言是完全可知的,在工程上,就是”我“的模型是完全可知的,导师会给我安排学习任务,假如导师在知道我能力的情况下做好了未来七天的计划(预测范围),但是只给我安排了五天的学习任务(控制范围),但在我完成一天学习后,我可能超额完成任务,也可能不达标(外界干扰导致没有达到预测结果),因此我只完成被安排的学习任务的第一天的任务,在此之后,导师再次制定七天之后的计划,并给我安排下五天的计划。长此以往,导师发现,制定七天的任务太多了,会浪费他宝贵的时间,因此之后改为制定五天计划,安排三天计划。 ④ 硬约束和软约束:硬约束必须服从,软约束不一定服从,如果全是硬约束,比如输入输出全部采用硬约束,那么可能会导致无法解决优化问题 软约束可以通过优化问题保证违反程度较小 ⑤ 权重: 通过权衡来衡量竞争目标之间的权重(如输入和输出有不同权重) 同时,对于同一个组,我们可以对不同的成员分配权重(如第一输出和第二输出有不同权重) 2.MPC使用范围 (1)线性系统,线性约束条件,有二次cost函数→ 可以使用线性MPC (2)非线性系统,同样可以使用线性MPC,原理是线性化 如:在自适应MPC中,随着运行条件变化,工作点也变化,因此可以动态地在工作点附近进行线性化,从而动态获得线性模型 注:对于自适应MPC,在不同运行条件下,状态数和约束数不会改变 如果随着操作条件变化,状态数改变:使用增益预定MPC,在感兴趣的工作点进行离线显性化,针对每个工作点设计线性 (3)如果非线性系统难以进行线性化,可以使用非线性MPC,此时做出的预测更加准确,但同时,优化问题变得不凸,即可能有很多局部最优解,如图: 3.MPC速度优化 I.(1)模型简化,可以减少状态数量 (2)预测范围适当减小 (3)控制范围适当减小 (4)减少约束数量 (5)降低数据表示精度 II.当采样时间特别小时,可以采用显式MPC(Implicit MPC) 显式MPC特点:离线解决问题,而不是在线优化,对于范围内每个x值,都预先计算最佳解, III. 采用次优解决方案 如果想在采样时间内找到解决方案,同时还有多余时间执行其他任务,可以确定迭代次数最大值,当达到最大次数时,停止最优化 三、MPC推导 1.基于单位脉冲响应的公式推导 步骤: (1)确定模型 (2)进行预测 (3)滚动优化 (4)误差补偿 对于模型已知的系统,其单位脉冲响应在每个采样时刻都是可知的,根据离散卷积定理,此时输出可以用输入和单位脉冲响应的卷积计算 假设在k+1时刻开始输入信号,对等式两侧进行差分,则在k+1时刻及其后,有: 最后进行误差补偿: 假如在k时刻,我们获得了之后p个时刻的预测值: 可能看到这里有点乱,我其实一开始也乱了,但是这里捋顺一下思路就好了,乱的原因主要是变量太多,难以区分。 总结:整体的思路是这样的: 我们首先对于这个模型的单位脉冲响应已经得知,那么我们可以获得矩阵A,根据卷积定理,我们可以获得输入变化量,输出变化量,输出初态的关系,即: 若我们设 其实从系统A矩阵可以看出,该系统特征值在单位圆外面,所以肯定是发散的 对于单输入系统,加入MPC后,结果如下: 可见加入MPC控制后,系统收敛了,MPC的确起到了状态反馈的作用,使得新的闭环系统的极点处于单位圆内。 如果提高 如果提高输入的权重,结果如下: 显然状态空间衰减变慢 如果期望值不是0,如期望 改变目标值的本质原理如下: 一般情况下,对于状态空间 综上,SISO系统MPC控制代码如下: mpc_sim.mclear;clc;A=[1 0.1;0 2];B=[0;0.5];%x=Ax0+BuQ=[2 0;0 1];%weight of error cost functionF=[1 0;0 1];%weight of error cost function(last step)R=[0.1]; %weight of input cost functionn=size(A,1);%the dimension of the state spacep=size(B,2);%the dimension of input vectork_step=100;%steps of my state space X_k=zeros(n,k_step);%set state space vectorX_d=zeros(n,k_step);X_k(:,1)=[20;-20];%initialization of the state space U_k=zeros(p,k_step);%set input vector N=5; %prediction horizonbasic = eye(n);[E,H]=Cal_matrix(A,B,Q,R,F,N);X_expect=[70;0];for k = 1:k_step X_d(:,k)=X_k(:,k)-X_expect; U_k(:,k)=Prediction(X_d(:,k),E,H,N,p);%with k adding,the initial value of %X_k also changes,so this is what is called recursive optimization X_d(:,k+1)=A*X_d(:,k)+B*U_k(:,k);%recursion of state space X_k(:,k+1)=X_d(:,k+1)+X_expect;end subplot(2,1,1);for i= 1 :size(X_k,1) plot(X_k(i,:)); hold onend legend("x1 x2");hold on;subplot(2,1,2);for i =1:size(U_k,1) plot (U_k(i,:));endlegend("u"); Cal_matrix.mfunction [E,H]=Cal_matrix(A,B,Q,R,F,N)n=size(A,1);p=size(B,2);M=[eye(n);zeros(N*n,n)];C=zeros((N+1)*n,N*p);temp=eye(n);for i = 1:N rows=i*n+(1:n); %this mean from which lines should we start at this step, %for each matrix has not a single row,we use 'i*n',it starts from n+1 C(rows,:)=[temp*B,C(rows-n,1:end-p)]%"rows-n,1:end-p"means using the %elements of last step,end -p equals to let out a place for 'temp*B' temp=A*temp; M(rows,:)=temp;endQ_bar=kron(eye(N),Q);%in order to make a diagonal matrix with Q% as its diagonal elementsQ_bar=blkdiag(Q_bar,F);R_bar=kron(eye(N),R);G=M'*Q_bar*M;E=C'*Q_bar*M;H=C'*Q_bar*C+R_bar;end prediction.mfunction u_k=Prediction(x_k,E,H,N,p)U_k=zeros(N*p,1);U_k=quadprog(H,E*x_k);u_k=U_k(1:p,1);%only use the first stepend 另外,令该系统跟踪圆形轨迹,结果如下: 主函数对应如下:clear;clc;A=[0.3 0;0 1];B=[0;0.5];%x=Ax0+BuQ=[1 0;0 1];%weight of error cost functionF=[1 0;0 1];%weight of error cost function(last step)R=[0.1]; %weight of input cost functionn=size(A,1);%the dimension of the state spacep=size(B,2);%the dimension of input vectork_step=1000;%steps of my state space X_k=zeros(n,k_step);%set state space vectorX_d=zeros(n,k_step);X_k(:,1)=[20;-20];%initialization of the state space U_k=zeros(p,k_step);%set input vector N=5; %prediction horizonbasic = eye(n);[E,H]=Cal_matrix(A,B,Q,R,F,N);X_expect=zeros(n,k_step);for k = 1:k_step X_expect=[10*cos(360/k_step*k)+10;10*sin(360/k_step*k)-5]; X_d(:,k)=X_k(:,k)-X_expect; U_k(:,k)=Prediction(X_d(:,k),E,H,N,p);%with k adding,the initial value of %X_k also changes,so this is what is called recursive optimization X_d(:,k+1)=A*X_d(:,k)+B*U_k(:,k);%recursion of state space X_k(:,k+1)=X_d(:,k+1)+X_expect;end figure(1)subplot(2,1,1);for i= 1 :size(X_k,1) plot(X_k(i,:)); hold onend legend("x1 x2");hold on;subplot(2,1,2);for i =1:size(U_k,1) plot (U_k(i,:));endlegend("u");hold on;figure(2);plot(X_k(1,:),X_k(2,:),'r')hold on;X_exp_vec=zeros(n,k_step);for k = 1:k_step X_exp_vec(:,k)=[10*cos(360/k_step*k)+10;10*sin(360/k_step*k)-5];endplot(X_exp_vec(1,:),X_exp_vec(2,:),'g')legend("track","reference"); 2.MIMO系统 对于MIMO系统: 3.基于simulink的仿真 在simulink中使用mpc controler搭建框图如下: 搭建教程: 【Model Predictive Control】了解模型预测控制,第六部分:如何使用 Simulink 和模型预测控制工具箱设计 MPC 控制器_哔哩哔哩_bilibili 给定约束: ① 方向盘物理转角不得超过30° ② 为了保证舒适度,方向盘变化率不得超过15°/s 在此条件下,仿真结果如图: 在预测范围为10,控制范围为2时,结果如下: 如果将prediction horizon变大,结果如下: 超调此时减小了,但是预测范围太大可能会造成算力的浪费 将控制范围变大,可见跟踪效果更好,跟踪曲线更接近reference 然而,进一步提高控制范围,发现结果变化并不大,所以我们一般取预测范围的20%-30%就可以了 当速度提升至35时,结果如下: 可见跟踪效果并不好,所以我们最好添加自适应MPC(adaptive MPC) 4.车辆横向运动状态空间模型的推导 这里就必须要提及著名的自行车模型 自行车模型的条件如下: ① 车辆做平面运动 ② 左右前轮的转向角近似相等 ③ 忽略轮胎收到的侧向力 ④ 忽略前后轴荷载的转移 ⑤ 车身和悬架系统是刚性的 其中② ③限制了车体必须是低速运动的 我们选择状态变量: x,y:车辆在绝对坐标系的位置 v:车辆的速度大小 假如这是一辆车,则有: 对于侧向,有: 而侧向加速度包括运动加速度和向心加速度 对车轮进行受力分析,车轮受侧向力(风吹,提供离心力的摩擦)和纵向力(摩擦,牵引),二者可以合成为车体的横向力 侧偏力和侧偏角关系如图: 在侧偏角较小时,可以认为: 这个我没做出来,因为属实不知道怎么改这个plant,所以直接截图了 更改 可见MPC的确可以根据不同的模型,不同的条件进行自适应控制 五、多种MPC类型拓展 1.非线性MPC(nonlinear MPC\NMPC) 参考文献: [PDF] MPC-Based Approach to Active Steering for Autonomous Vehicle Systems | Semantic Scholar 2.线性时变MPC(LTV MPC) 面对非线性模型,我们一般有两个思路: 一个是直接采用非线性模型,对原来模型直接进行控制 另一个是对模型进行连续的在线线性化 3.Explicit MPC(显式MPC) 参考文献 显式预测控制(Explicit MPC)_dymodi的博客-CSDN博客_显式模型预测控制 收藏(0)