為什麼明明寫著可以用但是 openpilot 卻無法識別我的車?淺談 openpilot 如何辨識車型
openpilot 早期最為人詬病的一個問題便是車型識別,如果有接觸過 0.5 或是更早版本的用戶就知道,常常發生某一個重開機 openpilot 就沒辦法正確識別車子,或是識別成別款車子,這次我們聊聊 openpilot 辨識車型的機制。
指紋一代 (FPv1)
老用戶對 fp 這個詞一定一點也不陌生,因為如果自已車子的指紋沒有提交回去給 comma.ai 時,每一次升級意味著又得要重新輸入一次。
那 fp 是如何產生的呢?我們就得先來看目前汽車大多數使用的一種網路: CAN。
這裡我們用 comma.ai 的 cabana CAN 分析工具為例子:
左側看到有個 ID 欄位,一台車會有數十甚至上百個 ID,也是我們說的 CAN ID,而旁邊的 Bytes 欄位代別著該 CAN ID 的資料長度,以第一行的 STEERING_LKA (2e4 換算成 740) 來看, "be"、"00"、"00"、"00"、"a9" 共有 5 格,我們便可以將之標示成 740:5,以此類推。
當我們把所有的 CAN ID 和它的資料長度全收集起來,便成為 openpilot 辨識車型的方法。
同一款車子因不同的配備便會有不同的 CAN ID,所以 openpilot 為了方便,使用了「可以少,但不能有不一樣」的機制,讓同款車型但有不同配備的車都識為同一款車。
但是這種設計就出現了兩種問題:
額外加了非原廠的硬體 (例如速控鎖) 時,有可能會發送額外的 CAN 訊號,便會辨識不到正確的車型。
有時不同車型也會產生同樣的指紋,造成調校參數不匹配。
指紋二代 (FPv2)
為了解決指紋一代遇上的問題,在 comma.ai 推出 Comma Two (C2) 的時候加入了一個新的硬體配件:comma power v2。
comma power 早在前一代的硬體平台 (EON/LEON) 就已經出現了,但當時的用途只是從方向盤下方的 OBD2 拉取 12v 電源。
到了 comma power v2,除了從 OBD2 拉取 12v 電源外,它在車子發動時會試著從該連接埠對車子請求車子幾個重要零件的韌體版本,以這些版本做為辨識用,而 openpilot 也從 0.8.11 開始,不再使用 FPv1 來辨識車型。
小技巧
如果有寫程式經驗的人可以直接到 /data/openpilot/selfdrive/car/<車廠>/values.py 裡找車型 ID,再修改 /data/openpilot/selfdrive/car/car_helper.py 直接硬改做測試:
總結
時至今日,comma.ai 已經把整個抓取指紋的手續簡單化很多,只要你把所有的線路接上、發動車、上路開一圈 (使用ACC / LKA 等的功能)、熄火、讓 C2/C3 連上網把行車記錄上傳給 comma.ai,他們的 useradmin 介面便能夠顯示所你的車子指紋,再把指紋以及行車記錄用 github 提交上給 comma.ai,未來便不用擔心換版本時又出現不支援的問題。
(以上需使用 comma.ai 原版的 EON/LEON/C2/C3 硬體平台,我們之後再說明)
感謝
本文最後要特別感謝台灣兩位比較知名的團購主 Philip 和 Cloud 熱心的提供指紋給 dragonpilot,雖然大多數的指紋並沒能提交回 comma.ai (因為缺少行車記錄),但也讓 dragonpilot 成為台灣玩家們熟知分支之一。
還有 Taiwan VW/Skoda 玩家裡的 小P、Saber 將行車記錄提供給 VW 車型的主開發人員 Jason Young (https://github.com/jyoung8607/openpilot)。
只有靠大家無私的努力,才能有今天台灣仍至全球的 openpilot 玩家們隨插即用的用戶體驗。
我們盡量以最簡單易懂的方式說明,若有任何錯誤也麻煩各位指正。
未經授權請勿任意轉發,轉發請註明出處,謝謝。











