文章目录
- 前言
- 一、加速度输出变量问题澄清
- 二、配置Carsim动力学模型
- 三、配置Carsim驾驶员模型
- 四、添加VS Command代码
- 五、Run Control联合仿真
- 六、加速度模型效果验证
前言
1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。
2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方式将请求加速度转换成对应的节气门开度与主缸压力传给动力学软件进行闭环控制。
3、这里提供一个使用Carsim的VS Command方法定义一个加速度输入变量,修改车辆的动力系统模型,然后通过PID调节变矩器扭矩和主缸压力输出加速度来实现这个响应接近完美的加速度模型。
一、加速度输出变量问题澄清
问题澄清:改变动力学模型后Carsim Output接口输出的加速度值异常
1、正常情况下Carsim的加速度输出变量AX、AX_SM是能够正常输出加速度值,但是经过VS Command以及动力学模型修改之后Carsim Output接口加速度输变量输出值会比原值小10倍。因此需要在VS Command中定义新的加速度输出变量来解决输出值小10倍的问题。
2、自证Carsim Output接口输出加速度变量比原值小10倍。首先Carsim接口和VS Command中添加加速度输出变量,RsponAx是在VS Command定义的加速度输出变量,本质是在VS Command获取AX的值。
3、和Labview联合仿真:通过观察请求加速度(蓝色)、正确加速度RsponAx(红色曲线)和错误加速度AX(绿色曲线)就可以看出Rspon在VS Command拿的AX值是正常的,而直接从Carsim输出接口拿的AX比原值小10倍是不正确的。
4、再分析此时的速度变化情况,此时的速度变化是基于0.2g的正确加速度进行变化的,因此推断Carsim输出接口拿的AX 0.02g是错误的。
X轴300-600之间,这3秒钟速度变化大概为21kph(图表),由于V=at = 0.2*9.8*3 =5.88m/s,转换成km/h为21km/h左右。因此推断0.2g的正确加速度。
二、配置Carsim动力学模型
1、配置车辆模型
2、这里复制了Carsim自带例程C-Class, Hatchback。
3、修改车辆的动力系统模型,随便复制一个例程并进入修改内容。
4、选择外部发动力模型和外部变矩器,从模型上看只要调整变矩器扭矩IMP_M_OUT_TC即可实现纵向加速控制,减速控制一般都是通过主缸压力PBK_CON进行控制的。
5、修改挡位参数,改成1个前进挡位
改成1个前进挡位,否则速度加不上去
三、配置Carsim驾驶员模型
1、老规矩随便复制一个例程
2、驾驶员模型配置
1)配置概览
2)节气门开度加初始速度控制,但是由于我们修改了模型我们加速不控制THROTTLE_ENGINE,我们直接在VS Command控制变矩器扭矩IMP_M_OUT_TC。
3)初始刹车主缸压力为0MP,在VS Command控制变量为PBK_CON。
4)开闭环的档位控制(-1:倒挡 0:空挡 1-6:前进挡),在VS Command控制变量为MODE_TRANS。
5)最后配置一个Run就行,Forerer或者时间都行。
四、添加VS Command代码
重头戏:VS Command,相当于Carsim开放的脚本编写命令行,直接上脚本,我就不对脚本的每一句内容进行解析了,有兴趣的结合官方文档VS Command分析。
1、配置Carsim VS Command
2、将下面脚本复制进VS Command中去
!Define vehicle forward related variables
define_variable CumErr_TC 0
define_variable CumErr_BK 0
define_variable CurErr 0
define_variable Torque_TC 0
define_variable PCON_BK 0
!Define vehicle reverse related variables
define_variable RCumErr_TC 0
define_variable RCumErr_BK 0
define_variable RCurErr 0
define_variable RTorque_TC 0
define_variable RPCON_BK 0
!Define driver Behavior variables
define_variable ForwardFlag 0
define_variable ReverseFlag 0
!Add Brake master cylinder pressure
!Add shaft torque of torque converter
IMP_PCON_BK VS_add 0
IMP_M_OUT_TC VS_add 0
!Define PID related parameter
define_parameter P_TC 0.5
define_parameter I_TC 0.2
define_parameter D_TC 0.0
define_parameter P_BK 0.5
define_parameter I_BK 0.005
define_parameter D_BK 0.000
!Define Operating cycle
define_parameter DeltaT 0.001
!Define Input/Output variables
define_import IMP_TargetAX 0
define_import IMP_TargetBk 0
define_import IMP_ConMode 0
define_output RsponAx
!Select Froward or Reverse
EQ_IN ForwardFlag = GE(IMP_TargetAX,0)
EQ_IN ReverseFlag = LE(IMP_TargetAX,0)
!Caiculate Current Error and Cumulative error
EQ_OUT CurErr= IMP_TargetAX - AX
EQ_OUT RCurErr= AX - IMP_TargetAX
EQ_OUT CumErr_TC = IF_GT_0_THEN(ForwardFlag,CumErr_TC+CurErr,0)
EQ_OUT RCumErr_TC = IF_GT_0_THEN(ReverseFlag,RCumErr_TC+RCurErr,0)
EQ_OUT CumErr_BK = IF_NOT_0_THEN(ForwardFlag,0,CumErr_BK+CurErr)
EQ_OUT RCumErr_BK = IF_NOT_0_THEN(ReverseFlag,0,RCumErr_BK+CurErr)
!Forward PID(Torque)
EQ_IN Torque_TC = P_TC*CurErr+I_TC*CumErr_TC+D_TC*CurErr/DeltaT
EQ_IN Torque_TC = IF_GT_0_THEN(Torque_TC, Torque_TC,0)
EQ_IN Torque_TC = IF_GT_0_THEN(ForwardFlag,Torque_TC,0)
!Reverse PID(Torque)
EQ_IN RTorque_TC = P_TC*RCurErr+I_TC*RCumErr_TC+D_TC*RCurErr/DeltaT
EQ_IN RTorque_TC = IF_GT_0_THEN(RTorque_TC, RTorque_TC,0)
EQ_IN RTorque_TC = IF_GT_0_THEN(ReverseFlag,RTorque_TC,0)
!Forward or backward depending on the transmission mode
EQ_IN IMP_M_OUT_TC = IF_GT_0_THEN(GE(ModeTran, 0), Torque_TC, RTorque_TC)
EQ_IN IMP_M_OUT_TC = IF_GT_0_THEN(EQ(ModeTran, 0), 0 , IMP_M_OUT_TC)
EQ_IN IMP_M_OUT_TC = IF_GT_0_THEN(IMP_ConMode, 0 , IMP_M_OUT_TC)
!Forward PID(Brake)
EQ_IN PCON_BK = -(P_BK*CurErr+I_BK*CumErr_BK+D_BK*CurErr/DeltaT)
EQ_IN PCON_BK = IF_GT_0_THEN(PCON_BK-15, 15, PCON_BK)
EQ_IN PCON_BK = IF_GT_0_THEN(PCON_BK, PCON_BK,0)
EQ_IN PCON_BK = IF_NOT_0_THEN(ForwardFlag,0,PCON_BK)*1e6
EQ_IN PCON_BK = IF_NOT_0_THEN(IMP_TargetBk,IMP_TargetBk,PCON_BK)
!Reverse PID(Brake)
EQ_IN RPCON_BK = P_BK*CurErr+I_BK*CumErr_BK + D_BK*CurErr/DeltaT
EQ_IN RPCON_BK = IF_GT_0_THEN(RPCON_BK-15, 15, RPCON_BK)
EQ_IN RPCON_BK = IF_NOT_0_THEN(IMP_TargetBk, IMP_TargetBk,RPCON_BK)
EQ_IN RPCON_BK = IF_GT_0_THEN(GE(ModeTran,0), RPCON_BK,0)
EQ_IN RPCON_BK = IF_GT_0_THEN(RPCON_BK, RPCON_BK,0)*1e6
!Acceleration braking or direct braking depending on the mode
EQ_IN IMP_PCON_BK = IF_GT_0_THEN(GE(ModeTran, 0), PCON_BK, RPCON_BK)
EQ_IN IMP_PCON_BK = IF_GT_0_THEN(IMP_ConMode, IMP_TargetBk, IMP_PCON_BK)
!if ModeTran=0,Clear accumulated error
EQ_OUT CumErr_TC = IF_GT_0_THEN(EQ(ModeTran, 0),0,CumErr_TC)
EQ_OUT RCumErr_TC = IF_GT_0_THEN(EQ(ModeTran, 0),0,RCumErr_TC)
EQ_OUT CumErr_BK = IF_GT_0_THEN(EQ(ModeTran, 0),0,CumErr_BK)
EQ_OUT RCumErr_BK = IF_GT_0_THEN(EQ(ModeTran, 0),0,RCumErr_BK)
EQ_OUT RsponAx= AX
我在脚本中定义了新的接口变量:
!Define Input/Output variables
define_import IMP_TargetAX 0 !IMP_TargetAX是外部请求的加速度接口。
define_import IMP_TargetBk 0 !IMP_TargetBk是外部请求的主缸压力,一般通过给减速度就可以控制,这里开放了手动减速 的方法。
define_import IMP_ConMode 0 !IMP_ConMode自动模式0或者手动模式1,自动模式通过加速度控制减速,手动模式发送IMP_TargetBk值进行减速,默认自动模式。
define_output RsponAx 0 !RsponAx定义新的加速度输出接口,Carsim端的加速度接口AX比原值小10倍,因此使用RsponAx作为加速度响应。
五、Run Control联合仿真
1、这里使用的Labiew,大家可以用Simulink联合仿真。
2、添加输入变量
3、添加输出变量
4、Send to Labview
六、加速度模型效果验证
1、层叠曲线显示所有变量
2、前进挡:请求加速度与响应加速度曲线(挡位给1,加速度值给正值)
3、后退挡:请求加速度与响应加速度曲线(挡位给-1,加速度值给负值)
综上,完成加速度模型搭建,模型可能还有点小缺陷,大神们可以指导一下,如有问题及时沟通。