Apollo10.0學習——planning模塊(8)之scenario、Stage插件詳解二

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可以在停車區域泊入指定的車位。

場景切入條件

  1. planning command里存在泊車命令
  2. 距離泊車點距離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 邏輯
    1. 沿參考線遍歷地圖路徑(map_path),匹配指定 ID 的停車位。
    2. 若找到則記錄其覆蓋區域(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 邏輯推測
    1. 計算自車當前位置到目標停車位起點(start_s)的縱向距離。
    2. 若距離超過配置參數 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 查詢地圖數據。

關聯設計總結

  1. 場景切換條件

    • 泊車指令存在性:通過路由服務明確觸發場景切換。
    • 停車位可達性:需在參考線路徑范圍內且距離合理(避免遠距離誤觸發)。
    • 地圖數據依賴:依賴高精地圖的停車位標注信息實現精準定位。
  2. 安全冗余機制

    • 距離閾值校驗:防止車輛過早進入泊車場景導致路徑規劃復雜化。
    • 空值防御:對 other_scenarioreference_line_info 的空指針檢查避免運行時崩潰。
  3. 調試與日志

    • 使用 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);
  • 任務鏈內容
    1. 路徑決策:生成避障路徑(如 PathDecider)。
    2. 速度優化:調用 SpeedOptimizer 生成平滑速度曲線。
    3. 軌跡校驗:驗證軌跡是否符合車輛動力學約束 。

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 狀態處理:持續優化軌跡直至滿足停車條件。

設計關聯與關鍵機制

  1. 虛擬障礙物管理

    • 通過忽略全局路徑終點障礙物,避免代客泊車場景與常規路徑規劃的沖突 。
    • 標簽化決策(ignore-dest-in-valet-parking)增強調試可追溯性 。
  2. 跨階段狀態同步

    • 上下文(ValetParkingContext)與幀數據(OpenSpaceInfo)雙向同步,確保路徑規劃的連貫性 。
  3. 安全冗余設計

    • 雙重校驗(停車位 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_idValetParkingScenario::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);
  • 任務鏈內容
    1. 可行駛區域構建:基于停車位多邊形生成可行區域(OpenSpaceRoiDecider)。
    2. 路徑搜索:使用 Hybrid A* 算法生成初始避障軌跡。
    3. 軌跡優化:調用 OpenSpaceTrajectoryOptimizer 結合車輛動力學參數優化軌跡平滑性。
    4. 檔位決策:根據軌跡方向(前進/倒車)設置檔位切換點。
    5. 碰撞檢測:驗證軌跡與障礙物無沖突。

5. 錯誤處理與狀態返回

if (result.HasError()) {AERROR << "StageParking planning error";  // 記錄錯誤日志return result.SetStageStatus(StageStatusType::ERROR);  // 終止階段
}
return result.SetStageStatus(StageStatusType::RUNNING);  // 繼續執行
  • 錯誤類型
    • 路徑搜索失敗:可能因停車位尺寸不足或障礙物封鎖。
    • 優化約束沖突:如曲率超過車輛最大轉向能力。
  • 狀態流轉:持續返回 RUNNING 直至車輛完全停入車位(需外部條件觸發)。

關聯設計參數與配置

  1. 軌跡優化配置

    • open_space_trajectory_optimizer_config:控制優化器參數(如權重系數、迭代次數)。
    • open_space_standstill_acceleration:設置車輛靜止時的加速度閾值(防止誤判為移動)。
  2. 軌跡拼接策略

    • 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: 場景切入條件

  1. 當前command為lane_follow_command
  2. 參考線信息不為空
  3. FLAGS_enable_pull_over_at_destination 參數配置允許靠邊停車場景
  4. 主車不處于變道狀態
  5. 主車距離目標點滿足靠邊停車距離閾值
  6. 不處于overlap
  7. 最右側車道允許靠邊停車

代碼邏輯

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_APPROACHapollo::planning::PullOverStageApproach主車靠近靠邊停車點
PULL_OVER_RETRY_APPROACH_PARKINGapollo::planning::PullOverStageRetryApproachParking接近Parking位置點,主車速度、距離誤差達到閾值后,進入下一個stage
PULL_OVER_RETRY_PARKINGapollo::planning::PullOverStageRetryParking執行openspace的軌跡規劃,主車位置、航向達到閾值后,退出該stage

階段一:PullOverStageApproach

PullOverStageApproach : 該階段用于主車規劃接近靠邊停車點,獲取靠邊停車軌跡,并檢查是否完成靠邊停車。

Process方法

Process: 該階段處理的主函數,輸入為規劃初始點 planning_init_pointFrame;輸出為當前階段處理狀態StageResult

  • ExecuteTaskOnReferenceLine:輸入為規劃初始點planning_init_pointFrame信息,按照該stage配置的task列表,依次進行規劃。
  • CheckADCPullOver:檢查主車的PullOver狀態。輸入主車狀態、參考線信息、場景信息和規劃上下文信息,根據主車當前位置和速度,判斷與停靠點關系,確定主車PullOverState。狀態返回值分為: UNKNOWN, PASS_DESTINATION, APPROACHING, PARK_COMPLETEPARK_FAIL。如果完成靠邊停車,即狀態為 PASS_DESTINATIONPARK_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_pointFrame;輸出為當前階段處理狀態StageResult

  • ExecuteTaskOnReferenceLine:輸入為規劃初始點planning_init_pointFrame信息,按照該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_pointFrame;輸出為當前階段處理狀態StageResult

  • ExecuteTaskOnReferenceLine:輸入為規劃初始點planning_init_pointFrame信息,按照該stage配置的task列表,依次進行規劃。該階段主要時調用Openspace的軌跡規劃方法進行靠邊停車規劃。
  • CheckADCPullOverOpenSpace:檢查主車是否停車,輸入為Frame信息。主車與目標點的位置、航向偏差小于閾值,進入FinishStage,結束當前Stage。

FinishStage: 該階段的退出函數。

  • 退出PULL_OVER_RETRY_PARKING階段,退出當前PullOverScenario

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80723.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM的面試相關問題

面試中的相關問題主要是三塊 1.JVM 內存區域劃分 2.JVM 的類加載機制 3.JVM 的垃圾回收機制 JVM Java虛擬機 VM Virtual Machine 虛擬機,用 軟件 來 模擬 硬件 傳統意義上的"虛擬機" 更多指的是 VMWare, Virtual Box, Hyper-V, KVM(構造出虛擬的電腦,甚至可以…

win10使用nginx做簡單負載均衡測試

一、首先安裝Nginx&#xff1a; 官網鏈接&#xff1a;https://nginx.org/en/download.html 下載完成后&#xff0c;在本地文件中解壓。 解壓完成之后&#xff0c;打開conf --> nginx.config 文件 1、在 http 里面加入以下代碼 upstream GY{#Nginx是如何實現負載均衡的&a…

[特殊字符]車牌識別相機,到底用在哪?

停車場管理&#xff0c;快速通行不是夢 停車場大概是車牌識別相機最常見的 “工作崗位” 啦&#xff01;以前進出停車場&#xff0c;取卡、刷卡、人工收費&#xff0c;一系列操作下來&#xff0c;高峰期的時候真的能把人等得不耐煩&#x1f62b; 現在有了車牌識別相機&#xff…

nosqlbooster pojie NoSQLBooster for MongoDB

測過可用&#xff0c;注意 asar的安裝使用報錯改用 npx asar extract app.asar app 路徑 C:\Users{computerName}\AppData\Local\Programs\nosqlbooster4mongo\resources npm install asar -g asar extract app.asar app 打開shared\lmCore.js 修改MAX_TRIAL_DAYS3000 修改…

組態王通過開疆智能profinet轉ModbusTCP網關連接西門子PLC配置案例

本案例是組態王通過使用開疆智能研發的Profinet轉ModbusTCP網關采集西門子1200PLC中數據的案例。 網關配置 首先來配置網關的參數&#xff0c;打開網關配置軟件“Gateway Configuration Studio” 由于組態王那側設定為ModbusTCP客戶端所以網關作為ModbusTCP服務器。新建項目…

大模型服務如何實現高并發與低延遲

寫在前面 大型語言模型(LLM)正以前所未有的速度滲透到各行各業,從智能客服、內容創作到代碼生成、企業知識庫,其應用場景日益豐富。然而,將這些強大的 AI 能力轉化為穩定、高效、可大規模應用的服務,卻面臨著巨大的挑戰,其中高并發處理能力和低響應延遲是衡量服務質量的…

k8s監控方案實踐補充(二):使用kube-state-metrics獲取資源狀態指標

k8s監控方案實踐補充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics獲取資源狀態指標 文章目錄 k8s監控方案實踐補充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics獲取資源狀態指標一、Metrics Server簡介二、kube-state-metrics實戰部署1. 創…

Manus 全面開放注冊,OpenAI 發布 Codex,ChatGPT 上線 GPT-4.1!| AI Weekly 5.12-18

&#x1f4e2;本周 AI 快訊 | 1 分鐘速覽&#x1f680; 1?? &#x1f4dd; Manus 全面開放注冊 &#xff1a;無需邀請碼即可注冊&#xff0c;新用戶免費獲得 1000 積分&#xff0c;每日 300 積分免費任務。 2?? &#x1f50d; 阿里 Qwen 推出「深入研究」 &#xff1a;Qw…

代理(主要是動態)和SpringAOP

代理 靜態代理基于繼承實現動態代理是基于接口實現 業務層每次實現轉賬都需要執行&#xff0c;可以把他們拿出來當成一個切面&#xff0c;自己寫出一個代理類&#xff0c;讓業務層只執行業務的邏輯&#xff0c;重復的代碼代理類來完成&#xff0c;然后調用代理類來執行。 代理類…

uniapp打包H5,輸入網址空白情況

由于客戶預算有限&#xff0c;最近寫了兩個uniapp打包成H5的案例&#xff0c;總結下面注意事項 1. 發行–網站-PCWeb或手機H5按鈕&#xff0c;輸入名稱&#xff0c;網址 點擊【發行】&#xff0c;生成文件 把這個給后端&#xff0c;就可以了 為什么空白呢 最重要一點&#xf…

uniapp-商城-63-后臺 商品列表(分類展示商品的刪除)

商品列表中的數據需要進行狀態管理&#xff0c;如上架、下架、刪除和修改等操作。對于存在錯誤或后期需要重新上傳的商品&#xff0c;可以通過刪除操作進行處理。 具體到商品刪除功能的實現&#xff0c;其基本流程如下&#xff1a;用戶在前端頁面點擊刪除按鈕后&#xff0c;系統…

學習設計模式《十》——代理模式

一、基礎概念 代理模式的本質【控制對象訪問】&#xff1b; 代理模式的定義&#xff1a;為其他對象提供一種代理以控制對這個對象的訪問&#xff1b; 代理模式的功能&#xff1a;代理模式是通過創建一個代理對象&#xff0c;用這個代理對象去代表真實的對象&#xff1b;客戶端得…

阿里云web端直播(前端部分)

阿里云&#xff1a;Web播放器快速接入_視頻點播(VOD)-阿里云幫助中心 import Aliplayer from aliyun-aliplayerimport aliyun-aliplayer/build/skins/default/aliplayer-min.css<div id"J_prismPlayer" style"width: 300px; height: 300px;" />var …

深入解析OrientDB:多模型數據庫的技術優勢與實際應用

OrientDB 是一款開源的多模型 NoSQL 數據庫&#xff0c;融合了文檔數據庫、圖數據庫和對象數據庫的特性。它不僅支持靈活的數據建模&#xff0c;還提供了高性能的查詢能力&#xff0c;適用于社交網絡、物聯網、內容管理等場景。本文詳細探討 OrientDB 的核心特性、應用場景&…

STM32控制電機

初始化時鐘&#xff1a;在 STM32 的程序中&#xff0c;初始化系統時鐘&#xff0c;一般會使用 RCC&#xff08;Reset and Clock Control&#xff09;相關函數來配置時鐘。例如&#xff0c;對于 STM32F103 系列&#xff0c;可能會使用 RCC_APB2PeriphClockCmd 函數來使能 GPIO 和…

(05)數字化轉型之生產制造:從通常的離散制造到柔性化生產的全景指南

當今制造業正經歷著前所未有的數字化變革&#xff0c;從傳統的離散制造到流程制造&#xff0c;再到新興的項目制造和柔性制造&#xff0c;各種生產模式都在加速向智能化方向演進。本文將系統性地介紹制造業生產管理的完整體系&#xff0c;為企業數字化轉型提供全面的方法論和實…

龍虎榜——20250520

上證指數今天縮量向上&#xff0c;個股漲多跌少&#xff0c;大盤股和小盤股總體表現都還可以。 深證同樣縮量上漲&#xff0c;向上補缺口的概率增大。 2025年5月20日龍虎榜行業方向分析 寵物經濟&#xff08;消費升級政策催化&#xff09; ? 代表標的&#xff1a;天元寵物、…

CVE-2022-22978源碼分析與漏洞復現

漏洞概述 CVE-2022-22978 是 Spring Security 框架中的一個高危認證繞過漏洞&#xff0c;影響版本包括 Spring Security 5.5.x < 5.5.7、5.6.x < 5.6.4 及更早的不受支持版本。攻擊者可通過構造包含換行符&#xff08;如 %0a&#xff09;的 URL 路徑&#xff0c;繞過正則…

PostGIS實現柵格數據入庫【raster2pgsql】

raster2pgsql使用與最佳實踐 一、工具概述 raster2pgsql是PostGIS提供的命令行工具,用于將GDAL支持的柵格格式(如GeoTIFF、JPEG、PNG等)導入PostgreSQL數據庫,支持批量加載、分塊切片、創建空間索引及金字塔概覽,是柵格數據入庫的核心工具。 二、核心功能與典型用法 1…

Redis企業級開發實戰:核心應用場景與最佳實踐

引言 Redis&#xff08;Remote Dictionary Server&#xff09;作為一款高性能的內存數據庫&#xff0c;在企業級開發中扮演著至關重要的角色。無論是緩存加速、分布式鎖、實時統計&#xff0c;還是消息隊列&#xff0c;Redis都能以極低的延遲和極高的吞吐量滿足業務需求。本文…