版本:apollo5.0以上
1、模块理解
首先需要理解Planning模块是基于Scenario、Stage、Task这样的层次来进行的,即:场景->步骤->具体的决策方法。Apollo可以应对自动驾驶所面临的不同道路场景,都是通过Scenario统一注册与管理。Scenario通过一个有限状态机来判断选择当前行车场景,每个Scenario下又有多个Stage,指当前场景下需要执行的粗略步骤,例如泊车分为两个Stage:泊车前的制动停车、车辆停止之后开始泊车。Task会列出该Stage的具体方法。
2、代码示例
现在看代码,首先是场景的判断
apollo-master\modules\planning\scenarios\scenario_manager.cc
首先调用ValetParkingScenario::IsTransferable函数对场景进行条件判断,如果条件满足才会调用VALET_PARKING 的Scenario泊车场景。
ScenarioConfig::ScenarioType ScenarioManager::SelectValetParkingScenario(
const Frame& frame) {
const auto& scenario_config =
config_map_[ScenarioConfig::VALET_PARKING].valet_parking_config();
// TODO(All) trigger valet parking by route message definition as of now
double parking_spot_range_to_start =
scenario_config.parking_spot_range_to_start();
if (scenario::valet_parking::ValetParkingScenario::IsTransferable(
frame, parking_spot_range_to_start)) {