前言
1、自動駕駛行業(yè)中,算法端對于縱向控制的功能預留接口基本都是加速度,我們需要給控制器仿真加速度的信號,控制器才會實現對縱向功能的控制。
2、Carsim或者其他動力學軟件,主要提供者節(jié)氣門開度和主缸壓力進行控制。我們在進行聯(lián)合仿真時,往往都要通過PID的方式將請求加速度轉換成對應的節(jié)氣門開度與主缸壓力傳給動力學軟件進行閉環(huán)控制。
3、這里提供一個使用Carsim的VS Command方法定義一個加速度輸入變量,修改車輛的動力系統(tǒng)模型,然后通過PID調節(jié)變矩器扭矩和主缸壓力輸出加速度來實現這個響應接近完美的加速度模型。
一、加速度輸出變量問題澄清
問題澄清:改變動力學模型后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聯(lián)合仿真:通過觀察請求加速度(藍色)、正確加速度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、修改車輛的動力系統(tǒng)模型,隨便復制一個例程并進入修改內容。
4、選擇外部發(fā)動力模型和外部變矩器,從模型上看只要調整變矩器扭矩IMP_M_OUT_TC即可實現縱向加速控制,減速控制一般都是通過主缸壓力PBK_CON進行控制的。
5、修改擋位參數,改成1個前進擋位
改成1個前進擋位,否則速度加不上去
三、配置Carsim駕駛員模型
1、老規(guī)矩隨便復制一個例程
2、駕駛員模型配置
1)配置概覽
2)節(jié)氣門開度加初始速度控制,但是由于我們修改了模型我們加速不控制THROTTLE_ENGINE,我們直接在VS Command控制變矩器扭矩IMP_M_OUT_TC。
3)初始剎車主缸壓力為0MP,在VS Command控制變量為PBK_CON。
4)開閉環(huán)的檔位控制(-1:倒擋 0:空擋 1-6:前進擋),在VS Command控制變量為MODE_TRANS。
5)最后配置一個Run就行,Forever或者時間都行。
四、添加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,自動模式通過加速度控制減速,手動模式發(fā)送IMP_TargetBk值進行減速,默認自動模式。
define_output RsponAx 0 !RsponAx定義新的加速度輸出接口,Carsim端的加速度接口AX比原值小10倍,因此使用RsponAx作為加速度響應。
五、Run Control聯(lián)合仿真
1、這里使用的Labiew,大家可以用Simulink聯(lián)合仿真。
2、添加輸入變量
3、添加輸出變量
4、Send to Labview
六、加速度模型效果驗證
1、層疊曲線顯示所有變量
2、前進擋:請求加速度與響應加速度曲線(擋位給1,加速度值給正值)
3、后退擋:請求加速度與響應加速度曲線(擋位給-1,加速度值給負值)
文章來源:http://www.zghlxwxcb.cn/news/detail-669348.html
綜上,完成加速度模型搭建,模型可能還有點小缺陷,大神們可以指導一下,如有問題及時溝通。文章來源地址http://www.zghlxwxcb.cn/news/detail-669348.html
到了這里,關于自動駕駛仿真:基于Carsim開發(fā)的加速度請求模型的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!