目录
前言
一、Carsim设置(和上面链接的设置基本相同)
1、车辆初始情况和道路的设置
2、CarSim输入和输出的设置
2.1、输入编辑
2.2、输出
二、MATLAB模块设计(主要不同的地方)
1.整体模块
2.切换模块
3、油门标定(将速度设置为0)
4、刹车标定(将速度设置为180)
5、合并
总结
在这篇文章中我们详细介绍了车辆的标定车辆的纵向控制之标定_路在脚下,梦在心里的博客-CSDN博客,但是这篇文章中的油门标定表和刹车标定表是分开的。为了实现控制的光滑性,我们这里将两个标定表记录到一个总表中,以实现控制更佳的控制效果。
注:这里主要的变化就是添加了一个切换模块,进行刹车和油门的切换,这里就不分别对每一个模块进行介绍了,可以参考之前的标定文章。这里ax和vx的采样时间设计为0.1。
代码如下:
function [power,brake] = fcn(x)
%正数代表油门,负数代表刹车
%不允许同时踩油门和刹车
if x>0
power=x;
brake=0;
else
power=0;
brake=-x;
end
end
%启动时检查carsim的初速度是否为0
x=0; %初始化信号
for i=1:21
%该程序非常耗时,如果需要更多更密集的数据,请先测试
sim('biaoding'); //这里根据自己的simulation文件名选
v_temp(:,i)=vx.data;
a_temp(:,i)=ax.data;
thr_temp(:,i)=ones(length(vx.data),1)*x;
%油门是递增
x=x+0.05;
end
%合并,一定要转成行向量再合并,否则会导致合并失败
v=v_temp(:,1)';
a=a_temp(:,1)';
tr=thr_temp(:,1)';
for i=2:length(v_temp(1,:))
v=[v,v_temp(:,i)'];
a=[a,a_temp(:,i)'];
tr=[tr,thr_temp(:,i)'];
end
%为什么油门和刹车不可以写到一个文件中?因为油门和刹车的初速度要求不一样,油门要求初速度为0,刹车要求初速度很大(180)
%启动前检查车的初速度是否为180
x=0; %初始化刹车
%%%刹车的初速度一定要比较高
for i=1:81
sim('biaoding');
v_temp1(:,i)=vx.data;
a_temp1(:,i)=ax.data;
brake_temp1(:,i)=ones(length(vx.data),1)*x;
%%%这里是为了消除奇异性,因为无论brake=1还是brake=2,最后都会导致车的速度v,加速度a为0,这将导致多值性
for j=1:length(v_temp1(:,i))
if v_temp1(j,i)<0.001
brake_temp1(j,i)=0;
end
end
%刹车是递减
x=x-0.1;
end
a_temp1(1,:)=a_temp1(2,:); %将上面for循环运行的结果的第二行赋值给第一行,为了避免大的跳跃
%合并,一定要转成行向量再合并,否则会导致合并失败
vbr=v_temp1(:,1)';
abr=a_temp1(:,1)';
br=brake_temp1(:,1)';
for i=2:length(v_temp1(1,:))
vbr=[vbr,v_temp1(:,i)'];
abr=[abr,a_temp1(:,i)'];
br=[br,brake_temp1(:,i)'];
end
%将油门标定表和刹车标定表组合在一起
v2=[v,vbr];
a2=[a,abr];
br2=[tr,br];
F=scatteredInterpolant(v2',a2',br2'); %转成列向量
vubr=0:0.05:50;
aubr=-8:0.05:5;
tablebr=zeros(length(vubr),length(aubr));
for i=1:length(vubr)
for j=1:length(aubr)
tablebr(i,j)=F(vubr(i),aubr(j));
end
end
将油门和制动标定表放到一块的原因:考虑控制的连续性,比如,如果是两个表很难做一个过渡,我们规划速度是10m/s,现在速度是50m/s,开始减速(踩刹车),当减速接近10m/s时,如果调整的不好的话,可能会出现刹车踩过头,然后继续踩油门,可能会出现振荡,如果放在一块避免这种情况的出现。