其他分享
首页 > 其他分享> > Apollo学习——预测

Apollo学习——预测

作者:互联网

前言

本文将对Apollo预测模块进行梳理,了解Apollo中进行预测的具体流程和工作原理





如上述架构图所示,预测处于感知与规划之间,它会对感知到的障碍物信息进行分析,并对障碍物未来一段时间内的行为及轨迹进行预测,并将信息反馈到规划模块,使规划模块能够生成更加合理、安全的轨迹

我会根据每个不同的文件,来对Apollo预测模块进行解读

1. ReadMe

预测模块中的ReadMe出了该模块的输入、输出和功能


2.prdiction_component

在predictiond模块中,可以看到prdiction_component,其会对该模块进行相关初始化操作

// 如果需要,则对该模块下相关数据进行初始化
bool Init() override;
//init中主要对相关Manager对象以及向cyber中的reader和writer进行对应初始化
// 接收感知模块传来的障碍信息进行处理
bool Proc(const std::shared_ptr<perception::PerceptionObstacles>&) override;
//头文件中同时设置了四个管理器对象
  std::shared_ptr<ContainerManager> container_manager_;//容器

  std::unique_ptr<EvaluatorManager> evaluator_manager_;//评估

  std::unique_ptr<PredictorManager> predictor_manager_;//预测

  std::unique_ptr<ScenarioManager> scenario_manager_;//场景

//...还有cyber相关的reader和writer...
 std::shared_ptr<cyber::Reader<planning::ADCTrajectory>> planning_reader_;//读取规划信息(作用未知)

  std::shared_ptr<cyber::Reader<localization::LocalizationEstimate>>
      localization_reader_;//读取位置信息(作用未知)

  std::shared_ptr<cyber::Reader<storytelling::Stories>> storytelling_reader_;//storytelling?

2.1 Proc

该函数会对接收到的信息进行处理,对信息处理这里使用了两种情况:ContainerSubmoduleProcess和PredictionEndToEndProc
这里主要对PredictionEndToEndProc进行解读

//1.对位置信息进行获取(本车位置信息?)
localization_reader_->Observe();//observer()调用的node中的数据
auto ptr_localization_msg = localization_reader_->GetLatestObserved();//获取最新的位置信息(获取message对列中前面的数据块)
  MessageProcess::OnLocalization(container_manager_.get(),
                                 *ptr_localization_msg);

//2. 读取storytelling模块信息(stroytell作用?)
storytelling_reader_->Observe();
  auto ptr_storytelling_msg = storytelling_reader_->GetLatestObserved();//同理
//读取最后一帧规划信息(但规划需要先有预测?)
  if (ptr_storytelling_msg != nullptr) {
    MessageProcess::OnStoryTelling(container_manager_.get(),*ptr_storytelling_msg);
  }
planning_reader_->Observe();
  auto ptr_trajectory_msg = planning_reader_->GetLatestObserved();
if (ptr_trajectory_msg != nullptr) {
    MessageProcess::OnPlanning(container_manager_.get(), *ptr_trajectory_msg);
  }
//3. 读取感知的障碍物信息
auto perception_msg = *perception_obstacles;
PredictionObstacles prediction_obstacles;
 MessageProcess::OnPerception(
      perception_msg, container_manager_, evaluator_manager_.get(),
      predictor_manager_.get(), scenario_manager_.get(), &prediction_obstacles);
//在得到prediction_obstacles后,会有一些后续处理

在对信息进行处理过程中,可以发现都是从localization_reader、storytelling_reader_、planning_reader_中读取信息,并且交由MessageProcess类进行处理,MessageProcess处理就是将这些信息存放到对应的容器中去,最后调用MessageProcess::OnPerception,其中会使用评估器、预测器来对获取的信息进行处理

3.MessageProcess

PredictionEndToEndProc对数据进行获取,其中各个reader读取最新的消息,这些消息读取后存储至对应的容器中去。MessageProcess会对不同容器进行管理,同时调用OnPerception进行处理。下面则是MessageProcess的头文件

  //这里会对容器、评估器、预测器进行初始化
  static bool Init(ContainerManager *container_manager,
                   EvaluatorManager *evaluator_manager,
                   PredictorManager *predictor_manager,
                   const PredictionConf &prediction_conf);
  static bool InitContainers(ContainerManager *container_manager);

  static bool InitEvaluators(EvaluatorManager *evaluator_manager,
                             const PredictionConf &prediction_conf);

  static bool InitPredictors(PredictorManager *predictor_manager,
                             const PredictionConf &prediction_conf);
  //通过获取的容器、评估器、预测器、场景对障碍物信息进行处理(主要)
  static void OnPerception(
      const perception::PerceptionObstacles &perception_obstacles,
      const std::shared_ptr<ContainerManager> &container_manager,
      EvaluatorManager *evaluator_manager, PredictorManager *predictor_manager,
      ScenarioManager *scenario_manager,
      PredictionObstacles *const prediction_obstacles);

  //将获取的相关信息,存储到对应容器中去,例如localization信息,存到PoseContainer中(在Prediction中存储了多个容器,来存储不同对象的信息)
  static void OnLocalization(
      ContainerManager *container_manager,
      const localization::LocalizationEstimate &localization);

  static void OnPlanning(ContainerManager *container_manager,
                         const planning::ADCTrajectory &adc_trajectory);

  static void OnStoryTelling(ContainerManager *container_manager,
                             const storytelling::Stories &story);

MessageProcess中OnPerception是对获取的感知数据进行处理,并进行相关的评估、预测

//对容器信息进行处理
//这里会将container_manager中的相关信息进行处理,其中一个就是将scenario_manager中的信息提取,每个障碍物中会存储其对应的场景信息
ContainerProcess(container_manager, perception_obstacles, scenario_manager);
//将障碍物信息获取
  auto ptr_obstacles_container =
      container_manager->GetContainer<ObstaclesContainer>(
          AdapterConfig::PERCEPTION_OBSTACLES);
  CHECK_NOTNULL(ptr_obstacles_container);

//获取规划曲线容器(规划怎么结合呢?)
  auto ptr_ego_trajectory_container =
      container_manager->GetContainer<ADCTrajectoryContainer>(
          AdapterConfig::PLANNING_TRAJECTORY);
  CHECK_NOTNULL(ptr_ego_trajectory_container);

//评估器运行(obstacles信息和规划信息)
evaluator_manager->Run(ptr_ego_trajectory_container,ptr_obstacles_container);
//预测器运行
predictor_manager->Run(perception_obstacles, ptr_ego_trajectory_container,ptr_obstacles_container);
//将结果返回,prediction_obstacles传进来的就是指针,相当于返回了
*prediction_obstacles = predictor_manager->prediction_obstacles();

在OnPerception将容器的中的相关信息再做一个处理,然后通过获取obstacles、planing的相关信息进行评估和预测

4.Evaluator

标签:container,预测,obstacles,信息,学习,manager,reader,Apollo,ptr
来源: https://www.cnblogs.com/wlm-198/p/16366869.html