Comma ai 入門 | 無人駕駛 汽車控制逆向工程
前言
各位朋友好,離上一次發文已經一個多月了,中間有好幾次都想要發文章,可是研究生活太過忙碌,再來實驗室一直沒錢買汽車來研究,所以Comma ai的新文章就這樣一直被延期了。而這次的更新是因為 Move-it Hackathon !雖然我本人並沒有到現場參加,但是還是有再關注動向,也因為這樣發現了這次的活動有使用Comma ai的Panda產品與openpilot的代碼來完成CAN Bus Hacking。
綱要
本次主題主要介紹如何透過CAN Bus控制汽車,並且逆向工程找出控制訊息的address
- CAN Bus 控制
- 油門、煞車、轉向的韌體限制
- 突破韌體限制方法
- Move it Hackathon Honda civic project 介紹
CAN Bus 控制
延續上一次的介紹,我們已經知道汽車可以透過Forward Recognition Camera連接到汽車內部CANBus 網路,進而傳送假的油門、煞車、轉向控制訊號。
標準的CAN訊息:
框架起點(Start-of-Frame,SOF)位元:1bit
仲裁識別號碼(Arbitration ID):標準格式使用11bits,延伸格式使用29bits
識別子延伸(Identifier Extension,IDE):可區隔標準與延伸框架
遠端傳輸要求(Remote Transmission Request,RTR)位元:1bit
資料長度碼(Data Length Code,DLC):指出資料欄位所函的位元數
資料欄位(Data Length Code,DLC):包含0~8bytes
循環冗餘校驗(Cyclic Redundancy Check,CRC):CRC 欄位可用於除錯
認可字元 (ACKnowledgement,ACK) 槽:任何正確接收訊息的 CAN 控制器,均將於訊息末端附加傳送 1 組 ACK 位元。傳送節點將檢查匯流排中是否具有 ACK 位元,而若未偵測到 ACK 則將重新嘗試傳輸。 NI Series 2 CAN 介面則具備唯接收 (Listen-only) 模式。因此,若透過硬體監控而傳輸 ACK 位元,則是為了避免其受到匯流排的動作所影響。
如何傳送及接收:
在CAN網路中一個節點發送訊息,所有網路內的節點都會收到消息,也就是說:「今天發送一個轉向45°的消息給管理轉向控制的ECU,只要這個ECU再網路內都能接收到消息,而ECU可以透過Arbitration ID來決定要不要這筆消息」。所以你要控制轉像就需要先知道Arbitration ID的位址,而這個實際只有車廠知道這組ID,所以需要透過逆向工程來找出控制轉向的Arbitration ID。
如果你是Comma ai支持的車輛就可以省下訊號逆向工程的步驟,而每款車都有不一樣的控制ID,於是Comma ai提供了DBC file,下方為Civic DBC檔的程式片段。
BO_ 228 STEERING_CONTROL: 5 ADAS SG_ STEER_TORQUE : 7|16@0- (1,0) [-3840|3840] "" EPS SG_ STEER_TORQUE_REQUEST : 23|1@0+ (1,0) [0|1] "" EPS SG_ CHECKSUM : 39|4@0+ (1,0) [0|15] "" EPS SG_ COUNTER : 33|2@0+ (1,0) [0|3] "" EPS
第一行表示轉向控制訊息,Arbitration ID:228 (或0xE4),接下來四個內容被包裝到5byte的消息中。解析DBC file的檔案為 parser.py。
汽車網路架構延伸閱讀:
CAN Bus延伸閱讀 1、CAN Bus延伸閱讀 2、LIN 延伸閱讀、逆向工程方法、DBC File
油門、煞車、轉向的韌體限制
雖然前面介紹可以透過發送0xE4位址的轉向控制訊號來控制轉向。
但這是有限制的,像是Civic touring 的轉向控制是基於Honda Sensing 的LKAS系統,所以轉向只能控制再速度20mph以上,這是ECU韌體上的限制。另外還有些汽車不是全速度控制的ACC,在低於某個速度以下也是不能控制油門及煞車的。所以再選購汽車實際得看清楚,印象中Toyota TSS-P系列的都可以全速度控制油門、煞車及轉向,這邊就留給強大的網友們驗證摟!
突破韌體限制方法
EPS (Electric power assisted steering) Firmware:限制LKAS系統的轉向。
PCM (power-train control module) Firmware:限制ACC系統。
同樣以Civic 為例,CIvic已經有full stop and go control所以只須更動EPS的限制。
Step1. 拆解
ECU會在零件14中,拆解時需要非常小心George Hotz就曾經拆壞了一個。
Step2. 讀取韌體
讀取韌體方法就很麻煩了,要先了解是那款晶片,才有辦法讀取,Civic用的是SH72A0, SH72A2 (晶片)有Memory Read功能,韌體可能就存在裡面,中間可以能有一些密碼。
Step3. 讀取韌體後會是bin file,所以需要嘗試一些軟體來逆向工程拼回組合語言,最後在找到限制轉向在20mph以下以法控制的程式碼,並修改為0mph。
Step4. 燒入回晶片中,根據George Hotz大神描述,可以通過ISO-14229標準將韌體燒入回去。下方圖片擷取至 Wiki,你可看到0x34為請求下載、0x35為請求上傳。
補充:
George Hotz 視頻 (Youtube)、Datasheep、汽車黑客大曝光(書)、Adventures in Automotive Networks and Control Units
Move it Hackathon Honda civic project 介紹
move it 是連續五天打造自動駕駛的活動,活動中會分為好幾個小組,其中就有兩隊CAN Bus破解小組,其中一對就是使用Civic作為研究。當中裡面的人就是使用Panda在加上DBC file來完成整個專案的,並將openpilot對CANBus處理的部份抽取出來,在以ROS (Robot Operating System)系統重新架構整個專案,詳細內容請看github連結,這裡就不再多加說明。
那既然這個小組只是參考openpilot的程式在另外發行的版本,那為什麼拿要介紹呢?
只要你有看過openpilot的程式碼就會清楚,如果你想由openpilot直接控制轉向、油門、煞車那會是非常大的工程,因為程式的相依性太多,需要移除太多東西,而這個小隊已經把控制部代碼移出,又是採用ROS系統來開發,讓你可以很方更的上手做研究。補充:
github連結、Move it文章
小結
跟各位報告,這可能是最後一次發comma ai系列的文章了,在讀研究所的過程遇到很多轉折,原本預計買台實車來做研究的,結果經費預算差太多,只能腰斬了。而你們看到的文章大多都是我網搜了許多資料一個一個反覆理解彙整的,但是沒有實車可以驗證許多想法有隻能留在腦裡,所以這跟各位說個抱歉 > < 。
但是之後還是會以其他低成本平台作為替代,所以還請繼續多多支持。
推薦閱讀:
※自動駕駛問題之二黑客攻擊問題
※自動駕駛背後的故事太大了,這篇文章讓你看個明白。(無人汽車是下一個投資風口的概率非常大)
※從Uber無人車事故談無人駕駛汽車的測試
※與Uber和解的Waymo,想落地自動駕駛技術還缺啥?
※兩條路徑落地自動駕駛,首度亮相的安波福還將與Lyft展示用車服務