nuPlan Data

September 15, 2026 ยท View on GitHub

Download

Download the nuPlan v1.1 database and map archives from the nuPlan download page. The official dataset setup guide describes the archive layout.

Prepare a nuPlan v1.1 data tree and map package before running evaluation:

<nuplan-data>/nuplan-v1.1/splits/trainval/*.db
<nuplan-data>/nuplan-v1.1/splits/test/*.db
<nuplan-maps>/nuplan-maps-v1.0/*

Set the roots:

export NUPLAN_DATA_ROOT=/path/to/nuplan-data
export NUPLAN_MAPS_ROOT=/path/to/nuplan-maps

The release configurations use box tracks and map features.

Benchmark filters

The companion checkout contains one fixed filter for each benchmark split:

filtertokens
driverl_val141118
driverl_test14_hard272
driverl_test14_random261

Filter files:

nuplan-devkit/nuplan/planning/script/config/common/scenario_filter/driverl_val14.yaml
nuplan-devkit/nuplan/planning/script/config/common/scenario_filter/driverl_test14_hard.yaml
nuplan-devkit/nuplan/planning/script/config/common/scenario_filter/driverl_test14_random.yaml

The Random file stores the 261 benchmark tokens and gives the same selection across database scans.

Use DRIVERL_EVAL_DB_LINK_ROOT to point to directories of symbolic links to the selected SQLite databases:

<db-link-root>/driverl_val14/
<db-link-root>/driverl_test14_hard/
<db-link-root>/driverl_test14_random/

The evaluator also accepts the complete splits/trainval and splits/test directories directly.

Filter check

Run this from the DriveRL root:

python - <<'PY'
from pathlib import Path
import yaml

root = Path("nuplan-devkit/nuplan/planning/script/config/common/scenario_filter")
expected = {
    "driverl_val14.yaml": 1118,
    "driverl_test14_hard.yaml": 272,
    "driverl_test14_random.yaml": 261,
}
for name, count in expected.items():
    values = yaml.safe_load((root / name).read_text(encoding="utf-8"))["scenario_tokens"]
    assert len(values) == count and len(set(values)) == count, name
    print(f"DRIVERL_FILTER_OK {name} tokens={count}")
PY