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

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

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

  • 558查看
  • 0回复

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

[复制链接]


该用户从未签到

发表于 2-4-2024 08:15:48 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


我们前面提到,模型中驾驶员干的活就是观测目标车速和实际车速,车速慢了踩油门,车速快了踩刹车。

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

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

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

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

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

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

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



所以PID是个啥

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

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

要解释PID控制,就不得不搬出一边加水,一边放水的数学题来了。
传说有这么一个水池,一个进水口,一个放水口。放水口的出水量为0~15L/min不等,进水口注水量15L/min。人们要控制水池的蓄水量为100L,应该怎么做?
真·simulink车辆仿真基础教程-给我一脚我就跑了:驾驶员及工况模型w7.jpg



最简单的,启停控制。

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

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

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

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

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



升级一小步,比例控制

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

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

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

用公式表示即:

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

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

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

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

那怎么办呢?

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



再迈一小步,积分控制

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

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

用公式表示即:

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

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

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

这个问题怎么解决呢?

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

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

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



驾驶员建模

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

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

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

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

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

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

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

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

输入:

【1】目标车速

【2】实际车速

输出:

【1】加速踏板开度

【2】制动踏板开度

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

有几方面稍微注意下。

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

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

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

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

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

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

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

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

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



工况模型

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

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

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

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

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

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

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

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

铁子李:那你接着说吧。

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

害,我还不说了。建模!

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

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

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

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

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

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

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

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

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

②打开模型资源管理器。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

想到了没,余数!

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

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

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

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

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

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

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

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

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

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

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

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

加速工况怎么建立呢?

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

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

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

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

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

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

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


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


快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 22-12-2024 22:27 , Processed in 0.258558 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.