增量式速度跟随,MPC,Simulink建模

2024-01-26 04:59

本文主要是介绍增量式速度跟随,MPC,Simulink建模,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

完美的结果

1.对本车进行建模

2.

 3.使用的模型是

 4.代码段如下

function [sys,x0,str,ts] =Main_MPC_SpeedCtrl_du(t,x,u,flag)
%***************************************************************% 
% Input:
% t是采样时间, x是状态变量, u是输入(是做成simulink模块的输入,即CarSim的输出),
% flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等)% Output:
% sys输出根据flag的不同而不同(下面将结合flag来讲sys的含义), 
% x0是状态变量的初始值, 
% str是保留参数,设置为空
% ts是一个1×2的向量, ts(1)是采样周期, ts(2)是偏移量
%---------------------------------------------------------------%
% Published by: Kai Liu
% Email:leoking1025@bit.edu.cn
% My github: https://github.com/leoking99-BIT 
%***************************************************************% switch flag,case 0 % Initialization %[sys,x0,str,ts] = mdlInitializeSizes; % Initializationcase 2 % Update %sys = mdlUpdates(t,x,u); % Update discrete statescase 3 % Outputs %sys = mdlOutputs(t,x,u); % Calculate outputscase {1,4,9} % Unused flagssys = [];            otherwise % Unexpected flags %error(['unhandled flag = ',num2str(flag)]); % Error handlingend %  end of switch    
%  End sfuntmpl%==============================================================
% Initialization, flag = 0,mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%==============================================================
function [sys,x0,str,ts] = mdlInitializeSizes
sizes = simsizes;%用于设置模块参数的结构体用simsizes来生成
sizes.NumContStates  = 0;  %模块连续状态变量的个数
sizes.NumDiscStates  = 2;  %模块离散状态变量的个数,实际上没有用到这个数值,只是用这个来表示离散模块
sizes.NumOutputs     = 1;  %S函数的输出,包括控制量和其它监测量
sizes.NumInputs      = 2; %S函数模块输入变量的个数,即CarSim的输出量
sizes.DirFeedthrough = 1;  %模块是否存在直接贯通(direct feedthrough). 1 means there is direct feedthrough.
% 直接馈通表示系统的输出或可变采样时间是否受到输入的控制。
% a.  输出函数(mdlOutputs或flag==3)是输入u的函数。即,如果输入u在mdlOutputs中被访问,则存在直接馈通。
% b.  对于一个变步长S-Function的“下一个采样时间”函数(mdlGetTimeOfNextVarHit或flag==4)中可以访问输入u。
% 正确设置直接馈通标志是十分重要的,因为它影响模型中块的执行顺序,并可用检测代数环。
sizes.NumSampleTimes = 1;  %模块的采样次数,>=1sys = simsizes(sizes);    %设置完后赋给sys输出x0 = zeros(sizes.NumDiscStates,1);%initial the  state vector, of no usestr = [];             % 保留参数,Set str to an empty matrix.ts  = [0.05 0];       % ts=[period, offset].采样周期sample time=0.05,50ms %--Global parameters and initialization
global InitialGapflag; InitialGapflag = 0; % the first few inputs don't count. Gap it.
global MPCParameters; MPCParameters.Np      = 30;% predictive horizonMPCParameters.Nc      = 30;% control horizonMPCParameters.Nx      = 2; %number of state variablesMPCParameters.Nu      = 1; %number of control inputsMPCParameters.Ny      = 1; %number of output variables  MPCParameters.Ts      = 0.05; %Set the sample timeMPCParameters.Q       = 100; % cost weight factor MPCParameters.R       = 1; % cost weight factor MPCParameters.qp_solver =0; %0: default, quadprog; 1:qpOASES; 2:CVXGENMPCParameters.refspeedT = 1; %0: default, step speed profile; %1:sine-wave speed profileMPCParameters.umin      = -5.0;  % the min of decelerationMPCParameters.umax      = 3.5;  % the max of accelerationMPCParameters.dumin     = -5.0; % minimum limits of jerkMPCParameters.dumax     = 5.0; % maximum limits of jerk
global WarmStart;WarmStart = zeros(MPCParameters.Np,1);
%  End of mdlInitializeSizes%==============================================================
% Update the discrete states, flag = 2, mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%==============================================================
function sys = mdlUpdates(t,x,u)
%  基本没有用到这个过程;在后期的程序模块化时可以继续开发这个功能。sys = x;    
% End of mdlUpdate.%==============================================================
% Calculate outputs, flag = 3, mdlOutputs
% Return the block outputs. 
%==============================================================
function sys = mdlOutputs(t,x,u)global InitialGapflag;
global MPCParameters;
global WarmStart;
a_des=0t_Start = tic; % 开始计时 
if InitialGapflag < 2 %  get rid of the first two inputsInitialGapflag = InitialGapflag + 1;%
elseInitialGapflag = InitialGapflag + 1;%***********Step (1). Update vehicle states *************************% Vx    = u(1);  %车辆纵向速度,单位:km/h-->m/sa_x   = u(2);  %车辆纵向加速度,单位:g's-->m/s2 kesi = [Vx;  a_x]; %更新车辆状态向量%********Step(2): Generate reference speed profile *******************%switch MPCParameters.refspeedT,case 0 % default, step speed profile%----设定阶梯式的期望速度曲线----------------------%SpeedProfile = func_ConstantSpeed(InitialGapflag, MPCParameters);case 1 % sine-wave speed profile%----设置sine wave形式 的期望速度曲线--------------%SpeedProfile = func_SineSpeed(InitialGapflag,MPCParameters);otherwise % Unexpected flags %error(['unexpected speed-profile:',num2str(MPCParameters.refspeedT)]); % Error handlingend %  end of switch %****Step(3): update longitudinal vehilce model with inertial delay***%Ts = MPCParameters.Ts; % 50msStateSpaceModel.A =  [1      Ts;0      1];StateSpaceModel.B =  [0;     1]; StateSpaceModel.C =  [1,    0];%****Step(4):  MPC formulation;********************%%Update Theta and PHI for future states prediction[PHI, THETA] = func_Update_PHI_THETA(StateSpaceModel, MPCParameters);%Update H and f for cost function J[H, f, g] = func_Update_H_f(kesi, SpeedProfile, PHI, THETA, MPCParameters); %****Step(5):  Call qp-solver********************%switch MPCParameters.qp_solver,case 0 % default qp-solver: quadprog[A, b, Aeq, beq, lb, ub] = func_Constraints_du_quadprog(MPCParameters, a_x);options = optimset('Display','off', ...'TolFun', 1e-8, ...'MaxIter', 2000, ...'Algorithm', 'active-set', ...'FinDiffType', 'forward', ...'RelLineSrchBnd', [], ...'RelLineSrchBndDuration', 1, ...'TolConSQP', 1e-8); warning off all  % close the warnings during computation     U0 = WarmStart;           [U, FVAL, EXITFLAG] = quadprog(H, g, A, b, Aeq, beq, lb, ub, U0, options); %WarmStart = shiftHorizon(U);     % Prepare restart, nominal close loop if (1 ~= EXITFLAG) %if optimization NOT succeeded.U(1) = 0.0;fprintf('MPC solver not converged!\n');                  enda_des =a_x+U(1);case 1 % qpOASES[A, lb, ub, lbA, ubA] = func_Constraints_du_qpOASES(MPCParameters, a_x);options = qpOASES_options('default', ...'printLevel', 0); %=======================USE QP==================%[U, FVAL, EXITFLAG, iter, lambda] = qpOASES(H, g, A, lb, ub, lbA, ubA, options); %%=======================USE SQP==================%%         try%             H=sparse(H);%             A=sparse(A);%         catch%             fprintf('qpOASES Error reported\n'); %         end%         if (qpOASES_hotstart_flag)%             [qpOASES_QP, U, FVAL, EXITFLAG, iter, lambda] = qpOASES_sequence('i', H, g, A, lb, ub, lbA, ubA, options);%             qpOASES_hotstart_flag = 1;%         else    %             [U, FVAL, EXITFLAG, iter, lambda] = qpOASES_sequence('m', qpOASES_QP, H, g, A, lb, ub, lbA, ubA, options); %%         endif (0 ~= EXITFLAG) %if optimization NOT succeeded.U(1) = 0.0;fprintf('MPC solver: qpOASES not converged!\n');                  enda_des =  U(1);case 2 % CVXGEN%--由于License限制,本书不提供CVXGEN版的solver,读者可自行生成[vars, status] = MPC_Speed_Controller_CVXGEN(kesi, SpeedProfile, MPCParameters);if (1 == status.converged) %if optimization succeeded.a_des = vars.u_0; elsea_des = 0;fprintf('MPC solver not converged!\n');                  endotherwise % Unexpected flags %error(['unexpected qp-solver, Sol_method=',num2str(flag)]); % Error handlingend %  end of switch end % end of if Initialflag < 1 % %****Step(6):  由期望的加速度生成Throttle和Brake;********************%t_Elapsed = toc( t_Start ); %computation time sys = [a_des]; 
% end  %End of mdlOutputs.%==============================================================
% sub functions
%============================================================== 
function [Vref] = func_SineSpeed(Index, MPCParameters)
%生成正弦形式的期望速度曲线%****Sine wave parametersT = 50; %正弦速度曲线的周期,unit: sfreq = 1/T; %正弦速度曲线的频率,unit: HzAmplit = 10;%正弦速度曲线的幅值offst = 20; %正弦速度曲线的偏移Ts = MPCParameters.Ts; %采样时间=0.05,unit: sNp = MPCParameters.Np; % 预测时域:30Vref = cell(Np,1);t0 = Index*Ts;for i = 1:1:Npt = t0 + i*Ts;Vref{i,1}   =   Amplit*sin(2*pi*freq*t) + offst;   end% end %EoFfunction [Vref] = func_ConstantSpeed(InitialGapflag, MPCParameters)
% 生成阶梯形式的期望速度曲线    Ts = MPCParameters.Ts; %采样时间=0.05,unit: sNp = MPCParameters.Np; % 预测时域:30Vref = cell(Np,1);% 自定义阶梯的形式if InitialGapflag < 400Vset = 10;elseif InitialGapflag < 800Vset = 10;elseif InitialGapflag < 1500Vset = 20;elseVset = 5;endendendfor i = 1:1:NpVref{i,1}   =   Vset;   end% end %EoFfunction [Throttle, Brake] = func_AccelerationTrackingController(ahopt)
% 车辆下位控制器将期望加速度转化为油门控制量和制动主缸压力控制量K_brake         = 0.3;K_throttle      = 0.1; %0.05;Brake_Sat       = 15;Throttle_Sat    = 1;if ahopt < 0 % Brake controlBrake = K_brake * ahopt;if Brake > Brake_SatBrake = Brake_Sat;endThrottle = 0;else % throttle control Brake       = 0;Throttle    = K_throttle  *ahopt;if Throttle > Throttle_SatThrottle = Throttle_Sat;endif Throttle < 0Throttle = 0;endend
% end %EoFfunction u0 = shiftHorizon(u) %shift control horizonu0 = [u(:,2:size(u,2)), u(:,size(u,2))];  %  size(u,2))function [PHI, THETA] = func_Update_PHI_THETA(StateSpaceModel, MPCParameters)
%***************************************************************%
% 预测输出表达式 Y(t)=PHI*kesi(t)+THETA*DU(t) 
% Y(t) = [Eta(t+1|t) Eta(t+2|t) Eta(t+3|t) ... Eta(t+Np|t)]'
%***************************************************************%Np = MPCParameters.Np;Nc = MPCParameters.Nc;Nx = MPCParameters.Nx;Ny = MPCParameters.Ny;Nu = MPCParameters.Nu;A = StateSpaceModel.A;B = StateSpaceModel.B;C = StateSpaceModel.C;PHI_cell=cell(Np,1);                            %PHI=[CA CA^2  CA^3 ... CA^Np]' THETA_cell=cell(Np,Nc);                         %THETAfor j=1:1:NpPHI_cell{j,1}=C*A^j;                       %  demision:Ny* Nxfor k=1:1:Ncif k<=jTHETA_cell{j,k}=C*A^(j-k)*B;        %  demision:Ny*Nuelse THETA_cell{j,k}=zeros(Ny,Nu);endendendPHI=cell2mat(PHI_cell);    % size(PHI)=[(Ny*Np) * Nx]THETA=cell2mat(THETA_cell);% size(THETA)=[Ny*Np Nu*Nc]
% end %EoFfunction[H, f, g] = func_Update_H_f(kesi, SpeedProfile, PHI, THETA, MPCParameters)
%***************************************************************%
% trajectory planning
%***************************************************************%Np = MPCParameters.Np;Nc = MPCParameters.Nc;   Q  = MPCParameters.Q;R  = MPCParameters.R;Qq = kron(eye(Np),Q);  %           Q = [Np*Nx] *  [Np*Nx] Rr = kron(eye(Nc),R);  %           R = [Nc*Nu] *  [Nc*Nu]Vref = cell2mat(SpeedProfile); error = PHI * kesi;    %[(Nx*Np) * 1]H = THETA'*Qq*THETA + Rr;  f = (error' - Vref')*Qq*THETA;g = f';
% end %EoFfunction  [A, b, Aeq, beq, lb, ub] = func_Constraints_du_quadprog(MPCParameters, um)
%************************************************************************%
% generate the constraints of the vehicle
%  
%************************************************************************%Np   = MPCParameters.Np;Nc   = Np;    dumax = MPCParameters.dumax;umin = MPCParameters.umin;  umax = MPCParameters.umax;  Umin = kron(ones(Nc,1),umin);Umax = kron(ones(Nc,1),umax);Ut   = kron(ones(Nc,1),um);
%----(1) A*x<=b----------%A_t=zeros(Nc,Nc);for p=1:1:Ncfor q=1:1:Ncif p >= q A_t(p,q)=1;else A_t(p,q)=0;endend end A_cell=cell(2,1);A_cell{1,1} = A_t; %A_cell{2,1} = -A_t;A=cell2mat(A_cell);  %b_cell=cell(2, 1);b_cell{1,1} = Umax - Ut; %b_cell{2,1} = -Umin + Ut;b=cell2mat(b_cell);  % %----(2) Aeq*x=beq----------%Aeq = [];beq = [];%----(3) lb=<x<=ub----------%lb=kron(ones(Nc,1),-dumax);ub=kron(ones(Nc,1),dumax);
% end %EoFfunction [A_t, lb, ub, lbA, ubA] = func_Constraints_du_qpOASES(MPCParameters, um)Np   = MPCParameters.Np;Nc   = Np;    dumax = MPCParameters.dumax;umin = MPCParameters.umin;umax = MPCParameters.umax;  Umin = kron(ones(Nc,1), umin);Umax = kron(ones(Nc,1), umax);Ut   = kron(ones(Nc,1),um);
%----(1) lbA <= A_t*x<=ubA----------%A_t=zeros(Nc,Nc);for p=1:1:Ncfor q=1:1:Ncif p >= q A_t(p,q)=1;else A_t(p,q)=0;endend end ubA = Umax - Ut; %lbA = Umin - Ut;
%---- lb=<x<=ub----------%lb=kron(ones(Nc,1),-dumax);ub=kron(ones(Nc,1),dumax);
% end %EoF

上传Simulink模型

这篇关于增量式速度跟随,MPC,Simulink建模的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/645701

相关文章

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

OCC开发_变高箱梁全桥建模

概述     上一篇文章《OCC开发_箱梁梁体建模》中详细介绍了箱梁梁体建模的过程。但是,对于实际桥梁,截面可能存在高度、腹板厚度、顶底板厚度变化,全桥的结构中心线存在平曲线和竖曲线。针对实际情况,通过一个截面拉伸来实现全桥建模显然不可能。因此,针对变高箱梁,本文新的思路来实现全桥建模。 思路 上一篇文章通过一个截面拉伸生成几何体的方式行不通,我们可以通过不同面来形成棱柱的方式实现。具体步骤

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

2024年高教社杯数学建模国赛最后一步——结果检验-事关最终奖项

2024年国赛已经来到了最后一天,有必要去给大家讲解一下,我们不需要过多的去关注模型的结果,因为模型的结果的分值设定项最多不到20分。但是如果大家真的非常关注的话,那有必要给大家讲解一下论文结果相关的问题。很多的论文,上至国赛优秀论文下至不获奖的论文并不是所有的论文都可以进行完整的复现求解,大部分数模论文都为存在一个灰色地带。         白色地带即认为所有的代码均可运行、公开

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

Rhinoceros 8 for Mac/Win:重塑三维建模边界的革新之作

Rhinoceros 8(简称Rhino 8),作为一款由Robert McNeel & Assoc公司开发的顶尖三维建模软件,无论是对于Mac还是Windows用户而言,都是一款不可多得的高效工具。Rhino 8以其强大的功能、广泛的应用领域以及卓越的性能,在建筑设计、工业设计、产品设计、三维动画制作、科学研究及机械设计等多个领域展现出了非凡的实力。 强大的建模能力 Rhino 8支持多种建

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区