线性MPC控制器(基于CasADi)的车辆横向动力学控制研究(Matlab代码实现)

   💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文内容如下:🎁🎁🎁

 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥第一部分——内容介绍

线性MPC控制器(基于CasADi)的车辆横向动力学控制研究

摘要:本文聚焦于车辆横向动力学控制领域,提出一种基于CasADi的线性模型预测控制(MPC)方法。通过将车辆简化为4状态系统,以前轮转角作为控制输入,在每个采样时刻求解线性优化问题,实现轨迹跟踪控制。参考轨迹由双曲正切函数生成,可得到光滑的换道或转弯路径。同时,将多种约束硬编码到二次规划(QP)问题中,确保车辆行为处于物理可行域内。利用qpOASES求解器通过CasADi接口高效求解QP问题,最后通过仿真验证控制器的性能。仿真结果表明,该控制器能够有效跟踪参考轨迹,满足各项约束条件,为车辆横向动力学控制提供了一种有效的解决方案。

关键词:车辆横向动力学;线性模型预测控制;CasADi;qpOASES;轨迹跟踪

一、引言

车辆在行驶过程中的横向动力学控制对于提高行驶安全性、稳定性和舒适性至关重要。模型预测控制(MPC)作为一种先进的控制策略,因其能够处理多变量、有约束的系统,并且具有对未来系统行为进行预测和优化的能力,在车辆控制领域得到了广泛关注。CasADi是一个用于非线性优化和数值最优控制的开源软件工具,它提供了高效的符号计算和数值计算功能,能够方便地构建和求解优化问题。qpOASES是一种开源的二次规划求解器,具有高效、稳定的特点。本文将结合CasADi和qpOASES设计一种线性MPC控制器,用于车辆横向动力学控制,实现轨迹跟踪任务。

二、车辆模型

为了便于分析和控制设计,将车辆简化为一个4状态系统。该系统的状态变量通常包括车辆的横向位移、横摆角、横向速度和横摆角速度等。这些状态变量能够充分描述车辆在横向平面内的运动特性。控制输入选定为前轮转角δ,通过调节前轮转角可以改变车辆的行驶方向,从而实现对车辆横向运动的控制。这种简化模型在保证一定精度的同时,降低了控制设计的复杂度,使得后续的MPC控制器设计更加可行。

三、控制器设计

3.1 MPC基本原理

模型预测控制是一种基于模型、滚动优化和反馈校正的控制策略。在每个采样时刻,MPC根据系统的当前状态和预测模型,求解一个有限时域内的最优控制问题,得到一组最优控制序列。然而,在实际应用中,通常只实施该序列的第一个控制作用,然后在下一个采样时刻,根据新的状态信息重新求解最优控制问题,如此循环往复,实现对系统的实时控制。

3.2 代价函数设计

在每个采样时刻,MPC的目标是求解一组最优控制序列,使得以下代价函数最小:

其中,xk​是系统在时刻k的状态向量,uk​是时刻k的控制输入,xref,k​是时刻k的参考状态,N是预测时域,Q、R和P分别是状态、控制输入和终端状态的加权矩阵。代价函数的第一项考虑了系统状态与参考状态之间的偏差,第二项考虑了控制输入的大小,通过合理选择加权矩阵,可以平衡跟踪精度和控制输入的平滑性。终端代价项的引入有助于提高系统的稳定性和鲁棒性。

3.3 参考轨迹生成

参考轨迹由双曲正切函数tanh给出,其表达式可以根据具体需求进行设计。例如,对于换道场景,可以设计如下形式的参考轨迹:

四、约束条件

在车辆横向动力学控制中,存在多种物理约束,如前轮转角的限制、车辆侧向加速度的限制等。为了确保车辆行为在物理可行域内,将这些约束条件硬编码到QP问题中。具体来说,约束条件可以表示为以下形式:

五、线性优化(QP)实现

5.1 QP问题构建

每一步建立标准二次规划问题:

5.2 qpOASES求解器与CasADi接口

qpOASES是一种专门用于求解二次规划问题的开源求解器,具有高效、稳定的特点。CasADi提供了与qpOASES的接口,使得在CasADi环境中可以方便地调用qpOASES求解器来求解QP问题。通过CasADi的符号计算功能,可以自动生成QP问题的系数矩阵和向量,然后将其传递给qpOASES求解器进行求解。这种结合方式充分发挥了CasADi在模型构建和符号计算方面的优势以及qpOASES在求解QP问题方面的高效性,提高了整个控制系统的开发效率和性能。

六、仿真流程

6.1 初始化参数

设置车辆模型的参数,如车辆质量、轴距、转动惯量等;确定MPC控制器的参数,如预测时域N、加权矩阵Q、R和P等;定义参考轨迹的参数,如换道宽度L、换道起始点纵向位置x0​和参数d等;设置约束条件的参数,如前轮转角的最小值和最大值、侧向加速度的最小值和最大值等。

6.2 初始状态设置

给定车辆的初始状态,包括初始横向位移、初始横摆角、初始横向速度和初始横摆角速度等。

6.3 循环求解

在每个采样时刻,根据当前车辆状态和参考轨迹,构建QP问题,并利用qpOASES求解器通过CasADi接口求解该问题,得到最优控制序列。实施该序列的第一个控制作用,更新车辆状态,然后进入下一个采样时刻,重复上述过程,直到仿真结束。

七、输出结果

程序运行后自动弹出两张图,分别展示车辆的轨迹跟踪效果和前轮转角的变化情况。

7.1 轨迹跟踪效果图

该图以车辆纵向位置为横轴,横向位置为纵轴,绘制出车辆的实际行驶轨迹和参考轨迹。通过观察两条轨迹的吻合程度,可以直观地评估控制器对参考轨迹的跟踪性能。如果两条轨迹基本重合,说明控制器能够很好地跟踪参考轨迹,实现了预期的轨迹跟踪任务;如果存在较大偏差,则需要进一步分析原因,调整控制器参数或改进控制策略。

7.2 前轮转角变化图

该图以时间为横轴,前轮转角为纵轴,展示前轮转角随时间的变化情况。通过观察前轮转角的变化曲线,可以了解控制器的控制输入特性。理想情况下,前轮转角的变化应该平滑,没有突变,并且能够在满足约束条件的前提下,根据参考轨迹的要求进行合理调整。如果前轮转角出现频繁的突变或超出约束范围,说明控制器可能存在问题,需要进行优化和改进。

八、结论

本文提出了一种基于CasADi的线性MPC控制器用于车辆横向动力学控制,实现了轨迹跟踪任务。通过将车辆简化为4状态系统,设计合理的代价函数和参考轨迹,并将约束条件硬编码到QP问题中,利用qpOASES求解器通过CasADi接口高效求解QP问题,最终通过仿真验证了控制器的有效性。仿真结果表明,该控制器能够使车辆较好地跟踪由双曲正切函数生成的参考轨迹,同时满足各项约束条件,为车辆横向动力学控制提供了一种可行的解决方案。未来的研究可以进一步考虑车辆模型的非线性特性,优化控制器参数,提高控制系统的鲁棒性和适应性,以应对更复杂的行驶工况。

📚第二部分——运行结果

部分代码:

obj = 0; % Objective function

g = []; % constraints vector

Q1 = 1000;

Q2 = 100;

R=1;

% compute objective

for k=1:Np

obj = obj+(X(4,k+1)-P(n_states+k))'*Q1*(X(4,k+1)-P(n_states+k))/1.75^2;

obj = obj+(X(2,k+1)-P(n_states+Np+k))'*Q2*(X(2,k+1)-P(n_states+Np+k))/(pi/18)^2;

if k<Nc

obj = obj+(U(1,k))'*R*(U(1,k))/(pi/18)^2;

end

end

% compute constraints

for k = 1:Np+1

g = [g ; X(2,k)]; %state psi

g = [g ; X(4,k)]; %state Y

if k>1 && k<=Nc

g = [g ; (U(k)-U(k-1))];

end

end

% make the decision variables one column vector

OPT_variables = reshape(U,Nc,1);

% nlp_prob = struct('f', obj, 'x', OPT_variables, 'g', g, 'p', P);

qp = struct('f', obj, 'x', OPT_variables, 'g', g, 'p', P);

% solver = nlpsol('solver', 'ipopt', nlp_prob,opts);

% opts = struct;

% opts.qpoases.printLevel ='PL_NONE';

solver = qpsol('solver', 'qpoases', qp);

args = struct;

ubg=[];

lbg=[];

for k=1:Np+1

lbg=[lbg;-pi/6];

lbg=[lbg;-4];

ubg=[ubg;pi/6];

ubg=[ubg;4];

if k>1 && k<=Nc

lbg=[lbg;-pi/36*Ts_p];

ubg=[ubg;pi/36*Ts_p];

end

end

args.ubg=ubg;

args.lbg=lbg;

ubx=[];

lbx=[];

for k=1:Nc

ubx=[ubx;pi/18];

lbx=[lbx;-pi/18];

end

args.ubx=ubx;

args.lbx=lbx;

%% THE SIMULATION LOOP SHOULD START FROM HERE

t = 0;

x=[0;0;0;0];

xp = 0;

% xs = 1.75; % Reference posture.

u=0;

th=[t];

xh=[x];

xph=[xp];

uh=[u];

d_x1=25;

d_x2=21.95;

d_y1=4.05;

d_y2=5.7;

z1 = 2.4/25*(xp-27.19)-1.2;

z2 = 2.4/21.95*(xp-56.46)-1.2;

Y_r=d_y1/2*(1+tanh(z1))-d_y2/2*(1+tanh(z2));

psi_r=atan(d_y1*(1/cosh(z1))^2*(1.2/d_x1)-d_y2*(1/cosh(z2))^2*(1.2/d_x2));

Y_rh=[Y_r];

psi_rh=[psi_r];

simtime=15;

Ts=0.05;

u0 = zeros(Nc,1);

for i=1:(simtime/Ts)

tic;

% z1 = 2.4/25*(xp-27.19)-1.2;

% z2 = 2.4/21.95*(xp-56.46)-1.2;

Y_r_pre=zeros(Np,1);

psi_r_pre=zeros(Np,1);

for j=1:Np

xp_pre(j)=xp+vx*(j-1)*Ts;

z1_pre(j) = 2.4/25*(xp_pre(j)-27.19)-1.2;

z2_pre(j) = 2.4/21.95*(xp_pre(j)-56.46)-1.2;

Y_r_pre(j)=d_y1/2*(1+tanh(z1_pre(j)))-d_y2/2*(1+tanh(z2_pre(j)));

psi_r_pre(j)=atan(d_y1*(1/cosh(z1_pre(j)))^2*(1.2/d_x1)-d_y2*(1/cosh(z2_pre(j)))^2*(1.2/d_x2));

end

xs=[Y_r_pre;psi_r_pre];

args.p = [x;xs];

args.x0 = reshape(u0',Nc,1);

sol = solver('x0', args.x0, 'lbx', args.lbx, 'ubx', args.ubx,...

'lbg', args.lbg, 'ubg', args.ubg,'p',args.p);

uout = reshape(full(sol.x)',1,Nc)';

u=uout(1);

xup=vehicle_lateral_dynamics(x,u,Ts,vx);

x = xup;

xp=xp+vx*Ts;

t=t+Ts;

u0 = [uout(2:Nc);uout(Nc)];

th=[th,t];

xh=[xh,x];

uh=[uh,u];

Y_rh=[Y_rh,Y_r_pre(1)];

psi_rh=[psi_rh,psi_r_pre(1)];

xph=[xph,xp];

sample_time(i)=toc;

end

Simulation_run_time=sum(sample_time)

figure

plot(xph,xh(4,:),'LineWidth',2);

hold on;

plot(xph,Y_rh,'--','LineWidth',2);

xlabel('$X$','Interpreter','latex','FontSize',15);

ylabel('$Y$','Interpreter','latex','FontSize',15);

legend('$Y$','$Y^{r}$','Interpreter','latex','FontSize',15);

figure

plot(xph,xh(2,:),'LineWidth',2);

hold on;

plot(xph,psi_rh,'--','LineWidth',2);

xlabel('$X$','Interpreter','latex','FontSize',15);

ylabel('$\psi$','Interpreter','latex','FontSize',15);

legend('$\psi$','$\psi^{r}$','Interpreter','latex','FontSize',15);

🎉第三部分——参考文献 

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)

🌈第四部分——Matlab代码实现

资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

                                                           在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值