Waymo Open Dataset 介绍

王 茂南 2026年8月12日07:55:55
评论
6837字阅读22分47秒

简介

 

参考资料

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 包含信号灯的信息;
  1. message Scenario {
  2.   reserved 9;
  3.   // 场景唯一ID
  4.   optional string scenario_id = 5;
  5.   // 时间戳为一个数组,tracks[i].states的数量和时间戳数组大小相等
  6.   // dynamic_map_states(红绿灯的状态)的大小也和时间戳数组大小相等
  7.   repeated double timestamps_seconds = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
  8.   // 当前时间在时间戳数组中的ID
  9.   optional int32 current_time_index = 10;
  10.   // 对象的追踪信息,是一个数组,每个对象中保存了一段时间内对象的位置和速度,
  11.   // 这个时间对应上述时间戳数组的时间
  12.   repeated Track tracks = [xxx];
  13.   // 交通灯状态信息
  14.   repeated DynamicMapState dynamic_map_states = 7;
  15.   // 地图信息
  16.   repeated MapFeature map_features = [xxx];
  17.   // 自动驾驶车自身对应 tracks 数组中的 Index
  18.   optional int32 sdc_track_index = 6;
  19.   // 有交互对象的 ID 列表
  20.   repeated int32 objects_of_interest = [4, 5, 6];
  21.   // 需要预测的对象列表,这只是建议train对象,不是包含所有object
  22.   repeated RequiredPrediction tracks_to_predict = [11, 12];
  23. }

接下来我们对一些复杂的对象进行进一步介绍,主要包括 Tracks(物体信息和轨迹)、Map(道路信息)。

Track

每个 track 代表一段时间内对象的状态。包含对象的 id,类型,和状态。其中每个时刻的状态包含 10 个维度的特征,共有 timestep 个时间片。注意下面 ObjectState 里面的 10 个特征,表示某个时刻某个 object 包含的信息。

  1. message Track {
  2.   enum ObjectType {
  3.     TYPE_UNSET = 0;  // 初始化状态.
  4.     TYPE_VEHICLE = 1; // 汽车
  5.     TYPE_PEDESTRIAN = 2; // 行人
  6.     TYPE_CYCLIST = 3;  // 自行车
  7.     TYPE_OTHER = 4;  // 其它
  8.   }
  9.   // 对象唯一ID,非负
  10.   optional int32 id = 1;
  11.   // 对象类型,见上面的枚举类型
  12.   optional ObjectType object_type = 2;
  13.   // 对象状态数组
  14.   repeated ObjectState states = [x1,x2,...,x10];
  15. }
  16. // ObjectState介绍如下
  17. message ObjectState {
  18.   // 对象的中心坐标
  19.   optional double center_x = 2;
  20.   optional double center_y = 3;
  21.   optional double center_z = 4;
  22.   // 对象的长宽高
  23.   optional float length = 5;
  24.   optional float width = 6;
  25.   optional float height = 7;
  26.   // 对象的朝向 [-pi, pi).
  27.   optional float heading = 8;
  28.   // 对象的速度
  29.   optional float velocity_x = 9;
  30.   optional float velocity_y = 10;
  31.   // 数据是否有效
  32.   optional bool valid = 11;
  33. }

 

DynamicMapState

主要是交通灯状态,包含了带箭头的红绿灯、圆形红绿灯、闪烁的红绿灯(这里的闪烁实际上是常闪)

  1. // 某一时刻的交通灯状态信息
  2. message DynamicMapState {
  3.   // 观测到的所有交通灯状态信息
  4.   repeated TrafficSignalLaneState lane_states = 1;
  5. }
  6. // 交通灯状态信息
  7. message TrafficSignalLaneState {
  8.   // 交通对应的lane id
  9.   optional int64 lane = 1;
  10.   enum State {
  11.     LANE_STATE_UNKNOWN = 0;  // 未知状态
  12.     // 带箭头交通灯.
  13.     LANE_STATE_ARROW_STOP = 1;
  14.     LANE_STATE_ARROW_CAUTION = 2;
  15.     LANE_STATE_ARROW_GO = 3;
  16.     // 圆形交通灯.
  17.     LANE_STATE_STOP = 4;
  18.     LANE_STATE_CAUTION = 5;
  19.     LANE_STATE_GO = 6;
  20.     // 闪烁交通灯.
  21.     LANE_STATE_FLASHING_STOP = 7;
  22.     LANE_STATE_FLASHING_CAUTION = 8;
  23.   }
  24.   // 交通灯状态,值为上述的枚举类型.
  25.   optional State state = 2;
  26.   // 红绿灯的停止点
  27.   optional MapPoint stop_point = 3;
  28. }

 

MapFeature

地图对象,可以为车道(lane),道路(road_line),道路边沿(road_edge),停止标志(stop_sign),人行横道(crosswalk),减速带(speed_nump)。

地图由很多这样的对象组成,不同的对象包含的属性不同,这个会在后面 Map 中专门介绍。

  1. message MapFeature {
  2.   // 地图对象的唯一ID
  3.   optional int64 id = 1;
  4.   // Type specific data.
  5.   oneof feature_data {
  6.     LaneCenter lane = 3;  // 车道
  7.     RoadLine road_line = 4;  // 道路
  8.     RoadEdge road_edge = 5;  // 道路边沿
  9.     StopSign stop_sign = 7;  // 停止标志
  10.     Crosswalk crosswalk = 8;  // 人行横道
  11.     SpeedBump speed_bump = 9;  // 减速带
  12.   }
  13. }

 

RequiredPrediction

包含必须要预测的对象,和预测的难度(tracks_to_predict)。

  1. message RequiredPrediction {
  2.   // 预测的难度等级类型
  3.   enum DifficultyLevel {
  4.     NONE = 0;    // 无
  5.     LEVEL_1 = 1;  // 等级1
  6.     LEVEL_2 = 2;  // 等级2
  7.   }
  8.   // track对象tracks数组中的ID
  9.   optional int32 track_index = 1;
  10.   // 预测的难度等级
  11.   optional DifficultyLevel difficulty = 2;
  12. }

 

Map 介绍

这里对上面的 MapFeature 进行详细的介绍。上面提到,地图对象可以为车道(lane),道路(road_line),道路边沿(road_edge),停止标志(stop_sign),人行横道(crosswalk),减速带(speed_nump)。我们逐个分析各个类型。

 

LaneCenter

车道,包含了限速、车道类型、车道中心采样点,前序和后继车道ID,以及左右车道边界和左右相邻车道。

  1. // 1. 车道
  2. message LaneCenter {
  3.   // 道路限速,单位mph
  4.   optional double speed_limit_mph = 1;
  5.   // 道路类型
  6.   enum LaneType {
  7.     TYPE_UNDEFINED = 0;   // 未定义
  8.     TYPE_FREEWAY = 1;  // 高速公路
  9.     TYPE_SURFACE_STREET = 2;  // 地表街道
  10.     TYPE_BIKE_LANE = 3;  // 自行车道
  11.   }
  12.   optional LaneType type = 2;
  13.   // 车道插入2条车道之间则为真?
  14.   optional bool interpolating = 3;
  15.   // 车道采样点
  16.   repeated MapPoint polyline = 8;
  17.   // 前序车道IDs
  18.   repeated int64 entry_lanes = 9 [packed = true];
  19.   // 后继车道IDs
  20.   repeated int64 exit_lanes = 10 [packed = true];
  21.   // 车道左边界,车道边界类型不同会分段描述,注意一些车道没有边界(交叉口的车道)
  22.   repeated BoundarySegment left_boundaries = 13;
  23.   // 车道右边界
  24.   repeated BoundarySegment right_boundaries = 14;
  25.   // 左侧相邻车道列表,仅包括同向的车道
  26.   repeated LaneNeighbor left_neighbors = 11;
  27.   // 右侧相邻车道列表,仅包括同向的车道
  28.   repeated LaneNeighbor right_neighbors = 12;
  29. }
  30. // 2.车道边界分段
  31. message BoundarySegment {
  32.   // 车道边界起始序号
  33.   optional int32 lane_start_index = 1;
  34.   // 车道边界终点序号.
  35.   optional int32 lane_end_index = 2;
  36.   // 边界的 MapFeature 的相邻边界特征 ID,可以是RoadLine和RoadEdge
  37.   optional int64 boundary_feature_id = 3;
  38.   // 相邻边界类型。 如果边界是道路边缘而不是道路线,这将设置为未知类型。
  39.   optional RoadLine.RoadLineType boundary_type = 4;
  40. }
  41. // 3. 相邻车道
  42. message LaneNeighbor {
  43.   // 唯一ID
  44.   optional int64 feature_id = 1;
  45.   // 相邻车道?
  46.   optional int32 self_start_index = 2;
  47.   optional int32 self_end_index = 3;
  48.   // 变道只能从这里开始
  49.   optional int32 neighbor_start_index = 4;
  50.   optional int32 neighbor_end_index = 5;
  51.   // 相邻车道边界
  52.   repeated BoundarySegment boundaries = 6;
  53. }

 

RoadLine

车道线,主要包含车道线类型、ID、和形状。

  1. message RoadLine {
  2.   // 车道线类型
  3.   enum RoadLineType {
  4.     TYPE_UNKNOWN = 0;
  5.     TYPE_BROKEN_SINGLE_WHITE = 1;
  6.     TYPE_SOLID_SINGLE_WHITE = 2;
  7.     TYPE_SOLID_DOUBLE_WHITE = 3;
  8.     TYPE_BROKEN_SINGLE_YELLOW = 4;
  9.     TYPE_BROKEN_DOUBLE_YELLOW = 5;
  10.     TYPE_SOLID_SINGLE_YELLOW = 6;
  11.     TYPE_SOLID_DOUBLE_YELLOW = 7;
  12.     TYPE_PASSING_DOUBLE_YELLOW = 8;
  13.   }
  14.   // 车道线类型
  15.   optional RoadLineType type = 1;
  16.   // 车道边界采样点, 多边形的坐标
  17.   repeated MapPoint polyline = [xxx,xxx];
  18. }

 

RoadEdge

道路边界,和上面的 roadline 一样,包含类型、ID、和形状。

  1. message RoadEdge {
  2.   // 道路边沿类型.
  3.   enum RoadEdgeType {
  4.     TYPE_UNKNOWN = 0;
  5.     // 物理隔离,旁边不会走车
  6.     TYPE_ROAD_EDGE_BOUNDARY = 1;
  7.     // 物理隔离,旁边会走车(绿化带,隔离带)
  8.     TYPE_ROAD_EDGE_MEDIAN = 2;
  9.   }
  10.   // 道路边沿类型.
  11.   optional RoadEdgeType type = 1;
  12.   // 道路边缘采样点
  13.   repeated MapPoint polyline = [xxx, xxx];
  14. }

 

StopSign

停止标志。包含标志的 ID、控制的 lane ID、位置、形状(形状的中心就是位置):

  1. message StopSign {
  2.   // 停止标志关联的车道id
  3.   repeated int64 lane = [id1, id2, id3, ];
  4.   // 位置
  5.   optional MapPoint position = [x, y, z];
  6. }

 

Crosswalk

人行横道,主要包含 ID 和形状:

  1. message Crosswalk {
  2.   // 假定是闭合的(第一个点和最后一个点连接起来)
  3.   repeated MapPoint polygon = [p1, p2, p3, ];
  4. }

 

SpeedBump

减速带,和上面的 crosswalk 相似,包含 ID 和形状:

  1. message SpeedBump {
  2.   // 假定是闭合的(第一个点和最后一个点连接起来)
  3.   repeated MapPoint polygon = 1;
  4. }

 

 

 

Motion Prediction

评价指标

 

Sim Agents

评价指标

 

Sim Agent 和 Motion Prediction 的区别

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2026年8月12日07:55:55
  • 转载请务必保留本文链接:https://mathpretty.com/16124.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: