New dataset support
We believe it is the effort from community makes it closer to a ImageNet of autonomous driving field. And thus we encourage the community to contribute convertors for new datasets. To build a convertor compatible to our APIs, one should follow the following steps. We recommend to take a look at our existing convertors. They are good examples and can be adjusted to parse the new dataset. Besides, we are very happy to provide helps if you are working on supporting new datasets!
1. Convertor function input/output
Take the convert_waymo(scenario:scenario_pb2.Scenario(), version:str)->metadrive.scenario.ScenarioDescription
as an example.
It takes a scenario recorded in Waymo original format as example and returned a ScenarioDescription
which is actually a nested Python dict
.
We just extend the functions of dict
object to pre-define a structure with several required fields to fill out.
The required fields can be found at Scenario Description.
Apart from basic information like version
and scenario_id
, there are mainly three fields that needs to fill:
tracks
, map_features
and dynamic_map_states
,
which stores objects information, map structure and traffic light states respectively.
These information can be extracted with the toolkit coupled with the original data.
2. Fill in the object data
By parsing the scenario
with the official APIs, we can extract the history of all objects easily.
Generally, the object information is stored in a frame-centric way, which means the querying API takes the timestep as
input and returns all objects present in this frame.
However, ScenarioNet requires an object-centric object history.
In this way, we can easily know how many objects present in the scenario and retrieve the trajectory of each object with
its object_id.
Thus, a convert from frame-centric description to object-centric description is required.
A good example for this is the extract_traffic(scenario: NuPlanScenario, center)
function in nuplan/utils.py.
Similarly, the traffic light states can be extracted from the original data and represented in an object-centric way.
3. Fill in the map data
Map data consists of lane center lines and various kinds of boundaries such as yellow solid lines and white broken lines. All of them are actually lines represented by a list of points. To fill in this field, the first step is to query all line objects in the region where the scenario is collected. By traversing the line list, and extracting the line type and point list, we can build a map which is ready to be loaded into MetaDrive.
4. Extend the description
As long as all mandatory fields are filled, one can add new key-value pairs in each level of the nested-dict. For example, the some scenarios are labeled with the type of scenario and the behavior of surrounding objects. It is absolutely ok to include these information to the scenario descriptions and use them in the later experiments.