《重構項目》基于Apollo架構設計的項目重構方案(多種地圖、多階段、多任務、狀態機管理)

1. 項目結構設計

project/
├── config/                  # 配置文件(定義 Scenario、Stage、Task 的映射)
├── src/
│   ├── base/                # 抽象基類定義
│   │   ├── scenario_base.h/.cpp
│   │   ├── stage_base.h/.cpp
│   │   └── task_base.h/.cpp
│   ├── scenarios/           # 不同樣本架地圖的 Scenario 實現
│   │   ├── map_a_scenario.cpp
│   │   └── map_b_scenario.cpp
│   ├── stages/              # 階段(Stage)實現
│   │   ├── stage1.cpp
│   │   ├── stage2.cpp
│   │   └── ...
│   ├── tasks/               # 任務(Task)實現
│   │   ├── task1.cpp
│   │   ├── task2.cpp
│   │   └── ...
│   └── main.cpp             # 入口邏輯
└── include/                 # 頭文件

?

2. 抽象基類定義

(1) Scenario 基類
// base/scenario_base.h
class ScenarioBase {public:virtual ~ScenarioBase() = default;// 初始化 Scenario(如加載配置、初始化 Stage 列表)virtual bool Init(const std::string& config_file) = 0;// 執行當前 Stage 的 Taskvirtual void Process() = 0;// 狀態機切換接口:根據條件判斷是否切換 Stage 或 Scenariovirtual ScenarioStatus UpdateStatus() = 0;// 獲取當前 Stage 名稱virtual std::string GetCurrentStageName() const = 0;protected:std::string name_;                      // Scenario 名稱(如 MapA/MapB)std::vector<std::shared_ptr<StageBase>> stages_;  // 當前 Scenario 的 Stage 列表size_t current_stage_index_ = 0;        // 當前 Stage 的索引
};
(2) Stage 基類
// base/stage_base.h
class StageBase {public:virtual ~StageBase() = default;// 執行當前 Stage 的所有 Taskvirtual StageStatus Run() = 0;// 獲取下一 Stage 名稱(根據 Task 返回狀態決定)virtual std::string NextStage() const = 0;// 獲取 Stage 名稱virtual std::string Name() const = 0;protected:std::string name_;                      // Stage 名稱(如 Stage1/Stage2)std::vector<std::shared_ptr<TaskBase>> tasks_;  // 當前 Stage 的 Task 列表
};
(3) Task 基類
// base/task_base.h
class TaskBase {public:virtual ~TaskBase() = default;// 執行單個 Task 的邏輯virtual TaskStatus Execute() = 0;// 獲取 Task 名稱virtual std::string Name() const = 0;
};

3. 狀態機實現原理

(1) 狀態定義
// base/status.h
enum class ScenarioStatus {SUCCESS,      // 當前 Scenario 成功完成RUNNING,      // 當前 Scenario 繼續執行ERROR,        // 當前 Scenario 出錯TRANSITION    // 需要切換到其他 Scenario
};enum class StageStatus {SUCCESS,      // 當前 Stage 成功完成RUNNING,      // 當前 Stage 繼續執行ERROR         // 當前 Stage 出錯
};enum class TaskStatus {SUCCESS,      // 當前 Task 成功完成RUNNING,      // 當前 Task 繼續執行ERROR         // 當前 Task 出錯
};
(2) 狀態機切換邏輯
  • Scenario 狀態機
    • 在?UpdateStatus()?中根據感知數據(如樣本架地圖類型、任務完成狀態)決定是否切換 Scenario。
    • 示例:如果檢測到地圖類型從 MapA 切換為 MapB,則調用?SetScenario("MapB")
  • Stage 狀態機
    • 在?Run()?中依次執行所有 Task,根據 Task 返回的?TaskStatus?決定是否繼續或切換 Stage。
    • 示例:如果某個 Task 返回?SUCCESS,則執行下一個 Task;如果返回?ERROR,則觸發 Scenario 的重規劃。

4. 樣本架地圖的實現示例

(1) 地圖 A 的 Scenario 實現
// scenarios/map_a_scenario.cpp
class MapAScenario : public ScenarioBase {public:std::string Name() const override { return "MapA"; }bool Init(const std::string& config_file) override {// 加載 Stage 列表(如 Stage1 -> Stage2)stages_.push_back(std::make_shared<Stage1>());stages_.push_back(std::make_shared<Stage2>());return true;}void Process() override {auto& current_stage = stages_[current_stage_index_];auto status = current_stage->Run();if (status == StageStatus::SUCCESS) {// 切換到下一 Stagecurrent_stage_index_++;} else if (status == StageStatus::ERROR) {// 觸發 Scenario 重規劃ResetStageIndex();}}ScenarioStatus UpdateStatus() override {// 根據感知數據判斷是否需要切換 Scenarioif (CheckMapTypeChangedToB()) {return ScenarioStatus::TRANSITION;}return ScenarioStatus::RUNNING;}
};
(2) 地圖 B 的 Scenario 實現
// scenarios/map_b_scenario.cpp
class MapBScenario : public ScenarioBase {public:std::string Name() const override { return "MapB"; }bool Init(const std::string& config_file) override {// 加載 Stage 列表(如 Stage3 -> Stage4)stages_.push_back(std::make_shared<Stage3>());stages_.push_back(std::make_shared<Stage4>());return true;}// ... 其他方法類似
};

5. 配置文件示例

# config/scenario_config.yaml
scenarios:- name: MapAstages:- name: Stage1tasks:- name: Task1- name: Task2- name: Stage2tasks:- name: Task3- name: MapBstages:- name: Stage3tasks:- name: Task4- name: Task5

6. 狀態機管理器(主邏輯)

// main.cpp
int main() {// 1. 加載配置文件std::string config_file = "config/scenario_config.yaml";ScenarioConfig config = LoadScenarioConfig(config_file);// 2. 創建初始 Scenariostd::shared_ptr<ScenarioBase> current_scenario = CreateScenario("MapA");// 3. 初始化 Scenarioif (!current_scenario->Init(config_file)) {return -1;}// 4. 主循環while (true) {// 4.1 執行當前 Scenario 的 Stagecurrent_scenario->Process();// 4.2 更新 Scenario 狀態auto status = current_scenario->UpdateStatus();if (status == ScenarioStatus::SUCCESS) {break;} else if (status == ScenarioStatus::TRANSITION) {// 切換到新的 Scenariostd::string new_scenario_name = GetNextScenarioName();  // 通過感知數據獲取current_scenario = CreateScenario(new_scenario_name);current_scenario->Init(config_file);}}return 0;
}

7. 關鍵設計原則

  1. 解耦與擴展性

    • 通過抽象基類和工廠模式(CreateScenario)實現模塊解耦。
    • 新增 Scenario/Stage/Task 時無需修改現有代碼,只需擴展配置文件和實現類。
  2. 狀態驅動

    • 每個組件(Scenario/Stage/Task)通過返回狀態(SUCCESS/RUNNING/ERROR)驅動狀態機切換。
  3. 配置化

    • 通過 YAML 文件定義 Scenario、Stage、Task 的映射關系,支持快速調整流程。
  4. 容錯性

    • 每個 Stage/Task 的錯誤狀態會觸發上層重規劃或降級策略。

8. 總結

  • 架構層級Scenario → Stage → Task,符合 Apollo 的分層設計。
  • 狀態機實現:通過?Status?枚舉和?NextStage()?方法實現動態切換。
  • 靈活性:支持兩種樣本架地圖的差異化處理,通過配置文件靈活擴展。

你可以根據實際需求補充具體的 Task 邏輯(如路徑規劃、障礙物避讓等),并結合感知模塊的數據驅動狀態機切換。

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

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

相關文章

動手學深度學習13.6. 目標檢測數據集-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記&#xff0c;以及對課后練習的一些思考&#xff0c;自留回顧&#xff0c;也供同學之人交流參考。 本節課程地址&#xff1a;數據集_嗶哩嗶哩_bilibili 本節教材地址&#xff1a;13.6. 目標檢測數據集 — 動手學深度學習 2.0…

Unity3D游戲內存優化指南

前言 Unity3D 游戲的內存控制是保證游戲流暢運行&#xff08;尤其在移動端和主機平臺&#xff09;和避免崩潰的關鍵挑戰。以下是核心策略和常見問題的解決方案&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗…

git學習:首次創建倉庫

文章目錄前言&#xff1a;1、首次創建倉庫并上傳數據1.1 創建倉庫&#xff0c;1.2 命令上傳1.3 首次代碼上傳至倉庫的步驟&#xff1a;2、分支操作2.1 分支的刪除2.2 切換分支2.3 查看分支2.4 同步其他分支的修改3、查看電腦的配置文件4、遠程倉庫命令 git remote5、其他后語前…

C++并行計算:OpenMP與MPI全解析

在高性能計算領域&#xff0c;充分利用硬件資源的并行計算技術已成為剛需。從單節點多核到跨節點集群&#xff0c;開發者需要掌握不同的并行編程模型。本文將系統講解兩種主流并行技術&#xff1a;OpenMP&#xff08;共享內存多核并行&#xff09;與MPI&#xff08;分布式內存集…

TCP 動態選路協議全面研究:OSPF、BGP 與 IS-IS 的比較與應用分析

一、引言&#xff1a;動態選路協議概述 在現代計算機網絡中&#xff0c;路由選擇是數據傳輸的核心功能&#xff0c;它決定了數據包從源到目的地的路徑選擇。隨著網絡規模的不斷擴大和復雜性的增加&#xff0c;靜態路由已經無法滿足網絡動態變化的需求&#xff0c;動態路由協議…

OpenCV 圖像哈希類cv::img_hash::AverageHash

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::img_hash::AverageHash是OpenCV中用于圖像哈希&#xff08;Image Hashing&#xff09;的一個類&#xff0c;屬于opencv_img_hash模塊。它實現了…

【Python-網絡爬蟲】爬蟲的基礎概念介紹

目錄 一、爬蟲的介紹 1.1 爬蟲的概念 1.2 爬蟲的作用 1. 搜索引擎數據索引 2. 商業數據采集與分析 3. 輿情監控與社交分析 4. 學術研究與數據挖掘 5. 信息聚合與服務優化 二、爬蟲的分類 三、爬蟲的基本流程 3.1 基本流程 3.2 Robots協議 一、爬蟲的介紹 1.1 爬蟲的…

力扣-31.下一個排列

題目鏈接 31.下一個排列 class Solution {public void nextPermutation(int[] nums) {//1.從右往左找第一個非逆序的數aint left nums.length - 2; //這里是為了找不到順序對的時候正好停在-1while (left > 0 && nums[left] > nums[left 1]) { //一定要取等號…

Python爬蟲實戰:研究python-nameparser庫相關技術

1. 引言 在當今數字化時代,姓名作為個人身份的重要標識,在許多領域都有著廣泛的應用需求。例如,在客戶關系管理系統中,準確解析姓名可以幫助企業更好地了解客戶背景;在學術研究中,分析作者姓名分布有助于發現研究團隊的地域特征;在社交網絡分析中,姓名信息可以輔助進行…

Android中MVI架構詳解

博主前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住也分享一下給大家 ??點擊跳轉到教程 什么是 MVI 架構? MVI (Model-View-Intent) 是一種單向數據流的架構模式,它源于響應式編程思想。在 MVI 中: 架構圖: 1、Model: 代表的是UI 狀態,它包含了…

AutoGen-AgentChat-3-人機交互

import os from dotenv import load_dotenvload_dotenv()True人機交互 在上一節“團隊”中&#xff0c;我們了解了如何創建、觀察和控制代理團隊。本節將重點介紹如何在應用程序中與團隊進行交互&#xff0c;并向團隊提供人工反饋。 您可以通過兩種主要方式從您的應用程序與團隊…

Flink Db2 CDC 環境配置與驗證

一、DB2 數據庫核心配置 1. 啟用數據庫日志記錄與CDC支持 -- 以DB2管理員身份連接數據庫 CONNECT TO mydb USER db2inst1 USING password;-- 啟用數據庫歸檔日志模式&#xff08;CDC依賴&#xff09; UPDATE DATABASE CONFIGURATION USING LOGARCHMETH1 DISK:/db2log/archive…

初識單例模式

文章目錄場景通點定義實現思路六種 Java 實現餓漢式懶漢式synchronized 方法雙重檢查鎖 Double Check Lock Volatile靜態內部類 Singleton Holder枚舉單例單例運用場景破解單例模式參考場景通點 資源昂貴&#xff1a;數據庫連接池、線程池、日志組件&#xff0c;只需要一份全…

音樂搶單源碼(連單卡單/疊加組規則/打針/多語言)

簡介&#xff1a; 測試環境&#xff1a;Nginx、PHP7.2、MySQL5.6&#xff0c;運行目錄設置為public&#xff0c;偽靜態thinkphp&#xff0c;建議開啟SSL 測試語言&#xff1a;11種 不知道誰給我的一套&#xff0c;說是買來的&#xff0c;我看了一下功能感覺也一般&#…

分類樹查詢性能優化:從 2 秒到 0.1 秒的技術蛻變之路

在電商系統中&#xff0c;分類樹查詢是一個基礎且高頻的功能&#xff0c;然而這個看似簡單的功能背后卻隱藏著不小的性能挑戰。本文將分享我們在實際項目中對分類樹查詢功能進行五次優化的全過程&#xff0c;看如何將查詢耗時從 2 秒縮短至 0.1 秒&#xff0c;為用戶提供更流暢…

Ansible 介紹及安裝

簡介 Ansible 是一款開源的自動化工具&#xff0c;廣泛應用于配置管理、應用部署、任務自動化以及多節點管理等領域。它由 Michael DeHaan 于 2012 年創建&#xff0c;ansible 目前已經已經被紅帽官方收購&#xff0c;是自動化運維工具中大家認可度最高的&#xff0c;并且上手…

超光譜相機的原理和應用場景

超光譜相機是光譜成像技術的尖端形態&#xff0c;具備亞納米級光譜分辨率與超千波段連續覆蓋能力&#xff0c;通過“圖譜合一”的三維數據立方體實現物質的精準識別與分析。其核心技術架構、應用場景及發展趨勢如下&#xff1a;一、核心技術原理1、?分光機制??干涉分光?&am…

掌握MySQL函數:高效數據處理指南

? 在 MySQL 數據庫管理系統中&#xff0c;函數扮演著極為重要的角色。它們就像是數據庫操作的得力助手&#xff0c;能夠幫助開發者高效地完成各種數據處理任務。本文將深入探討 MySQL 函數的方方面面&#xff0c;從其基本概念到實際應用&#xff0c;幫助讀者全面掌握這一強大的…

10.SpringBoot的統一異常處理詳解

文章目錄1. 異常處理基礎概念1.1 什么是異常處理1.2 為什么需要統一異常處理1.3 Spring異常處理機制2. SpringBoot默認異常處理2.1 默認錯誤頁面2.2 自定義錯誤頁面3. 全局異常處理器3.1 基礎全局異常處理器3.2 統一響應格式3.3 使用統一響應格式的異常處理器4. 自定義異常4.1 …