💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文内容如下:🎁🎁🎁
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥第一部分——内容介绍
线性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资源获取

的车辆横向动力学控制研究(Matlab代码实现)&spm=1001.2101.3001.5002&articleId=154108097&d=1&t=3&u=73815422eda143e1952ceef7b7d90e90)
3639

被折叠的 条评论
为什么被折叠?



