我是靠谱客的博主 高大微笑,最近开发中收集的这篇文章主要介绍Apollo6.0轨迹预测算法分析文章内容Evaluator模块Predictor模块,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章内容

分析Apollo6.0轨迹预测模块里面所使用的方法,主要是 evaluatorpredictor两个模块中的函数,分析里面每个函数的作用和输入输出。最好配合代码食用 Apollo/Prediction

Evaluator模块

Cyclists_keep_lane:

Input: curr_lane_id, lane_sequence
Output: Probability(0或1)
作用: 判断自行车每条可能路径mutable_lane_sequence的第一个lane的id是否为当前自行车所在的lane_id, 是则将该条mutable_lane_sequence的概率设为1

PedestrianInteraction:

Input: pos_x, pos_y, rel_x, rel_y
Output: trajectory
作用: 将rel_x, rel_y输入LSTM网络中, 网络输出的是每一次新的rel_x和rel_y的值,设置predicted trajectory的初始位置为pos_x, pos_y 通过上一个位置的坐标叠加一次LSTM生成的rel_x和rel_y的值获得一个新的点,计算出这个点和上一个点的位置差值得到新的rel_x和rel_y输入网络。
网络参数:
kGridSize = 2;
kEmbeddingSize = 64;
kHiddenSize = 128;
kShortTermPredictionTimeResolution = 0.4;
kShortTermPredictionPointNum = 5;
kHiddenStateUpdateCycle = 4;
疑问: social_embedding没用?

CostEvaluator:

Input: obstacle_length, obstacle_width, lane_sequence
Output: Probability
作用: 根据障碍车每条可能路径mutable_lane_sequence的第一个lane的第一个LanePoint 和 障碍物的长度宽度信息计算出该条lane_sequence的cost,cost经过一个Sigmoid函数得到这条lane_sequence的概率。
Probability = Sigmoid(Cost)
Cost = width / 2 - abs( l - length / 2 * sin(angle_diff) )
疑问: angle_diff具体含义?

CruiseMLPEvaluator:

Input: 23 + 5 * 9 + 4 * 20 = 148 个特征值
Output: probability, time_to_lane_center
作用: 根据障碍车的每条可能路径mutable_lane_sequence的148个特征值输入进mlp中,得到该条路径的probability和障碍物的time_to_lane_center,通过判断障碍物是否on lane, 采用两个不同的模型分别预测。
网络参数:
OBSTACLE_FEATURE_SIZE = 23 + 5 * 9;
INTERACTION_FEATURE_SIZE = 8;
SINGLE_LANE_FEATURE_SIZE = 4;
LANE_POINTS_SIZE = 20;

JunctionMapEvaluator:

Input: junction的12 个特征值 + junction 的 semantic_map
Output: junction每个exit出口对应的 lane_sequence 的概率
作用: 根据障碍车的每条可能路径mutable_lane_sequence的148个特征值输入进mlp中,得到该条路径的probability和障碍物的time_to_lane_center,通过判断障碍物是否on lane, 采用两个不同的模型分别预测。
网络参数:
JUNCTION_FEATURE_SIZE = 12

JunctionMLPEvaluator:

Input: 114个特征值
Output: probability
作用: 多层感知机输入114个参数,输出每个出口对应的每条lane_sequence的概率。
网络参数:
// obstacle feature with 4 basic features and 5 frames of history position
static const size_t OBSTACLE_FEATURE_SIZE = 4 + 2 * 5;
// ego vehicle feature of position and velocity
static const size_t EGO_VEHICLE_FEATURE_SIZE = 4;
// junction feature on 12 fan area 8 dim each
static const size_t JUNCTION_FEATURE_SIZE = 12 * 8;

LaneAggregatingEvaluator:

Input: 20 * 9 = 180个障碍物特征值 + 前方50m和后方25m的一共(100+50) * 4 =600个道路特征值,一共780个特征值,encoding之后作为网络输入。
Output: 各条可能的lane_sequence的probability,其中只有一条为1,其余为0。
作用: 先对180个障碍物特征值进行encoding,然后对每条lane_sequence进行encoding,将两个encoding进行合并输入网络中,得到该条道路的probability,得到所有道路的probability之后用一个softmax将最有可能的那条道路的probability设为1,其余设为0.。
网络参数:
OBSTACLE_FEATURE_SIZE = 20 * 9;
SINGLE_LANE_FEATURE_SIZE = 4;
LANE_POINTS_SIZE = 100; // 50m
BACKWARD_LANE_POINTS_SIZE = 50; // 25m
OBSTACLE_ENCODING_SIZE = 128;
SINGLE_LANE_ENCODING_SIZE = 128;
AGGREGATED_ENCODING_SIZE = 256;

LaneScanningEvaluator:

Input: 20 * (9 + 202) = 980个障碍物特征值(前20帧,每帧9个障碍物特征202个多边形点特征值) + 前方50m和后方25m的一共(100+50) * 4 = 600个道路特征值(每米两个LanePoint,每个LanePoint 4个特征值) + 1个lane数目最大值:MAX_NUM_LANE 一共1581个特征值。
Output: 各条可能的lane_sequence的probability,其中只有一条为1,其余为0。
作用: 障碍物未来的轨迹点Trajectory,长度为10。
网络参数:
static const size_t OBSTACLE_FEATURE_SIZE = 20 * (9 + 40);
static const size_t INTERACTION_FEATURE_SIZE = 8;
static const size_t SINGLE_LANE_FEATURE_SIZE = 4;
static const size_t LANE_POINTS_SIZE = 100; // 50m
static const size_t BACKWARD_LANE_POINTS_SIZE = 50; // 25m
static const size_t MAX_NUM_LANE = 10;
static const size_t SHORT_TERM_TRAJECTORY_SIZE = 10;
疑问: 深度学习网络输出数据后如何处理成轨迹的?

MLP_Evaluator:

Input: 22个障碍物特征值 + 40个道路特征值 一共62个道路特征值。
Output: 各条可能的lane_sequence的probability,其中只有一条为1,其余为0。
作用: 将每条可能的lane_sequence的62个特征值输入网络,网络输出得到一个probability,然后根据这条lane_sequence和该障碍物的车速计算得到一个关于向心加速度的损失,网络输出的probability乘以该损失值得到这条lane_sequence最终的probability。
网络参数:
static const size_t OBSTACLE_FEATURE_SIZE = 22;
static const size_t LANE_FEATURE_SIZE = 40;
疑问: 向心加速度损失的计算方式?

SemanticLSTMEvaluator:

Input: 道路的semantic_map,202 = 40 个障碍物历史位置信息特征值 + 202 = 40 个障碍物历史位置信息改变特征值,一共一个map图加80个特征值。
Output: 未来轨迹trajectory,长度为30。
作用: 将map图和80个特征值一起输入网路,网络输出一个1305的张量,处理得到一条长度为30的预测轨迹。。
疑问: 深度学习网络输出数据后如何处理成轨迹的?

Predictor模块

ExtrapolationPredictor:

用于在预测的轨迹的基础上做延长
Input: 预测得到的一条或多条轨迹点 trajectory。
Output: 延长后的预测轨迹 trajectory,长度符合要求。
作用: 延长轨迹点的数目为(所需的轨迹预测时间长度-当前所预测轨迹的时间长度)/ time resolution。
延长轨迹的速度为当前所预测轨迹最后5帧的平均速度。
先根据当前所得轨迹的最近5帧判断得到障碍物接下来最可能出现在哪个lane上。
如果找到了接下来最可能所在的lane,则用ExtrapolateByLane模型进行预测,如果没找到,则用ExtrapolateByFreeMove模型预测。
ExtrapolateByLane模型:选择已预测得到的较短轨迹中的last point为延长的起始点,先计算得到该点距离目标lane的s和l,然后将laneid,s,l,theta传入SmoothPointFromLane函数得到延长轨迹的下一步point并接入到预测轨迹中,更新s,l,lane id并循环,直到轨迹长度达到要求。
ExtrapolateByFreeMove模型:使用已有预测轨迹的最后 1 帧的位置和角度和之前得到的延长轨迹速度,直接延长预测轨迹直到长度符合要求。(延长线得到的是一条直线)

FreeMovePredictor:

Input: 障碍物的 last feature
output: 预测得到的轨迹 trajectory
作用: 如果last feature里面有已经预测得到的轨迹,则和ExtrapolateByFreeMove模型类似,将轨迹延长至符合要求,如果last feature 里面没有符合要求的轨迹,则按照last feature里面最后一帧的信息,直接按运动模型生成预测轨迹

InteractionPredictor:

Input: 障碍物的 last feature ,自车规划轨迹ADCtrajectory。
Output: 对筛选后的每条lane squence画出的预测轨迹,trajectory。
作用:

  • 先获得自车的规划轨迹ADCtrajectory,再获得last feature中的lane sequence数目,对每条lane sequence 初始化一个最佳加速度,储存在向量best_lon_accelerations中,设置加速度的候选范围:candidate_lon_accelerations = {0.0, -0.5, -1.0, -1.5, -2.0, -2.5, -3.0}
  • 历遍每条lane sequence和每个候选加速度,根据该条lane sequence ,该候选加速度值,自车规划轨迹来计算一个cost,如果这个cost为当前所有cost中的最小值,则更新smallest cost,并将该候选加速度更新到该条lane sequence的best_lon_accelerations中。根据当前的smallest cost计算一个likelihood,根据likelihood和该条轨迹的probability得到该条轨迹的posterior并保存在一个向量中。
  • 根据posterior计算每条lane sequence的normalized_posterior并将其设为该条lane sequence的probability,然后选出probability最大的那条lane sequence,保存其索引值best_seq_idx,并将其probability记录。
  • 设置一个probability_threshold = 0.5,如果存在一条lane sequence的probability大于0.5,则对于每条大于0.5的lane sequence,根据是否有stop sign 计算一个新的最佳加速度,根据该加速度和lane sequence生成该条lane sequence的预测轨迹。如果所有lane sequence的probability都小于0.5,则对于probability最大的那一条lane sequence按照上述方式生成预测轨迹。。
    疑问: DrawTrajectory的具体实现方法?

JunctionPredictor

Input: last feature。
Output: 对每个概率较高的junction exit生成一条预测轨迹。
作用: 根据junction mlp evaluator得到的12个方向的probability选取probability最大的那个方向,经过计算将属于该方向的出口记录为概率较高的junction exit,对于每个junction exit,根据障碍物目前的位置及该junction exit的位置,假设障碍物匀速运动,用多项式拟合法生成轨迹。当轨迹到达了junction exit的位置但轨迹长度不满足要求时,根据junction exit 之后的lane类似于ExtrapolateByLane中的方法将轨迹补全至符合要求。

LaneSequencePredictor

Input: last feature。
Output: 对筛选后的lane sequence生成预测轨迹。
作用: 去除lane type = PARKING及lane change type 不等于 LEFT,RIGHT,ONTO_LANE的lane sequence,计算出该障碍物与主车之间的距离s,若s小于阈值,再经过一系列计算筛选lane sequence。对于筛选得到的lane sequence,先更具是否有stop sign 判断是否需要减速至0,如果有stop sign则根据stop sign的距离算出最佳减速度,用匀减速运动模型生成轨迹,如果没有stop sign,则用匀速运动模型,使用SmoothPointFromLane一步一步生成轨迹。

MoveSequencePredictor

Input: last feature。
Output: 对筛选后的lane sequence生成预测轨迹。
作用: 去除lane type = PARKING及lane change type 不等于 LEFT,RIGHT,ONTO_LANE的lane sequence,计算出该障碍物与主车之间的距离s,若s小于阈值,再经过一系列计算筛选lane sequence。对于筛选得到的lane sequence,先更具是否有stop sign 判断是否需要减速至0,如果有stop sign则根据stop sign的距离算出最佳减速度,用匀减速运动模型生成轨迹,如果没有stop sign,则用DrawMoveSequenceTrajectoryPoints一步一步生成轨迹。

SingleLanePredictor

Input: last feature。
Output: 对每条lane sequence生成轨迹。
作用: 假设障碍物为匀速运动,用SmoothPointFromLane一步一步生成轨迹。

最后

以上就是高大微笑为你收集整理的Apollo6.0轨迹预测算法分析文章内容Evaluator模块Predictor模块的全部内容,希望文章能够帮你解决Apollo6.0轨迹预测算法分析文章内容Evaluator模块Predictor模块所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部