当前位置: 首页 > news >正文

《重构项目》基于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.dtcms.com/a/270563.html

相关文章:

  • 【教程】在ubuntu安装Edge浏览器
  • 工业通讯网关在电子制造中的核心作用——从DeviceNet到Modbus TCP的智能转换
  • 家庭网络中的服务器怎么对外提供服务?
  • 跨平台ROS2视觉数据流:服务器运行IsaacSim+Foxglove本地可视化全攻略
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_dsack
  • NHibernate案例
  • scp:上传大型数据集到实验室服务器
  • 2025年人工智能、虚拟现实与交互设计国际学术会议
  • 蛋白质序列-kappa参数计算算法解读
  • Linux——I/O复用
  • django 一个表中包括id和parentid,如何通过parentid找到全部父爷id
  • 微信小程序91~100
  • 什么是高防 IP?从技术原理到实战部署的深度解析
  • 制作MikTex本地包可用于离线安装包
  • springBoot使用XWPFDocument 和 LoopRowTableRenderPolicy 两种方式填充数据到word模版中
  • ARM单片机滴答定时器理解与应用(一)(详细解析)
  • Node.js 是什么?npm 是什么? Vue 为什么需要他们?
  • CVE-2025-32463复现
  • ✍️ Python 批量设置 Word 文档多级字体样式(标题/正文/名称/小节)
  • PHP 基于模板动态生成 Word 文档:图片 + 表格数据填充全方案(PHPOffice 实战)
  • 使用python 将多个docx文件合并为一个word
  • 【Unity】MiniGame编辑器小游戏(十)连连看【Link】
  • 实时地震分析:AI+Python如何帮我们提前感知大地的怒吼?
  • 使用 Docker 搭建 Go Web 应用开发环境——AI教你学Docker
  • NO.1数据结构绪论|数据结构|逻辑结构|物理结构|算法|算法的度量
  • 从救火到赋能:运维的职责演进与云原生时代的未来图景
  • 聚铭安全管家平台2.0实战解码 | 安服篇(二):无人值守自动化封禁
  • 【Unity】MiniGame编辑器小游戏(十一)消消乐【Crush】
  • 本地Qwen中医问诊小程序系统开发
  • 【目标检测之Ultralytics预测框颜色修改】