實戰(zhàn) | 詳解Apollo 換道
本文經(jīng)自動駕駛之心公眾號授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請聯(lián)系出處。
1.介紹
1.1. 換道的功能
簡單地說, 換道的作用就是從待選地參考線中選擇其中一個參考線, 供 Planning 后續(xù)模塊進行使用.
需要說明的是, Apollo 所開源出的換道代碼經(jīng)過了過多的刪減, 只有一個簡單的框架. 有很多功能, 比如主動換道, 由于障礙物產(chǎn)生的被動換道, 較為完整的狀態(tài)機, 換道窗口和 Gap 的選擇等等功能都是缺失的. 本技術(shù)文章也只展現(xiàn)現(xiàn)有框架上的內(nèi)容. 關(guān)于其他的換道功能請期待后續(xù)的內(nèi)容.
1.2. 換道狀態(tài)機
Apollo 當前的換道狀態(tài)機如下:
對狀態(tài)機有一下幾點值得注意:
- 這里的IN_CHANGE_LANE同時包含了換道執(zhí)行和換道準備兩個階段. 正常情況下應(yīng)該加以區(qū)分. Apollo 采取的是先切換參考線后執(zhí)行換道動作的方法, 也有友商會采用先執(zhí)行換道動作在切換參考線的方法(好處是切換參考線的那一幀, 自車的橫向距離接近于 0).
- 當前代碼中并沒有體現(xiàn)出什么時候會換道失敗. 同樣有理由相信是由于刪除相關(guān)代碼導致的.
- 完整的換道狀態(tài)應(yīng)該至少包含: 換道準備, 換道執(zhí)行, 換道保持, 換道取消, 換道完成等狀態(tài).
2. 代碼解析
2.1. 整體流程
相關(guān)代碼所在路徑: modules/planning/tasks/deciders/lane_change_decider/http://lane_change_decider.cc
- 處理
reference_line_info
為空的異常情況. - 如果配置了強制換道
reckless_change_lane
為true
, 則直接更新 Reference Line. - 獲取上一幀的換道狀態(tài)
prev_status
, 剛進入程序時, 可能prev_status
沒有狀態(tài)信息(!prev_status->has_status()
), 此時直接認為處于換道完成狀態(tài). - 如果
reference_line_info
的數(shù)量為 1(即has_change_lane
為false
), 說明自車處在巡跡狀態(tài), 自車當前所在的車道擁有唯一的車道線, 周圍沒有可變車道, 所以直接更新?lián)Q道狀態(tài)即可. - 切換換道的狀態(tài)機
- 上一幀處在換道狀態(tài)
ChangeLaneStatus::IN_CHANGE_LANE
: 如果上一幀自車所在的 Lane 和這一幀所在的 Lane 相同, 說明自車還在往目標車道上走. 反之如果上一幀自車所在的 Lane 和這一幀所在的 Lane 不同, 說明自車已經(jīng)在目標車道上了, 切換已經(jīng)完成. - 上一幀處在換道失敗狀態(tài)
ChangeLaneStatus::CHANGE_LANE_FAILED
: 如果換道失敗, 則凍結(jié)狀態(tài)一段時間, 然后切換到正在換道狀態(tài), 為下一次換道做準備. - 上一幀處在換道完成狀態(tài)
ChangeLaneStatus::CHANGE_LANE_FINISHED
: 換道成功后同樣凍結(jié)一段時間, 然后切換到正在換道狀態(tài), 為下一次換道做準備. 這里凍結(jié)時間是為了避免頻繁換道.
2.2. 安全檢查
IsClearToChangeLane
判斷換道是否安全.
- 本安全判斷方法不考慮虛擬障礙物(Virtual Obstacles)和靜態(tài)障礙物(Static Obstacles).
- 計算動態(tài)障礙物在 Reference Line 上面的投影. 投影的幾何意義如下圖所示:
- 如果自車正在換道
IsChangeLanePath
, 利用上面計算的投影關(guān)系來忽略目標參考線的車道之外的障礙物. - 判斷障礙物的行駛方向是否和自車相同
same_direction
. 根據(jù)障礙物與自車的行駛方向的關(guān)系和速度關(guān)系分別計算前向安全距離和后向安全距離. - 如果自車和障礙物之間的距離大于上面計算的安全距離, 則認為可以安全換道的.
HysteresisFilter
是一種 Open Close 邏輯, 目的是增加安全判斷結(jié)果的穩(wěn)定性(上一幀判斷結(jié)果認為是安全的, 那么這一幀就更傾向于給出是安全的判斷, 反之亦然).
2.3. 更新 Reference Line
LaneChangeDecider::PrioritizeChangeLane
- 輸入:
is_prioritize_change_lane
. 如果is_prioritize_change_lane
為true
, 則找自車要切換的目標參考線. 反之如果is_prioritize_change_lane
為false
, 則找自車當前位置所在的 Lane 所在的參考線. reference_line_info->splice(reference_line_info->begin(),*reference_line_info, iter)
;將步驟 1 找到的iter
所指向的參考線放在鏈表的最前面. 由于 Planning 后續(xù)模塊使用的都是reference_line_info().front()
, 所以鏈表的最前面就表示當幀就是使用的參考線.splice
的使用詳細說明見C++ 基礎(chǔ).- 輸出:
ReferenceLineInfo
鏈表.
原文鏈接:https://mp.weixin.qq.com/s/IQkBV8iadaU4Qy70F3Xs3Q