當前位置:
首頁 > 最新 > 無人駕駛中的CAN匯流排

無人駕駛中的CAN匯流排

前言

到目前為止,無人駕駛技術入門硬體篇的分享已經介紹完了。接下來我將會分享更多和軟體相關的內容。這一期的主要內容是——無人駕駛中的CAN(Controller Area Network )匯流排。

CAN匯流排在整個無人駕駛系統中有著十分重要的作用。除了在《無人駕駛技術入門(九)——與生俱來的VCU信號》中提到的VCU信號需要通過CAN匯流排進行傳輸外,無人車上的某些感測器(如雷達、Mobileye)的信號傳遞也是通過CAN實現的。

我在無人駕駛,個人如何研究?中提到過

實現一個無人駕駛系統,會有幾個層級:感知層 → 融合層 → 規劃層 → 控制層更具體一點為:感測器層 → 驅動層 → 信息融合層 → 決策規劃層 → 底層控制層

「感測器層」在前十期的技術入門分享中已經介紹過了,這次主要介紹的是「驅動層」相關的內容。

正文

CAN通信是一套高性能、高可靠性的通信機制,目前已廣泛應用在汽車電子領域。有關CAN的匯流排的原理及特性並不是本次分享的重點。本文的重點在無人駕駛系統獲取到CAN消息後,如何根據CAN協議,解析出想要的數據。從CAN匯流排中解析出感測器的信息,可以說是每個自動駕駛工程師,甚至每一個汽車電子工程師必備的技能。

認識CAN消息

以百度推出的Apollo開源的代碼為例做CAN消息的講解,我們先看到每一幀的CAN消息是如何被定義的。

可以看到這個名為CanFrame的消息結構中包含4個關鍵信息,分別是:

1. uint32_tid

CAN消息的ID號。

由於CAN匯流排上傳播著大量CAN消息,因此兩個節點進行通信時,會先看id號,以確保這是節點想要的CAN消息。最初的CAN消息id號的範圍是000-7FF(16進位數),但隨著汽車電控信號的增多,需要傳遞的消息變多,信息不太夠用了。工程師在CAN消息基礎上,擴展了id號的範圍,大大增加了id號的上限,並將改進後的CAN消息稱為「擴展幀」,舊版CAN消息稱為「普通幀」。

如果拿寫信做比較,這個id就有點類似寫在信件封面上的名字。

2. uint8_tlen

CAN消息的有效長度。

每一幀CAN消息能夠傳遞最多8個無符號整形數據,或者說能夠傳遞8*8的bool類型的數據。這裡的len最大值為8,如果該幀CAN消息中有些位沒有數據,這裡的len就會小於8。

3. uint8_tdata[8]

CAN消息的實際數據。

正如剛才提到的,每一幀CAN消息都包含至多8*8個bool類型的數據,因此可以通過8*8個方格,可視化CAN消息中的data。如下圖所示:

在沒有CAN協議幫助我們解析的情況下,這裡的數據無異於亂碼,根本無法得到有用的消息,這也是CAN消息難以破解的原因之一。

4.timestamp

CAN消息的時間戳。

時間戳表示的是收到該CAN消息的時刻。通過連續多幀的時間戳,可以計算出CAN消息的發送周期,也可以用於判斷CAN消息是否被持續收到。

綜上,每幀CAN消息中最重要的部分其實是data,即8*8的bool值。所謂解析CAN消息,其實就是解析這8*8個bool類型的值。

認識CAN協議

目前業界的CAN協議,都是以後綴名為dbc的文件進行存儲的。德國Vector公司提供CANdb++ Editor是一款專門用於閱讀dbc文件的軟體。

如下圖所示,為Mobileye提供的車道線的dbc文件。(文末提供CANdb++ Editor安裝包和Mobileye車道線的dbc文件的獲取方法)

以id號為0x766的LKA_Left_Lane_A為例,這是Mobileye檢測無人車左側車道線的部分信息,包括了左側車道線的偏移量,曲率等。該幀CAN消息(Message)中的五個信號(Signal),分別是Lane_Type、Quality、Curvature、Curvature_Derivative、Width_left_marking、Position。

每個信號的具體描述顯示在軟體右側,其中與解析直接相關的三個要素已用綠色框選中。

1. Value Type(Unsigned或Signed)

某些物理量在描述時是有符號的,比如溫度。而描述另外一些量時,是沒有符號的,即均為正數,比如說曲率。

2. Factor 和 Offset

這兩個參數需要參與實際的物理量運算,Factor是倍率,Offset是偏移量。例如Lane_Type和Quality信號的Factor為1,Offset為0,而其他信號的Factor均為小數。具體的計算方法請往下看。

雙擊LKA_Left_Lane_A,打開Layout頁,會發現很熟悉的方塊陣列,如下圖所示。

工程師真正關心的恰好是這塊彩色圖,因為該圖上的每個小方塊和data中的每一個bool量一一對應。這就是CAN協議的真面目。

解析CAN信號

由於彩色方塊圖與data是一一對應的,我們將兩個圖疊加,將得到如下圖所示的data圖。

每個信號物理量的計算公式為:

1.Factor為1的物理量

由於Lane_Type和Quality的Factor為1,Offset為0,因此十進位值為多少,實際物理量即為多少。

從圖中就能直接看出Quality這個信號佔據兩個位,二進位數11,換算為十進位是3(1*2 + 0*1);Lane_Type佔據四個位,二進位數為0010,換算為十進位是2(0*8 + 0*4 + 1*2 + 0*1)。

所以這一幀信號表示此時的左車道線Lane_Type值為2,Quality值為3。對於整數值,通信雙方可以約定規則,比如Mobileye就規定了,Quality為0或者1時表示車道線的置信度較低,不推薦使用此時的值;2表示置信度中等,3表示置信度較高,請放心使用。

2.Factor為小數的物理量

對於Factor不為1的物理量,比如Position,需要使用移位的方法進行解析,但解析公式保持不變。以百度 Apollo提供的源碼為例進行講解。

這裡的bytes即為CAN消息中的data,首先將Position信號所在的行取出來,將第1行的8個bool值存儲在變數t1中,將第二行的8個bool值存儲在變數t0中。由於在這條CAN消息中,Position同時佔據了高8位和低8位,因此需要將第一行和第二行的所有bool位拿來計算,高8位存儲在32位的變數x中,低8位存儲在32位的變數t中。

現在需要將高8位和低8位拼接,將高8位左移8位,然後與低8位求或運算,即可得到Position的二進位值。隨後進行的左移16位,再右移16位的操作是為了將32位的變數x的高16位全部初始化為0。之後將x乘以Factor再加上Offset即可得到真實的Position值,給真實值加上單位meter,即可獲取實際的物理量。

與CAN類似的通信協議

VCU、雷達等通過CAN匯流排傳遞信號,隨著CAN的負載越來越高,很多感測器選擇了其他通信方式。比如激光雷達的點雲數據量太過龐大,使用的是區域網的方式進行傳遞;再比如GPS和慣導使用的是串口進行通信。

雖然通信方式和通信協議千差萬別,但解析的方法都是一樣的。

結語

好了(^o^)/~,這篇分享的內容基本上講清楚了CAN匯流排消息的解析過程。這是無人駕駛系統感測器驅動層的基本理論。

由於不同ID的CAN消息的結構不一樣,因此在寫解析代碼時,需要十分仔細,否則會給後續處理帶來想不到的bug。

如果你對CAN匯流排的解析還有什麼疑問,可以在評論區與我互動。

如果你覺得文章還不錯,就關注我一下吧~

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 自動駕駛乾貨鋪 的精彩文章:

TAG:自動駕駛乾貨鋪 |