我是靠谱客的博主 帅气烧鹅,最近开发中收集的这篇文章主要介绍Apollo预测模块代码结构解析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

       在看Apollo预测部分代码时,一开始被很多的模块搞晕了,一时不知从何下手。而且网上没能找到比较有价值的解析代码结构的博客,因此,在理清了预测部分的结构之后,想到写一篇博客,供同样学习预测模块的伙伴们参考。本篇博客只涉及结构解析,不进行具体的算法分析,如有错误,恳请批评指正。

        预测模块的工作是预测感知模块检测到的障碍物的行为。整个模块的输入是障碍物信息(位置、速度、加速度、方位角)、本车的规划轨迹、本车定位信息; 输出是障碍物的预测轨迹及其概率。预测模块与其他模块的关系如图所示。

        预测模块主要包括四个部分:container、scenario、evaluator和predictor。

        其中,container负责存储输入数据,包括PoseContainer、ADCTrajectoryContainer和ObstacleContainer,分别存储本车定位信息,本车已规划的轨迹信息和障碍物信息。

        scenario的作用是分析本车所处场景。

        evaluator的作用是预测障碍物的路径和速度,并给出一个概率。

        predictor负责生成障碍物的预测轨迹。

        调用这些模块是在prediction_component.cc中,因此,学习预测模块代码首先应从prediction_component.cc开始,预测的主要工作是在函数 PredictionComponent::Proc中进行的。一、prediction_component.cc



localization_reader_->Observe();
auto ptr_localization_msg = localization_reader_->GetLatestObserved();
if (ptr_localization_msg == nullptr) {
AERROR << "Prediction: cannot receive any localization message.";
return false;
}
auto localization_msg = *ptr_localization_msg;
MessageProcess::OnLocalization(localization_msg);

        这一部分代码是读取本车的定位信息,并调用MessageProcess::OnLocalization(localization_msg)更新PoseContainer。



planning_reader_->Observe();
auto ptr_trajectory_msg = planning_reader_->GetLatestObserved();
if (ptr_trajectory_msg != nullptr) {
auto trajectory_msg = *ptr_trajectory_msg;
MessageProcess::OnPlanning(trajectory_msg);

        这一部分代码是读取本车最新一帧的规划信息,并调用MessageProcess::OnPlanning(trajectory_msg)更新ADCTrajectoryContainer。



auto perception_msg = *perception_obstacles;//获取障碍物的感知信息
PredictionObstacles prediction_obstacles;
MessageProcess::OnPerception(perception_msg, &prediction_obstacles);

        这一部分代码是读取障碍物信息,并调用MessageProcess::OnPerception(perception_msg, &prediction_obstacles)进行处理。

        prediction_component.cc最主要的就是这三部分,预测是在MessageProcess::OnPerception()中进行的。


二、message_process.cc

        前边提到的MessageProcess::OnLocalization()、MessageProcess::OnPlanning()和MessageProcess::OnPerception()都是message_process.cc中的函数,其中,主要的预测工作是在通过MessageProcess::OnPerception()调用container、scenario、evaluator和predictor模块来完成的,我们主要介绍MessageProcess::OnPerception()的结构。

ContainerProcess(perception_obstacles); //处理三个container

        首先处理三个container。


ScenarioManager::Instance()->Run();
const Scenario& scenario = ScenarioManager::Instance()->scenario();

        调用scenario_manager.cc中的函数Run(),分析当前场景,并返回当前场景。


EvaluatorManager::Instance()->Run();

        调用evaluator_manager.cc中的函数Run(),针对当前的信息,对障碍物进行评估,给出障碍物可能的运动路径和速度,并输出一个概率。

PredictorManager::Instance()->Run();

        调用predictor_manager.cc中的函数Run(),预测障碍物可能的运动轨迹。

        可以看到,我们前面提到的四个主要模块,是在message_process.cc中调用的。


三、scenario_manager.cc

        scenario_manager.cc中包含两个函数,一个是Run(),主要工作是提取并分析环境特征,确定当前场景;一个是scenario(),主要工作是返回当前场景。

void ScenarioManager::Run() {
auto environment_features = FeatureExtractor::ExtractEnvironmentFeatures();
auto ptr_scenario_features = ScenarioAnalyzer::Analyze(environment_features);
current_scenario_ = ptr_scenario_features->scenario();
}

        在函数Run()中,调用了feature_extractor.cc中的函数ExtractEnvironmentFeatures(),这个函数主要同来提取环境特征,包括自动驾驶车所处车道、相邻车道及前方路口的环境特征。

        提取环境特征之后,调用scenario_analyzer.cc中的Analyze()来分析环境特征。

        在Analyze()中,首先会根据环境特征分析出场景类型,目前只包括两个场景:CRUISE和JUNCTION。根据具体的场景类型,会返回相应的场景特征。


四、evaluator_manager.cc

        在函数Run()中,主要用到了函数EvaluateObstacle()对障碍物进行评估。EvaluateObstacle()输入障碍物信息及环境信息,根据障碍物类型及其所处场景,调用不同的evaluator对障碍物进行评估。这也就不难理解,为什么这部分代码的名字是“evaluator_manager”,因为Apollo中众多的evaluator是通过这部分代码来调用的。

        根据障碍物的类型,evaluator被分为三大类。当障碍物类型为cyclist,可用的evaluator为cyclist_keep_lane_evaluator;当障碍物类型为pedestrian,可用的evaluator为pedestrian_interaction_evaluator;当障碍物类型为vehicle,可用的evaluator为cost_evaluator、cruise_mlp_evaluator、junction_map_evaluator、junction_mlp_evaluator、lane_aggregating_evaluator、lane_scanning_evaluator、mlp_evaluator、rnn_evaluator、semantic_lstm_evaluator。


五、predictor_manager.cc

        在函数Run()中,主要调用了函数PredictObstacles()对障碍物进行预测。在PredictObstacles()中,有两个关于障碍物的变量,一个是perception_obstacle,另一个是obstacle。这两个变量的区别是,perception_obstacle是感知模块给的障碍物,obstacle是perception_obstacle经过处理、去掉了出现频率最少的障碍物之后的结果。用于预测的就是obstacle。

        predictor_manager.cc的作用是根据障碍物的类型及场景,选出合适的predictor来预测障碍物轨迹。

最后

以上就是帅气烧鹅为你收集整理的Apollo预测模块代码结构解析的全部内容,希望文章能够帮你解决Apollo预测模块代码结构解析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部