1、电机模型搭建(参考B站老王)
目前智能车辆大都采用电动车,汽车电动化也是大势所趋,因此这里采用电车模型来进行车辆的纵向控制。电机参数为:最大扭矩为380,最大功率为180kw,转速w如下:
转速的单位为:转/每分钟。
上面两图就是建立的电机模型。
2、油门刹车标定表的制作
这里我们把油门标定表和刹车标定表,做到一张表里面,这样当控制车辆到达一个目标速度时,就会根据表中数据自动插值,使控制具有连续性。当分成两张表时,当目标速度是10km/h时,可能出现在目标速度附近来回跳动,控制连续性不好。
标定表制作如下:
当标定油门时,这里速度为0,标定刹车时速度为180。
输入、输出为:
注意一点,设置的道路长一点,否则程序运行可能报错。
3、simulink模型搭建
代码分别为:
function [thr,brake] = fcn(x)
if x>= 0
thr = x;
brake = 0;
else
brake = -x;
thr = 0;
end
end
function torque = fcn(thr,rpm)
Tmax = 380*thr;
if rpm <= 4523
torque = Tmax;
else
torque = Tmax *4523/rpm;
end
end
标定代码为:
clc;clear;
x = 0;
for i = 1:101
sim('longitudinal_control');
vx_tmp(:,i) = ans.vx.data;
ax_tmp(:,i) = ans.ax.data;
thr_tmp(:,i) = ones(length(ans.vx.data),1)*x;
x = x + 0.02;
end
ax_tmp(1,:) = ax_tmp(2,:);
%拟合
vv = vx_tmp(:,1)';
aa = ax_tmp(:,1)';
thr_thr = thr_tmp(:,1)';
for i = 2 :length(vx_tmp(1,:))
vv =[vv,vx_tmp(:,i)'];
aa = [aa,ax_tmp(:,i)'];
thr_thr = [thr_thr,thr_tmp(:,i)'];
end
%% 刹车
x= 0;
for i = 1:81
sim('longitudinal_control');
vvx_tmp(:,i) = ans.vx.data;
aax_tmp(:,i) = ans.ax.data;
brake_tmp(:,i) = ones(length(ans.vx.data),1)*x;
for j = 1:length(vvx_tmp(:,i))
if vvx_tmp(j,i) <= 0.01
brake_tmp(j,i) = 0;
end
end
x = x - 0.1;
end
%%
%将v_tmp 、a_tmp 、brake_tmp合并
aax_tmp(1,:) = aax_tmp(2,:);
vvv = vvx_tmp(:,1)';
aaa = aax_tmp(:,1)';
brake_bra = brake_tmp(:,1)';
for i = 2 :length(vvx_tmp(2,:))
vvv =[vvv,vvx_tmp(:,i)'];
aaa = [aaa,aax_tmp(:,i)'];
brake_bra = [brake_bra,brake_tmp(:,i)'];
end
%%
%% 拟合
v1 = [vv,vvv];
a1 = [aa,aaa];
thr_bra = [thr_thr,brake_bra];
F = scatteredInterpolant(v1',a1',thr_bra');
vu = 0:0.05:50;
au = -8:0.05:5;
tabler = zeros(length(vu),length(au));
for i = 1:length(vu)
for j = 1:length(au)
tabler(i,j) = F(vu(i),au(j));
end
end
这里记得油门刹车分开标定,最后完成一张总表
如图:
在 里面填写对应的数据
4、双PID的纵向控制
这里输出增了位移输出;
参考加速度、速度、位移代码和图像如下:
function [s,v,a] = fcn(t)
if t<10
s=0.1*t^3/3;
v=0.1*t^2;
a=0.2*t;
else
a=2-0.1*(t-10);
v=2*t-0.05*(t-10)^2-10;
s=t^2-0.05*(t-10)^3/3-10*t+100/3;
end
模型搭建如下:
位移PID和速度PID的参数为:
5、仿真结果
位移跟踪结果:
位移基本满足要求
速度跟踪
速度 7-15之间波动明显,这里可以试着调节PID这三个参数,其中kp可以加快收敛,且对于画龙时,调节kp小点,可以明显改善。ki可以消除稳态误差,但是可能引起超调,对于这个超调,通过微分还不容易消除,只能通过降低比例项,但是会使系统响应变慢,所以一般ki,最后调节,先p,后d,最后i。kd的作用是抑制超调,比如上图有超调,就可以增加kd,但是kd会放大高频噪声。