查看原文
其他

开发者说|Apollo预测模块解析

The following article is from 分子运动 Author 王方浩


下面是由社区开发者—王方浩提供的文章,本文主要介绍Apollo预测模块解析。


    ENJOY THE FOLLOWING  


本文将主要从以下几个方面来介绍:
  • 预测模块主流程

  • 3个容器类型

  • 评估器和预测器

  • 调试技巧



学习Apollo预测模块之前,首先要了解的就是预测模块的整体流程。预测模块包括以下三大主流程:消息主流程、数据主流程和代码主流程。搞清楚了上述3大流程也就清楚了预测模块的整体结构,理解起来也就事半功倍。


消息主流程

如下图所示,预测模块主要是接收感知到的障碍物消息,然后结合自身的位置和规划信息,输出的结果是障碍物未来一小段时间的预测轨迹。



数据主流程

数据主流程的作用主要是为了帮助训练,例如在线无人车预测的数据,可以保存下来给离线使用。同时在调试的时候也可以通过跑离线任务来定位问题。



代码主流程

预测模块的代码相对比较简单,主流程在"message_process.cc"中,然后通过评估器和预测器来输出最后的预测结果。其中不同的障碍物类型对应不同的评估器和预测器。




除三大流程外,预测模块的数据结构主要为3个容器类型,实际上搞清楚这三个容器,可以很大程度帮助我们理解预测模块。这三个容器分别是:

  • pose_container   (自动驾驶车辆当前的位置信息)

  • adc_trajectory_container (自动驾驶车辆规划的轨迹信息)

  • obstacles_container (感知到的障碍物信息)


pose_container

pose_container相对比较简单,主要是保持自动驾驶车辆自身的位置和速度信息。也就是说后期预测的时候也会把障碍物和自身车辆同时进行考虑。



adc_trajectory_container

adc_trajectory_container主要保存自动驾驶车辆规划好的轨迹,比如自动驾驶车辆自身的驾驶意图。和pose_container一样是用来考虑障碍物和自动驾驶车辆本身的交互。



obstacles_container

obstacles_container主要用来保存障碍物信息,采用了一个LRUcache来保持障碍物,并且定期淘汰过期的障碍物。同时还会对障碍物进行聚类,找出同一条车道上的所有障碍物,组成障碍物簇。



路网(RoadGraph)

因为在添加障碍物的时候,会计算出当前障碍物可能的行驶路径,也就是说未来障碍物有几种可能的驾驶路径选择,这通过路网(RoadGraph)来实现。下面是一个简单的例子,障碍物有2种路径选择,一种是直行,对应的车道分别是:l20,l98,l95;一种是右拐,对应的车道分别是:l20,l31,l29。




预测模块会根据不同的障碍物类型,选择不同的评估器和预测器。同时还会根据判断障碍物是否在车道上,选择不同的评估器件和预测器,下面为评估器和预测器的框图:



评估器

首先介绍评估器,一共有以下几种评估器,大部分都是深度学习模型,有少量的基于规则的模型。

  • cyclist_keep_lane_evaluator

  • pedestrian_interaction_evaluator

  • mlp_evaluator

  • cruise_mlp_evaluator

  • junction_mlp_evaluator

  • junction_map_evaluator


单车在路上的评估器,是基于规则的模型,只要当前的自行车在之前生成好的车道序列(自行车可能的行驶路径)上,那么就认为单车会保持当前车道。下图可以看出单车有2种选择,一种是左拐,一种是直行,那么这2个路径的概率都是1,之后会把结果交给预测器去选择。

在车道选择比较多的情况下,生成好的车道序列最多限制大小为4条,本车道最多选择2条,相邻车道最多选择2条。



接下来介绍行人,行人的预测采用的是LSTM的模型,最多预测2s的轨迹,行人没有区分在不在路上,默认为行人是一个自由移动的模型。



此外还有在车道上的UNKNOW类型,用的是mlp_evaluator模型。它是一个神经网络,输入的特征主要是障碍物的轨迹和车道的误差(位置、夹角、速度等)来判断车辆拐弯的概率和直行的概率。



然后是在路上的车辆模型,在路上的车辆模型也是神经网络,和mlp_evaluator的区别不是很大,主要是输入特征的选取有细微差别。



最后介绍路口的评估器,路口的情况比较复杂,这里把路口分为12等分,然后预测障碍物可能的出口,同时还要考虑车辆和本车之间路径是否有冲突,最后得出预测的结果。



预测器
接下来介绍预测器。一共有以下几种预测器,预测器最后的输出是一系列的轨迹点。

  • move_sequence_predictor

  • interaction_predictor

  • lane_sequence_predictor

  • free_move_predictor


free_move_predictor

首先介绍free_move_predictor,free_move_predictor是自由移动评估器,主要是预测不在路上的所有类型的障碍物以及行人,之前行人通过pedestrian_interaction_evaluator评估之后,只有2s的预测轨迹,后面会通过free_move_predictor补充6s的轨迹,一共预测8s。free_move_predictor是通过当前的速度和朝向拟合的8s轨迹,因此变化非常大,表现为预测线会甩来甩去的。



lane_sequence_predictor

lane_sequence_predictor会根据评估的车道,过滤一些不太可能的车道,然后再选择一条曲率最低的路径。



move_sequence_predictor

move_sequence_predictor和lane_sequence_predictor有轻微不同,主要不同在生成轨迹的部分(DrawMoveSequenceTrajectoryPoints),进行了多项式拟合EvaluateQuarticPolynomial。



Apollo的预测模块有2种调试方式,一种是离线模式,另外一种是跑测试用例。



离线模式的打开方式如下:


离线模型的结果是一些特征和预测的信息,可以帮助我们分析。


测试用例

预测用到的地图是kml_map.bin,下面是可视化的结果。


然后就可以结合地图和每个评估器、预测器的测试用例来熟悉和测试它们的功能。



以上就是Apollo预测模块解析的介绍和分享,还遗留的主要问题是路口的预测器没有进行深入分析,同时对神经网络的部分也没有进行训练和重构,后期有时间会做进一步的学习。希望对大家的学习有帮助!



*Apollo预测模块分享

https://mp.weixin.qq.com/s/Wi-7RcpIQGeeuNOsUYi84A


以上是 "Apollo预测模块解析" 的全部内容,更多讨论请扫描二维码添加『Apollo小哥哥』为好友,进开发者交流群。欢迎开发者们踊跃投稿,技术交流,共同进步,我们将为热爱技术交流、贡献心得的你送上诚意惊喜,期待与每位开发者一起探索、共赴星海!



©️著作权归作者所有,如需转载,请注明出处,否则将追究法律责任。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存