[AI] 我的 openpilot 分支改了什麼?(下)Caddy Mk5 適配、提醒邏輯與更新修正
上集整理了分支來源、繁體中文與畫面調整。這篇接著往裡面看,聊 Caddy Mk5 的雷達資料、方向燈和盲點提醒、前車起步提醒,以及更新和控制程式的幾個修正。
這些功能光看 commit 名稱,很容易全部理解成「車子變好開了」。但實際上,有的是資料接收條件,有的是通知判斷,也有的是避免程式在特定路徑出錯。這次就把各自改到哪裡整理清楚。
版本範圍:主程式為 KingChang168/openpilot master da4dac60,比較基準為 IC a6c755d8;主程式指定的 opendbc 版本為 33fb6e59。本文記錄程式實作,沒有把尚未附上的實車測試當成已確認成果。
一、為什麼還有一個 opendbc 分支?
主程式負責 UI、流程和控制等工作,車型設定、CAN 訊息解析與車輛介面則有一部分放在 opendbc。因此只看 openpilot 主程式的修改清單,會漏掉車型相關內容。
這版把 opendbc 的來源改成 KingChang168/opendbc,並由主程式固定對應的 commit。這樣介紹分支或追查問題時,主程式和車型資料都有明確版本可對照。
Caddy Mk5 的車型項目在這兩筆近期 opendbc 修改之前就已經存在。下面介紹的是這次追加的攝影機側雷達適配與扭力值修正,不把既有的整套車型支援重新算成新功能。
二、Caddy Mk5:讓攝影機側的雷達資料走對解析路徑
這次新增 FWD_CAMERA_RADAR 旗標,並套用到 Caddy Mk5 的車型設定。介面會在對應的外部 CAN bus 檢查 0x24F,也就是 Strukturen_01 訊息,作為這條路徑的雷達可用性判斷。
原本前攝影機連接位置的處理,會套用停用雷達的設定。修改後,對有這個旗標、而且符合雷達訊息條件的情況,保留雷達解析路徑;如果訊息條件不符合,仍會走停用處理。
另外,雷達 parser 原本把 bus 編號寫死為 2,現在改由 CanBus(CP).ext 取得對應位置。這樣設定與解析使用相同的 bus 定義,避免資料位置和程式預期對不起來。
用比較白話的方式說,這項工作在處理「資料有沒有出現在預期的位置,以及程式是否去那裡讀」。它不是單靠一個旗標,就讓所有 MQB Evo 車型或不同線組都自動相容。
讀得到雷達,跟接管油門煞車要分開看
這筆修改不能拿來宣稱 Caddy Mk5 已完成 openpilot 縱向控制。能解析前車資料,不等於已確認加速、減速命令能到達車輛執行端。
同樣地,原廠 ACC、AEB 與相關介面是否維持預期行為,也需要各自的實車證據。這篇介紹的是資料適配範圍,沒有提供改線或控制接管的操作步驟。
三、盲點警示:跟正在打的方向燈對上
這部分的規則比較直覺:要往哪邊變換車道,就檢查同一邊的盲點資訊。
| 方向燈狀態 | 盲點資訊 | 這項警示的判斷 |
|---|---|---|
| 只有左燈 | 左側有盲點 | 左側警示 |
| 只有右燈 | 右側有盲點 | 右側警示 |
| 只有左燈 | 只有右側有盲點 | 不觸發 |
| 左右燈同時亮 | 任一側有盲點 | 不觸發 |
| 沒有打方向燈 | 任一側有盲點 | 不觸發 |
程式要求「只有一邊方向燈啟用,而且同側盲點成立」。雙黃燈因此不會被當成同時要往左右變換車道。
這改的是 openpilot 這項通知的觸發條件,沒有新增一組盲點感測器,也不是關閉車輛原廠後視鏡的盲點燈。資料來源是否正常,仍然是提醒能否成立的前提。
四、前車起步提醒:多確認一下再提醒
前車起步提醒要做得實用,不能只看某一瞬間的距離跳了一下,就認定前車已經離開。因此這次在既有狀態機上增加了幾個條件。
- 保留最近最多 10 筆前車距離與相對速度資料,使用中位數過濾。
- 距離增加仍需超過原有的 1 公尺門檻。
- 增加過濾後相對速度大於
0.2 m/s的條件。 - 將觸發確認時間常數從
0.3改為0.8秒。 - 在不符合追蹤條件或離開對應狀態時,清除相關歷史資料。
目前這段邏輯仍有既有的啟用、停車與近距離前車等條件,並不是只要速度數值超過門檻就會提醒。近距離判斷使用前車存在且距離小於 8 公尺的條件。
這樣改的目的是讓短暫跳值比較不容易直接觸發提醒。相對地,多做確認也可能讓提醒更晚出現,所以不能只看「少叫了幾次」,還要確認真正起步時有沒有漏掉。
另外,0.8 秒是程式中的確認門檻,不代表所有情況下,前車一動就一定剛好在 0.8 秒後響。資料過濾、狀態切換和訊息更新都會影響時間。這篇沒有附改前改後的事件統計,因此先不寫誤報下降百分比。
五、更新流程:記住目標分支,控制 submodule 抓取
自己維護 fork,除了新增功能,更新能不能順利完成也很重要。這次的更新修正包含保留目標分支,以及控制 Git 抓取 submodule 的方式。
例如背景更新抓主程式時,現在明確使用 --no-recurse-submodules,並關閉該次 fetch 的遞迴 submodule 行為,避免主程式抓取階段被額外的子模組抓取牽動。
這不表示 opendbc 不需要更新。主程式指定的 submodule commit 仍然必須對得上,只是不要把主程式 fetch 和所有 submodule 的抓取混成一個不容易控制的動作。
對使用者來說,這類修改可能沒有新按鈕可以看,但版本對不上時,問題往往比畫面少一段翻譯更難查。
六、兩個比較小、但值得記下來的程式修正
1. 曲率計算結果統一成 float
曲率控制相關程式,把插值結果明確轉成 Python float,讓後續快取和計算使用一致的數值型別。這是型別處理的修正,不能直接解讀成轉彎更順或轉向能力增加。
2. Emergency Assist 訊息沿用上一筆扭力值
Volkswagen 控制器並不是每一個更新週期都送新的轉向命令。這次先以 self.apply_torque_last 初始化目前使用的扭力值,讓沒有產生新轉向命令的週期,相關訊息仍能取得上一筆命令值。
修改也加入對應測試,檢查這類非轉向傳送週期的行為。這是在修正訊息處理路徑,不是新增緊急煞車功能,也不代表已完成 Emergency Assist 全套實車驗證。
七、目前這個分支,可以怎麼理解?
把上下集放在一起看,目前的方向就是在 IC/sunnypilot 基礎上,保留跟 Caddy Mk5、繁中顯示和日常使用有關的調整。畫面部分讓資訊更適用,車型部分處理資料來源,提醒部分把觸發條件寫得更明確。
原始碼和對應測試可以幫忙確認程式想做什麼,但實際車況、線組和軟體版本仍會影響最後結果。本文沒有附本版本完整測試執行報告,也沒有新增實車 A/B 數據;後續若要寫成效果比較,會另外整理可對照的紀錄。
先把改動寫清楚,之後更新或遇到問題,至少知道該回頭看哪一段,也比較不會隔一陣子連自己都忘記當初為什麼改。
版本與參考資料
整理日期:2026-09-10|KingChang with AI 協助整理。本文為分支修改紀錄,非車型相容性或實車安全驗證報告。
留言
張貼留言