精华内容
下载资源
问答
  • 模型预测控制系列讲解(一):抛砖引玉(自动驾驶车辆纵向控制实例)1.说明2.模型预测控制实现2.1预测模型构建2.2性能指标要求及设计2.3根据性能指标要求重构预测模型2.4根据预测模型预测Np时域内系统输出2.5约束...

    1.说明

    首先通过一个简单的基于恒加速度(CA)车辆运动学模型MPC控制算法,引出模型预测控制,可以对模型预测控制有提个初步的感性的认知,具体模型预测控制思想,实现方式,实现步骤,定量分析,定性分析,性能指标设计以及参数整定等等后续会持续更新相关内容,可以先按照该篇模型先行仿真,感受模型预测控制。

    2.模型预测控制实现

    2.1预测模型构建

    恒加速度(CA)模型(高中物理),已经离散化后的线性模型:
    { v k + 1 = v k + a k T d k + 1 = d k + v k T + 1 2 a k T 2 \begin{gathered} \begin{cases} v_{k+1} = v_{k}+a_{k}T\\ d_{k+1}=d_{k}+v_{k}T+\frac{1}{2}a_{k}T^2\\ \end{cases} \end{gathered} {vk+1=vk+akTdk+1=dk+vkT+21akT2
    其中:
      v k \ v_k  vk k k k时刻车辆速度,
      v k + 1 \ v_{k+1}  vk+1 k + 1 k+1 k+1时刻车辆速度,
      a k \ a_k  ak k k k 时刻车辆加速度,
      d k \ d_k  dk k k k 时刻车辆位置,
      d k + 1 \ d_{k+1}  dk+1 k + 1 k+1 k+1时刻车辆位置,
      T \ T  T 为 采样时间。
    将上述模型写成矩阵形式:
    { x k + 1 = A x k + B u k y k + 1 = C x k \begin{gathered} \begin{cases} x_{k+1} = Ax_{k}+Bu_{k}\\ y_{k+1}=Cx_{k}\\ \end{cases} \end{gathered} {xk+1=Axk+Bukyk+1=Cxk
    其中:
      x k = [ d k , v k ] T \ x_k=[d_k,v_k]^T  xk=[dk,vk]T,为状态向量,
      u k = a k \ u_k=a_k  uk=ak,为控制量,
      y k = [ d k , v k ] T \ y_k=[d_k,v_k]^T  yk=[dk,vk]T,为输出向量,
      A , B , C \ A,B,C  A,B,C分别为状态矩阵,控制矩阵,输出矩阵。
    由上述模型可以求得A,B,C:

      A = [ 1 , T ; 0 , 1 ] \ A = [1,T;0,1]  A=[1,T;0,1]

      B = [ T 2 2 ; T ] \ B = [\frac{T^2}{2};T]  B=[2T2;T]

      C = [ 1 , 0 ; 0 , 1 ] \ C = [1,0;0,1]  C=[1,0;0,1]

    2.2性能指标要求及设计

    在设计性能指标的时候考虑因素:
    1.输出与期望偏差尽可能小,反映系统跟随能力
    2.尽量对控制量的突变情况进行约束,所以采用控制增量来约束
    具体性能指标形式如下:
      J ( k ) = ∑ i = 1 N p ∣ ∣ y r e a l ( k + i / k ) − y d e s ( k + i / k ) ∣ ∣ Q _ b a s e 2 + ∑ i = 0 N c − 1 ∣ ∣ Δ u ( k + i / k ) ∣ ∣ R _ b a s e 2 \ J(k) = \sum_{i =1}^{Np}||y_{real}{(k+i/k)}-y_{des}{(k+i/k)}||^2_{Q\_{base}}+\sum_{i=0}^{Nc-1}||\Delta u{(k+i/k)}||_{R\_{base}}^2  J(k)=i=1Npyreal(k+i/k)ydes(k+i/k)Q_base2+i=0Nc1Δu(k+i/k)R_base2
    性能指标的选取与实际需求有着非常紧密的联系,通常会先选择性能指标,再根据性能指标来决定预测模型的选取或者建立。

    2.3根据性能指标要求重构预测模型

    根据性能指标,将预测模型重构成含有控制增量的方式,重构方法:待定系数法,具体形式如下:
    ξ k + 1 = A t r a n ξ k + B t r a n Δ u k y k = C t r a n ξ k \xi_{k+1}=A_{tran}\xi_{k}+B_{tran}\Delta u_{k}\\y_{k}=C_{tran}\xi_{k} ξk+1=Atranξk+BtranΔukyk=Ctranξk

    Δ u k = u k − u k − 1 \Delta u_{k} = u_{k}-u_{k-1} Δuk=ukuk1
    ξ k = [ d k , v k , a k − 1 ] T \xi_k=[d_k,v_k,a_{k-1}]^T ξk=[dk,vk,ak1]T
    可以求得 A t r a n A_{tran} Atran B t r a n B_{tran} Btran C t r a n C_{tran} Ctran
    A t r a n = [ 1 , T , T 2 / 2 ; 0 , 1 , T ; 0 , 0 , 1 ] A_{tran} =[1,T,T^2/2;0,1,T;0,0,1] Atran=[1,T,T2/2;0,1,T;0,0,1]
    B t r a n = [ T 2 / 2 ; T ; 1 ] B_{tran}=[T^2/2;T;1] Btran=[T2/2;T;1]
    C t r a n = [ 1 , 0 , 0 ; 0 , 1 , 0 ] C_{tran}=[1,0,0;0,1,0] Ctran=[1,0,0;0,1,0]
    性能指标可以写的更紧凑:
    J ( k ) = ∣ ∣ Y ( t ) − Y d e s ( t ) ∣ ∣ Q 2 + ∣ ∣ Δ u ( t ) ∣ ∣ R 2 J(k) = ||Y(t)-Y_{des}(t)||_Q^2+||\Delta u(t)||_R^2 J(k)=Y(t)Ydes(t)Q2+Δu(t)R2
    其中:
    Y ( t ) = [ y T ( k + 1 / k ) , y T ( k + 2 / k ) , . . . , y T ( k + N p / k ) ] T Y(t)=[y^T(k+1/k),y^T(k+2/k), ... ,y^T(k+Np/k)]^T Y(t)=[yT(k+1/k),yT(k+2/k),...,yT(k+Np/k)]T
    Y d e s ( t ) = [ y d e s T ( k + 1 / k ) , y d e s T ( k + 2 / k ) , . . . , y d e s T ( k + N p / k ) ] T Y_{des}(t)=[y_{des}^T(k+1/k),y_{des}^T(k+2/k), ... ,y_{des}^T(k+Np/k)]^T Ydes(t)=[ydesT(k+1/k),ydesT(k+2/k),...,ydesT(k+Np/k)]T
    Δ u ( t ) = [ Δ u T ( k ) , Δ u T ( k + 1 ) , . . . , Δ u T ( k + N c − 1 ) ] T \Delta u(t)=[\Delta u^T(k),\Delta u^T(k+1), ... ,\Delta u^T(k+Nc-1)]^T Δu(t)=[ΔuT(k),ΔuT(k+1),...,ΔuT(k+Nc1)]T
    Q Q Q的对角线上的元素为 Q b a s e ( k + 1 ) , Q b a s e ( k + 2 ) , . . . Q b a s e ( k + N p ) Q_{base}(k+1),Q_{base}(k+2), ... Q_{base}(k+Np) Qbase(k+1)Qbase(k+2),...Qbase(k+Np)
    R R R的对角线上的元素为 R b a s e ( k ) , R b a s e ( k + 1 ) , . . . , R b a s e ( k + N c − 1 ) R_{base}(k),R_{base}(k+1), ... ,R_{base}(k+Nc-1) Rbase(k),Rbase(k+1),...,Rbase(k+Nc1)
    具体实现大家可以亲自推导一遍,在推导过程用分块矩阵去做,以预测时域和控制时域来分块,便于推导和理解。

    2.4根据预测模型预测Np时域内系统输出

    预测时域Np内的系统输出可以在当前状态下通过预测模型得到,并且只与当前状态 x ( k ) x(k) x(k)和未来控制时域Nc的控制量 u ( k ) , u ( k + 1 ) , . . . , u ( k + N c − 1 ) u(k),u(k+1),...,u(k+Nc-1) u(k),u(k+1),...,u(k+Nc1)有关,而未来Nc时域的控制量又可以由前一时刻的控制量 u ( k − 1 ) u(k-1) u(k1) Δ u ( k ) , Δ u ( k + 1 ) , . . . , Δ u ( k + N c − 1 ) \Delta u(k),\Delta u(k+1),...,\Delta u(k+Nc-1) Δu(k),Δu(k+1),...,Δu(k+Nc1)来计算的来,具体推导大家可以亲手试着推导一遍,更容易理解其中的变换过程,这里就不再进行推导。
    用紧凑型来表示:
    Y ( t ) = Φ ξ k + Θ Δ u ( t ) Y(t)=\Phi \xi_k+\Theta\Delta u(t) Y(t)=Φξk+ΘΔu(t)
    其中, Y ( t ) , ξ k , Δ u ( t ) Y(t),\xi_k,\Delta u(t) Y(t),ξk,Δu(t)上面已经列出,重点是 Φ , Θ \Phi,\Theta Φ,Θ的计算,可以选取Np和Nc都小一点,推导一下,规律很好找,由于公式编辑是在太过耗时,这里不再展开,大家可以在代码中看到具体形式,或者参考北理工出版的《无人驾驶车辆模型预测控制》。

    2.5约束条件设计

    约束条件,根据被控量物理属性,控制过程的舒适性等等来设计,具体如何设计会在后续详细分一章节来展开。
    首先,对控制量的约束:
    u m i n ( t ) < = u ( t ) < = u m a x ( t ) u_{min}(t)<= u(t)<=u_{max}(t) umin(t)<=u(t)<=umax(t)
    u ( t ) = [ u T ( k ) , u T ( k + 1 ) , . . . , u T ( k + N c − 1 ) ] T u(t)=[u^T(k),u^T(k+1), ... ,u^T(k+Nc-1)]^T u(t)=[uT(k),uT(k+1),...,uT(k+Nc1)]T
    再次,对控制增量的约束:
    Δ u m i n ( t ) < = Δ u ( t ) < = Δ u m a x ( t ) \Delta u_{min}(t)<= \Delta u(t)<=\Delta u_{max}(t) Δumin(t)<=Δu(t)<=Δumax(t)
    Δ u ( t ) = [ Δ u T ( k ) , Δ u T ( k + 1 ) , . . . , Δ u T ( k + N c − 1 ) ] T \Delta u(t)=[\Delta u^T(k),\Delta u^T(k+1), ... ,\Delta u^T(k+Nc-1)]^T Δu(t)=[ΔuT(k),ΔuT(k+1),...,ΔuT(k+Nc1)]T
    具体限制值代码中会给出,由于求解变量为控制增量,所以需要将约束条件转换成只含有控制增量的表达式:
    Δ U m i n ( t ) < = Δ U ( t ) < = Δ U m a x ( t ) U m i n ( t ) < = A c Δ U ( t ) + U ( k − 1 ) < = U m a x ( t ) \Delta U_{min}(t)<=\Delta U(t)<=\Delta U_{max}(t)\\U_{min}(t)<=A_{c}\Delta U(t)+U(k-1)<=U_{max}(t) ΔUmin(t)<=ΔU(t)<=ΔUmax(t)Umin(t)<=AcΔU(t)+U(k1)<=Umax(t)
    其中所有含有大写U都是Nc控制时域内的对应值,都是Nc*size(u)的列向量
    U ( k − 1 ) U(k-1) U(k1)为Nc长度的列向量与 u ( k − 1 ) u(k-1) u(k1)的克罗内克积,
    A c A_c Ac为下三角元素全为1, N c ∗ N c Nc * Nc NcNc的对角矩阵与 I N u I_{Nu} INu的克罗内克积。
    A c Δ U ( t ) + U ( k − 1 ) A_{c}\Delta U(t)+U(k-1) AcΔU(t)+U(k1)目的就是由未来Nc个时刻的控制增量和上一时刻的控制量来计算未来Nc个时刻的控制量。

    2.6整理化简性能指标为标准二次规划形式

    就是将前面的性能指标通过矩阵的性质,化简为标准的二次规划形式,就可以使用quadprog来求解,大家可以通过matlab的帮助文档来获得二次规划函数quadprog的实际使用方法,以及参数传递,文档中会有标准二次规划的说明。

    	% 性能指标转化为标准二次规划系数矩阵
    	H = 2 * (Theta' * Q * Theta + R);
    	H = (H + H')/2;
    	f = (2*(Phi * kesi - y_ref)' * Q * Theta)';
    

    这里是转换结果,推导过程大家可以体验一下,后续我会把手动推导的过程以图片的形式贴上来。

    3.仿真结果

    仿真的数据输入是根据CA(横加速度)模型,根据采样时间,以一个恒定的加速度来计算出期望速度和期望位置,给入模型预测控制,简单的仿真曲线,大概可以反应控制效果,具体可以修改其中的权值,预测时域以及控制时域来优化控制效果。
    速度跟随曲线:
    在这里插入图片描述
    位置跟随曲线:
    在这里插入图片描述
    如果输入期望值直接给入阶跃值,效果又如何?造成这样的原因是什么,在不改变期望输入的情况下,怎么解决?我会在接下来的更新过程中说明一些解决方案。这也是需要加速度规划和不需要加速度规划的问题,其实这两种情况我们实际应用中是都会遇到的,之后我会详细为大家说明。

    4.总结

    这个只是使用非常简单的预测模型,没有太多复杂处理,只用来大家体验下模型预测控制的实现,对MPC有一个初步的认知。
    接下来会展开来讲模型预测控制的相关原理,思想方式,不同的实现方式,简单的稳定性分析,定量以及定性的分析等等。会在后续介绍中,介绍已经经过RCP(快速原型)验证的基于MPC的ACC(自适应巡航)控制算法,详细介绍性能指标的选取,参数的调节等等。

    5.S_Function代码(后续会更新C/C++代码)

    下面附MPC的S_Function代码:
    该代码是在Matlab2018b中开发

    function MPC_long_control(block)
    % Level-2 MATLAB file S-Function
    % 基于恒加速度汽车纵向模型的模型预测控制
    	setup(block);
    % endfunction
    function setup(block)
    
    	% Register number of ports
    	block.NumInputPorts  = 4;
    	block.NumOutputPorts = 2;
    
    	% setup port properties to be inherited or dynamic
    	block.SetPreCompInpPortInfoToDynamic;
    	block.SetPreCompOutPortInfoToDynamic;
    
    	% Override input port properties
    	block.InputPort(1).Dimensions = 1;
    	block.InputPort(1).DatatypeID = 0;    % double
    	block.InputPort(1).Complexity = 'Real';
    	block.InputPort(1).DirectFeedthrough = false;
    	block.InputPort(1).SamplingMode = 'Sample';
    
    	block.InputPort(2).Dimensions = 1;
    	block.InputPort(2).DatatypeID = 0;    % double
    	block.InputPort(2).Complexity = 'Real';
    	block.InputPort(2).DirectFeedthrough = false;
    	block.InputPort(2).SamplingMode = 'Sample';
    
    	block.InputPort(3).Dimensions = 1;
    	block.InputPort(3).DatatypeID = 0;    % double
    	block.InputPort(3).Complexity = 'Real';
    	block.InputPort(3).DirectFeedthrough = false;
    	block.InputPort(3).SamplingMode = 'Sample';
    
    	block.InputPort(4).Dimensions = 1;
    	block.InputPort(4).DatatypeID = 0;    % double
    	block.InputPort(4).Complexity = 'Real';
    	block.InputPort(4).DirectFeedthrough = false;
    	block.InputPort(4).SamplingMode = 'Sample';
    
    	% Override output port properties
    	block.OutputPort(1).Dimensions = 1;
    	block.OutputPort(1).DatatypeID = 0;    % double
    	block.OutputPort(1).Complexity = 'Real';
    	block.OutputPort(1).SamplingMode = 'Sample';
    
    	block.OutputPort(2).Dimensions = [1,2];
    	block.OutputPort(2).DatatypeID = 0;    % double
    	block.OutputPort(2).Complexity = 'Real';
    	block.OutputPort(2).SamplingMode = 'Sample';
    
    	% Register parameters
    	block.NumDialogPrms = 2;
    	block.DialogPrmsTunable = {'Tunable','Tunable'};
    
    	block.SampleTimes = [-1,0];
    	block.SimStateCompliance = 'DefaultSimState';
    
    	block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup);
    	block.RegBlockMethod('InitializeConditions', @InitializeConditions);
    	block.RegBlockMethod('Outputs', @Outputs);
    	block.RegBlockMethod('Update', @Update);
    
    % end setup
    function DoPostPropSetup(block)
    	% 系统状态变量设置
    	% 状态变量个数设置
    	block.NumDworks = 2;
    
    	block.Dwork(1).Name            = 'd_rel';
    	block.Dwork(1).Dimensions      = 1;
    	block.Dwork(1).DatatypeID      = 0;    %double
    	block.Dwork(1).Complexity      = 'Real';
    	block.Dwork(1).UsedAsDiscState = true;
    
    	block.Dwork(2).Name            = 'v_rel';
    	block.Dwork(2).Dimensions      = 1;
    	block.Dwork(2).DatatypeID      = 0;    %double
    	block.Dwork(2).Complexity      = 'Real';
    	block.Dwork(2).UsedAsDiscState = true;
    
    % end DoPostPropSetup
    function InitializeConditions(block)
    	% 初始化设置
    	global U;    % 控制量
    	U = 0;
    	block.Dwork(1).Data = block.DialogPrm(1).Data;
    	block.Dwork(2).Data = block.DialogPrm(2).Data;
    
    % end InitializeConditions
    
    function Outputs(block)
    	% 输出函数
    	global U;
    	Ts  = 0.01;   % 采样周期
    	Np  = 50;     % 预测时域
    	Nc  = 50;     % 控制时域
    	Row = 10;     % 松弛因子
    	Nx  = 2;      % 状态量个数
    	Nu  = 1;      % 控制量个数
    	No  = 2;      % 输出量个数
    
    	% 控制期望值计算以及转换
    	y_des = [block.InputPort(1).Data, block.InputPort(2).Data]';    % 期望输出向量
    	y_ref = kron(ones(Np, 1), y_des);                               % 预测时域内各时刻期望输出
    
    	% 预测状态方程状态向量计算
    	vector_x = [block.Dwork(1).Data, block.Dwork(2).Data]';              % 原始状态方程状态向量
    	Kesi_cell = cell(2, 1);
    	Kesi_cell{1,1} = vector_x;
    	Kesi_cell{2,1} = U;
    	kesi = cell2mat(Kesi_cell);                                   % 预测状态方程状态向量
    
    	% 初始状态方程矩阵以及输出矩阵
    	A = [1,Ts;0,1];
    	B = [(Ts^2)/2,Ts]';
    	C = eye(2);
    
    	% 变换后状态方程系数矩阵
    	A_tran_cell = cell(2,2);
    	B_tran_cell = cell(2,1);
    	C_tran_cell = cell(1,2);
    	A_tran_cell{1,1} = A;
    	A_tran_cell{1,2} = B;
    	A_tran_cell{2,1} = zeros(Nu,Nx);
    	A_tran_cell{2,2} = eye(Nu);
    	B_tran_cell{1,1} = B;
    	B_tran_cell{2,1} = eye(Nu);
    	C_tran_cell{1,1} = C;
    	C_tran_cell{1,2} = zeros(No,1);
    	A_tran = cell2mat(A_tran_cell);
    	B_tran = cell2mat(B_tran_cell);
    	C_tran = cell2mat(C_tran_cell);
    
    	% 系统预测输出系数矩阵
    	Phi_cell    = cell(Np,1);
    	Theta_cell  = cell(Np,Nc);
    	for i = 1:Np
    		Phi_cell{i,1} = C_tran*(A_tran^i);
    		for j = 1:Nc
    			if j <= i
    				Theta_cell{i,j} = C_tran*A_tran^(i-j)*B_tran;
    			else
    				Theta_cell{i,j} = zeros(No,Nu);
    			end
    		end
    	end
    	Phi   = cell2mat(Phi_cell);
    	Theta = cell2mat(Theta_cell);
    
    	% 性能指标权系数矩阵
    	Q_base = [1,0;0,1];    % No*No的对角矩阵,输出误差基准加权矩阵
    	R_base = 1;            % Nu*Nu的对角矩阵,控制量加权基准矩阵,此处为控制增量加权基准矩阵
    	Q = eye(Np);
    	R = eye(Nc);
    	Q = kron(Q,Q_base);    % 预测时域内输出误差权矩阵
    	R = kron(R,R_base);    % 控制时域内控制增量权矩阵
    
    	% 性能指标转化为标准二次规划系数矩阵
    	H = 2 * (Theta' * Q * Theta + R);
    	H = (H + H')/2;
    	f = (2*(Phi * kesi - y_ref)' * Q * Theta)';
    
    	% 约束条件
    	A_c  = tril(ones(Nc*Nu));
    	Ut   = kron(ones(Nc,1),U);
    	umin = -5;                        % 控制量最大值,此处为加速度最小值
    	umax = 2;                         % 控制量最小值,此处为加速度最大值
    	delta_umin = -0.05;               % 控制增量最小值
    	delta_umax = 0.05;                % 控制增量最大值
    	U_min = kron(ones(Nc,1),umin);
    	U_max = kron(ones(Nc,1),umax);
    	delta_Umin = kron(ones(Nc,1),delta_umin);
    	delta_Umax = kron(ones(Nc,1),delta_umax);
    	lb = delta_Umin;
    	ub = delta_Umax;
    
    	% 不等式约束系数矩阵
    	A_con_cell = {A_c;-A_c};
    	b_con_cell = {U_max - Ut;-U_min + Ut};
    	A_con = cell2mat(A_con_cell);
    	b_con = cell2mat(b_con_cell);
    
    	% 二次规划求解
    	options = optimset('Algorithm','');
    	[X,fval,exitflag] = quadprog(H,f,A_con,b_con,[],[],lb,ub,[],options);
    
    	% 控制量计算
    	delta_u = X(1);
    	U = U + delta_u;
    	u_ctr = U;
    
    	block.OutputPort(1).Data = u_ctr;
    	block.OutputPort(2).Data = [u_ctr, delta_u];
    
    % end Outputs
    function Update(block)
    	% 状态更新
    	block.Dwork(1).Data = block.InputPort(3).Data;
    	block.Dwork(2).Data = block.InputPort(4).Data;
    
    % end Updata
    

    补充1:性能指标转化成标准二次规划推导过程(手动推导)

    这个推导过程看似复杂,经常在这会劝退很多人,实则掌握了它的本质,则就相对简单很多,要有一种持之以恒的信念!

    性能指标: J ( k ) = ∣ ∣ Y ( t ) − Y d e s ( t ) ∣ ∣ Q 2 + ∣ ∣ Δ u ( t ) ∣ ∣ R 2 J(k) = ||Y(t)-Y_{des}(t)||_Q^2+||\Delta u(t)||_R^2 J(k)=Y(t)Ydes(t)Q2+Δu(t)R2

    输出预测方程: Y ( t ) = Φ ξ k + Θ Δ u ( t ) Y(t)=\Phi \xi_k+\Theta\Delta u(t) Y(t)=Φξk+ΘΔu(t)

    标准二次规划形式:

    min ⁡ x   1 2 x T H x + f T x s t . { A x ⩽ b A e q ⩽ b e q l b ⩽ x ⩽ u b \begin{gathered} \min_{x}\ \frac{1}{2}{x^T}Hx+f^Tx \\ st.\begin{cases} Ax\leqslant{b}\\ Aeq\leqslant{beq}\\ lb\leqslant{x}\leqslant{ub} \end{cases} \end{gathered} xmin 21xTHx+fTxst.AxbAeqbeqlbxub
    目标是将性能指标化简为标准二次规划形式。
    推导过程中用到的矩阵运算性质:
    { ( A B ) T = B T A T ( A ± B ) T = A T ± B T A B C = A ( B C ) = ( A B ) C A ( B + C ) = A B + A C ( B + C ) A = B A + C A \begin{gathered} \begin{cases} (AB)^T=B^TA^T\\ (A\pm{B})^T=A^T\pm{B}^T\\ ABC = A(BC)=(AB)C\\ A(B+C)=AB+AC\\ (B+C)A=BA+CA\\ \end{cases} \end{gathered} (AB)T=BTAT(A±B)T=AT±BTABC=A(BC)=(AB)CA(B+C)=AB+AC(B+C)A=BA+CA
    当A矩阵为对称矩阵或者A为一个实数,则有:
      A T = A \ A^T =A  AT=A
    这个性质在推导过程中及其重要,尤其是它的不同表现形式,如   M = A B \ M = AB  M=AB,如果我们知道M为对称矩阵或者M为实数,则会有:
    M = M T = ( A B ) T = B T A T \begin{gathered} M =M^T=(AB)^T=B^TA^T \end{gathered} M=MT=(AB)T=BTAT
    下面是手动推导过程:
    推导过程手动推导过程。

    补充2:性能指标转化成标准二次规划推导过程(公式编辑)

    这里采用公式编辑来跟清晰的展现转化过程。
    \begin{split}J(k)&=||Y(t)-Y_{des}(t)||2_{Q}+||\Delta{u}(t)||2_{R}\&=(Y(t)-Y_{des}(t)){T}Q(Y(t)-Y_{des}(t))+\Delta{u}T(t)R\Delta{u}(t)\&=YT(t)QY(t)+Y_{des}T(t)QY_{des}(t)-2Y_{des}T(t)QY(t)+\Delta{u}T(t)R\Delta{u}(t)\&=(\Phi\xi_k+\Theta\Delta{u}(t))TQ(\Phi\xi_k+\Theta\Delta{u}(t))+Y_{des}T(t)QY_{des}(t)-2YT_{des}(t)Q(\Phi\xi_k+\Theta\Delta{u}(t))+\Delta{u}T(t)R\Delta{u}(t)\&=(\Phi\xi_k)TQ(\Phi\xi_k)+(\Theta\Delta{u}(t))TQ(\Theta\Delta{u}(t))+2(\Phi\xi_k)TQ(\Theta\Delta{u}(t))-2Y_{des}(t)TQ(\Phi\xi_k)-2Y_{des}(t)TQ(\Theta\Delta{u}(t))+\Delta{u}T(t)R\Delta{u}(t)\&=(\Phi\xi_k)TQ(\Phi\xi_k)+\Delta{u}T(t)(\ThetaTQ\Theta)\Delta{u}(t)+2((\Phi\xi_k)T-YT_{des}(t))Q(\Theta\Delta{u}(t))-2YT_{des}(t)Q(\Phi\xi_k)+\Delta{u}^T(t)R\Delta{u}(t)\&=\Delta{u}T(t)(\ThetaTQ\Theta+R)\Delta{u}(t)+2(\Phi\xi_k-YT_{des}(t))Q\Theta\Delta{u}(t)+(\Phi\xi_k)TQ(\Phi\xi_k)-2Y^T_{des}(t)Q(\Phi\xi_k)\end{split}

    其中 ( Φ ξ k ) T Q ( Φ ξ k ) (\Phi\xi_k)^TQ(\Phi\xi_k) (Φξk)TQ(Φξk) 2 Y d e s T ( t ) Q ( Φ ξ k ) 2Y^T_{des}(t)Q(\Phi\xi_k) 2YdesT(t)Q(Φξk),不含有优化变量 Δ u ( t ) \Delta{u}(t) Δu(t),这两项可以看作是常数项,对优化不产生影响,比如要求 f ( x ) f(x) f(x)的最小值:
    min ⁡ x   f ( x ) = f 1 ( x ) + a \begin{gathered} \min_{x}\ f(x)=f_1(x)+a \end{gathered} xmin f(x)=f1(x)+a
    式中 a a a为常数项,那么 f ( x ) f(x) f(x)取的最小值的时候就是 f 1 ( x ) f_1(x) f1(x)取得最小值的时候。
    所以最后的性能指标就可以简化为:
    J ( k ) = Δ u T ( t ) ( Θ T Q Θ + R ) Δ u ( t ) + 2 ( Φ ξ k − Y d e s ( t ) ) T Q Θ Δ u ( t ) J(k)=\Delta{u}^T(t)(\Theta^TQ\Theta+R)\Delta{u}(t)+2(\Phi\xi_k-Y_{des}(t))^TQ\Theta\Delta{u}(t) J(k)=ΔuT(t)(ΘTQΘ+R)Δu(t)+2(ΦξkYdes(t))TQΘΔu(t)
    对照上边的标准二次规划,可以得到其系数:
    H = 2 ( Θ T Q Θ + R ) f = ( 2 ( Φ ξ k − Y d e s ( t ) ) T Q Θ ) T H=2(\Theta^TQ\Theta+R)\\ f = (2(\Phi\xi_k-Y_{des}(t))^TQ\Theta)^T H=2(ΘTQΘ+R)f=(2(ΦξkYdes(t))TQΘ)T
    从而实现了从性能指标到标准二次规划的化简。

    展开全文
  • 为提高车辆自动驾驶系统的运动性能, 基于模糊逻辑和滑模控制理论设计了一种车辆纵向和横向运动综合控制系统。该控制系统通过对前轮转向角度、发动机节气门开度、制动液压及主动横摆力矩进行协调控制, 使车辆能够以...
  • 这篇论文讲述了智能驾驶方向纵向控制算法,侧重与卡车类的纵向算法
  • 车辆纵向mpc控制

    千次阅读 2020-03-21 12:46:15
    这里只取结果 ·车辆运动的状态主要有六个值表示:x轴和y轴的位置、速度、偏离中心的角度、横向偏移量、角度变化量。 ·而我们能控制的就是在绝对坐标中的加速度(油门)和转向角度(方向盘) ·因为是基于现实的,...

    MPC控制器:https://blog.csdn.net/qq_42258099/article/details/95353986?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
    内点法:https://zhuanlan.zhihu.com/p/96981554
    运动学模型:https://www.cnblogs.com/yrm1160029237/p/10087315.html
    基于python的mpc实现:https://blog.csdn.net/u013468614/article/details/103519721
    mpc控制器:首先构建一个物理模型,将当前的信息和要输出的量放入其中可以预测之后一段时间的情况,用预测和期望做代价函数,找出可以使得代价函数最小的输出,就是当前的最佳输出。

    内点法:要求某个函数值最小,并且有约束函数。通过构建惩罚函数绕过约束。

    ·本人刚开始学习mpc控制器的内容,想从一个简单易懂的角度阐述一下对mpc控制器的理解,本博客仅供参考

    首先参考资料中的第一个连接,得到如下思路:
    想做MPC控制器需要做三件事:
    1、给物理模型建模
    ·这部分需要汽车动力学的知识,具体介绍在第三个链接中。这里只取结果
    在这里插入图片描述
    ·车辆运动的状态主要有六个值表示:x轴和y轴的位置、速度、偏离中心的角度、横向偏移量、角度变化量。
    ·而我们能控制的就是在绝对坐标中的加速度(油门)和转向角度(方向盘)
    ·因为是基于现实的,所以还要对加速度和转向角度进行约束。
    在这里插入图片描述
    ·也就是说当我们获得当前时刻的运动状态的六个量,我们再设置两个加速度和转向角度两个输出,我们就可以通过上面的物理模型预测之后数个时刻的六个状态量

    2、以理想路线为期望和预测的结果一起为建立代价函数
    在这里插入图片描述
    ·这个代价函数代表的是理想路线(通过路径规划的方法得出)和当前预测的结果的差距量。
    ·带ref的量就是期望量是通过路径规划获得的理想理想路线上的点得到的
    ·给出一组加速度和转向角度就可以获得一组模型预测而来的未来数个点的六个状态值。不同的状态量可能重要性不同,所以可能要设计一个权重系数。
    ·那么现在要做的就是找到一组加速度和转向角度使得和理想路径误差最小,也就是这个代价函数最小。

    3、求得输出量的最佳值
    ·这里涉及一个最优化的问题,要在对加速度和转向角的约束下,找到使得代价函数最小的加速度和转向角。为了解决这个问题使用了内点法。
    ·内点法具体内容参考第二个链接,以下是对内点法的个人理解:
    (1)这个问题的难点就在于存在一个不等式的约束,其实如果只是一个二元二次等式可以通过微积分的求导得出最优值。
    (2)所以构造一个障碍函数,通过等式的方式代替不等式代表的意义。在这里插入图片描述

    ·这个f(x)就是那个代价函数,这样在约束下的条件下,求代价函数的最小值的问题就转换成了求一个函数最小值的问题。
    (3)这个函数的最小值就可以通过求偏导的方式进行求解了,求得的结果是包含r的。r越小,结果越好。通过r的极限过程,求得加速度和转角的不带r的结果。

    展开全文
  • 通过扭矩控制车辆纵向控制 默认方案: 百度Apollo的控制中默认是基于MKZ的油门刹车控制车辆的纵向,衍生出了需要标定表,用来标定汽车油门刹车及速度的关系。控制的最后一步也是进行查表,确定给多少油门或刹车。 ...

    通过扭矩控制车辆的纵向控制

    默认方案:

    百度Apollo的控制中默认是基于MKZ的油门刹车控制车辆的纵向,衍生出了需要标定表,用来标定汽车油门刹车及速度的关系。控制的最后一步也是进行查表,确定给多少油门或刹车。

    电动车的控制接口

    电动车给到的控制接口一般都是扭矩进行控制,且刹车用的减速度的接口,当然Apollo也支持通过加速度进行控制,而加速度和扭矩是有一个对应的关系的,简单的做法可以直接做线性拟合;复杂的做法是做个标定表。像油门刹车与速度的标定表一样做一个扭矩、加速度与速度的表格。

    loncontroller.cc的代码说明
    vehicle_controller.cc
    其中一种调试方式如上所示,直接将油门和刹车注释掉,刹车直接通过发送减速度来执行。

    展开全文
  • 无人驾驶车辆纵向速度PID控制

    千次阅读 2018-12-05 20:46:00
    无人驾驶纵向控制研究 1.车辆纵向模型 模型不考虑爬坡因素 1.1 简化模型 1.2 车辆模型参数 根据参数求得实际模型如下:

    无人驾驶纵向控制研究

    1.车辆纵向模型

    模型不考虑爬坡因素
    在这里插入图片描述

    1.1 模型简化 在这里插入图片描述

    式中参数表达式如下:
    在这里插入图片描述

    1.2 车辆模型参数

    在这里插入图片描述

    根据参数求得实际模型如下:

    a = 0.0134 b = 29.38 FT=Tm - 6.8439
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/201811202231041.png)
    

    2 PID控制算法

    2.1 拉普拉斯变换

    由于模型中包含速度的平方,因此不能直接进行拉普拉斯变换,本人的思路使用分段线性化去进行拟合:

    在这里插入图片描述

    令速度平方约等于k*u,u在[0,10]范围内时,满足如下公式

    u

    则模式可进一步写成下公式

    在这里插入图片描述

    对上公式进行拉普拉斯变换

    在这里插入图片描述

    2.2 PID控制

    2.2.1 PID算法拉普拉斯变换

    在这里插入图片描述

    2.2.2 控制模型图

    在这里插入图片描述
    在这里插入图片描述
    则传递函数为:
    在这里插入图片描述
    具体形式如下:
    在这里插入图片描述

    2.2.3 PID参数计算

    利用劳斯判据进行参数范围计算
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 应用向量Lyapunov函数方法和...根据滑模控制策略确定了车辆跟随系统的纵向控制规律,基于稳定性准则设计了车辆纵向跟随控制器参数.仿真结果表明,基于该方法设计的车辆纵向跟随控制器能使跟踪误差具有较快的收敛率.</p>
  • 使用simulink搭建的车辆控制的一个模型,主要用于自动驾驶控制部分的仿真,能够跟随轨迹按设定的车速行驶。
  • 4.4 纵向车辆建模(Longitudinal Vehicle ...这些模型将帮助我们在本课程的下一个模块中建立纵向控制器。 纵向车辆动力学模型是简单的基于产生前进运动的车辆动力学。这是一个典型的车辆在倾斜道路上的纵向运动。作
  • 车辆纵向动力学控制,利用模型预测进行控制车辆加减速达到纵向跟驰
  • 课题围绕智能车辆纵向速度跟踪与控制,从智能车辆纵向动力学建模与执行器设计、速度跟踪控制、全速范围跟车控制、实时经济车速控制等方面开展以下研究工作。 本章引入车间反应距离的概念。自车距离目标车辆一定距离...
  • 然后基于得到的稳定性条件, 采用滑模变结构控制策略对脉冲变时滞车辆纵向跟随系统进行控制器设计; 最后通过 一个数值仿真算例验证了所得结论的正确性以及在实际中如何应用.</body></html>
  • 1驾驶辅助装置,车辆和控制车辆纵向速度的方法_new.pdf
  • 自主排利用协作驾驶技术,将能够有效地提高交通密度和安全性。... 在此模型车辆模拟环境中进行了排纵向控制的实验。 结果表明,所提出的控制逻辑对于纵向排协同动作(包括合并,分离和跟随)的执行和平滑切换足够有效。
  • 应用向量Lyapunov函数方法和...根据滑模控制策略确定了车辆跟随系统的纵向控制规律。基于稳定性准则设计了车辆纵向跟随控制器参数.仿真结果表明,基于该方法设计的车辆纵向跟随控制器能使跟踪误差具有较快的收敛率.
  • 根据液驱混合动力车辆的特点,提出了一种集成驱动和制动控制纵向运动控制策略。建立了基于模糊PTD控制策略的驱动、制动控制器,并结合将驱动时的滑转率和制动时的滑移率统一处理的设想,设计了车辆纵向运动控制...
  • 关于驾驶辅助装置,车辆和控制车辆纵向速度的方法的介绍说明.rar
  • 本代码仿真了车辆ABS/TCS子系统在牵引或制动时的纵向动力学设计。完整源码下载请点击“阅读原文” ...
  • 利用纵向控制器模块建立汽车行驶速度控制仿真模型。
  • 本文主要介绍了车辆动力学及控制,主要内容包括车辆侧向动力学、自动车道保持的转向控制、车辆纵向动力学、车辆纵向控制、自适应巡航控制等等。
  • Apollo代码学习(五)—横纵向控制

    万次阅读 多人点赞 2018-11-07 14:51:48
    纵向控制主要为速度控制,通过控制刹车、油门、档位等实现对车速的控制,对于自动挡车辆来说,控制对象其实就是刹车和油门。 图1 纵向控制 Apollo纵向控制的工作原理如图1所示。它主要由“位移-速度闭环PID控制...
  • me227-项目 ME227车辆动力学和控制项目的软件仓库。 重点是横向和纵向车辆控制器的开发。
  • 无人驾驶汽车横向控制模型

    千次阅读 2018-12-04 21:31:06
    无人驾驶横向控制模型 1.车辆单车二自由度模式 车辆二自由度模型如下: 如对具体推导感兴趣,可以查看余志生的汽车理论教材,当然后期也会对其更新理论推导方面的知识。 2. 误差控制模型 3.总结 ...
  • 以智能车辆横、纵向动力学模型为基础,以设计可行的、稳定的智能车辆横、纵向及综合控制系统为目的进行研究
  • 无人驾驶车辆模型预测控制横向控制轨迹跟踪
  • 摘要:考虑ACC系统在跟车模式下的平稳性与安全性,且兼顾车辆舒适性,运用模型预测控制原理,引入前车输出综合白噪声干扰,建立ACC系统跟车模型,该模型可全面描述自车与前车状态变化规律,且具有足够的精度和可靠性...
  • 基于模糊自整定PID的履带车辆自动驾驶系统纵向车速控制.pdf
  • 基于车辆模型的横向控制方法

    万次阅读 多人点赞 2020-03-24 14:37:05
    无人驾驶车辆基于模型横向控制车辆运动学模型、纯跟踪、后轮反馈、前轮反馈控制算法;车辆动力学模型、车辆线性二自由度动力学模型、车辆路径跟踪偏差状态方程的构建、LQR 横向控制算法的求解
  • 百度Apollo 中纵向控制源码解析

    千次阅读 2018-05-07 14:01:40
     上篇博文中,我们主要介绍了control模块的入口和车辆横向控制的介绍,有兴趣的可以参考链接Apollo control 模块源码解析 此篇博文,我们主要介绍下Apollo内部的纵向控制代码和原理解析: 话不多少,首先我们需要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,740
精华内容 1,096
关键字:

车辆纵向控制