scenario插件
- 插件總覽
- 插件ValetParkingScenario
- 階段一:StageApproachingParkingSpot
- process()方法
- 階段二:StageParking
- process()方法
- FinishStage方法
- 插件PullOverScenario
- IsTransferable: 場景切入條件
- 代碼邏輯
- 階段一:PullOverStageApproach
- Process方法
- 階段二:PullOverStageRetryApproachParking
- Process方法
- 階段三:PullOverStageRetryParking
- Process方法
插件總覽
planning模塊對于scenario的切換的代碼是在scenario_manager中實現的,目前apollo一共支持了11多種場景和場景的定義。
-
LaneFollowscenario
:默認駕駛場景,包括本車道保持、變道、基本轉彎 -
TrafficLightProtectedScenario
有保護交通燈,即有明確的交通指示燈(左轉、右轉),是有路權保護的紅綠燈場景,在該場景下可以實現在紅綠燈路口前紅燈停車,綠燈通過路口。 -
EmergencyStopScenario
: 緊急停車場景,車輛在行駛過程中如果收到PadMessage命令“PadMessage::STOP”,主車計算停車距離,直接停車。 -
ParkAndGoScenario
:從車位出庫到路線上,用于車輛在遠離終點且靜止條件下,在非城市車道或匹配不到道路點的位置,通過freespace規劃,實現車輛由開放空間駛入道路的功能。 -
ValetParkingScenario
可以在停車區域泊入指定的車位。 -
PullOverScenario
: 靠邊停車場景,enable_pull_over_at_destination
設置為true
時, 當車輛到達終點附近時,將自動切入PullOverScenario
并完成靠邊停車。 -
BareIntersectionUnprotectedScenario
: 無保護裸露交叉路口場景,在交通路口既沒有停止標志,也沒有交通燈,車輛在路口前一段距離范圍內切換到此場景。 -
EmergencyPullOverScenario
: 緊急靠邊停車場景,車輛在行駛過程中如果收到PadMessage命令“PULL_OVER”,車輛就近找到合適的位置在當前車道內停車,相比于直接停車,這樣保證了行駛過程中的停車安全性和舒適性。 -
StopSignUnprotectedScenario
無保護停止標志,場景可以在高精地圖中有停止標記的路口時停車,觀望周邊車輛,等待周圍車輛駛離后跛行,再快速通過路口。 -
TrafficLightUnprotectedLeftTurnScenario
是沒有路權保護的紅綠燈左轉場景。在該場景下,主車在左轉車道線上 -
TrafficLightUnprotectedRightTurnScenario
是有路權保護的紅綠燈右轉場景,在該場景下可以實現在紅綠燈路口前紅燈停車,綠燈通過路口。 -
YieldSignScenario
場景可以在有讓行標記的場景減速觀望,然后慢速通過。
插件ValetParkingScenario
ValetParkingScenario
可以在停車區域泊入指定的車位。
場景切入條件
- planning command里存在泊車命令
- 距離泊車點距離parking_spot_range_to_start以內
1. 檢查泊車指令有效性
if (!frame.local_view().planning_command->has_parking_command()) {return false; // 無泊車指令時阻斷場景切換
}
- 功能:驗證規劃指令中是否包含泊車命令。泊車指令通常由路由請求(Routing Request)觸發,是進入代客泊車場景的必要條件。
- 設計意圖:確保車輛僅在用戶明確請求泊車操作時激活該場景。
2. 輸入參數校驗
if (other_scenario == nullptr || frame.reference_line_info().empty()) {return false; // 上下文或參考線缺失時退出
}
- 意義:
other_scenario
為空表示無前序場景上下文,可能導致狀態錯誤。- 參考線缺失意味著無法進行路徑規劃,需終止場景切換。
3. 解析目標停車位 ID
std::string target_parking_spot_id;
if (frame.local_view().planning_command->has_parking_command() &&frame.local_view().planning_command->parking_command().has_parking_spot_id()) {// 從指令中提取停車位 IDtarget_parking_spot_id = ...;
} else {ADEBUG << "No parking space id from routing";return false;
}
- 功能:從泊車指令中獲取目標停車位的唯一標識符(如
parking_spot_id
)。 - 異常處理:若 ID 缺失或為空,終止切換并記錄調試日志。
4. 搜索目標停車位
const auto& nearby_path = frame.reference_line_info().front().reference_line().map_path();
PathOverlap parking_space_overlap;
if (!SearchTargetParkingSpotOnPath(nearby_path, target_parking_spot_id, &parking_space_overlap)) {ADEBUG << "No such parking spot found...";return false; // 停車位不在當前路徑上則退出
}
- SearchTargetParkingSpotOnPath 邏輯:
- 沿參考線遍歷地圖路徑(
map_path
),匹配指定 ID 的停車位。 - 若找到則記錄其覆蓋區域(
parking_space_overlap
)。
- 沿參考線遍歷地圖路徑(
- 設計關聯:依賴高精地圖數據(HDMap)實現停車位定位,確保泊車路徑可達性。
5. 檢查距離條件
double parking_spot_range_to_start = context_.scenario_config.parking_spot_range_to_start();
if (!CheckDistanceToParkingSpot(frame, vehicle_state, nearby_path,parking_spot_range_to_start,parking_space_overlap)) {ADEBUG << "target parking spot too far...";return false;
}
- CheckDistanceToParkingSpot 邏輯推測:
- 計算自車當前位置到目標停車位起點(
start_s
)的縱向距離。 - 若距離超過配置參數
parking_spot_range_to_start
(如 50米),判定為過遠。
- 計算自車當前位置到目標停車位起點(
- 參數來源:
parking_spot_range_to_start
來自scenario_conf.pb.txt
配置文件。
6. 更新場景上下文
context_.target_parking_spot_id = target_parking_spot_id;
return true; // 滿足所有條件,允許切換至代客泊車場景
- 上下文作用:
- 存儲目標停車位 ID,供后續階段(如
StageApproachingParkingSpot
)使用。 - 支持跨階段狀態傳遞,例如生成泊車路徑時需基于此 ID 查詢地圖數據。
- 存儲目標停車位 ID,供后續階段(如
關聯設計總結
-
場景切換條件
- 泊車指令存在性:通過路由服務明確觸發場景切換。
- 停車位可達性:需在參考線路徑范圍內且距離合理(避免遠距離誤觸發)。
- 地圖數據依賴:依賴高精地圖的停車位標注信息實現精準定位。
-
安全冗余機制
- 距離閾值校驗:防止車輛過早進入泊車場景導致路徑規劃復雜化。
- 空值防御:對
other_scenario
和reference_line_info
的空指針檢查避免運行時崩潰。
-
調試與日志
- 使用
ADEBUG
記錄關鍵判定結果(如停車位未找到或距離過遠),便于問題排查。 - 上下文更新后返回
true
,觸發后續階段的初始化。
- 使用
典型應用場景
- 停車場入口觸發:用戶選擇目標停車位后,車輛行駛至預設距離范圍時激活代客泊車場景。
- 動態路徑調整:若車輛偏離參考線導致停車位丟失,自動退出場景并等待重新觸發。
階段一:StageApproachingParkingSpot
階段:接近停車位階段
process()方法
1. 階段標識與輸入校驗
ADEBUG << "stage: StageApproachingParkingSpot"; // 標記當前為接近停車位階段
CHECK_NOTNULL(frame); // 確保幀數據指針有效性
StageResult result; // 初始化階段結果對象
- 功能:標識當前處于 Valet Parking 場景的 Approaching Parking Spot 階段,驗證輸入數據結構合法性。
2. 上下文有效性校驗
auto scenario_context = GetContextAs<ValetParkingContext>();
if (scenario_context->target_parking_spot_id.empty()) {return result.SetStageStatus(StageStatusType::ERROR); // 無目標停車位ID時返回錯誤
}
- 設計意圖:確保上下文中的停車位 ID 有效。
ValetParkingContext
包含target_parking_spot_id
字段用于標識目標停車位 。
3. 設置開放空間信息
// 將上下文中的停車位ID傳遞至當前幀
*(frame->mutable_open_space_info()->mutable_target_parking_spot_id()) =scenario_context->target_parking_spot_id;// 同步預停止標志及坐標點
frame->mutable_open_space_info()->set_pre_stop_rightaway_flag(scenario_context->pre_stop_rightaway_flag);
*(frame->mutable_open_space_info()->mutable_pre_stop_rightaway_point()) =scenario_context->pre_stop_rightaway_point;
- 字段意義:
pre_stop_rightaway_flag
:標記是否需要立即預停車(如檢測到障礙物)。pre_stop_rightaway_point
:預停車目標點坐標 。
- 作用:傳遞跨階段狀態,支持路徑規劃模塊動態調整行為 。
4. 參考線遍歷與障礙物處理
auto* reference_lines = frame->mutable_reference_line_info();
for (auto& reference_line : *reference_lines) {auto* path_decision = reference_line.path_decision();if (nullptr == path_decision) continue;// 查找并處理目的地虛擬障礙物(ID為FLAGS_destination_obstacle_id)auto* dest_obstacle = path_decision->Find(FLAGS_destination_obstacle_id);if (nullptr == dest_obstacle) continue;ObjectDecisionType decision;decision.mutable_ignore(); // 設置忽略決策dest_obstacle->EraseDecision();dest_obstacle->AddLongitudinalDecision("ignore-dest-in-valet-parking", decision);
}
- 關鍵邏輯:
- 虛擬障礙物忽略:代客泊車場景需忽略全局路徑終點標識的虛擬障礙物(如
DESTINATION
標簽),避免誤觸發停車決策 。 - 決策標簽:
"ignore-dest-in-valet-parking"
標識此操作場景,便于調試追蹤 。
- 虛擬障礙物忽略:代客泊車場景需忽略全局路徑終點標識的虛擬障礙物(如
5. 執行參考線任務鏈
result = ExecuteTaskOnReferenceLine(planning_init_point, frame);
- 任務鏈內容:
- 路徑決策:生成避障路徑(如
PathDecider
)。 - 速度優化:調用
SpeedOptimizer
生成平滑速度曲線。 - 軌跡校驗:驗證軌跡是否符合車輛動力學約束 。
- 路徑決策:生成避障路徑(如
6. 同步預停止狀態
scenario_context->pre_stop_rightaway_flag =frame->open_space_info().pre_stop_rightaway_flag();
scenario_context->pre_stop_rightaway_point =frame->open_space_info().pre_stop_rightaway_point();
- 雙向同步:確保上下文與幀數據中的預停止狀態一致,支持跨階段連續性 。
7. 階段退出條件判斷
if (CheckADCStop(*frame)) { // 檢查車輛是否完全停止next_stage_ = "VALET_PARKING_PARKING"; // 進入停車階段return StageResult(StageStatusType::FINISHED); // 當前階段完成
}if (result.HasError()) { // 任務鏈執行異常AERROR << "StopSignUnprotectedStagePreStop planning error";return result.SetStageStatus(StageStatusType::ERROR);
}
- CheckADCStop:
- 可能校驗車速為零且橫向偏移在閾值內。
- 滿足條件時切換至
VALET_PARKING_PARKING
階段(實際泊入操作) 。
- 錯誤處理:路徑規劃失敗時記錄日志并返回錯誤狀態 。
8. 默認狀態返回
return result.SetStageStatus(StageStatusType::RUNNING); // 繼續執行當前階段
- RUNNING 狀態處理:持續優化軌跡直至滿足停車條件。
設計關聯與關鍵機制
-
虛擬障礙物管理
- 通過忽略全局路徑終點障礙物,避免代客泊車場景與常規路徑規劃的沖突 。
- 標簽化決策(
ignore-dest-in-valet-parking
)增強調試可追溯性 。
-
跨階段狀態同步
- 上下文(
ValetParkingContext
)與幀數據(OpenSpaceInfo
)雙向同步,確保路徑規劃的連貫性 。
- 上下文(
-
安全冗余設計
- 雙重校驗(停車位 ID 非空、車輛停止狀態)防止場景誤切換。
- 動態更新預停止點支持緊急避障場景 。
代碼解釋:
StageResult StageApproachingParkingSpot::Process(const common::TrajectoryPoint& planning_init_point, Frame* frame) {ADEBUG << "stage: StageApproachingParkingSpot";// 標記當前為接近停車位階段CHECK_NOTNULL(frame);StageResult result;auto scenario_context = GetContextAs<ValetParkingContext>();// 無目標停車位ID時返回錯誤if (scenario_context->target_parking_spot_id.empty()) {return result.SetStageStatus(StageStatusType::ERROR);}// 將上下文中的停車位ID傳遞至當前幀*(frame->mutable_open_space_info()->mutable_target_parking_spot_id()) =scenario_context->target_parking_spot_id;// 同步預停止標志及坐標點frame->mutable_open_space_info()->set_pre_stop_rightaway_flag(scenario_context->pre_stop_rightaway_flag);// 標記是否需要立即預停車(如檢測到障礙物)。*(frame->mutable_open_space_info()->mutable_pre_stop_rightaway_point()) =scenario_context->pre_stop_rightaway_point;//預停車目標點坐標 。auto* reference_lines = frame->mutable_reference_line_info();// 參考線遍歷與障礙物處理for (auto& reference_line : *reference_lines) {auto* path_decision = reference_line.path_decision();if (nullptr == path_decision) {continue;}// 查找并處理目的地虛擬障礙物(ID為FLAGS_destination_obstacle_id)auto* dest_obstacle = path_decision->Find(FLAGS_destination_obstacle_id);if (nullptr == dest_obstacle) {continue;}ObjectDecisionType decision;decision.mutable_ignore(); // 設置忽略決策dest_obstacle->EraseDecision();dest_obstacle->AddLongitudinalDecision("ignore-dest-in-valet-parking",decision);}// 執行參考線任務鏈result = ExecuteTaskOnReferenceLine(planning_init_point, frame);
// 同步預停止狀態scenario_context->pre_stop_rightaway_flag =frame->open_space_info().pre_stop_rightaway_flag();scenario_context->pre_stop_rightaway_point =frame->open_space_info().pre_stop_rightaway_point();if (CheckADCStop(*frame)) { // 檢查車輛是否完全停止next_stage_ = "VALET_PARKING_PARKING";// 進入停車階段return StageResult(StageStatusType::FINISHED);//當前階段完成}if (result.HasError()) {AERROR << "StopSignUnprotectedStagePreStop planning error";return result.SetStageStatus(StageStatusType::ERROR);}return result.SetStageStatus(StageStatusType::RUNNING);
}
階段二:StageParking
process()方法
以下是對 StageParking::Process
函數的逐行解釋,結合 Apollo 代客泊車場景邏輯及搜索結果內容:
1. 上下文注釋說明
// Open space planning doesn't use planning_init_point from upstream because
// of different stitching strategy
- 設計意圖:開放空間規劃(如泊車場景)采用獨立的軌跡拼接策略,與常規結構化道路的軌跡生成邏輯不同。例如,開放空間需處理車輛靜止啟動、倒車軌跡生成等特殊工況。
2. 獲取場景上下文
auto scenario_context = GetContextAs<ValetParkingContext>();
- 功能:獲取代客泊車場景的上下文對象
ValetParkingContext
,包含目標停車位 ID、預停止狀態等跨階段共享數據。 - 數據關聯:上下文中的
target_parking_spot_id
在ValetParkingScenario::IsTransferable
階段已通過停車位搜索和距離校驗。
3. 設置開放空間信息
frame->mutable_open_space_info()->set_is_on_open_space_trajectory(true); // 標記為開放空間模式
*(frame->mutable_open_space_info()->mutable_target_parking_spot_id()) =scenario_context->target_parking_spot_id; // 傳遞目標停車位ID
- 作用:
- 模式切換:啟用開放空間規劃算法(如 Hybrid A* 和 RS 曲線),支持非結構化道路的軌跡生成。
- 停車位標識:確保路徑規劃模塊能根據 ID 查詢高精地圖中的停車位幾何信息。
4. 執行開放空間任務鏈
StageResult result = ExecuteTaskOnOpenSpace(frame);
- 任務鏈內容:
- 可行駛區域構建:基于停車位多邊形生成可行區域(
OpenSpaceRoiDecider
)。 - 路徑搜索:使用 Hybrid A* 算法生成初始避障軌跡。
- 軌跡優化:調用
OpenSpaceTrajectoryOptimizer
結合車輛動力學參數優化軌跡平滑性。 - 檔位決策:根據軌跡方向(前進/倒車)設置檔位切換點。
- 碰撞檢測:驗證軌跡與障礙物無沖突。
- 可行駛區域構建:基于停車位多邊形生成可行區域(
5. 錯誤處理與狀態返回
if (result.HasError()) {AERROR << "StageParking planning error"; // 記錄錯誤日志return result.SetStageStatus(StageStatusType::ERROR); // 終止階段
}
return result.SetStageStatus(StageStatusType::RUNNING); // 繼續執行
- 錯誤類型:
- 路徑搜索失敗:可能因停車位尺寸不足或障礙物封鎖。
- 優化約束沖突:如曲率超過車輛最大轉向能力。
- 狀態流轉:持續返回
RUNNING
直至車輛完全停入車位(需外部條件觸發)。
關聯設計參數與配置
-
軌跡優化配置
- open_space_trajectory_optimizer_config:控制優化器參數(如權重系數、迭代次數)。
- open_space_standstill_acceleration:設置車輛靜止時的加速度閾值(防止誤判為移動)。
-
軌跡拼接策略
- open_space_trajectory_stitching_preserved_length:保留歷史軌跡的拼接長度,確保控制模塊平滑過渡。
典型應用場景
- 垂直泊車:車輛根據目標停車位 ID 生成倒車軌跡,分階段調整方向直至對齊車位中線。
- 動態避障:泊車過程中檢測到臨時障礙物時,重新規劃軌跡繞過障礙物。
與其他階段的協同
- 前置階段:
StageApproachingParkingSpot
負責將車輛引導至停車位附近并觸發預停止。 - 后置邏輯:當檢測到車輛完全停入車位(如橫向偏移 <0.3米),切換至結束狀態并退出泊車場景。
代碼解釋:
StageResult StageParking::Process(const common::TrajectoryPoint& planning_init_point, Frame* frame) {// Open space planning doesn't use planning_init_point from upstream because// of different stitching strategy// 獲取場景上下文auto scenario_context = GetContextAs<ValetParkingContext>();frame->mutable_open_space_info()->set_is_on_open_space_trajectory(true);// 標記為開放空間模式*(frame->mutable_open_space_info()->mutable_target_parking_spot_id()) =scenario_context->target_parking_spot_id;// 傳遞目標停車位ID// 執行開放空間任務鏈StageResult result = ExecuteTaskOnOpenSpace(frame);if (result.HasError()) {AERROR << "StageParking planning error";return result.SetStageStatus(StageStatusType::ERROR);}return result.SetStageStatus(StageStatusType::RUNNING);
}
FinishStage方法
StageResult StageParking::FinishStage() {return StageResult(StageStatusType::FINISHED);
}
插件PullOverScenario
PullOverScenario
: 靠邊停車場景,如果參數配置 enable_pull_over_at_destination
設置為 true
, 當車輛到達終點附近時,將自動切入 PullOverScenario
并完成靠邊停車。
IsTransferable: 場景切入條件
- 當前command為
lane_follow_command
- 參考線信息不為空
FLAGS_enable_pull_over_at_destination
參數配置允許靠邊停車場景- 主車不處于變道狀態
- 主車距離目標點滿足靠邊停車距離閾值
- 不處于overlap
- 最右側車道允許靠邊停車
代碼邏輯
1. 基礎條件校驗
if (!frame.local_view().planning_command->has_late_follow_command()) {return false; // 當前規劃指令非車道跟隨模式時阻斷場景切換
}
if (other_scenario == nullptr || frame.reference_line_info().empty()) {return false; // 上下文或參考線缺失時退出
}
if (!FLAGS_enable_pull_over_at_destination) {return false; // 全局參數禁用靠邊停車功能則退出
}
- 關鍵邏輯:
- 指令校驗:僅當車輛處于車道跟隨模式(
lane_follow_command
)時才允許切換場景。 - 配置參數:
FLAGS_enable_pull_over_at_destination
控制是否啟用終點靠邊停車功能[[1][63]]。
- 指令校驗:僅當車輛處于車道跟隨模式(
2. 終點位置有效性檢查
const auto routing_end = frame.local_view().end_lane_way_point;
if (nullptr == routing_end) {return false; // 路由終點無效時退出
}
common::SLPoint dest_sl;
reference_line.XYToSL(routing_end->pose(), &dest_sl);
if (!reference_line.IsOnLane(dest_sl)) {return false; // 終點不在當前車道內則阻斷
}
- 設計意圖:
- 確保導航終點位于當前參考線上,避免車輛在無車道區域內嘗試停車[[48][63]]。
- 坐標系轉換:將全局坐標(XY)轉換為參考線坐標系(SL)以進行縱向距離計算。
3. 縱向距離校驗
const double adc_front_edge_s = reference_line_info.AdcSlBoundary().end_s();
const double adc_distance_to_dest = dest_sl.s() - adc_front_edge_s;bool pull_over_scenario = (frame.reference_line_info().size() == 1 && // 禁止變道中切入adc_distance_to_dest >= context_.scenario_config.pull_over_min_distance_buffer() &&adc_distance_to_dest <= context_.scenario_config.start_pull_over_scenario_distance()
);
- 參數意義[[48][63]]:
- pull_over_min_distance_buffer:最小觸發距離(如 10 米),防止車輛過早觸發。
- start_pull_over_scenario_distance:最大觸發距離(如 50 米),超出范圍不激活場景。
- 限制條件:參考線數量為 1 保證車輛不處于變道狀態。
4. 終點過近處理
if (adc_distance_to_dest < context_.scenario_config.max_distance_stop_search()) {pull_over_scenario = false; // 終點過近時停止搜索停車位
}
- 邏輯說明:當車輛距離終點過近(如 <5 米)時,無法找到有效的靠邊停車區域,強制退出場景。
5. 避開交通設施區域
constexpr double kDistanceToAvoidJunction = 8.0; // 禁止在交叉口附近停車
for (const auto& overlap : first_encountered_overlaps) {if (overlap.first 為 PNC_JUNCTION/SIGNAL/STOP_SIGN/YIELD_SIGN) {// 計算與交通設施的相對距離if (距離在 kDistanceToAvoidJunction 內) {pull_over_scenario = false;break;}}
}
- 安全設計:禁止在交叉口、信號燈、停止標志等區域附近停車,避免阻礙交通。
6. 右側車道合法性校驗
while (check_s < dest_sl.s()) {reference_line.GetLaneFromS(check_s, &lanes);// 檢查右側相鄰車道類型for (const auto& neighbor_lane_id : lane->right_neighbor_forward_lane_id()) {if (neighbor_lane->type() == CITY_DRIVING) {rightmost_driving_lane = false; // 右側存在可行駛車道則禁止停車break;}}
}
- 規則依據:僅允許在最右側城市駕駛車道(
CITY_DRIVING
)進行靠邊停車,右側若存在同類型車道說明當前車道非最右側[[48][63]]。 - 動態檢測:沿路徑分段校驗,確保全程右側無合法行駛車道。
Stages
階段名 | 類型 | 描述 |
---|---|---|
PULL_OVER_APPROACH | apollo::planning::PullOverStageApproach | 主車靠近靠邊停車點 |
PULL_OVER_RETRY_APPROACH_PARKING | apollo::planning::PullOverStageRetryApproachParking | 接近Parking位置點,主車速度、距離誤差達到閾值后,進入下一個stage |
PULL_OVER_RETRY_PARKING | apollo::planning::PullOverStageRetryParking | 執行openspace的軌跡規劃,主車位置、航向達到閾值后,退出該stage |
階段一:PullOverStageApproach
PullOverStageApproach
: 該階段用于主車規劃接近靠邊停車點,獲取靠邊停車軌跡,并檢查是否完成靠邊停車。
Process方法
Process: 該階段處理的主函數,輸入為規劃初始點 planning_init_point
、Frame
;輸出為當前階段處理狀態StageResult
- ExecuteTaskOnReferenceLine:輸入為規劃初始點
planning_init_point
、Frame
信息,按照該stage配置的task列表,依次進行規劃。 - CheckADCPullOver:檢查主車的PullOver狀態。輸入主車狀態、參考線信息、場景信息和規劃上下文信息,根據主車當前位置和速度,判斷與停靠點關系,確定主車
PullOverState
。狀態返回值分為:UNKNOWN
,PASS_DESTINATION
,APPROACHING
,PARK_COMPLETE
和PARK_FAIL
。如果完成靠邊停車,即狀態為PASS_DESTINATION
或PARK_COMPLETE
,則進入FinishStage
,結束當前Stage,并且退出當前PullOverScenario
;如果靠邊停車失敗,即狀態為PARK_FAIL
,則進入FinishStage
,結束當前Stage,進入PULL_OVER_RETRY_APPROACH_PARKING
階段。 - CheckADCPullOverPathPoint:如果當前仍處于靠邊停車階段,檢查關鍵path_point,根據path_point與停靠點的位置和heading偏差,判斷是否path_fail。如果
path_fail==true
, 在未到達停靠點前設置STOP
的虛擬障礙物。主車到達虛擬障礙物后,進入FinishStage
,結束當前Stage,進入PULL_OVER_RETRY_APPROACH_PARKING
階段。如果path_fail==false
,則仍處于PULL_OVER_APPROACH
階段。
FinishStage: 該階段的退出函數,輸入為bool success
,即該階段是否靠邊停車成功。
- 如果
success==true
,退出PULL_OVER_APPROACH
階段,并退出PullOverScenario
。 - 如果
success==false
,退出PULL_OVER_APPROACH
階段,進入PULL_OVER_RETRY_APPROACH_PARKING
階段。
階段二:PullOverStageRetryApproachParking
PullOverStageRetryApproachParking
:上一階段直接靠邊停車失敗,進入該階段重試接近靠邊停車點。
Process方法
Process: 該階段處理的主函數,輸入為規劃初始點 planning_init_point
、Frame
;輸出為當前階段處理狀態StageResult
- ExecuteTaskOnReferenceLine:輸入為規劃初始點
planning_init_point
、Frame
信息,按照該stage配置的task列表,依次進行規劃。 - CheckADCStop:檢查主車是否靠近停車點,輸入為
Frame
信息。主車滿足速度小于閾值,位置距離規劃設置的open_space_pre_stop_fence_s
小于閾值,進入FinishStage
,結束當前Stage。
FinishStage: 該階段的退出函數。
- 退出
PULL_OVER_RETRY_APPROACH_PARKING
階段,進入PULL_OVER_RETRY_PARKING
階段。
階段三:PullOverStageRetryParking
PullOverStageRetryParking
:上一階段靠近停車點后,進入該階段實線停車。
Process方法
Process: 該階段處理的主函數,輸入為規劃初始點 planning_init_point
、Frame
;輸出為當前階段處理狀態StageResult
- ExecuteTaskOnReferenceLine:輸入為規劃初始點
planning_init_point
、Frame
信息,按照該stage配置的task列表,依次進行規劃。該階段主要時調用Openspace的軌跡規劃方法進行靠邊停車規劃。 - CheckADCPullOverOpenSpace:檢查主車是否停車,輸入為
Frame
信息。主車與目標點的位置、航向偏差小于閾值,進入FinishStage
,結束當前Stage。
FinishStage: 該階段的退出函數。
- 退出
PULL_OVER_RETRY_PARKING
階段,退出當前PullOverScenario
。