ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Apollo学习——预测

2022-06-11 22:35:02  阅读:208  来源: 互联网

标签:container 预测 obstacles 信息 学习 manager reader Apollo ptr


前言

本文将对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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有