首頁  >  文章  >  科技週邊  >  深入解析Apollo的換道策略及其實際應用

深入解析Apollo的換道策略及其實際應用

WBOY
WBOY轉載
2023-11-07 11:37:05586瀏覽

1.介紹

1.1. 換道的功能

#簡單地說, 換道的作用就是從待選地參考線中選擇其中一個參考線, 供Planning 後續模組進行使用.

深入解析Apollo的換道策略及其實際應用

需要說明的是,Apollo所開源的換道代碼已經經過了大量的刪減,僅保留了一個簡單的框架。許多功能,如主動換道、被動換道(由於障礙物產生)、較為完整的狀態機、換道窗口和Gap的選擇等等都缺失了。本技術文章只展示現有框架上的內容。關於其他換道功能的內容,請期待後續的文章

1.2. 換道狀態機

Apollo 目前的換道狀態機如下:

深入解析Apollo的換道策略及其實際應用

對狀態機有一下幾點值得注意:

  • 這裡的IN_CHANGE_LANE同時包含了換道執行和換道準備兩個階段. 正常情況下應該加以區分. Apollo 採取的是先切換參考線後執行換道動作的方法, 也有友商會採用先執行換道動作在切換參考線的方法(好處是切換參考線的那一幀, 自車的橫向距離接近於0).
  • 當前程式碼中並沒有體現出什麼時候會換道失敗. 同樣有理由相信是由於刪除相關代碼導致的.
  • 完整的換道狀態應該至少包含: 換道準備, 換道執行, 換道保持, 換道取消, 換道完成等狀態.

#2. 程式碼解析

#2.1. 整體流程

相關程式碼所在路徑: modules/planning/tasks/deciders/lane_change_decider/http://lane_change_decider.cc

  1. 處理reference_line_info為空的例外情況.
  2. 如果配置了強制換道reckless_change_lanetrue, 則直接更新Reference Line.
  3. 取得上一幀的換道狀態prev_status, 剛進入程式時, 可能prev_status沒有狀態資訊(!prev_status-> has_status()), 此時直接認為處於換道完成狀態.
  4. 如果reference_line_info的數量為1(即has_change_lanefalse ), 說明自車處在巡跡狀態, 自車目前所在的車道擁有唯一的車道線, 周圍沒有可變車道, 所以直接更新換道狀態即可.
  5. 切換換道的狀態機
  • 上一幀處在換道狀態ChangeLaneStatus::IN_CHANGE_LANE#: 如果上一幀自車所在的Lane 和這一幀所在的Lane相同, 說明自車還在往目標車道上走. 反之如果上一幀自車所在的Lane 和這一幀所在的Lane 不同, 說明自車已經在目標車道上了, 切換已經完成.
  • 上一幀處在換道失敗狀態ChangeLaneStatus::CHANGE_LANE_FAILED: 如果換道失敗, 則凍結狀態一段時間, 然後切換到正在換道狀態, 為下一次換道做準備.
  • 上一幀處在換道完成狀態ChangeLaneStatus::CHANGE_LANE_FINISHED: 換道成功後同樣凍結一段時間, 然後切換到正在換道狀態, 為下一次換道做準備.這裡凍結時間是為了避免頻繁換道.

2.2. 安全檢查

IsClearToChangeLane判斷換道是否安全.

  1. 本安全判斷方法不考慮虛擬障礙物(Virtual Obstacles)和靜態障礙物(Static Obstacles).
  2. 計算動態障礙物在Reference Line 上面的投影.投影的幾何意義如下圖所示:

深入解析Apollo的換道策略及其實際應用

  1. 如果自車正在換道IsChangeLanePath, 利用上面計算的投影關係來忽略目標參考線的車道之外的障礙物.
  2. 判斷障礙物的行駛方向是否和自車相同same_direction. 根據障礙物與自車的行駛方向的關係和速度關係分別計算前向安全距離與後向安全距離.
  3. 如果自車與障礙物之間的距離大於上面計算的安全距離, 則認為可以安全換道的. HysteresisFilter是一種Open Close 邏輯, 目的是增加安全判斷結果的穩定性(上一幀判斷結果認為是安全的, 那麼這一幀就更傾向於給出是安全的判斷,反之亦然).

2.3. 更新Reference Line

需要重寫的內容是:LaneChangeDecider::PrioritizeChangeLane

  1. #輸入:<span> </span>is_prioritize_change_lane. 如果is_prioritize_change_lanetrue, 則找自車要切換的目標參考線.反之如果is_prioritize_change_lanefalse, 則找自車目前位置所在的Lane 所在的參考線.
  2. #reference_line_info->splice(reference_line_info->##reference_line_info->splice(reference_line_info->##reference_line_info->splice(reference_line_info->##reference_line_info->splice(reference_line_info->##reference_line_info->splice(reference_line_info->##reference_line_info->splice(reference_line_info->##reference_line_info->splice(reference_line_info->##reference_line_info->splice(reference_line_info-) begin(),*reference_line_info, iter);將步驟1 找到的iter
  3. 所指向的參考線放在鍊錶的最前面. 由於Planning 後續模組所使用的都是
  4. reference_line_info( ).front(), 所以鍊錶的最前面就表示當訊框就是使用的參考線. splice
  5. 的使用詳細說明請見C 基礎.

#輸出:深入解析Apollo的換道策略及其實際應用 

ReferenceLineInfo

鍊錶.###################原文連結:https://mp.weixin.qq.com /s/IQkBV8iadaU4Qy70F3Xs3Q###

以上是深入解析Apollo的換道策略及其實際應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除