开发者说|Apollo预测模块解析
The following article is from 分子运动 Author 王方浩
预测模块主流程
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预测模块解析的介绍和分享,还遗留的主要问题是路口的预测器没有进行深入分析,同时对神经网络的部分也没有进行训练和重构,后期有时间会做进一步的学习。希望对大家的学习有帮助!
https://mp.weixin.qq.com/s/Wi-7RcpIQGeeuNOsUYi84A
以上是 "Apollo预测模块解析" 的全部内容,更多讨论请扫描二维码添加『Apollo小哥哥』为好友,进开发者交流群。欢迎开发者们踊跃投稿,技术交流,共同进步,我们将为热爱技术交流、贡献心得的你送上诚意惊喜,期待与每位开发者一起探索、共赴星海!