代码详解——NMPC路径跟踪复杂参考路径设置

时间:2022-07-24
本文章向大家介绍代码详解——NMPC路径跟踪复杂参考路径设置,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在先前的代码中,参考路径在每一个仿真循环内设置,因此只能设置为直线。

详见 白国星,公众号:Path Tracking Letters代码详解——最简NMPC路径跟踪仿真代码

为设置更加复杂的参考路径,我们可以借助全局变量。即在初始化部分,通过全局变量设置参考路径,然后将在每一个仿真循环中读取参考路径即可。

NMPC_main.m的代码修改如下,黄绿背景部分为改后代码:

NMPC参考路径设置 作者北京科技大学白国星 david.gx.bai@gmail.com

致谢:原始框架来自北京理工大学龚建伟教授团队著作《无人驾驶车辆模型预测控制》

clear all;
%%车辆参数初始化
l=1;%轴距
%% 控制参数初始化
Nx=3;%状态量个数
Np=25;%预测时域
Nc=3;%控制时域
%% 车辆位置初始化
State_Initial(1,1)=0;%x
State_Initial(2,1)=0;%y
State_Initial(3,1)=pi/6;%phi
%% 参考轨迹参数初始化
N=1000;%参考轨迹点数量
T=0.05;%采样周期
global Xrefg;
global Yrefg;
global PHIrefg;
%%参考轨迹生成
for k=1:1:N+Np
    if k<200
        Xrefg(k,1)=k*T;  %横坐标
        Yrefg(k,1)=2;  %纵坐标
        PHIrefg(k,1)=0;  %航向角
    elseif k<514
        Xrefg(k,1)=10+10*sin( 0.1*(k-200)*T);
        Yrefg(k,1)=12-10*cos(0.1*(k-200)*T);
        PHIrefg(k,1)=0.1*(k-200)*T;
    elseif k<714
        Xrefg(k,1)=20;
        Yrefg(k,1)=12+(k-514)*T;
        PHIrefg(k,1)=1.57;
    else
        Xrefg(k,1)=20;
        Yrefg(k,1)=22;
        PHIrefg(k,1)=1.57;
    end
end
%% 开始仿真
for j=1:1:N
    %读取参考路径
    Xref=zeros(Np,1);
    Yref=zeros(Np,1);
    PHIref=zeros(Np,1);
    for Nref=1:1:Np
        Xref(Nref,1)=Xrefg(j+Nref-1,1);
        Yref(Nref,1)=Yrefg(j+Nref-1,1);
        PHIref(Nref,1)=PHIrefg(j+Nref-1,1);
    end
    %%约束条件
    for i=1:1:Nc
        lb(2*i-1)=0.8;
        lb(2*i)=-0.44;
        ub(2*i-1)=1.2;
        ub(2*i)=0.44;
    end
    %%选取求解算法
    options = optimset('Algorithm','active-set'); %选择active-set为求解算法
    %%求解算法预留
    A=[];
    b=[];
    Aeq=[];
    beq=[];
    %%求解
    [A,fval,exitflag]=fmincon(@(x)NMPC(x,State_Initial,Np,Nc,T,Xref,Yref,PHIref),[0;0;0;0;0;0],A,b,Aeq,beq,lb,ub,[],options);%有约束求解,需要有2*Nc个0
    %%获得控制输入
    v_actual=A(1);
    deltaf_actual=A(2);
    %%车辆位置代入
    X00(1)=State_Initial(1,1);
    X00(2)=State_Initial(2,1);
    X00(3)=State_Initial(3,1);
    %%代入控制输入后,解算下一时刻车辆位置
    Xref=dsolve('Dx-v_actual*cos(z)=0','Dy-v_actual*sin(z)=0','Dz-v_actual*tan(deltaf_actual)/l=0','x(0)=X00(1)','y(0)=X00(2)','z(0)=X00(3)');
    t=T;
    %%更新车辆位置
    State_Initial(1,1)=eval(Xref.x);
    State_Initial(2,1)=eval(Xref.y);
    State_Initial(3,1)=eval(Xref.z);
    %%绘图
    figure(1)
    plot(State_Initial(1,1),State_Initial(2,1),'b*');
    hold on;
    plot(Xrefg(j,1),Yrefg(j,1),'ro');
    hold on;
    axis([-5 25 -5 25])
end

NMPC.m文件保持不变。

运行结果为: