中国汽车工程师之家--聚集了汽车行业80%专业人士 

论坛口号:知无不言,言无不尽!QQ:542334618 

本站手机访问:直接在浏览器中输入本站域名即可 

搜索附件  
汽车工程师之家 附件中心 结构原理专业知识特区 『Matlab-Simulink-Advisor论坛』 真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w16.jpg
左侧广告
附件中心&附件聚合2.0
For Discuz! X2.5 © hgcad.com

真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w16.jpg

 

真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型:
我们前面提到,模型中驾驶员干的活就是观测目标车速和实际车速,车速慢了踩油门,车速快了踩刹车。

这是个什么东西?这不就是个反馈控制器吗!



工程上应用最广泛的是基于PID(比例、积分、微分)控制理论建立的驾驶员模型。其方法是根据目标车速与实际车速之间的误差,通过比例、微分、积分等计算出车辆加、减速需求或需求扭矩。

通过PID控制器实现驾驶员模块的具体方法为:

【1】求取目标车速与实际车速的误差,作为PID模块的输入

【2】通过Saturation模块,将PID模块的输出取正值作为加速请求,取负值作为减速请求,注意该值作为制动踏板开度输出时需取绝对值。





所以PID是个啥

PID控制是根据给定值和实际输出值构成控制偏差,将偏差按比例、积分和微分通过线性组合构成控制量,对被控对象进行控制。



要解释PID控制,就不得不搬出一边加水,一边放水的数学题来了。
传说有这么一个水池,一个进水口,一个放水口。放水口的出水量为0~15L/min不等,进水口注水量15L/min。人们要控制水池的蓄水量为100L,应该怎么做?




最简单的,启停控制。

当水位低于95L就打开注水阀门,当水位高于105L就关闭注水阀门。

启停控制好处就是控制逻辑简单,但是缺点也很明显,控制不稳定。什么意思呢,举个栗子。

假设下方出水量为10L/min,上方注水量为15L/min,当蓄水池水位低于95L时,注水阀打开两分钟后,水池水量到达105L,阀门关闭。但是由于出水量较大,1min后,水位低于95L,注水阀又需要打开。

所以,一旦下方出水量不稳定,这种启动控制很容易出现震荡。





升级一小步,比例控制

后来人们就想,为什么注水阀门的流量不能随着水位变化呢?水位过低我就开大点,水位接近我就开小点。

于是比例控制就被搞出来了。注水量按下式计算:

注水量=(目标水位-实际水位)*比例系数

用公式表示即:



这样就实现了水位低的时候增大注水量,水位高的时候减小注水量。

但是比例控制有个问题:无法消除静态误差。

假设目标水位为100L,此时用水量为1L/min,比例系数为1。那么他的注水量就是1L/min,这样实际水位就永远无法注到100L,会永远控制在99L。

那怎么办呢?





再迈一小步,积分控制

这时候人们又想了,我把这个静态误差累加起来,然后乘一个系数,然后加到比例环节的输出上,不就消除静态误差了吗?

注水量=(目标水位-实际水位)*比例系数+Σ(目标水位-实际水位)*积分系数

用公式表示即:



假设现在静态误差是1L,积分系数是0.1,这样在经过10个步长之后,积分环节的输出就为1L了,这样就消除了静态误差。

但是积分控制也有个问题:控制延迟,在参数恶劣的时候波动明显。

这个问题怎么解决呢?

再迈……不迈了,基于PI控制的驾驶员足够用了。

有兴趣的铁子自己扒拉下控制理论吧。





驾驶员建模

这样就非常Esay了,我们可以直接利用simulink模型库中的PID模块建立上述模型,模型建立如下。这里加入Trans Function模块目的是使输出信号变平滑。



但是我们都介绍了PI控制的原理了,不自己做一个PI控制器,岂不是白讲了。



我们前面提到,驾驶员的功能是根据目标车速与实际车速,车速快了踩刹车,车速慢了踩油门。

但是需求有大有小,这种用什么表达?

想想你开车的时候,想急加速怎么办?深踩油门(加速踏板)。想急减速怎么办?深踩刹车(制动踏板)。

所以我们把加减速需求量化成加速踏板和制动踏板的开度,那么驾驶员的输入输出接口就是:

输入:

【1】目标车速

【2】实际车速

输出:

【1】加速踏板开度

【2】制动踏板开度

我们先做一个比例控制。这里没有用到复杂的模块,你们直接照葫芦画瓢吧。

有几方面稍微注意下。

【1】比例环节输出为正值时,说明目标车速>实际车速,此时车辆有加速需求;

【2】比例环节输出为负值时,说明目标车速<实际车速,此时车辆有制动需求;

【3】加速、制动踏板开度在0~1,所以要对输出进行限值处理;

【4】开度值应为正值,所以要对制动需求取绝对值。



在比例控制的基础上加入积分环节。积分环节是误差的累积×积分系数。这里可以通过积分模块实现,也可以通过如下图离散的方式实现,图中的0.01是仿真步长。

最后将比例环节与积分环节输出累加,封装后即可得到驾驶员模型了。







工况模型

建模之前先思考一个问题:工况是什么?

铁子李:我知道我知道,工况就是告诉车要怎么跑。

导师:万丈高楼平地起,建模还得看老李。说的对!

所以工况是什么,工况是车辆在时域上运行状态的集合。

车辆运行状态最直观的表达方式是什么?车速嘛,对吧。

所以工况应该至少包含两种信息:时间t,以及车速v。工况就可以看成是车速在时域上的集合。

铁子李:啊对对对,NEDC、CLTC工况啥的不都是这样的吗,还用你说。

卑微的老王:那要不你来说?

铁子李:那你接着说吧。



害,我还不说了。建模!

既然工况是车速在时域上的集合,那么用查表模块真是再合适不过了。查表向量:时间;表向量:车速。

Simulink中时间用什么输出?Clock模块。



工况的数据我们怎么建立呢?

方法有很多种,可以像前面写电机特性数据写入脚本中,也可以写在Excel或Text文本中通过程序读取。

但是工况通常有几百上千的数据,写入脚本会使脚本过于冗长,不利于脚本维护;通过读取外部数据又需要写程序,增加学习成本(虽然就一行命令,但也偏离了老王吹下的牛逼:基础教程不需要编程)。

所以,这里我们可以通过模型变量写入。

①假设我们现在手里有一组CLTC工况的数据,我们直接从EXCEL中复制出来。



②打开模型资源管理器。



③选中Model Workspace,添加Matlab变量,命令为CLTC,然后将数据复制到Value中。注意复制的时候要先在value中写入中括号[ ],然后将数据复制在中括号里,直接复制的话无法写入。

另外,这里有两个工作空间,一个是Base Workspace,对应的是软件的工作区,一个是Model Workspce,对应的是当前simulink模型的变量空间,位置不要选错了。



④这样工况数据就写入了,然后我们直接在查表模块中读取即可。

CLTC(:,1)指的是数组第一列的数据,CLTC(:,2)指的数组第二列的数据。



那我们这样直接输出就可以了吗?不可以!



因为你只写入了一个工况的数据,在跑续航仿真时假设你需要工况循环五次、十次、三十次该怎么办呢?后面没有数据了呀。

所以我们需要想办法让数据在时域内,按工况时长循环输出,怎么实现呢?

铁子李:我知道我知道,我建立工况数据的时候,先把车速数据复制上一百次,时域拉长到180000s不就行了。

卑微的老王:厉害啊老李!这是一个非常聪明的笨办法,所以我们不这么搞。



既然不去搞表数据,那就只能搞查表的输入数据了。但是Clock输出的是一个持续增长的数据,该怎么变成一个在工况时长内重复变化的数据呢?

想到了没,余数!

我们对时间取工况时长的余数,通过将余数作为查表模块的输入就可以了。



这样我们包含CLTC的工况就做好了。



但是我们不可能只跑一种工况啊,如果有多种工况我们该怎么扩展呢?这里需要用到一个新的模块,Multi-Port Switch。



Multi-Port Switch包含控制端口和数据端口,根据控制端口输入的信号选择输出数据端口的数据,即控制端口输入几,则输出第几数据端口的数据。

数据端口的顺序可以从1开始,也可以从0开始,端口的数量可以通过模块中的“数据端口数量”对话框控制。模块还包含一个默认端口,可以是最后一个数据端口,也可以是附加的数据端口,默认端口序号用“※”表示。



假设我们要建立NEDC、CLTC、加速三个仿真任务。

与建立CLTC数据同样的方法,我们在模型中建立NEDC仿真数据,并连接至Multi-Port Switch的数据端口2。注意NEDC单个工况的时长为1180s。



加速工况怎么建立呢?

铁子李:还用问,也这样搞啊!

帅气的老王:聪明!这又是一个非常聪明的笨办法,所以我们也不这么搞。

想一下,加速需求是怎么计算的?通过目标车速与实际车速的车速差,然后……

对了,不用然后了,我们只要保证目标车速与实际车速有较大的车速差就能保证驾驶员持续输出加速需求。

最简单的,直接给个常数值即可。这样我们就完成仿真工况模块的建立了,通过改变控制端口的常数即可选择仿真运行的工况。



这样,我们工况模型就建立完成了,是不是也非常简单呢。


好了,这一节内容有点多,看我码字这么辛苦的份上,不给我点个在看吗?


真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w16.jpg
         同一主题附件:
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w3.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w4.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w6.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w7.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w8.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w9.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w10.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w11.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w12.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w14.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w15.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w16.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w17.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w18.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w20.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w21.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w22.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w23.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w24.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w25.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w26.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w27.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w28.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w29.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w30.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w31.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w32.jpg
    真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w33.jpg

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 6-5-2024 04:43 , Processed in 0.263008 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.