端到端自动驾驶nuPlan数据集-入门使用

前言

最近在了解端到端自动驾驶,接触到了nuPlan数据集,在跑官方demo时遇到些坑,发现相关的资料不多,记录一下。

nuPlan介绍

最直接就是看nuplan官网的介绍,和paper。如果只想大概扫一眼这里还有篇中文翻译的自动驾驶轨迹规划之nuplan数据集

一句话总结就是:和nuScenes同一家公司发布的,nuPlan是首个面向planning的大规模自动驾驶基准数据集,不仅包括大量的1200小时多城市的实车驾驶数据,还提供了一整套开环/闭环仿真、多种评价标准、ML规划器开发工具及可视化工具。

nuplan_v1.1数据量是1.8TB,这还不包括原始的传感器数据(摄像头、激光);它也有个mini版,nuplan_v1.1_mini,解压后是13g左右,7h的驾驶数据覆盖了大部分场景,但是原始传感器数据仍旧是非常大的。下图就是它的采集车(包含8个相机,5个激光,1个IMU)及数据可视化结果:
在这里插入图片描述

数据下载及环境安装

数据的使用基于官方的工具nuplan-devkit就行,数据下载直接上nuplan官网注册登陆后就能下载,学习只用nuplan_v1.1_mini版就够了,下载时选择Asia节点(国内会更快点)。如果是从头安装,具体的细节这部分有篇博客下载数据教程及环境配置_csdn中文写得很详细了,就不重复写了,感谢原博主X.ZHANG0825。另外官网也有对应环境安装和数据下载的教程nuplan-devkit Installation

以下仅记录一些重点内容和遇到的问题:

环境安装

conda安装nuplan-devkit

如果你电脑已经有conda环境,可以直接用以下命令安装

conda create -n nuplan python=3.9
conda activate nuplan
python -m pip install pip==24.0  -i https://pypi.tuna.tsinghua.edu.cn/simple
git clone https://github.com/motional/nuplan-devkit.git && cd nuplan-devkit
pip install -e .
pip install -r ./requirements.txt
pip install -r requirements_torch.txt

错误问题记录

报错如下“No matching distribution found for omegaconf==2.1.0.rc1”

解决办法

#降级pip,如下版本
python -m pip install pip==24.0

torch版本

官方requirements_torch.txt已有torch版本,版本相对老点,要用新点的可以参考以下本人使用的torch版本

pip install torch==2.0.1 torchvision==0.15.2 pytorch-lightning==2.0.1
数据目录

记住nuplan文件夹存放目录,假设你就放在“HOME”目录下,则"~/nuplan/dataset"目录下就是放解压后的数据;

dataset同级目录下可以创一个exp文件夹,“~/nuplan/exp”,专门保存代码运行结果的,主要代码会访问"NUPLAN_EXP_ROOT"获取

推荐数据结构

nuplan
└── dataset
    ├── maps  ## nuplan-maps-v1.0.zip 解压后的
    │   ├── sg-one-north
    │   │   └── 9.17.1964
    │   ├── us-ma-boston
    │   │   └── 9.12.1817
    │   ├── us-nv-las-vegas-strip
    │   │   └── 9.15.1915
    │   └── us-pa-pittsburgh-hazelwood
    │       └── 9.17.1937
    └── nuplan-v1.1
        └── splits ## 注意和之前教程不同,多个split文件夹
            └── mini  # nuplan-v1.1_mini.zip 解压后的

加入环境变量

按你自己存放的路径和对应的数据结构,将nuplan的数据路径加入系统环境变量,这样不用每次都export一下了。在~/.bashrc添加路径即可,记得添加nuplan-devkit的目录(如果是pip install -e .安装的可以不用);也可以在命令行中直接export;

# 以下路径根据自己存放的路径和对应的数据结构调整
export NUPLAN_DATA_ROOT="$HOME/nuplan/dataset/mini"
export NUPLAN_MAPS_ROOT="$HOME/nuplan/dataset/maps"
export NUPLAN_EXP_ROOT="$HOME/nuplan/exp"
export NUPLAN_DB_FILES="$HOME/nuplan/dataset/nuplan-v1.1/splits/mini"

备选,如果不想加入系统环境,也可以在代码里设置对应数据路径

import os
NUPLAN_DATA_ROOT = os.getenv('NUPLAN_DATA_ROOT', '$HOME/nuplan/dataset')
NUPLAN_MAPS_ROOT = os.getenv('NUPLAN_MAPS_ROOT', '$HOME/nuplan/dataset/maps')
NUPLAN_DB_FILES = os.getenv('NUPLAN_DB_FILES', '$HOME/nuplan/dataset/nuplan-v1.1/splits/mini')
NUPLAN_MAP_VERSION = os.getenv('NUPLAN_MAP_VERSION', 'nuplan-maps-v1.0')

跑通场景可视化

官方github的tutorials有个关于数据可视化的-nuplan_scenario_visualization.ipynb,是jupyter跑的,所以需要安装对应环境

pip install jupyter notebook

打开jupyter

## 命令行输入如下,自动会打开浏览器,或者复制链接进入浏览器,建议chrome
jupyter notebook

可视化结果保存目录默认是在"/tmp/scenario_visualization",因为nuplan-devkit/tutorials/utils/tutorial_utils.py的216行默认写死了,可以自行修改

def visualize_scenario(scenario: NuPlanScenario, save_dir: str = '/tmp/scenario_visualization/', bokeh_port: int = 8899) -> None:

然后打开 nuplan-devkit/tutorials/nuplan_scenario_visualization.ipynb,不确定自己数据路径配置是否有问题的话,将第2个代码块内容替换为自己的数据路径:

import os
NUPLAN_DATA_ROOT = os.getenv('NUPLAN_DATA_ROOT', '$HOME/nuplan/dataset')
NUPLAN_MAPS_ROOT = os.getenv('NUPLAN_MAPS_ROOT', '$HOME/nuplan/dataset/maps')
NUPLAN_DB_FILES = os.getenv('NUPLAN_DB_FILES', '$HOME/nuplan/dataset/nuplan-v1.1/splits/mini')
NUPLAN_MAP_VERSION = os.getenv('NUPLAN_MAP_VERSION', 'nuplan-maps-v1.0')

然后依次执行各代码块或者run all cells

运行成功后在Scenario选择切换场景,因为是mini版数据,有些场景没有,可以选accelerating_at_traffic_light或者accelerating_at_crosswalk等测试,然后等待30s左右,成功渲染后如下就可以播放了:

在这里插入图片描述

达到上面效果基本就够了,但如果你还想把这个可视化结果保存下来,其实录屏也行。但如果你想完全白嫖官方的工具,可以点击Render video按键,视频默认是保存在"nuplan-devkit/tutorials/scenario_visualization/video_screenshot",看看有没有.avi文件。如果没有(大概率是没有),或者点了没反应则环境有问题,主要是selenium的锅,官方用的selenium应该是以前老版本,解决起来相对麻烦,如果有时间可以参考如下办法、

  • 报错_init_() got an unexpected keyword argument ‘chrome_options’

    需要修改 nuplan-devkit/nuplan/planning/nuboard/base/simulation_tile.py 445行

    driver = webdriver.Chrome(chrome_options=chrome_options)
    

    改为

    driver = webdriver.Chrome(options=chrome_options)
    
  • 继续报错 ‘chromedriver’ executable needs to be in PATH

    需要安装chromedriver,而且要和chrom版本一致,可以参考这个链接解决:‘chromedriver’ executable needs to be in PATH

    ## 查看当前chrom版本,安装对应版本兼容的chromedriver
    google-chrome --version
    # 根据Chrome版本下载匹配的ChromeDriver版本
    # 安装方法访问 https://developer.chrome.com/docs/chromedriver/downloads/version-selection?hl=zh-cn
    # 在此页面找到自己chrome版本的包下载http://chromedriver.storage.googleapis.com/index.html
    
    ## https://chromedriver.storage.googleapis.com/index.html?path=103.0.5060.134/
    unzip chromedriver_linux64.zip
    cd chromedriver-linux64
    sudo mv chromedriver /usr/bin/chromedriver
    sudo chown root:root /usr/bin/chromedriver
    sudo chmod +x /usr/bin/chromedriver
    

    刚才修改的simulation_tile.py 445行改为

    driver_path = "/usr/bin/chromedriver"
    driver = webdriver.Chrome(driver_path, options=chrome_options)
    

然后notebook中Restart Kernel并重新跑一遍代码,再次点击Render video就能保存视频了,其实就是将一帧帧的图片用opencv拼成一个视频,保存过程如下,默认路径是在"nuplan-devkit/tutorials/scenario_visualization/video_screenshot":

在这里插入图片描述

### nuplan 数据结构详解 #### 数据集概述 nuplan 是由 Motional 发布的一个大规模自动驾驶规划数据集,旨在推动基于学习的轨迹规划研究的发展。该数据集不仅提供了丰富的传感器数据,还包含了高质量的人类驾驶员行为标注以及详细的场景描述[^1]。 #### 主要组成部分 ##### 1. 场景(Scenario) 每个场景代表了一段特定时间段内的交通状况记录,通常持续数秒到数十秒不等。一个完整的场景可能涉及多个车辆、行人和其他动态物体的行为变化过程。为了便于处理不同类型的交互情况,nuplan 将所有场景划分为若干类别,如城市道路行驶、高速公路汇入/退出等[^3]。 ##### 2. 轨迹(Trajectory) 对于每一个移动实体,在给定的时间窗口内都会有一系列位置坐标构成其运动路径即轨迹。这些轨迹被细分为历史部分(已知的真实行驶路线)和未来预测部分(待估计的理想化前进方向)。值得注意的是,除了常规的位置信息外,某些情况下还会附加速度、加速度甚至转向角度等相关属性来更全面地刻画对象的状态演变特征。 ##### 3. 静态地图元素(Static Map Elements) 静态地图涵盖了车道线定义、交叉路口布局以及其他固定设施的信息。通过这种方式可以有效地建立起物理环境框架,帮助理解各个参与者之间相对关系的同时也为后续的任务执行奠定了基础条件。例如,在进行碰撞检测或是计算最优避让策略时就需要依赖于精确的地图表示形式[^2]。 ##### 4. 动态障碍物(Dynamic Obstacles) 除开自车本身之外其他任何能够自主改变所处空间位置的事物都被视为动态障碍物范畴之内。这其中包括但不限于机动车、自行车骑行者乃至突然闯入视野范围的小动物等等。针对这类目标不仅要关注它们当前所在之处还要预判下一步可能会采取的动作倾向从而做出合理反应措施以保障安全通行权益不受侵害。 ```python from nuplan.database.nuplan_db_orm import Scenario, Trajectory, StaticMapElement, DynamicObstacle # 获取某个具体场景实例 scenario = Session.query(Scenario).filter_by(id='example_id').first() # 访问关联的历史轨迹集合 for traj in scenario.historical_trajectories: print(f"Historical trajectory points: {traj.points}") # 查询对应区域内的静态要素列表 static_elements = session.query(StaticMapElement)\ .join(LaneConnectivity)\ .filter(LaneConnectivity.scenario_id == 'example_id')\ .all() print([elem.type for elem in static_elements]) # 列举出现在同一时空背景下的活动个体概况 dynamic_obstacles = session.query(DynamicObstacle)\ .filter(DynamicObstacle.appear_time >= start_time, DynamicObstacle.disappear_time <= end_time)\ .all() print([(obj.category, obj.motion_pattern) for obj in dynamic_obstacles]) ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值