四轮独立驱动汽车轨迹跟踪与横向稳定性控制:MPC控制器与二次规划方法结合应用,基于MATLAB...
四轮独立驱动汽车自动轨迹跟踪横向稳定性控制 CarSim与Simulink联合 控制目标为对给定轨迹进行跟踪(不带轨迹规划)同时进行横向稳定性控制 上层控制器为MPC控制器输出为附加横摆力矩和方向盘转角,采用了二自由度车辆模型 MPC控制器采用代码编写原理一目了然 将MPC问题转化为了二次规划方法求解 下层为基于优化控制的转矩分配 带有完整详细的推导文档 可通过该模型学习★MPC控制★将MPC转化为二次规划的方法★轨迹跟踪控制★MATLAB中二次规划和非线性规划的命令使用方法 MATLAB版本为2018b CarSim版本为2018四轮独立驱动电动车搞轨迹跟踪听着就带感对吧今天咱们要撸的这个模型上层用MPC控方向盘和横摆力矩下层搞转矩分配CarSim和Simulink这对老搭档配合得那叫一个丝滑。直接上干货先看MPC这层的核心代码段function [delta, Mz] MPC_Controller(x0, refTraj) % 状态空间模型参数 A [1 -0.02; 0.1 0.98]; B [0.3 0.05; 0.01 1.2]; % 预测时域N5 H zeros(10,10); for k1:5 H(2*k-1:2*k,2*k-1:2*k) [10 0; 0 5]; % 状态权重 end f zeros(10,1); current_ref refTraj(1:2,:); f(1:2:10) -20*current_ref(:,1); % 轨迹跟踪目标 % 约束条件构建 Aeq []; beq []; for k1:5 Aeq blkdiag(Aeq, A); if k1 Aeq(2*k-1:2*k, 2*(k-1)-1:2*(k-1)) -eye(2); end end % 调用quadprog求解器 options optimoptions(quadprog,Display,off); U quadprog(H,f,[],[],Aeq,beq,[],[],[],options); delta U(1); % 取第一个控制量作为方向盘转角 Mz U(2); % 附加横摆力矩 end这段代码最骚的地方在于把预测模型直接编码成矩阵运算。H矩阵对应目标函数的二次项f向量处理轨迹跟踪的线性项。注意看那个for循环构建预测模型的方式像叠乐高积木一样把状态转移关系垒起来。quadprog求解器吃进去这些参数吐出来的就是最优控制序列。四轮独立驱动汽车自动轨迹跟踪横向稳定性控制 CarSim与Simulink联合 控制目标为对给定轨迹进行跟踪(不带轨迹规划)同时进行横向稳定性控制 上层控制器为MPC控制器输出为附加横摆力矩和方向盘转角,采用了二自由度车辆模型 MPC控制器采用代码编写原理一目了然 将MPC问题转化为了二次规划方法求解 下层为基于优化控制的转矩分配 带有完整详细的推导文档 可通过该模型学习★MPC控制★将MPC转化为二次规划的方法★轨迹跟踪控制★MATLAB中二次规划和非线性规划的命令使用方法 MATLAB版本为2018b CarSim版本为2018下层转矩分配玩的是非线性规划关键在这段约束处理function torque torque_distribution(Mz, Fx_total) % 轮胎力约束 f_max 3000; % 单轮最大驱动力 A [eye(4); -eye(4)]; b [f_max*ones(4,1); f_max*ones(4,1)]; % 力矩平衡约束 Aeq [1 1 1 1; -0.5*car.W 0.5*car.W -0.5*car.W 0.5*car.W]; beq [Fx_total; Mz]; % fmincon求解 options optimoptions(fmincon,Algorithm,sqp); torque fmincon((x)sum(x.^2),zeros(4,1),A,b,Aeq,beq,[],[],[],options); end这里用平方和最小化作为目标函数既保证总驱动力达标又能均衡各轮负荷。注意看Aeq矩阵的第二行那个0.5倍轮距的系数排列其实是把四个轮的力臂关系转换成横摆力矩的数学表达。联合仿真配置有个坑要注意CarSim的S-function接口在2018版必须用特定的数据打包方式。下面这个回调函数处理车辆输出function sys carsim_output(t,x,u,flag) persistent vh; if flag 0 % 初始化 vh actxserver(CarSim.ApiServer); vh.Invoke(Initialize); elseif flag 3 % 输出 sys [vh.GetVariable(YawRate); vh.GetVariable(LateralAcc)]; end end这个COM接口调用看着简单但实测时发现必须把采样时间设为变步长否则数据会错拍。调试时最好在关键节点插几个disp输出毕竟CarSim的黑箱特性你懂的...最后说下学习要点推导文档里那个状态方程线性化过程值得细品特别是把轮胎侧偏刚度简化成线性关系的操作。实际调试时权重系数得反复调参比如横向误差的惩罚系数如果太大车会像醉汉一样左右晃。建议先用正弦曲线作为参考轨迹测试比圆形轨迹更容易观察控制效果。