apollo之规划

规划组件

组件名为PlanningComponent,其依赖PlanningBase

PlanningComponent
-unique_ptr<PlanningBase> planning_base
- shared_ptr<DependencyInjector> injector_
+bool Init()
+bool Proc(shared_ptr<PredictionObstacles> &prediction_obstacles, shared_ptr<Chassis> &chassics, shared_ptr<LocalizationEstimate> &location_estimate)
DependencyInjector
- PlanningContext planning_context_
- FrameHistory frame_history_
- History history_
- EgoInfo ego_info_
- VehicleStateProvider vehicle_state_
- LearningBasedData learning_based_data_
PlanningContext
- PlanningStatus planning_status_
Component
PlanningStatus

PlanningBase

其依赖规划器Planner和交通决策器TrafficDecider

PlanningBase
-shared_ptr<Planner> planner
-TrafficDecider traffic_decider
+string Name()
+void RunOnce(LocalView& local_view, ADCTrajectory* adc_trajectory)
+Plan(doubel current_time_stamp, vector<TrajectoryPoint>& stitching_trajectory, ADCTrajectory* trajectory)
OnLanePlanning
NaviPlanning

处理时序为
在这里插入图片描述

Planner

规划器

Planner
+Status Init(shared_ptr<DependencyInjector>& injector, string& config_path)
+Status Plan(TrajectorPoint& planning_init_point, Frame* frame, ADCTrajectory* ptr_computed_trajectory)
+void Stop()
+string Name()
PlannerWithReferenceLine
+PlanOnReferenceLint(TrajectoryPoint& planning_init_point, Frame* frame, ReferenceLineInfo* reference_line_info)
NaviPlanner
PublicRoadPlanner
LatticePlanner
RTKReplayPlanner

场景Scenario

场景的pipeline配置是在conf/pipeline.pb.txt中

message StagePipeline {
    // The alias name of the stage.
    required string name = 1;
    // The class type of the stage.
    required string type = 2;
    // If the stage is disabled, it will be skipped.
    optional bool enabled = 3;
    // The contained task list of the stage pipeline.
    repeated PluginDeclareInfo task = 4;
    // Task executed when path or speed planning failed.
    optional PluginDeclareInfo fallback_task = 5;
}

message ScenarioPipeline {
    // The contained stage list of the scenarion pipeline.
    repeated StagePipeline stage = 1;
}
Scenario
# ScenarioPipeline scenario_pipeline_config
# Stage current_stage_
# unordered_map<string, StagePipeline*> stage_pipeline_map_
+ScenarioContext* GetContext()
+Init(shared_ptr<DependencyInjector> injector, string&name)
+ScenarioResult Processs(TrajectoryPoint& planning_init_point, Frame* frame)
+bool isTransferable(Scenario* other_scenario, Frame& frame)
+bool Exit(Frame* frame)
+bool Enter(Frame* frame)
Stage
ScenarioPipeline
StagePipeline

在Scenario的process中来控制Stage的转移,isTransferable看场景是否需要切换
场景有一系列的阶段构成,在当前阶段完成后,没有下一阶段,则表示场景完成,需要调用Update来更新场景

场景管理器ScenarioManager

ScenarioManager
- shared_ptr<DependencyInjector> injector_
- shared_ptr<Scenario> current_scenario_
- shared_ptr<Scenario> default_scenario_type_
- vector<shared_ptr>Scenario<> scenario_list_
+bool Init(...)
+void Update(...)
+void Reset(...)

Update:控制场景的变换

阶段Stage

阶段中包含context(为所在场景的上下文)

1
0..n
Stage
# void *context
# string next_stage
# vector<shared_ptr>Task<> task_list_
# StagePipeline pipeline_config_
+StageResult Process(TrajectoryPoint& planning_init_point, Frame* frame)
+Init(StagePipeline& config, shared_ptr<DependencyInjector>& injector, string& config_dir, void*context)
#ExecuteTaskOnReferenceLine(...)
#ExecuteTaskOnReferenceLineForOnlineLeanring(...)
#ExecuteTaskOnOpenSpace(...)
BaseStageCruise
+PathOverlap* GetTrafficSignOverlap(...)
BaseStageCreep
-CreepStageConfig& GetCreepStageConfig(...)
-bool GetOverlapStopInfo()
Task
BaseStageTrafficLightCruise
BaseStageTrafficLightCreep

Init:初始化Task

bool Stage::Init(const StagePipeline& config,
                 const std::shared_ptr<DependencyInjector>& injector,
                 const std::string& config_dir, void* context) {
  pipeline_config_ = config;
  next_stage_ = config.name();
  injector_ = injector;
  name_ = config.name();
  context_ = context;
  injector_->planning_context()
      ->mutable_planning_status()
      ->mutable_scenario()
      ->set_stage_type(name_);
  std::string path_name = ConfigUtil::TransformToPathName(name_);
  std::string task_config_dir = config_dir + "/" + path_name;
  // Load task plugin.
  for (int i = 0; i < pipeline_config_.task_size(); ++i) {
    auto task = pipeline_config_.task(i);
    auto task_type = task.type();
    auto task_ptr = apollo::cyber::plugin_manager::PluginManager::Instance()
                        ->CreateInstance<Task>(
                            ConfigUtil::GetFullPlanningClassName(task_type));
    if (nullptr == task_ptr) {
      AERROR << "Create task " << task.name() << " of " << name_ << " failed!";
      return false;
    }
    if (task_ptr->Init(task_config_dir, task.name(), injector)) {
      task_list_.push_back(task_ptr);
    } else {
      AERROR << task.name() << " init failed!";
      return false;
    }
  }
  // Load trajectory fallback task.
  // If fallback task is not set, use "FastStopTrajectoryFallback" as default.
  std::string fallback_task_type = "FastStopTrajectoryFallback";
  std::string fallback_task_name = "FAST_STOP_TRAJECTORY_FALLBACK";
  if (pipeline_config_.has_fallback_task()) {
    fallback_task_type = pipeline_config_.fallback_task().type();
    fallback_task_name = pipeline_config_.fallback_task().name();
  }
  fallback_task_ =
      apollo::cyber::plugin_manager::PluginManager::Instance()
          ->CreateInstance<Task>(
              ConfigUtil::GetFullPlanningClassName(fallback_task_type));
  if (nullptr == fallback_task_) {
    AERROR << "Create fallback task " << fallback_task_name << " of " << name_
           << " failed!";
    return false;
  }
  if (!fallback_task_->Init(task_config_dir, fallback_task_name, injector)) {
    AERROR << fallback_task_name << " init failed!";
    return false;
  }
  return true;
}

ExecuteTaskOnReferenceLineExecuteTaskOnReferenceLineForOnlineLeanringExecuteTaskOnOpenSpace:会调用Task的Execute方法

StageResult Stage::ExecuteTaskOnReferenceLine(
    const common::TrajectoryPoint& planning_start_point, Frame* frame) {
  StageResult stage_result;
  if (frame->reference_line_info().empty()) {
    AERROR << "referenceline is empty in stage" << name_;
    return stage_result.SetStageStatus(StageStatusType::ERROR);
  }
  for (auto& reference_line_info : *frame->mutable_reference_line_info()) {
    if (!reference_line_info.IsDrivable()) {
      AERROR << "The generated path is not drivable skip";
      reference_line_info.SetDrivable(false);
      continue;
    }

    if (reference_line_info.IsChangeLanePath()) {
      AERROR << "The generated refline is change lane path, skip";
      reference_line_info.SetDrivable(false);
      continue;
    }
    common::Status ret = common::Status::OK();
    for (auto task : task_list_) {
      const double start_timestamp = Clock::NowInSeconds();

      ret = task->Execute(frame, &reference_line_info);

      const double end_timestamp = Clock::NowInSeconds();
      const double time_diff_ms = (end_timestamp - start_timestamp) * 1000;
      ADEBUG << "after task[" << task->Name()
             << "]: " << reference_line_info.PathSpeedDebugString();
      ADEBUG << task->Name() << " time spend: " << time_diff_ms << " ms.";
      AINFO << "Planning Perf: task name [" << task->Name() << "], "
            << time_diff_ms << " ms.";
      RecordDebugInfo(&reference_line_info, task->Name(), time_diff_ms);

      if (!ret.ok()) {
        stage_result.SetTaskStatus(ret);
        AERROR << "Failed to run tasks[" << task->Name()
               << "], Error message: " << ret.error_message();
        break;
      }
    }
    // Generate fallback trajectory in case of task error.
    if (!ret.ok()) {
      fallback_task_->Execute(frame, &reference_line_info);
    }
    DiscretizedTrajectory trajectory;
    if (!reference_line_info.CombinePathAndSpeedProfile(
            planning_start_point.relative_time(),
            planning_start_point.path_point().s(), &trajectory)) {
      AERROR << "Fail to aggregate planning trajectory."
             << reference_line_info.IsChangeLanePath();
      reference_line_info.SetDrivable(false);
      continue;
    }
    reference_line_info.SetTrajectory(trajectory);
    reference_line_info.SetDrivable(true);
    return stage_result;
  }
  return stage_result;
}

StageResult Stage::ExecuteTaskOnReferenceLineForOnlineLearning(
    const common::TrajectoryPoint& planning_start_point, Frame* frame) {
  // online learning mode
  for (auto& reference_line_info : *frame->mutable_reference_line_info()) {
    reference_line_info.SetDrivable(false);
  }

  StageResult stage_result;
  // FIXME(all): current only pick up the first reference line to use
  // learning model trajectory
  auto& picked_reference_line_info =
      frame->mutable_reference_line_info()->front();
  for (auto task : task_list_) {
    const double start_timestamp = Clock::NowInSeconds();

    const auto ret = task->Execute(frame, &picked_reference_line_info);

    const double end_timestamp = Clock::NowInSeconds();
    const double time_diff_ms = (end_timestamp - start_timestamp) * 1000;
    ADEBUG << "task[" << task->Name() << "] time spent: " << time_diff_ms
           << " ms.";
    RecordDebugInfo(&picked_reference_line_info, task->Name(), time_diff_ms);

    if (!ret.ok()) {
      stage_result.SetTaskStatus(ret);
      AERROR << "Failed to run tasks[" << task->Name()
             << "], Error message: " << ret.error_message();
      break;
    }
  }

  const std::vector<common::TrajectoryPoint>& adc_future_trajectory_points =
      picked_reference_line_info.trajectory();
  DiscretizedTrajectory trajectory;
  if (picked_reference_line_info.AdjustTrajectoryWhichStartsFromCurrentPos(
          planning_start_point, adc_future_trajectory_points, &trajectory)) {
    picked_reference_line_info.SetTrajectory(trajectory);
    picked_reference_line_info.SetDrivable(true);
    picked_reference_line_info.SetCost(0);
  }

  return stage_result;
}

StageResult Stage::ExecuteTaskOnOpenSpace(Frame* frame) {
  auto ret = common::Status::OK();
  StageResult stage_result;
  for (auto task : task_list_) {
    const double start_timestamp = Clock::NowInSeconds();

    ret = task->Execute(frame);

    if (!ret.ok()) {
      stage_result.SetTaskStatus(ret);
      AERROR << "Failed to run tasks[" << task->Name()
             << "], Error message: " << ret.error_message();
      const double end_timestamp = Clock::NowInSeconds();
      const double time_diff_ms = (end_timestamp - start_timestamp) * 1000;
      AINFO << "Planning Perf: task name [" << task->Name() << "], "
            << time_diff_ms << " ms.";
      return stage_result;
    }

    const double end_timestamp = Clock::NowInSeconds();
    const double time_diff_ms = (end_timestamp - start_timestamp) * 1000;
    AINFO << "Planning Perf: task name [" << task->Name() << "], "
          << time_diff_ms << " ms.";
  }

  if (frame->open_space_info().fallback_flag() ||
      frame->open_space_info().stop_flag()) {
    auto& trajectory = frame->open_space_info().fallback_trajectory().first;
    auto& gear = frame->open_space_info().fallback_trajectory().second;
    PublishableTrajectory publishable_trajectory(Clock::NowInSeconds(),
                                                 trajectory);
    auto publishable_traj_and_gear =
        std::make_pair(std::move(publishable_trajectory), gear);

    *(frame->mutable_open_space_info()->mutable_publishable_trajectory_data()) =
        std::move(publishable_traj_and_gear);
  } else {
    auto& trajectory =
        frame->open_space_info().chosen_partitioned_trajectory().first;
    auto& gear =
        frame->open_space_info().chosen_partitioned_trajectory().second;
    PublishableTrajectory publishable_trajectory(Clock::NowInSeconds(),
                                                 trajectory);
    auto publishable_traj_and_gear =
        std::make_pair(std::move(publishable_trajectory), gear);

    *(frame->mutable_open_space_info()->mutable_publishable_trajectory_data()) =
        std::move(publishable_traj_and_gear);
  }
  return stage_result;
}

具体的Stage实现类在modules/planning/scenarios下

任务Task
Task
+Init(string& config_dir, string& name, shared_ptr<DependencyInjector> injector)
+Status Execute(Frame* frame, ReferenceLineInfo* lineInfo)
+Status Execute(Frame* frame)
TrajectoryFallbackTask
-GenerateFallbackSpeed(...)
TrajectoryOptimizer
-Status Process()
SpeedOptimizer
#Status Process(...)
PathGeneration
#Status Process(Frame* frame, ReferenceLineInfo* lineInfo)
#Status Process(Frame* frame)
Decider
#Status Process(Frame* frame, ReferenceLineInfo* lineInfo)
#Status Process(Frame* frame)
//SpeedOptimizer的处理抽象方法
virtual common::Status Process(const PathData& path_data,
                                 const common::TrajectoryPoint& init_point,
                                 SpeedData* const speed_data) = 0;
//TrajectoryOptimizer的处理抽象方法
virtual apollo::common::Status Process() = 0;

具体的Task实现类在modules/planning/tasks下
Init:任务初始化

bool Task::Init(const std::string& config_dir, const std::string& name,
                const std::shared_ptr<DependencyInjector>& injector) {
  injector_ = injector;
  name_ = name;
  config_path_ =
      config_dir + "/" + ConfigUtil::TransformToPathName(name) + ".pb.txt";

  // Get the name of this class.
  int status;
  std::string class_name =
      abi::__cxa_demangle(typeid(*this).name(), 0, 0, &status);
  // Generate the default task config path from PluginManager.
  default_config_path_ =
      apollo::cyber::plugin_manager::PluginManager::Instance()
          ->GetPluginConfPath<Task>(class_name, "conf/default_conf.pb.txt");
  return true;
}

Execute:任务执行,将参数赋值给成员frame_,reference_line_info_,其它交给具体任务的处理虚函数执行

Status Task::Execute(Frame* frame, ReferenceLineInfo* reference_line_info) {
  frame_ = frame;
  reference_line_info_ = reference_line_info;
  return Status::OK();
}

Status Task::Execute(Frame* frame) {
  frame_ = frame;
  return Status::OK();
}
### Apollo 自动驾驶速度规划模块实现与优化 #### 速度规划的重要性 在自动驾驶系统中,速度规划是确保车辆能够安全高效行驶的关键组成部分之一。合理的速度规划不仅有助于提升乘客舒适度,还能有效应对复杂的道路环境变化。 #### 实现机制 Apollo平台的速度规划紧密依赖于路径规划的结果,在此基础上进一步细化每一段路程的具体行驶速度。通过结合实时路况信息以及预设的安全参数,如最大加速度、最小跟车距离等,来调整预期的行车速率[^1]。 对于具体的实现细节而言: - **状态空间构建**:类似于路径规划部分提到的状态离散化操作,这里同样会将时间维度上的连续运动转化为一系列离散的时间片段内的动作序列。 - **目标函数设计**:考虑到实际应用需求,通常会在满足基本物理规律的前提下追求最短耗时或是最低能耗的目标。这涉及到对不同路段设置不同的权重因子来进行综合评估[^4]。 - **约束条件设定**:除了遵循交通法规外,还需顾及到诸如红绿灯等待、行人避让等情况所带来的临时限速要求;另外也要防止因急加速减速而引发不必要的震动感传递给车内人员[^2]。 #### 技术亮点 为了更好地适应复杂多变的城市交通状况并保障乘员体验质量,Apollo团队引入了一系列先进的技术和理念用于改进速度规划效果: - 利用了机器学习模型预测前方可能出现的风险因素及其影响程度,提前做好准备措施; - 结合高精度地图数据精确掌握各条线路特征,从而制定更为贴切的实际运行方案; - 应用强化学习框架训练智能体自主探索更优解法,不断提高系统的鲁棒性和泛化能力[^3]。 ```python def speed_planner(path_points, traffic_rules, vehicle_dynamics): """ Generate optimal velocity profile based on given path points and constraints. Args: path_points (list): List of waypoints along the planned route. traffic_rules (dict): Dictionary containing relevant traffic regulations. vehicle_dynamics (object): Object representing dynamic properties of ego car. Returns: list: A sequence of velocities corresponding to each point in `path_points`. """ # Initialize parameters according to current environment context... init_params() # Define optimization problem formulation here... # Solve using appropriate algorithm such as IPOPT or similar solvers... return optimized_velocity_profile ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值