標注:本文來自本實驗室單超的研究成果。
整體思路:仿真模型通過python打開并運行之后,會啟動Carla, 使用Carla API 獲取汽車的相關數據之后,啟動matplotlib繪制線程,將Carla提供的數據輸進模型,再從matlab的worksapce通過接口獲取輸出結果并繪制。
python調用仿真模型
Matlab提供python API供外部調用,本文將需要使用的matlab功能封裝成類的形式進行調用。Matlab class用于連接Matlab軟件并對模型輸入數據獲取輸出結果,其中connectToMatlab方法通過Matlab命令行啟動Simulink運行仿真模型,simulate方法用于把數據輸入模型,之后將輸出結果以數組形式存入實例變量中。
python控制Carla客戶端
python腳本啟動的Carla客戶端以pygame庫作為媒介,實現用戶輸入和Carla服務端交互的各種功能,再將最新的結果渲染并繪制到pygame的用戶界面中。初始需要先將Carla服務端啟動,暴露本地2000端口用于客戶端連接。獲取到初始化的 pygame.display實例后進入循環渲染階段,此時鍵盤的輸入作為pygame的事件觸發parse_events方法調用
數據提取
建模部分提到,simulink CAN 仿真模型主要傳輸的是車速、轉向角、檔位三種數據報文。所有的數據來源于以下三個實例:
車速:車速V(km/h)計算方式為 V = 3.6 * √(x^2 + y^2 + z^2 ) (其中x、y、z表示前/后、左/右、上/下方向的速度矢量,單位為m/s)。
檔位:檔位共分為R、P、D三檔,分別代表倒車、停車、直行,檔位的判斷依據汽車的行駛狀態來定,因此檔位的數據源需要汽車車速和倒車參數來判定。
轉向角度:轉向角可以直接從實例中獲取。
實時數據展示
上文已經解決了模型實時輸入實時輸出問題,那么當獲取到仿真模型的輸出結果時,該結果是以數組的形式記錄從仿真開始到當前時間的所有結果,所以每次獲取到結果后都需要重新依據新的數據樣本進行繪制,由于python是Carla和Simulink數據傳輸的媒介,因此最好的解決方案是基于python的繪圖工具實時繪制。本文采用python Matplotlib庫以實現該需求。
繪制代碼實現
由于繪制的是模型的輸出結果,現針對輸出的車速數據繪制相應的實時變化曲線,為了做到良好的代碼風格,增加代碼復用率,本文將一系列繪制相關的方法集中到Draw類里。
實時仿真并繪制
本部分將結合前面的實驗結果,將所有對接Carla的python模塊、對接Matlab/Simulink的python模塊、實時繪制相關的python模塊都組合起來運行。
車速實時變化
實時模擬時長為60秒,60秒內,汽車的速度變化曲線在圖像中持續不斷地刷新,直到60秒到為止。
從圖中可以看出,經過仿真模型模擬出來的速度數據和原數據基本一致,說明模型的CAN報文解封裝過程順利執行,但是在車速的轉折點存在模型的模擬結果比原數據更平滑的問題,很明顯是由于原數據輸入過于頻繁,兩個相鄰的輸入時間間隔小于模型最小采樣時間,而采樣時間不能進一步縮小,否則會導致該時間段內無正確模擬結果輸出。
檔位實時變化
時長為60秒,手動控制汽車行駛,共嘗試兩個檔位,P和D、分別代表泊車和直行,對應參數為17和20,泊車后發送單個P檔位報文,到車輛開始直行這段時間不發送任何報文,直行后會依據汽車的速度反饋不斷發送D檔位報文。從圖中可以看出,由于原數據變化的不是非常頻繁,模型模擬出來的結果完全匹配了原數據,說明輸入頻率遠小于模型采樣頻率會使模擬結果貼合預期結果。
轉向角度實時變化
時長60秒,手動控制汽車行駛,并控制輪胎左右轉向,向左角度為負,向右角度為正,值位于[-100, 100]區間內。由圖可知,轉向角變化數據更新十分頻繁,仿真模型在處理大量的輸入時必然會卡頓并拋棄大量數據,使得模擬結果沒有很好地貼合原數據,因此在高頻輸入的前提下,模型模擬結果無法完全貼合預期。
小結
本文介紹了基于Carla自動駕駛模擬仿真平臺構造Simulink CAN仿真模型并結合python API及其繪圖工具庫matplotlib的一整套實時仿真流程的設計和實現細節,實際模擬了虛擬汽車車速,檔位、轉向角度三個信息在CAN中的解封裝和傳遞。發現在低頻的數據輸入場景下,模型能做到貼合實際結果,而在高頻輸入數據場景下,模型容易運行卡頓并在多個時間點輸出無效數據,拋棄這些數據后模擬結果相對于預期結果顯得平滑,無法體現預期結果中的峰值。
fqj
-
自動駕駛
+關注
關注
784文章
13915瀏覽量
166774 -
數字孿生
+關注
關注
4文章
1341瀏覽量
12305
發布評論請先 登錄
相關推薦
評論