目录
一、Simulink和Stateflow基本操作
1、文件新建、打开及保存
2、Simulink模块库介绍
3、简单的Simulink模型搭建
4、Simulink模型仿真
5、Stateflow与Simulink关系
6、创建StateFlow状态图
7、状态图仿真
二、系统级模型搭建
1、明确FCW功能需求 :
2、确定系统组件:
3、系统建模:
3.1 顶层模块设计
3.2 各子系统搭建及验证
4、系统功能验证:
三、配置代码生成
1.1、新建工程
1)、双击matlab图标,打开matlab软件;
2)、打开要保存工程的文件夹路径;并点击工具栏Simulink图标;
3)、从新模板开始创建,如果有定制化的模板,也可以选择从相应模板开始;
4)、在编辑框里添加内容,点击保存按;重命名,保存;
5)、在matlab当前文件夹中,可看到刚保存的模型。
1.2、打开现有模型
1)、双击matlab图标,打开matlab软件;
2)、在MATLAB地址栏中导入工程路径;可看到Simulink工程文件。
3)、双击路径下的.slx文件,即可打开现有模型。
1)、打开Simulink,点击library browser,即可打开模块库。
2)、在模块库中,包含很多其他扩展工具箱的模块,如targetlink,deep learning等的工具箱。普通建模开发只会使用到Simulink下面的基础模块。
2.2、仿真调试模块
1)、模块的添加
直接从模块库中将模块拖入Simulink编辑器中;或者直接在Simulink编辑器空白位置编辑模块名字,也能够将模块添加到Simulink编辑器中。
2)、连接各个模块
3)、设置模块属性
双击模块,可以打开该模块的属性编辑器,依次为需要更改属性的模块设置属性。
4)、根据需要更改模块标签,双击信号连线,为输入输出的信号命名。
对于某些常量,也可以在脚本中定义变量,将变量名写入模块中,类似于宏定义。
5)、将模型放入一个子系统中
选中模型所有模块,点击创建子系统图标,便将该部分模块都放入了子系统中,为该子系统命名。
至此,一个简单的Simulink模型搭建完成,该模型实现的功能是:以Add_Step为步长进行累加,当结果大于20时则将结果清0,继续累加。
1)、模型参数配置
将模型设置为0.5s时间内,计算一次,得出一次实时数值。
2)、运行仿真
为模型增加输入信号,添加查看输出结果的示波器,将仿真时间设置为20s,点击运行,若有错误则系统报错,否则双击示波器可查看结果。
3)、示波器介绍
菜单栏图标
如下图设置,可将示波器设置为有四个信号输入,显示格式为2*2的样式
4)、单步仿真
Simulink中的Simulation Data Inspector亦可查看仿真数据。
点击信号线,如下图所示,点击该标志,则仿真过程中,Simulink会记录该信号的数据,可在Simulation Data Inspector中查看。
Stateflow是集成于Simulink中的图形化设计与开发工具,Stateflow适用于针对事件响应系统进行建模与仿真,与之对应的是动态变换系统。
动态变换系统通常可以利用数学表达式、方程等组成的输入/输出关系进行描述,像这样的系统利用Simulink进行建模最方便。而事件响应系统通常利用一些自然语言或者逻辑表达式进行描述,这样的系统用Stateflow建模较为方便。
总之,状态逻辑切换为主的内容,用Stateflow实现,数学运算或者逻辑运算为主的内容,用Simulink来实现。
1)、在Simulink中加入一个Stateflow模块,重命名状态机模块。
2)、双击Chart,进入Stateflow状态图,状态图左边为状态工具栏,类似于Simulink中的模块库。
3)、为Chart定义输入和输出
4)、插入状态图
5)、状态图语句
状态图在系统中被看作记忆性原件,它本身能够保持系统的当前模式,一旦激活,状态即保持在此状态图中,直到转移条件成立,系统退出此状态图执行下一个状态。
状态的标签一般可以右三个部分组成:状态名称、注释和相应的状态动作,完整的状态标签如下图所示:
6)、状态动作
状态动作的关键字主要有三种,分别为:
entry:当状态被激活时执行相应的动作;
exit:当状态退出活动状态时执行响应的动作;
during:当状态保持其活动状态时执行相应的动作;
状态动作一般可以为数据对象进行赋值或者进行数据对象的运算,也可以通过状态动作进行事件广播以触发其它子系统的变化。
如上图所示,则程序刚开始执行时,则将d默认赋值为1。
7)、创建转移
转移描述的是有限状态系统内的逻辑流,当转移发生时,原状态变为非活动状态,目标状态变为活动的状态。转移是带有箭头的线,状态之间的转换,直接受到转移方向的限制。
状态机执行机制是,一个周期内执行状态图内的内容并检查是否满足转移到其他状态的条件,如果满足,则转移出去。转移条件是在转移链接线上定义的,如果线上没内容,则默认向下一个目标转移(周期为0.5s)。
8)、连接标签
转移标签:一个完整的转移标签由四个部分组成,分别为事件、条件、条件动作和转移动作,也可以包含相应的注释,编写标签时,注意点击链接线,在显示的问号上进行编写,如下图所示:
Event:事件驱动,即只有在事件发生时,才可能去执行相应的转移,事件包含内部的广播事件以及来自Simulink的如上升沿下降沿的触发事件以及函数调用事件。
在[]中的内容是条件,条件是用于转移决策的逻辑判断,只有条件满足时,才可能发生相应的转移。
{}里的内容为条件动作,只要[]内的条件满足,则能执行该语句。
/后面的转移动作只有在整个转移通路都有效时才能够执行。
转移标签的四个部分不一定完整地出现,但是不论出现哪个部分,标签内容按照上面顺序填写。
9)、搭建状态图
编辑如下状态图(a、b为Simulink中的数据输入,d为输出到Simulink的数据)
实现的功能为:
系统启动时初始化dataRange值为0,若标志位ModeSet为真,则延时(5*0.5=2.5s)后,进入正常工作模式;正常工作模式时,当a的数值在10到18的范围内时,dataRange数值为2,否则为1;工作过程中,若ModeSet==0,则不管在哪个工作位置,立即回到初始位置,dataRange==0.
为状态图增加外部输入激励及示波器,如下图所示
点击单步仿真时,可查看每个周期,状态机执行到哪个状态,以及此时各个参数的数值
本教程演示如何使用Simulink/Stateflow建立FCW(汽车前向碰撞预警)功能决策部分的模型。
1)当主车(ego vehicle)与前方车辆(Target vehicle)同向行驶时,主车车速高于前车车速时,
有可能发生碰撞。FCW即根据两车之间的距离和相对速度检测发生碰撞的时间TTC, TTC低于限值时,发出碰撞警报。
2)在驾驶室有个硬件开关控制是否启用FCW功能。
3)主车车速高于30km/h且前方有目标车辆时,才开启是否预警的功能决策。
4)TTC计算采用常速度及常加速度两种预测模型进行综合判断。
5)每次预警需维持至少2s时间。
1)状态机切换部分:
主要实现在特地条件下进入到特定状态中,给告警标志位赋值。
输入:
Switch_on: 硬件开关信号,1:启用FCW功能 0:停用FCW功能
TTC_State: TTC小于等于4s时,TTC_State==1 否则TTC_State==0;
FCW_Enable:是否开启预警的功能决策;
输出:
FCW_active: 0:碰撞预警无效 1:碰撞预警 2:无效标志
功能描述:
上电默认进入初始化状态FCW_Off, FCW_active赋值2,当Switch_on==1时进入FCW_Open状态; 在FCW_Open中,默认先进入FCW_disable状态,FCW_active值赋0.若FCW_Enable==1时,则进入FCW_Enable状态,否则留在FCW_disable状态中。在FCW_Enable状态中,默认进入FCW_disactive状态,FCW_active值赋0。若TTC_State==1,则进入FCW_active状态中,FCW_active==1,至少维持2s。
2)FCW_Enable定义模块
输入:
Ego_Speed:主车车速
Target_num:主车前方目标车辆个数
输出:
FCW_Enable: 1:开启碰撞预警功能决策 0:关闭功能决策
功能描述:主车车速高于30km/h且目标个数大于0时,FCW_Enable=1.
3)TTC计数模块
输入:
Ego_Speed:主车车速
Target_Speed:目标车辆车速
clearance:两车之间实时距离
输出:
TTC_State: 1:碰撞预警激活 0:碰撞预警解除。
功能描述:常加速度及常速度计算两种方式计算出来的TTC数值有一个小于4时,则TTC_State=1.
常速度模式: TTC1= clearance/(Ego_Speed-Target_Speed)
常加速度模式:Ego_Speed*TTC+0.5*a1*TTC^2=Target_Speed*TTC+0.5*a2*TTC^2+clearance;
TTC2由此方程解出:TTC2=(-detV+√((detV^2)+2deta*clearance))/deta
detV=ego_Speed-Target_Speed; deta=主车加速度-目标车加速度。
1)在Simulink_editor中加入2个subsystem,一个Stateflow Chart,并为它们重新命名,调整大小,并拖放到合适的相对位置;
2)按照确定系统组件部分的内容,为子系统和Stateflow创建输入口和输出口。
3)完善各模块之间的连线,及与外部的接口,封装成一个子系统,并重新调整下模块大小及连线,添加信号标签。
1)搭建FCW_enable_def的功能模块
功能验证:略
2)搭建TTC_State_def里面的模块
TTC计算需采用两种计算方式分别计算,再对计算结果进行比较,和与运算,因此再建立一层模型,三个子系统分别计算常速下的TTC1、常加速度下的TTC2和最后定义TTC_State_def.
TTC_State_def模块的功能验证:
生成测试框架:
在harness input中,可以直接在编辑框内编辑输入激励数据,也可以通过excell编辑测试数据,将excell数据导入。
如上图这一段数据,模拟前车与主车距离10m,主车以5m/S^2的加速度启动,前车以3m/s^2的加速度启动,前0.2s的数据。我们用Excel计算出预计碰撞时间是在3.16秒左右。
将数据导入Harness Input中,
为了方便观察TTC计算结果,将TTC1、TTC2也引出到示波器中观测数据;如下图所示,运行的第一个周期,TTC_State=0,随后常加速度模型便计算出在3.152s之后会发生碰撞,TTC_State=1,基本符合预期。
如上所示便是在建模开发过程中进行单元功能测试,此处仅展示一个测试用例,在excel多个sheet可以增加多个不同测试用例。
对于较简单的模型,也可以选择使用较简单的输入口进行功能逻辑验证。
功能验证:
右击状态图表,选择创建test Harness.
选择测试环境输入激励为Inport口。此模型中Stateflow输入的信号量都是0 1这样的标志位,因此无需使用excel表格创造输入向量,使用普通模块搭建输入环境,便可以使用单步仿真实现功能的验证。
测试过程中可以单步边运行边修改输入变量值,查看状态机运行状态。
2)、类似下图,搭建验证环境
如上图所示厂景为,主车以20m/s行驶,前车静止不动,起始时两车距离10m。
运行后结果如下图所示,计算得0.5s后碰撞,FCW告警。
其他功能验证可参照如上方式进行验证,继续丰富完善功能场景模拟。
这里默认底层代码是手写代码,则应用层有一些输入输出变量是需要配置的,如果底层代码是走autosar的,则应用层模型的代码生成配置基本上没什么需要操作的,这里就不赘述。
1、配置输入和输出信号的全局变量
输入输出全局变量的作用是用于沟通底层或其他应用模块和咱们负责模块应用层的。如下图模型顶层的输入和输出
输入的5个信号通常情况下由其它模块定义成全局变量,把数值传递到FCW模块重;输出的FCW_active需要给到底层的执行模块,由FCW模块定义。引用全局变量和定义全局变量的操作如下:
1、点击如下图标进入模型数据管理界面
2、在模型工作空间中,建立6个信号,并依次命名为输入和输出信号。
3、为输入和输出定义数据类型,并定义全局变量的存储类型。ImportExtern表示引用自别处定义,ExportGlobal表示本处定义,别处可以引用。此处FCW_active应设置为uint8。
4、在模型信号属性中,将全局变量与输入输出关联,关联上就会出现个倒E。
5、配置模型中四个标定量Ego_Speed_limit、TTC_Valid、FcwTime、sampletime,还是在model explore模型的工作空间中,添加参数。
7、保存数据,输出为m或者mat文件,保存在本地,下次运行模型前先运行该文件。
8、调试模型,运行,看有没有报数据类型错误,如我们端口定义为double,但是信号却是single,类似的,根据提示更改,直到模型能运行。
选择ert.tlc
代码生成有挺多个性化配置,如配置枚举,配置函数形参,入参等,大家可以自行多加研究。本教程重点在于引导刚入门的同学们从0开始到能够系统的完成建模开发的这个过程。
更多资料、包括文章模型,还请光顾同名某宝小店<极简车辆控制>。