文章目录(Table of Contents)
简介
参考资料
Waymo Challenge 2022 -- Motion Prediction,轨迹预测的任务;
Waymo Open Motion Dataset 介绍
waymo数据集解析(motion),介绍了 Scenario 的数据结构(主要是轨迹);
waymo数据集解析(map),详细介绍 Map 的数据(Lane,Road Edge);
Waymo Open Dataset 介绍与应用(1),介绍数据结构,数据集内容;
Waymo Open Motion Dataset 介绍
这个数据集包含 object tracks(物体的轨迹)和 map data(地图信息)。每个信息被分为 10 Hz采样下 9s 的窗口,其中 1s 历史,8s 未来。也就是说,对于一个物体,有 10 个历史样本,1 个当前时刻样本和 80 个未来样本:
数据文件包含三种:
- test(15%):只包含1秒的历史数据;
- training(70%):包含用于模型开发的未来轨迹真值;
- validation(15%):包含用于模型开发的未来轨迹真值;
Scenario 介绍
Scenario 代表一个场景,也就是一段时间内的交通情况,包括自动驾驶车自身,其它的交通参与者(车辆、行人),以及交通灯在 20s 内的轨迹和状态,同时还包括了道路信息。也就是说 Scenario 是一条数据的最小单元,一个 tfrecord 文件包括多条 Scenario。
Scenario 具体的格式信息保存在 scenario.proto 文件中,这个文件可以参考 waymo 数据集官方github仓库下载。这里简单介绍下 protobuf,protobuf 是一种文件格式,类似于json,xml等,它的主要好处是压缩的效率高,速度快,通常用于数据传输的序列化和反序列化,也可以用于保存文件。
接下来我们详细介绍 scenario.proto 文件的具体内容,这里需要注意下面几个特征:
tracks里面保存所有 object 的内容,包含每个时刻的坐标,加速度,类型等;map_features包含地图信息,地图上每个点的坐标,和点的类型(lane、road edge 等);这个会在后面Map的部分详细介绍;dynamic_map_state包含信号灯的信息;
- message Scenario {
- reserved 9;
- // 场景唯一ID
- optional string scenario_id = 5;
- // 时间戳为一个数组,tracks[i].states的数量和时间戳数组大小相等
- // dynamic_map_states(红绿灯的状态)的大小也和时间戳数组大小相等
- repeated double timestamps_seconds = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
- // 当前时间在时间戳数组中的ID
- optional int32 current_time_index = 10;
- // 对象的追踪信息,是一个数组,每个对象中保存了一段时间内对象的位置和速度,
- // 这个时间对应上述时间戳数组的时间
- repeated Track tracks = [xxx];
- // 交通灯状态信息
- repeated DynamicMapState dynamic_map_states = 7;
- // 地图信息
- repeated MapFeature map_features = [xxx];
- // 自动驾驶车自身对应 tracks 数组中的 Index
- optional int32 sdc_track_index = 6;
- // 有交互对象的 ID 列表
- repeated int32 objects_of_interest = [4, 5, 6];
- // 需要预测的对象列表,这只是建议train对象,不是包含所有object
- repeated RequiredPrediction tracks_to_predict = [11, 12];
- }
接下来我们对一些复杂的对象进行进一步介绍,主要包括 Tracks(物体信息和轨迹)、Map(道路信息)。
Track
每个 track 代表一段时间内对象的状态。包含对象的 id,类型,和状态。其中每个时刻的状态包含 10 个维度的特征,共有 timestep 个时间片。注意下面 ObjectState 里面的 10 个特征,表示某个时刻某个 object 包含的信息。
- message Track {
- enum ObjectType {
- TYPE_UNSET = 0; // 初始化状态.
- TYPE_VEHICLE = 1; // 汽车
- TYPE_PEDESTRIAN = 2; // 行人
- TYPE_CYCLIST = 3; // 自行车
- TYPE_OTHER = 4; // 其它
- }
- // 对象唯一ID,非负
- optional int32 id = 1;
- // 对象类型,见上面的枚举类型
- optional ObjectType object_type = 2;
- // 对象状态数组
- repeated ObjectState states = [x1,x2,...,x10];
- }
- // ObjectState介绍如下
- message ObjectState {
- // 对象的中心坐标
- optional double center_x = 2;
- optional double center_y = 3;
- optional double center_z = 4;
- // 对象的长宽高
- optional float length = 5;
- optional float width = 6;
- optional float height = 7;
- // 对象的朝向 [-pi, pi).
- optional float heading = 8;
- // 对象的速度
- optional float velocity_x = 9;
- optional float velocity_y = 10;
- // 数据是否有效
- optional bool valid = 11;
- }
DynamicMapState
主要是交通灯状态,包含了带箭头的红绿灯、圆形红绿灯、闪烁的红绿灯(这里的闪烁实际上是常闪)
- // 某一时刻的交通灯状态信息
- message DynamicMapState {
- // 观测到的所有交通灯状态信息
- repeated TrafficSignalLaneState lane_states = 1;
- }
- // 交通灯状态信息
- message TrafficSignalLaneState {
- // 交通对应的lane id
- optional int64 lane = 1;
- enum State {
- LANE_STATE_UNKNOWN = 0; // 未知状态
- // 带箭头交通灯.
- LANE_STATE_ARROW_STOP = 1;
- LANE_STATE_ARROW_CAUTION = 2;
- LANE_STATE_ARROW_GO = 3;
- // 圆形交通灯.
- LANE_STATE_STOP = 4;
- LANE_STATE_CAUTION = 5;
- LANE_STATE_GO = 6;
- // 闪烁交通灯.
- LANE_STATE_FLASHING_STOP = 7;
- LANE_STATE_FLASHING_CAUTION = 8;
- }
- // 交通灯状态,值为上述的枚举类型.
- optional State state = 2;
- // 红绿灯的停止点
- optional MapPoint stop_point = 3;
- }
MapFeature
地图对象,可以为车道(lane),道路(road_line),道路边沿(road_edge),停止标志(stop_sign),人行横道(crosswalk),减速带(speed_nump)。
地图由很多这样的对象组成,不同的对象包含的属性不同,这个会在后面 Map 中专门介绍。
- message MapFeature {
- // 地图对象的唯一ID
- optional int64 id = 1;
- // Type specific data.
- oneof feature_data {
- LaneCenter lane = 3; // 车道
- RoadLine road_line = 4; // 道路
- RoadEdge road_edge = 5; // 道路边沿
- StopSign stop_sign = 7; // 停止标志
- Crosswalk crosswalk = 8; // 人行横道
- SpeedBump speed_bump = 9; // 减速带
- }
- }
RequiredPrediction
包含必须要预测的对象,和预测的难度(tracks_to_predict)。
- message RequiredPrediction {
- // 预测的难度等级类型
- enum DifficultyLevel {
- NONE = 0; // 无
- LEVEL_1 = 1; // 等级1
- LEVEL_2 = 2; // 等级2
- }
- // track对象tracks数组中的ID
- optional int32 track_index = 1;
- // 预测的难度等级
- optional DifficultyLevel difficulty = 2;
- }
Map 介绍
这里对上面的 MapFeature 进行详细的介绍。上面提到,地图对象可以为车道(lane),道路(road_line),道路边沿(road_edge),停止标志(stop_sign),人行横道(crosswalk),减速带(speed_nump)。我们逐个分析各个类型。
LaneCenter
车道,包含了限速、车道类型、车道中心采样点,前序和后继车道ID,以及左右车道边界和左右相邻车道。
- // 1. 车道
- message LaneCenter {
- // 道路限速,单位mph
- optional double speed_limit_mph = 1;
- // 道路类型
- enum LaneType {
- TYPE_UNDEFINED = 0; // 未定义
- TYPE_FREEWAY = 1; // 高速公路
- TYPE_SURFACE_STREET = 2; // 地表街道
- TYPE_BIKE_LANE = 3; // 自行车道
- }
- optional LaneType type = 2;
- // 车道插入2条车道之间则为真?
- optional bool interpolating = 3;
- // 车道采样点
- repeated MapPoint polyline = 8;
- // 前序车道IDs
- repeated int64 entry_lanes = 9 [packed = true];
- // 后继车道IDs
- repeated int64 exit_lanes = 10 [packed = true];
- // 车道左边界,车道边界类型不同会分段描述,注意一些车道没有边界(交叉口的车道)
- repeated BoundarySegment left_boundaries = 13;
- // 车道右边界
- repeated BoundarySegment right_boundaries = 14;
- // 左侧相邻车道列表,仅包括同向的车道
- repeated LaneNeighbor left_neighbors = 11;
- // 右侧相邻车道列表,仅包括同向的车道
- repeated LaneNeighbor right_neighbors = 12;
- }
- // 2.车道边界分段
- message BoundarySegment {
- // 车道边界起始序号
- optional int32 lane_start_index = 1;
- // 车道边界终点序号.
- optional int32 lane_end_index = 2;
- // 边界的 MapFeature 的相邻边界特征 ID,可以是RoadLine和RoadEdge
- optional int64 boundary_feature_id = 3;
- // 相邻边界类型。 如果边界是道路边缘而不是道路线,这将设置为未知类型。
- optional RoadLine.RoadLineType boundary_type = 4;
- }
- // 3. 相邻车道
- message LaneNeighbor {
- // 唯一ID
- optional int64 feature_id = 1;
- // 相邻车道?
- optional int32 self_start_index = 2;
- optional int32 self_end_index = 3;
- // 变道只能从这里开始
- optional int32 neighbor_start_index = 4;
- optional int32 neighbor_end_index = 5;
- // 相邻车道边界
- repeated BoundarySegment boundaries = 6;
- }
RoadLine
车道线,主要包含车道线类型、ID、和形状。
- message RoadLine {
- // 车道线类型
- enum RoadLineType {
- TYPE_UNKNOWN = 0;
- TYPE_BROKEN_SINGLE_WHITE = 1;
- TYPE_SOLID_SINGLE_WHITE = 2;
- TYPE_SOLID_DOUBLE_WHITE = 3;
- TYPE_BROKEN_SINGLE_YELLOW = 4;
- TYPE_BROKEN_DOUBLE_YELLOW = 5;
- TYPE_SOLID_SINGLE_YELLOW = 6;
- TYPE_SOLID_DOUBLE_YELLOW = 7;
- TYPE_PASSING_DOUBLE_YELLOW = 8;
- }
- // 车道线类型
- optional RoadLineType type = 1;
- // 车道边界采样点, 多边形的坐标
- repeated MapPoint polyline = [xxx,xxx];
- }
RoadEdge
道路边界,和上面的 roadline 一样,包含类型、ID、和形状。
- message RoadEdge {
- // 道路边沿类型.
- enum RoadEdgeType {
- TYPE_UNKNOWN = 0;
- // 物理隔离,旁边不会走车
- TYPE_ROAD_EDGE_BOUNDARY = 1;
- // 物理隔离,旁边会走车(绿化带,隔离带)
- TYPE_ROAD_EDGE_MEDIAN = 2;
- }
- // 道路边沿类型.
- optional RoadEdgeType type = 1;
- // 道路边缘采样点
- repeated MapPoint polyline = [xxx, xxx];
- }
StopSign
停止标志。包含标志的 ID、控制的 lane ID、位置、形状(形状的中心就是位置):
- message StopSign {
- // 停止标志关联的车道id
- repeated int64 lane = [id1, id2, id3, ];
- // 位置
- optional MapPoint position = [x, y, z];
- }
Crosswalk
人行横道,主要包含 ID 和形状:
- message Crosswalk {
- // 假定是闭合的(第一个点和最后一个点连接起来)
- repeated MapPoint polygon = [p1, p2, p3, ];
- }
SpeedBump
减速带,和上面的 crosswalk 相似,包含 ID 和形状:
- message SpeedBump {
- // 假定是闭合的(第一个点和最后一个点连接起来)
- repeated MapPoint polygon = 1;
- }
Motion Prediction
评价指标
Sim Agents
评价指标
Sim Agent 和 Motion Prediction 的区别
- 微信公众号
- 关注微信公众号
-
- QQ群
- 我们的QQ群号
-









评论