楊軍典 陳凌珊
摘? 要:為了在高級(jí)駕駛輔助系統(tǒng)(ADAS)中對(duì)車輛控制算法進(jìn)行驗(yàn)證,可以利用維克托(Vector)工具鏈對(duì)汽車電子控制器(ECU)內(nèi)部的變量進(jìn)行記錄,生成MDF(原版光盤映像文件)格式的測試數(shù)據(jù)文件,然后進(jìn)行離線分析。利用Qt公司開發(fā)的豐富的可視化圖形控件Qt(跨平臺(tái)軟件開發(fā)框架)和Python(一種計(jì)算機(jī)程序設(shè)計(jì)語言)的強(qiáng)大數(shù)據(jù)處理能力,本文開發(fā)了一種可以對(duì)MDF文件進(jìn)行解析并且可視化的軟件。該軟件可以實(shí)現(xiàn)變量的篩選功能,支持變量的樹狀顯示、多個(gè)變量測量值的二維時(shí)域圖形表示。特別地,ADAS感知到的環(huán)境目標(biāo),本軟件可以觀察其二維坐標(biāo)隨時(shí)間的運(yùn)動(dòng)過程,并且支持畫面與用戶的交互操作。經(jīng)過測試,本軟件運(yùn)行可靠,在某公司推廣使用。
關(guān)鍵詞:ADAS;測試;MDF解析;Qt;可視化
中圖分類號(hào):TP311.52? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):2096-1472(2021)-01-39-03
Abstract: In order to verify the vehicle control algorithm in the Advanced Driver Assistance System (ADAS), Vector's tool chain can be used to record variables inside the automotive Electronic Control Unit (ECU). Then, a test data file in MDF (Measurement Data Format) format is generated, and offline analysis can be performed. This paper proposes to develop a software that can analyze and visualize MDF files by utilizing Qt (the cross-platform software development framework) and Python (a computer programming language) developed by Qt Company. This software can realize the variable filtering function, support tree displays of variables and two-dimensional time-domain graphical representation of measured values of the multiple variables. In particular, the proposed software can observe the movement process of its two-dimensional coordinates over time for the environmental targets that ADAS perceives, and it supports the interactive operation of screen and user. Testing results show that the proposed software runs reliably and is being used by a company.
Keywords: ADAS; testing; MDF analysis; Qt; visualization
1? ?引言(Introduction)
在ADAS系統(tǒng)車輛ECU軟件的開發(fā)過程中,控制算法需要經(jīng)過不斷的設(shè)計(jì)、測試、修改迭代才能完成。在測試這一環(huán)節(jié)中,包括軟件在環(huán)測試(SIL)、硬件在環(huán)測試(HIL)和實(shí)車測試三種。在實(shí)車測試過程中,需要提前將軟件燒寫入汽車ECU,在汽車行駛過程中,通過XCP協(xié)議[1]和Vector公司的CAN工具,ECU可以記錄內(nèi)部變量,然后生成符合自動(dòng)化及測量系統(tǒng)標(biāo)準(zhǔn)協(xié)會(huì)(ASAM[2])標(biāo)準(zhǔn)的MDF[3]文件。通過將記錄的MDF文件回傳到算法開發(fā)人員手中,開發(fā)人員可以離線進(jìn)行算法的驗(yàn)證工作。因此,MDF文件的解析和可視化對(duì)算法的設(shè)計(jì)開發(fā)非常重要。雖然Vector公司已經(jīng)有對(duì)MDF文件進(jìn)行解析和可視化的商業(yè)工具,但是其價(jià)格昂貴并且無法進(jìn)行二次開發(fā)。本文的目標(biāo)是設(shè)計(jì)一個(gè)可視化軟件,可以解析MDF文件,并且對(duì)文件中的變量進(jìn)行二維顯示和三維的動(dòng)態(tài)播放。
本文首先利用Python豐富的第三方工具包對(duì)MDF文件進(jìn)行解析,然后使用Python的Numpy等數(shù)據(jù)科學(xué)包對(duì)MDF中的數(shù)據(jù)進(jìn)行處理。由于需要存儲(chǔ)的變量較多,查詢、篩選頻繁,因此選用小型的SQLite3關(guān)系數(shù)據(jù)庫來組織文件中的數(shù)據(jù)。最后使用Qt豐富的控件庫,實(shí)現(xiàn)軟件的整體可視化界面設(shè)計(jì)。其中,在與用戶的交互操作模塊上,利用了強(qiáng)大的兼容Qt平臺(tái)的PyQtGraph[4]圖形庫,加快了開發(fā)過程。
2? MDF文件介紹和解析(The introduction and parse of MDF file)
2.1? ?歷史、版本及用途
MDF文件格式是20世紀(jì)90年代由歐洲的Bosch、Vector聯(lián)合大眾等汽車公司專門為汽車行業(yè)設(shè)計(jì)的一種通用文件格式,主要用于汽車電子ECU的開發(fā)、標(biāo)定和測試領(lǐng)域,已經(jīng)成為該領(lǐng)域事實(shí)上的工業(yè)標(biāo)準(zhǔn)。由于測量數(shù)據(jù)的快速增長,在ASAM組織修訂下,MDF文件從2.0版本逐漸升級(jí)為目前的4.x版本,生成的數(shù)據(jù)文件后綴名為“.MF4”。MDF文件中記錄的典型數(shù)據(jù)有汽車傳感器信號(hào)、ECU內(nèi)部變量狀態(tài)等。這些存儲(chǔ)在MDF文件中的狀態(tài)信號(hào),可以被算法人員回放,進(jìn)行算法的驗(yàn)證工作。本文主要專注于最新的MDF 4.x版本文件(即*.MF4文件)的解析和可視化。
2 .2? ?MF4文件介紹
一個(gè)MF4文件由若干個(gè)二進(jìn)制模塊組合而成,每個(gè)模塊主要包含三個(gè)部分:文件頭、鏈接部分和數(shù)據(jù)部分,如圖1[5]所示。
模塊的類型有很多種,每種類型都定義了模塊的用途和內(nèi)容,由二位的大寫字母表示。主要的模塊類型有:ID(用于標(biāo)識(shí)MDF文件)、HD(MDF文件的通用描述)、TX(記錄變量長度的字符容器)、CH(定義通道的邏輯結(jié)構(gòu))、DG(描述數(shù)據(jù)分組)、CG(描述通道組)、CN(描述通道)、CC(描述每個(gè)通道數(shù)據(jù)的轉(zhuǎn)換)、DT(每個(gè)數(shù)據(jù)記錄的單個(gè)值)等。這些模塊按照一定的結(jié)構(gòu)存儲(chǔ)起來,便可以組成一個(gè)MDF文件,圖2描述了一個(gè)簡單模塊的物理存儲(chǔ)和層次結(jié)構(gòu)[5]。
由圖2可知,所有的變量在邏輯上是按照樹狀層級(jí)分布的,一個(gè)CN相當(dāng)于一個(gè)變量名,描述了測量值的存放位置、字節(jié)數(shù)等信息。同一個(gè)CG是若干個(gè)變量名的集合,并且有相同的采樣率。DT是真正存儲(chǔ)數(shù)據(jù)值的地方,其內(nèi)部數(shù)據(jù)的布局如圖3所示[5]。
2.3? ?MDF文件解析
Python是一種動(dòng)態(tài)的計(jì)算機(jī)語言,可以用于數(shù)據(jù)計(jì)算、軟件開發(fā)等。mdfreader[6]是Python的一個(gè)第三方開源工具包,可以用于讀取解析MDF文件格式,具體使用方法見文獻(xiàn)[6]。
使用mdfreader解析出MDF文件獲取的只是最原始的數(shù)據(jù),需要按照一定的邏輯層次對(duì)數(shù)據(jù)進(jìn)行篩選、整理、變換、存儲(chǔ)等操作。對(duì)于數(shù)據(jù)處理這部分,可以利用Python中著名的Numpy包進(jìn)行數(shù)學(xué)運(yùn)算。由于解析出來的數(shù)據(jù)存儲(chǔ)在內(nèi)存中,不能永久保存,因此在下節(jié)中使用數(shù)據(jù)庫技術(shù)來解決這一問題。
3? ?技術(shù)框架(Technical framework)
3.1? ?Qt和PyQt簡介
Qt是一個(gè)著名的面向?qū)ο?、跨平臺(tái)的C++圖形界面開發(fā)框架,可用于開發(fā)GUI程序,目前已經(jīng)更新到5.13版本。由于在上文中使用Python語言解析MDF文件,為了避免混合語言編程,本文選用Python語言開發(fā)GUI界面。
PyQt是由Python和Qt庫融合而成的一個(gè)工具包,允許開發(fā)者使用Python調(diào)用Qt庫中的應(yīng)用程序接口(API)創(chuàng)建GUI應(yīng)用程序。在本軟件開發(fā)中,使用與Qt5對(duì)應(yīng)的PyQt5模塊設(shè)計(jì)本軟件。
3.2? ?SQLite3數(shù)據(jù)庫
SQLite3是一個(gè)輕型,支持SQL語法的開源關(guān)系數(shù)據(jù)庫。關(guān)系數(shù)據(jù)庫使用多張二維表來存儲(chǔ)數(shù)據(jù),每張表可以通過主關(guān)鍵字唯一確定一行數(shù)據(jù)。SQL是用于訪問和處理數(shù)據(jù)的標(biāo)準(zhǔn)計(jì)算機(jī)語言,通過在Python程序中調(diào)用SQL語言的接口,可以對(duì)SQLite3中的數(shù)據(jù)庫進(jìn)行表格創(chuàng)建、數(shù)據(jù)查詢、篩選等,完成對(duì)MDF中測量數(shù)據(jù)的永久存儲(chǔ)和讀取。
3.3? ?PyQtGraph交互可視化庫
前文介紹了使用PyQt5進(jìn)行GUI應(yīng)用程序的設(shè)計(jì),但是Qt自帶的圖形庫中進(jìn)行用戶交互的函數(shù)較少。PyQtGraph是一個(gè)基于PyQt/PySide和Numpy的純Python開源圖形GUI函數(shù)庫,補(bǔ)充了Qt在數(shù)據(jù)圖形與用戶交互方面能力不足的缺點(diǎn),并且提供了幫助快速開發(fā)應(yīng)用程序的工具。因此,在本軟件需要與用戶交互的模塊中,使用PyQtGraph代替Qt進(jìn)行快速開發(fā)。
4? ?軟件架構(gòu)(Software architecture )
常用的軟件架構(gòu)一般分為三層:界面、服務(wù)和數(shù)據(jù)庫。界面負(fù)責(zé)與用戶的直接交互,需要布局合理、美觀。服務(wù)是軟件后臺(tái)對(duì)用戶界面中按鈕的功能實(shí)現(xiàn),不對(duì)用戶開放。數(shù)據(jù)庫是用來保存軟件中所產(chǎn)生的大量數(shù)據(jù),與服務(wù)進(jìn)行交互,提供存儲(chǔ)、提取功能。按照這一邏輯,設(shè)計(jì)本軟件的架構(gòu)層次如圖4所示。其中Python調(diào)用SQLite3數(shù)據(jù)庫的方法可以在參考文獻(xiàn)[7]中進(jìn)行查詢,數(shù)據(jù)與服務(wù)端的交互邏輯在前文中進(jìn)行了穿插介紹。
4.1? ?界面設(shè)計(jì)
使用PyQt5寫GUI界面可以通過直接手寫Python代碼實(shí)現(xiàn),但更方便的辦法是使用Qt Designer進(jìn)行按鈕的拖拉放置和布局設(shè)計(jì)。使用Qt Designer可以實(shí)現(xiàn)軟件界面和邏輯的分離,加速開發(fā)速度,生成的*.ui文件可以通過PyQt5自帶的pyuic5工具自動(dòng)轉(zhuǎn)換成對(duì)應(yīng)的Python代碼。因此,本文采用這種方法進(jìn)行如圖4所示三個(gè)界面的開發(fā)任務(wù)。
在變量樹狀、表格顯示界面,需要實(shí)現(xiàn)文件的導(dǎo)入,后臺(tái)服務(wù)將文件解析之后將文件內(nèi)部的變量以樹狀的形式展示給用戶。使用Qt Designer設(shè)計(jì)此界面如圖5所示。當(dāng)用戶想要查看某些變量的值時(shí),可以通過在樹狀圖中選擇某些變量,然后點(diǎn)擊表格顯示按鈕,實(shí)現(xiàn)在右上側(cè)的觀察。界面的右下側(cè)顯示了被測試車輛的長寬高、傳感器安裝位置有關(guān)的幾何靜態(tài)參數(shù)。使用同樣的方法設(shè)計(jì)其余兩個(gè)界面,具體過程不再贅述。
4.2 服務(wù)實(shí)現(xiàn)
在界面的設(shè)計(jì)中實(shí)現(xiàn)了許多按鈕,比如導(dǎo)入文件等操作,這些按鈕背后的具體操作需要在服務(wù)中實(shí)現(xiàn)。對(duì)于實(shí)現(xiàn)點(diǎn)擊按鈕打開文件等簡單的操作,可以在文獻(xiàn)[7]中進(jìn)行查詢,以下著重闡述數(shù)據(jù)的樹狀、表格顯示,二維時(shí)域顯示和三維播放功能。
4.2.1? ?樹狀、表格顯示
在Qt5上面用于界面組件顯示與編輯的數(shù)據(jù)結(jié)構(gòu)是模型/視圖結(jié)構(gòu)(Model/View)。視圖是用來可視化和編輯數(shù)據(jù)的界面組件,模型是視圖與數(shù)據(jù)可視化的接口,數(shù)據(jù)通過代理與編輯,可以把數(shù)據(jù)和界面分離開來,如圖6[8]所示。Qt自帶的QSqlQueryModel可直接執(zhí)行SQL語句,從數(shù)據(jù)庫中讀取數(shù)據(jù),然后使用QTableView將讀取的數(shù)據(jù)以表格的形式顯示出來,詳細(xì)使用見文獻(xiàn)[8]。由于Qt的數(shù)據(jù)結(jié)構(gòu)只給出了QTreeView,因此樹狀數(shù)據(jù)顯示的難點(diǎn)在于從QStandardItemModel基礎(chǔ)上進(jìn)行樹狀模型的定制。
QStandardItemModel是一種基于數(shù)據(jù)項(xiàng)的數(shù)據(jù)結(jié)構(gòu),由用戶組織數(shù)據(jù)項(xiàng)的結(jié)構(gòu)。數(shù)據(jù)項(xiàng)的類型是QStandardItem,保存著數(shù)據(jù)、文字、圖標(biāo)等顯示信息,并且可以設(shè)置為是否可編輯、選取等。根據(jù)圖2所示,將DG、CG、CN均表示成一個(gè)數(shù)據(jù)項(xiàng),然后使用QStandardItemModel的setItem函數(shù)對(duì)數(shù)據(jù)項(xiàng)進(jìn)行排布,形成樹狀結(jié)構(gòu)。如圖7所示為使用上述方法導(dǎo)入一個(gè)示例MF4文件后,變量的樹狀和表格顯示結(jié)果。
4.2.2? ?二維時(shí)域顯示
除了可以使用表格的形式顯示變量外,更直觀的方法是使用二維圖形表示。當(dāng)用戶更新了選擇的變量時(shí),二維圖形也可以動(dòng)態(tài)地更新。除此之外,當(dāng)用戶點(diǎn)擊圖形中的某個(gè)采樣點(diǎn)時(shí),可以將采樣點(diǎn)處的數(shù)據(jù)標(biāo)注出來,并且可以自由地使用鼠標(biāo)進(jìn)行圖形的縮放、平移。為了滿足這些人機(jī)交互功能,這里采用PyQtGraph進(jìn)行開發(fā)。
PyQtGraph工具庫自帶了支持鼠標(biāo)交互操作的后臺(tái),因此,這一模塊開發(fā)的重點(diǎn)在于如何動(dòng)態(tài)地更新二維圖形的數(shù)量和采樣點(diǎn)處的數(shù)據(jù)顯示。PyQtGraph工具庫和Qt圖形框架的本質(zhì)是一樣的,圖形顯示的原理是首先生成一塊畫布,所有的圖形元素按照一樣的布局在畫布上放置。當(dāng)用戶選擇的變量變化時(shí),首先需要使用布局畫布變量GraphicsLayout的clear函數(shù)清除畫布中已有變量的二維圖形,然后再生成新變量的二維圖形。當(dāng)鼠標(biāo)點(diǎn)擊曲線中的某個(gè)采樣點(diǎn)時(shí),使用PyQtGraph.CurvePoint建立一個(gè)錨點(diǎn),然后以這個(gè)錨點(diǎn)為基準(zhǔn)新建一個(gè)標(biāo)簽顯示采樣值。為了實(shí)現(xiàn)采樣數(shù)據(jù)的動(dòng)態(tài)更新,每次鼠標(biāo)重新選擇采樣點(diǎn)時(shí),從畫布包含的圖形元素中篩選并移除所有CurevePoint類型的錨點(diǎn)元素,最后再生成新采樣點(diǎn)處的錨點(diǎn)和數(shù)據(jù)標(biāo)簽。如圖8所示為某一MF4文件中選取三個(gè)變量的二維時(shí)域顯示圖形。
4.2.3? ?三維播放功能
在ADAS中,汽車的傳感器會(huì)將車輛周圍環(huán)境中目標(biāo)的坐標(biāo)、速度、加速度等狀態(tài)信息發(fā)送給ECU,然后控制算法會(huì)根據(jù)感知信息作出相應(yīng)的動(dòng)作。隨著時(shí)間的不斷前進(jìn),目標(biāo)的二維坐標(biāo)值會(huì)隨著發(fā)生變化。因此,對(duì)這些信息,需要使用播放功能表達(dá)。
實(shí)現(xiàn)三維播放功能有兩個(gè)難點(diǎn):(1)如何在所有變量中提取環(huán)境目標(biāo)的坐標(biāo)值;(2)如何設(shè)置播放功能。每家公司的變量名都有一定的命名規(guī)范,因此通過查找公司的相關(guān)文件,對(duì)MDF文件中解析出來的變量名稱建立符合環(huán)境目標(biāo)命名規(guī)
范的正則表達(dá)式,就可以提取出環(huán)境目標(biāo)的變量名。找到變量名之后,可以建立一個(gè)二維列表樣式的數(shù)據(jù)結(jié)構(gòu),每一行是[采樣時(shí)刻,目標(biāo)1-x坐標(biāo),目標(biāo)1-y坐標(biāo),目標(biāo)2-x坐標(biāo),目標(biāo)2-y坐標(biāo),...],這樣就可以獲得所需要的數(shù)據(jù),解決了難點(diǎn)(1)的問題。針對(duì)難點(diǎn)(2),需要設(shè)計(jì)一個(gè)簡單的播放器狀態(tài)機(jī),為了實(shí)現(xiàn)播放進(jìn)程和單幀進(jìn)行的功能,可以設(shè)計(jì)一個(gè)滑動(dòng)條和按鈕進(jìn)行控制。利用上述方法導(dǎo)入某MF4文件后的三維動(dòng)態(tài)顯示結(jié)果如圖9所示,當(dāng)目標(biāo)動(dòng)態(tài)運(yùn)動(dòng)時(shí),使用前文中方法顯示目標(biāo)的一些動(dòng)態(tài)屬性,如瞬時(shí)速度、加速度等,并在右側(cè)使用表格和樹狀結(jié)構(gòu)顯示了一些目標(biāo)的屬性值。
5? ?結(jié)論(Conclusion)
本文介紹了一種使用Qt可視化高級(jí)駕駛輔助系統(tǒng)測試數(shù)據(jù)的方法。本方法簡單、快速,使用開源工具包,而且可以針對(duì)ADAS測試過程中的需求進(jìn)行定制。經(jīng)某公司驗(yàn)證,該軟件簡單、實(shí)用,運(yùn)行穩(wěn)定,為ADAS控制算法的開發(fā)、驗(yàn)證工作提供了保障。
參考文獻(xiàn)(References)
[1] 任銀行,張建龍,殷承良.基于XCP協(xié)議支持多總線的ECU標(biāo)定系統(tǒng)的實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2018,44(5):72-76.
[2] 宋維群,楊世春,李明,等.基于ASAM標(biāo)準(zhǔn)的標(biāo)定數(shù)據(jù)庫邏輯分析與編程實(shí)現(xiàn)[J].汽車技術(shù),2012(1):10-13.
[3] 董新宇,張春,姜承賦,等.MDF存儲(chǔ)格式在柴油機(jī)匹配標(biāo)定軟件中的應(yīng)用[J].現(xiàn)代車用動(dòng)力,2011(2):29-31.
[4] PyQtGraph官方文檔及API[EB/OL]. https://pyqtgraph.readthedocs.io/en/latest,2020-6-10.
[5] ASAM. MDF標(biāo)準(zhǔn)官方維基百科[EB/OL]. https://www.asam.net/standards/detail/mdf/wiki,2020-6-10.
[6] Mdfreader-基于Python的MDF文件解析工具[EB/OL]. https://github.com/ratal/mdfreader.git.
[7] 王碩,孫洋洋.PyQt5快速開發(fā)與實(shí)戰(zhàn)[M].北京:電子工業(yè)出版社,2017.
[8] 陸文周.Qt5開發(fā)及實(shí)例(第3版)[M].北京:電子工業(yè)出版社,2017.
作者簡介:
楊軍典(1990-),男,碩士生.研究領(lǐng)域:ADAS感知系統(tǒng)及控制策略算法.
陳凌珊(1966-),女,博士,教授.研究領(lǐng)域:新能源汽車技術(shù),智能駕駛控制技術(shù).