车辆的纵向控制之标定

目录

前言

一、纵向控制开篇

二、油门/刹车标定表制定(电车)

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=FV=F \times r \times \tfrac{V}{r}=MW

其中:P表示功率,M表示扭矩,W表示角速度。

知识点补充:旋转物体的扭矩计算公式为T=9550P/n,P是功率,单位是KW。n是转速,单位是r/min。扭矩单位为Nm。一般的扭矩就是力*力臂。

扭矩·:扭矩就是圆周运动时的力矩,可以简单理解为作用力迫使物体产生旋转的一种特殊力矩。对应发动机曲轴就是燃料燃烧做功产生的压力驱使曲轴产生旋转,最终将旋转的力矩传递出去。

物理中:力矩=力X力臂(直线)

而在旋转状态下:扭矩(特殊的力矩)=力X旋转半径r,因此要想知道发动机的扭矩那曲轴旋转半径r必须是已知的,我们需要知道作用力扭矩怎么算出来的_高三网 (gaosan.com)。所有油门控制可以表示为:油门----->功率----->转速/扭矩----->车速/车加速度----->车速度。


二、油门/刹车标定表制定(电车)

1.Carsim设置

        1.1、主界面设计:

车辆的纵向控制之标定_第1张图片

        1.2、Procedure设置

                1.2.1、车辆初始情况的设置(制动情况)

                        车辆的纵向控制之标定_第2张图片

 注意:如果是给油门的情况,那么就只有初速度不一样,设置为0,其余设置均一样。

                1.2.2、道路设置

车辆的纵向控制之标定_第3张图片

 注意:如果搭了我们上一篇文章的仿真,这里的路径可能是一个弯角,需要重新设计路。

        1.3、Carsim输入设置

输入:油门和制动车辆的纵向控制之标定_第4张图片

         1.4、Carsim输出设置

输出:纵向速度,纵向加速度,转速

车辆的纵向控制之标定_第5张图片

2.MATLAB仿真设计

        2.1、整体框架图

车辆的纵向控制之标定_第6张图片

        2.2、CarSim S-Function设置

车辆的纵向控制之标定_第7张图片


         2.3、moto model模型设计

车辆的纵向控制之标定_第8张图片

 代码设计如下:

function torque = fcn(power,rpm)    //power:油门,rpm:转速
    Tmax=380*power;
    if(rpm<=4523)
        torque=Tmax;
    else
        torque=Tmax*4523/rpm;
    end
end

//输入:油门和转速
//输出:扭矩

注意:这里可以自己参考电车的转速扭矩曲线图设计 。

        2.4、制动模块设计

车辆的纵向控制之标定_第9张图片

代码示例(生成标定表):

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

 查看标定表(制动):

车辆的纵向控制之标定_第10张图片

测试:

车辆的纵向控制之标定_第11张图片

 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




总结

这里的标定还是传统的方法,当前标定可以联合强化学习进行,后面将记录作者学习车辆纵向控制的学习过程,希望大家多多交流,共同进步。

你可能感兴趣的:(matlab,自动驾驶)