技術乾貨 | 如何使用MATLAB和Simulink進行數據分析和模型化基礎設計

MathWorks是為工程師和科學家提供數學計算和基於模型的設計軟體開發商。它開發了如MATLAB和Simulink 等強大的分析和模擬軟體,廣泛應用於工程和科學領域。而Kvaser則專注於生產高質量的硬體,用於捕捉數據並接入CAN匯流排,同時也提供一些免費軟體。從產品角度看,MathWorks和Kvaser各有所長,共同為用戶提供完整的CAN解決方案。

此次研討會分為兩個部分。首先,Kvaser技術合作經理Bryan Hennessy演示了如何使用Kvaser硬體和軟體收集數據隨後,MathWorks技術專家Michelle Wu演示了《如何在MathWorks層級操作和使用這些數據(本篇內容)》,涵蓋了把數據導出為MDF檔,到將這些檔導入MATLAB進行解碼和分析的整個流程,課程的最後,她還演示了如何在Simulink模型中回放記錄的數據,為大家提供了一個完整的數據處理和應用的視角。  

*MATLAB是一款強大的數學計算軟體;
*Simulink則是一種基於模型的多域仿真平臺,常用於工程和科學領域中的系統設計、控制設計和信號處理等方面。

ASAM MDF檔格式中的ASAM是標準化組織,MDF代表測量數據格式。MDF是一種二進位檔格式,可能有擴展名。你可能經常看到的mf4表示MDF第4版檔,但mf4和MDF也可能是傳統標準版本的擴展名。

MDF檔可用於存儲記錄的數據和計算的數據,它被認為是當今汽車行業事實上的標準。下圖的簡化模型,可以幫助我們可視化其檔結構。

ASAM ADF File Format

MDF檔包含許多通道組,其中每個通道組都包含許多通道。在大多數數據記錄場景中,你會以特定的光柵速率記錄一組信號,因此,通道組會包含用作一組信號或通道的同步基礎的時間通道。

MDF檔中,我們主要關注兩個關鍵元素。首先是每個通道中存儲的數據,這是最明顯且重要的部分。其次,元數據也很重要,因為它為數據提供了描述,有助於檔使用者更好地理解數據,並確定哪些數據是關鍵資訊。元數據是在所有三個級別上定義的。例如,檔的初始時間戳表示測量開始的時間。在許多情況下,組的採集名稱包含有關所記錄數據的關鍵資訊。

使用MATLAB和車輛網路工具箱,你可以非常容易地查看檔結構,並訪問數據和元數據。MDF通常用於記錄通過車輛網路發送的信號值。但在某些情況下,通信本身可能是我們感興趣的主題,而匯流排通訊可以由數據記錄器記錄,以供後期評估。

數據記錄器應遵循匯流排記錄標準定義的規則,以便在不同的工具之間交換記錄的數據。對於CAN匯流排,推薦的通道名稱為CAN_frame類型,因為只有數據幀用於實際數據傳輸。我們將重點討論這些內容,因為它們在數據分析和基於模型的設計工作流中很重要。就像CAN數據幀包含幾個定義的字段一樣,CAN數據幀通道被定義為包含多個成員通道的結構通道。其中一些成員是強制性的,而另一些是可選的,如IDE、BRS和ESI。

MDF Bus Logging

元數據很重要,它能夠幫助你識別出感興趣的通道。在採集名稱中,你將找到匯流排系統名稱和通道編號。此外,源路徑描述了事件類型,因此你可以在此字段中查找CAN數據幀以獲取實際數據。這兩者的組合已經足夠讓你知道應該關注哪些內容。然而,還有三個源資訊字段也可能與你的分析相關:Source type/Source bus type/ Source bus channel number。在接下來的演示過程中,你將看到車輛網路工具箱如何幫助你快速獲取這些元數據,以幫助你知道在工作流中應該關注哪些數據。

Locate Channels of Interest

你還記得前幾張圖中的檔結構圖嗎?下圖是一個稍微修改過的版本,顯示了檔何時包含CAN匯流排流量。其區別在於增加了一層,因為CAN數據幀是一個具有成員的結構通道。

MDF Bus Logging File Format

在MATLAB中演示如何使用Kvaser Memorator記錄的MDF檔中的J1939數據進行數據分析和基於模型的設計,演示分為4個步驟。我們將在即時腳本的幫助下展示命令行介面,演示基於兩個檔:J1939 database.dbc,這是一個描述J1939網路的資料庫檔,包含將原始CANbus數據解碼為物理值的資訊;J1939 log.mf4,這是使用Kvaser Memorator從J1939網路記錄的MDF4檔。

第一步

將J1939日誌檔中存儲的CAN數據幀
讀取到MATLAB中

Step 1 Read CAN Frames from MDF-File into MATLAB

首先在一個變數中定義mf4檔案名,以便之後在需要引用檔案名時可以使用該變數。

接下來,我們將通過調用MDF-info函數並提供檔案名來檢查檔元數據。這將返回一個MDF資訊對象,該對象具有表示檔元數據的屬性。在創建者詳細資訊下,我們可以看到Kvaser Memorator配置工具用於創建MDF檔並且總共有4個通道組。

為了查看有關通道組的詳細資訊,讓我們調用MDF通道組資訊函數。我們看到一個有4行的表,其中每行表示通道組的元數據。對於此次演示而言,我們只對從1號CAN匯流排通道記錄的CAN數據幀感興趣。通過查看採集名稱和源路徑的組合,我們可以發現我們感興趣的數據位於4號通道組中。

View Metadata for File
View Metadata for Channel Groups

現在我們知道了應該關注的通道組,那麼讓我們使用MDF通道資訊函數來獲取有關該組中通道的一些詳細資訊。在這裏,我們提供檔案名和名稱-數值對,將組號指定為4。我們從之前的介紹中得知,CAN數據幀是一個有成員的結構通道,因此我們得到了一個表,顯示了CAN數據幀的所有11個成員通道以及名為t的時間通道。該表表示我們想要從中讀取數據的一組經過濾的通道。你可以很容易地將該表作為通道名稱-值對的值傳遞到MDF讀取函數中。MDF讀取函數將查看名稱和組號,以決定應從哪個通道讀取。

View Metadata for Channels

現在,要檢查時間表中的CAN數據幀,我們只需要逐一索引返回的單元數組。我們可以看到每個CAN數據幀的所有11個定義字段,如DLC、資料庫、數據長度和ID。

Read CAN Data Frames

第一步

Step 2 Decode as J1939 Parameter Groups and Signals

首先將DBC檔案名分配給一個變數;接下來,使用CAN資料庫函數在MATLAB中打開DBC檔。一個資料庫對象被返回,其中包含從DBC檔中提取的用於解碼的所有必要資訊。

Open DBC-File

讓我們在變數編輯器中打開資料庫對象,查看它的內容。點擊message info屬性,在其中可以找到為每條報文定義的資訊。你可以通過雙擊給定報文的信號資訊結構(infostruct)並查看其詳細資訊來進一步挖掘信號資訊。在這裏,你可以找到有關信號的有用資訊,例如類別、係數、偏移、最小值和最大值以及物理單位。

回想一下,在上一步中,我們獲得了包含所有CAN數據幀的時間表。使用這個時間表和數據庫對象作為輸入參數,我們可以調用J1939參數組時間表函數,它可以巧妙地將CAN數據幀重新轉化為參數組。

CANData Frames

輸出再次以時間表格式很好地被打包,其中每行代表一個J1939參數組,你可以找到所有必要的資訊,包括名稱、參數組號或PGN、優先順序、對等計算或廣播類型、源和目的地地址以及數據字節。請注意,解碼信號值也是可用的,你可能對獲取特定信號在一段時間內的值感興趣。好消息是,我們為這個確切的用例提供了另一個名為J1939信號時間表的函數。你只需要將我們剛剛獲得的PG時間表傳遞到該函數中,它就會為你重新打包信號數據。現在,你可以使用參數時間表來調用此函數,該參數時間表將重新打包來自所有PG的信號。然而,對於本演示,我們假設我們只對兩個參數組感興趣:EEC1和CCBS。我們可以將這些PG名稱指定為參數組的值,這樣就可以只得到這兩個PG的信號。

Decode-CAN-Frames-as-J1939-Parameter-Groups
Repackage Signal Data from Parameter Groups of Interest

第三步

Step 3 Analyze Signal Data Using MATLAB

為了更容易地處理數據,我們提取信號時間表,並將其分配給名為CCVS和EEC1的單個變數。在每個時間表中,列或變數表示信號。

Step 3 Analyze Signal Data Using MATLAB 2

我們的第一個數據分析任務是可視化發動機轉速隨時間的變化。這意味著我們需要查看EEC1參數組中變數EngSpeed中的數據。讓我們首先過濾EEC1時間表,只保留我們需要的一個信號,並排除不必要的資訊。

為了在繪圖上可視化發動機轉速信號,我們將使用在該腳本底部預定義的名為plotVarOverTime的輔助函數。這個輔助函數只在後臺調用MATLAB繪圖函數。通過提供時間表、變數名稱和單位,輔助函數可以繪製所請求的信號,並設置相應地標題和軸標籤。使用這個輔助函數,我們可以繪製發動機轉速隨時間變化的轉速(PRM)圖。

Helper Functions for Plotting
Plot Engine Speed Over Time

我們的下一個數據分析任務是可視化車輛速度隨時間的變化,這意味著我們需要查看CCVS參數組中名為WheelBasedVehicleSpeed的信號中的數據。同樣,讓我們首先過濾CCVS時間表,只關注這個信號。當我們滾動數據值時,我們看到每隔一個時間步長,該值似乎會重置為255.996。

Task 2 Visualize Vehicle Speed Over Time

為了獲得更全面的資訊,讓我們在圖上可視化信號。我們使用的輔助函數與上一個任務相同。通過查看該繪圖,它證實了我們的觀察結果,即信號似乎正在重置為最大值,這可能表明記錄器中存在錯誤配置,或感測器存在某種故障。

plotVar Over Time

為了更好地瞭解車輛的速度數據,我們應該嘗試清理異常。從第2步開始,J1939資料庫對象中提供了最大值等信號資訊。那麼,我們就可以查看這個變數來找出此類資訊。

讓我們打開J1939db變數,點擊報文資訊,在這個列表中我們需要找到CCVS。找到CCVS報文後,我們可以點擊信號資訊查看信號。在這裏我們可以看到WheelBasedVehicleSpeed,通過查看最大值,我們可以看到它是250.996。

J1939db

鑒於最高車速為250.996公里/小時,我們在數據中看到255.996肯定沒有意義。你可以將該值硬編碼到最大車速變數中,但這裏有一個以編程方式從對象中獲取該值的命令。為了清理數據,我們將刪除無效的樣本。我們將使用邏輯索引來查找樣本值超過定義最大值的所有行索引,將它們設置為空即可刪除無效行。

Find Maximum Vehicle Speed

讓我們觀察一下清理後的車輛速度隨時間的變化的情況。沒有來自錯誤數據樣本的干擾,它現在看起來好多了。

Plot Cleaned Up Vehicle Speed Over Time

現在我們同時掌握了車速和發動機轉速,我們的最終數據分析任務是觀察它們隨時間推移而發生的變化。由於CCVS時間表和EEC1時間表位於兩個不同的時間向量上,我們需要首先將它們同步到一個公共時間向量,以便將數據聚合到一個時間表中。現在,使用MATLAB中的同步函數可以很容易地實現這一點,我們提供了兩個時間表,並將新的時間基指定為並集,這意味著輸出將包含輸入時間表的時間向量,同步方法將包含線性的時間向量。

現在我們有了一個統一的時間表,讓我們使用另一個輔助函數來繪製兩個變數:車速和發動機轉速。繪製隨時間變化的兩個條形圖的實現方式類似於我們前面涉及的只針對兩個變數的輔助函數。至此,我們的第三步導出時間表和繪圖功能操作就完成了。

Plot Vehicel Speed and Engine Speed vs. Time

假設你正在試駕車輛,並且發生了一些有趣的事情,也許驅動迴圈不符合某些標準,或者你懷疑你的控制演算法有缺陷。如果你可以使用記錄的數據重現該狀態,並在相同狀態下使用Simulink模型進行調查,這將非常有幫助。

Step 4(a) Replay CAN Frames into Simulink

回想一下,在步驟1中,我們將MDF日誌檔中的CAN數據幀讀取到時間表中。然後在步驟2和3中,我們將CAN幀轉換為J1939參數組以處理信號。然而,由於J1939通信是以CAN幀的形式在網路上進行的,因此回放的對象也應該是CAN幀,而不是J1939 PG。為了準備回放,我們首先需要使用CAN報文時間表功能將CAN數據幀時間表轉換為稍微不同的格式。

Repackage CAN Data Frames into CAN Message Timetable

這種轉換是必需的,因為MDF數據日誌中可能缺少某些可選元素。但是回放函數需要一個更嚴格定義的格式。為了進行回放,我們將使用MathWorks虛擬設備,該設備有兩個通道,就像以回環方式連接一樣工作,並模擬物理CAN設備的行為。我們將在通道1上回放CAN通信,並在通道2上接收Simulink模型。我們為MathWorks虛擬1通道1創建了一個CAN通道。

Create CAN Channel for MathWorks Virtual 1 Channel 1

接下來,我們啟動通道,將其放到網上。在我們開始回放CAN報文之前,讓我們先看看Simulink中的接收端。這裏是我們將用於接收名為EEC1的PG的模型作為示例。我們有J1939網路配置塊,你可以在其中指定正在使用的DBC檔並為此配置命名,我們稱之為回放。接下來,我們有一個J1939節點配置塊來定義一個用於接收回放流量的自定義節點。

對於J1939 CAN傳輸層,我們選擇MathWorks虛擬1通道2作為正在使用的設備。最後,將J1939接收塊配置為使用定義的、名為節點1的自定義節點來接收EEC1。當我們收到PG時,我們將在示波器上顯示3個扭矩信號以及發動機轉速。在實際應用中,你可以將這些信號傳遞到包含控制演算法的另一個子系統中。讓我們首先通過運行Simulink模型來啟動接收端,然後我們可以返回到MATLAB即時腳本來執行啟動發送端的回放功能。

Step 4(b) Receive J1939 Parameter Group EEC1 over CAN

當我們返回接收端查看Simulink範圍時,我們可以看到數據通過MathWorks虛擬1 CAN網路流入模型。因此,這是演示如何將記錄的CAN流量輕鬆回放到Simulink模型中的最後一步,該模型允許你使用下游子系統中的數據進行離線分析。

Scope

在本次演示中,我們首先將MDF檔中的元數據和數據讀取到MATLAB中。接下來,我們使用DBC檔將CAN幀解碼為J1939參數組和信號。然後,我們通過操作時間表和使用繪圖可視化數據來執行一些數據分析任務。最後但同樣重要的是,我們將記錄的CAN流量從MATLAB腳本回放到Simulink中,用於基於模型的設計。

In this demo

車輛網路工具箱有更多供你瞭解的MDF功能。由於MDF檔也可用於存儲計算數據,因此你可能需要將數據分析結果寫入MDF檔。某些數據記錄器可能會生成未排序或未定義的檔。在這種情況下,你一定可以從排序和最終化函數中受益。實際上,你可以將DBC檔與MDF檔作為附件進行關聯,我們也支持附件操作。如果你使用的是串行記錄的多個檔,你可能需要導出MDF數據存儲,這樣你就可以輕鬆地使用檔集合並利用MATLAB中的強大功能,例如tall表。

Explore additional MDF functionalities in Vehicel Network Toolbox

如果您想諮詢CAN匯流排相關解決方案或有任何問題,歡迎通過文末卡片聯繫方式聯繫我們。

本篇文章轉載合作夥伴Kvaser文章