目录
前言
一、纵向控制开篇
二、油门/刹车标定表制定(电车)
1.Carsim设置
1.1、主界面设计:
1.2、Procedure设置
2.MATLAB仿真设计
2.1、整体框架图
2.2、CarSim S-Function设置
2.3、moto model模型设计
2.4、制动模块设计
总结
自动驾驶越来越受到关注,其中车辆控制分为横向控制和纵向控制,横向控制是控制车辆的前轮转角,即航向角
CarSim联合simulink仿真横向控制_路在脚下,梦在心里的博客-CSDN博客;那么车辆纵向控制到底是如何控制车辆的呢,控制的是车辆的什么呢,下面我们就车辆纵向控制进行详细介绍。
横向控制的原理:方向盘----->前轮转角----->车的航向角
那么当我们踩油门/刹车时,到底在控制车辆的什么东西呢?刹车相对来说容易理解,这里作者直接给出:刹车----->制动压力增大----->制动盘摩擦增大----->阻力增大----->车减速(类似于我们骑自行车时压刹车,会有一个刹车片压到轮胎上)。那么踩油门控制的是什么呢?
油门----->?----->车加速,这里的问号到底是什么呢?
当我们踩油门时,发动机的功率肯定是提高的,但是发动机的功率不能直观体现车的加速,那么当我们踩油门到底控制的是什么呢?
下面的公式相信大家并不陌生:
其中:P表示功率,M表示扭矩,W表示角速度。
知识点补充:旋转物体的扭矩计算公式为T=9550P/n,P是功率,单位是KW。n是转速,单位是r/min。扭矩单位为Nm。一般的扭矩就是力*力臂。
扭矩·:扭矩就是圆周运动时的力矩,可以简单理解为作用力迫使物体产生旋转的一种特殊力矩。对应发动机曲轴就是燃料燃烧做功产生的压力驱使曲轴产生旋转,最终将旋转的力矩传递出去。
物理中:力矩=力X力臂(直线)
而在旋转状态下:扭矩(特殊的力矩)=力X旋转半径r,因此要想知道发动机的扭矩那曲轴旋转半径r必须是已知的,我们需要知道作用力扭矩怎么算出来的_高三网 (gaosan.com)。所有油门控制可以表示为:油门----->功率----->转速/扭矩----->车速/车加速度----->车速度。
1.2.1、车辆初始情况的设置(制动情况)
注意:如果是给油门的情况,那么就只有初速度不一样,设置为0,其余设置均一样。
1.2.2、道路设置
注意:如果搭了我们上一篇文章的仿真,这里的路径可能是一个弯角,需要重新设计路。
1.3、Carsim输入设置
1.4、Carsim输出设置
输出:纵向速度,纵向加速度,转速
代码设计如下:
function torque = fcn(power,rpm) //power:油门,rpm:转速
Tmax=380*power;
if(rpm<=4523)
torque=Tmax;
else
torque=Tmax*4523/rpm;
end
end
//输入:油门和转速
//输出:扭矩
注意:这里可以自己参考电车的转速扭矩曲线图设计 。
代码示例(生成标定表):
brake=0.1; %初始化油门
for i=1:80
sim('calibration');
%注,如果这里出错可以参考工作区里面是否把输出存放在ans中,解决方法有两种,第一种将代码改为v_temp(:,i)=ans.vx.data
%第二种,Ctrl E打开model setting,然后找到single simulation output取消钩选,这样代码就不需要更改
v_temp(:,i)=vx.data;
a_temp(:,i)=ax.data;
brake_temp(:,i)=ones(length(vx.data),1)*brake;
brake=brake+0.1;
end
%合并
vbr=v_temp(:,1)';
abr=a_temp(:,1)';
bra=brake_temp(:,1)';
for i=2:80
vbr=[vbr,v_temp(:,i)'];
abr=[abr,a_temp(:,i)'];
bra=[bra,brake_temp(:,i)'];
end
%拟合
F=scatteredInterpolant(vbr',abr',bra'); %转成列向量
vubr=0:0.05:50;
aubr=-8:0.05:0;
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
%刹车标定的时候,carsim中将初速度设置为180,表tablebr的第一行第1061列对应的是a=0,v=0,我们手动将值设置为0.3
查看标定表(制动):
测试:
saturation参数为-9和0;saturation参数为0和9。
制定油门标定表MATLAB代码:
%% MATLAB和simulink的联动代码
% thr=1; %变量名要与simulink模型变量名一致
% sim('calibration'); %模型名要与simulink模型名一致
%%
thr=0; %初始化油门
for i=1:11
sim('calibration');
%注,如果这里出错可以参考工作区里面是否把输出存放在ans中,解决方法有两种,第一种将代码改为v_temp(:,i)=ans.vx.data
%第二种,Ctrl E打开model setting,然后找到single simulation output取消钩选,这样代码就不需要更改
v_temp(:,i)=vx.data;
a_temp(:,i)=ax.data;
thr_temp(:,i)=ones(length(vx.data),1)*thr;
thr=thr+0.1;
end
%合并
v=v_temp(:,1)';
a=a_temp(:,1)';
tr=thr_temp(:,1)';
for i=2:11
v=[v,v_temp(:,i)'];
a=[a,a_temp(:,i)'];
tr=[tr,thr_temp(:,i)'];
end
%拟合
F=scatteredInterpolant(v',a',tr'); %转成列向量
vu=0:0.1:50;
au=0:0.1:5;
table=zeros(length(vu),length(au));
for i=1:length(vu)
for j=1:length(au)
table(i,j)=F(vu(i),au(j));
end
end
%注意,油门标定的时候需要将carsim中的初速度设置为0
这里的标定还是传统的方法,当前标定可以联合强化学习进行,后面将记录作者学习车辆纵向控制的学习过程,希望大家多多交流,共同进步。