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/ # 头文件
// base/scenario_base.h
class ScenarioBase {
public:
virtual ~ScenarioBase() = default;
// 初始化 Scenario(如加载配置、初始化 Stage 列表)
virtual bool Init(const std::string& config_file) = 0;
// 执行当前 Stage 的 Task
virtual void Process() = 0;
// 状态机切换接口:根据条件判断是否切换 Stage 或 Scenario
virtual ScenarioStatus UpdateStatus() = 0;
// 获取当前 Stage 名称
virtual std::string GetCurrentStageName() const = 0;
protected:
std::string name_; // Scenario 名称(如 MapA/MapB)
std::vector> stages_; // 当前 Scenario 的 Stage 列表
size_t current_stage_index_ = 0; // 当前 Stage 的索引
};
// base/stage_base.h
class StageBase {
public:
virtual ~StageBase() = default;
// 执行当前 Stage 的所有 Task
virtual 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> tasks_; // 当前 Stage 的 Task 列表
};
// base/task_base.h
class TaskBase {
public:
virtual ~TaskBase() = default;
// 执行单个 Task 的逻辑
virtual TaskStatus Execute() = 0;
// 获取 Task 名称
virtual std::string Name() const = 0;
};
// 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 出错
};
UpdateStatus()
中根据感知数据(如样本架地图类型、任务完成状态)决定是否切换 Scenario。SetScenario("MapB")
。Run()
中依次执行所有 Task,根据 Task 返回的 TaskStatus
决定是否继续或切换 Stage。SUCCESS
,则执行下一个 Task;如果返回 ERROR
,则触发 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());
stages_.push_back(std::make_shared());
return true;
}
void Process() override {
auto& current_stage = stages_[current_stage_index_];
auto status = current_stage->Run();
if (status == StageStatus::SUCCESS) {
// 切换到下一 Stage
current_stage_index_++;
} else if (status == StageStatus::ERROR) {
// 触发 Scenario 重规划
ResetStageIndex();
}
}
ScenarioStatus UpdateStatus() override {
// 根据感知数据判断是否需要切换 Scenario
if (CheckMapTypeChangedToB()) {
return ScenarioStatus::TRANSITION;
}
return ScenarioStatus::RUNNING;
}
};
// 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());
stages_.push_back(std::make_shared());
return true;
}
// ... 其他方法类似
};
# config/scenario_config.yaml
scenarios:
- name: MapA
stages:
- name: Stage1
tasks:
- name: Task1
- name: Task2
- name: Stage2
tasks:
- name: Task3
- name: MapB
stages:
- name: Stage3
tasks:
- name: Task4
- name: Task5
// main.cpp
int main() {
// 1. 加载配置文件
std::string config_file = "config/scenario_config.yaml";
ScenarioConfig config = LoadScenarioConfig(config_file);
// 2. 创建初始 Scenario
std::shared_ptr current_scenario = CreateScenario("MapA");
// 3. 初始化 Scenario
if (!current_scenario->Init(config_file)) {
return -1;
}
// 4. 主循环
while (true) {
// 4.1 执行当前 Scenario 的 Stage
current_scenario->Process();
// 4.2 更新 Scenario 状态
auto status = current_scenario->UpdateStatus();
if (status == ScenarioStatus::SUCCESS) {
break;
} else if (status == ScenarioStatus::TRANSITION) {
// 切换到新的 Scenario
std::string new_scenario_name = GetNextScenarioName(); // 通过感知数据获取
current_scenario = CreateScenario(new_scenario_name);
current_scenario->Init(config_file);
}
}
return 0;
}
解耦与扩展性:
CreateScenario
)实现模块解耦。状态驱动:
配置化:
容错性:
Scenario → Stage → Task
,符合 Apollo 的分层设计。Status
枚举和 NextStage()
方法实现动态切换。你可以根据实际需求补充具体的 Task 逻辑(如路径规划、障碍物避让等),并结合感知模块的数据驱动状态机切换。