1.数据集介绍
comma2k19是由comma.ai发布的自动驾驶数据集, 是加利福尼亚280高速公路上超过33小时通勤的数据集。 它将加利福尼亚州圣何塞和旧金山之间20公里的高速公路上行驶时记录的数据分为2019段,每段1分钟。 comma2k19是一个完全可重现且可扩展的数据集。 数据采用comma EONs收集,其传感器类似于任何现代智能手机,包括道路相机,手机GPS,温度计和9轴IMU。 此外,EON还使用comma grey panda捕获原始GNSS测量值和汽车发送的所有CAN数据。
这里还引入了Laika,一个开源的GNSS处理库。为了计算定位,来自数据集的原始测量值用Laika处理,然后输入卡尔曼滤波器或其他估计位置的优化器。Laika产生的位置比用来收集原始数据的全球导航卫星系统模块(如 u-blox M8)精确40%。该数据集还包括记录相机的全局参考系中的pose(位置+方向)估计。这些姿态是用一个紧密耦合的惯性导航系统/全球导航卫星系统/视觉优化器计算的,该优化器依赖于Laika处理的数据。comma2k19非常适合开发和验证与商用传感器配合使用的紧密耦合的全球导航卫星系统算法和测绘算法。
项目github地址:https://github.com/commaai/comma2k19
2.下载数据集
事先提醒:因为该项目的某些文件命名中包含“|”,而在windows的文件系统中这是不允许的,所以为避免这个问题,最好在ubuntu系统上下载这个数据集。
数据集有95GB这么大,将以10GB为一个数据包进行下载,链接戳此下载地址
提示:跳转时请关闭代理否则会显示遇到审计规则拒绝访问。
须用bittorrent下载,ubuntu用默认的工具下载即可,之后就是漫长的等待。
3.数据集结构
目录结构
数据被分成10块,每一块大约200分钟的车程。数据集1-2块使用的车型是RAV4,其余的是civic。RAV4的dongle_id是b0c9d2329ad1606b, civic的dongle_id是99c94dc769b5d96e。
Dataset_chunk_n
|
+-- route_id (dongle_id|start_time)|+-- segment_number|+-- preview.png (first frame video)+-- raw_log.bz2 (raw capnp log, can be read with openpilot-tools: logreader)+-- video.hevc (video file, can be read with openpilot-tools: framereader)+-- processed_log/ (processed logs as numpy arrays, see format for details)+-- global_pos/ (global poses of camera as numpy arrays, see format for details)
日志格式
processed_log文件夹中的每个日志类型都包含2个numpy数组,分别是使用系统设备引导时间的时间戳数组(以秒为单位)和值数组。
processed_log
|
+--IMU ([forward, right, down])
| |
| +--acceleration: (m^2/s)
| +--gyro_uncalibrated (rad/s)
| +--gyro_bias: android gyro bias estimate (rad/s)
| +--gyro: with android bias correction (rad/s)
| +--magnetic_uncalibrated: (T)
| +--magnetic: with android calibration(T)
|
+--CAN data:
| |
| +--car_speed (m/s)
| +--steering_angle (deg)
| +--wheel_speeds: [front_left, front_right, rear_left, rear_right] (m/s)
| +--radar: [forward distance (m),
| | left distance (m),
| | relative speed (m/s),
| | nan,
| | nan,
| | address,
| | new_track (bool)]
| +--raw CAN: This not stored as a value array but as three seperate arrays [src, address, data]
|
+--GNSS|+--live_gnss_qcom: [latitude (deg),| longitude (deg),| speed (m/s),| utc_timestamp (s),| altitude (m),| bearing (deg)]+--live_gnss_ublox: [latitude (deg),| longitude (deg),| speed (m/s),| utc_timestamp (s),| altitude (m),| bearing (deg)]|+--raw_gnss_qcom: every row represents a measurement| of 1 sattelite at 1 epoch can easily| be manipulated with laika.| [prn (nmea_id, see laika),| week of gps_time of reception (gps_week),| time pf week of gps_time of reception (s),| nan,| pseudorange (m),| pseudorange_std (m),| pseudorange_rate (m/s),| pseudorange_rate_std (m/s)]+--raw_gnss_ublox: every row represents a measurementof 1 sattelite at 1 epoch can easilybe manipulated with laika.[prn (nmea_id, see laika),week of gps_time of reception (gps_week),time pf week of gps_time of reception (s),GLONASS channel number (-7..6) nan if not GLONASS,pseudorange (m),pseudorange_std (m),pseudorange_rate (m/s),pseudorange_rate_std (m/s)]
raw表示未经处理,live表示可以直接使用。所有的日志都是由raw_log.bz2
用openpilot(是项目的一个子模块)读取处理出来的。
pose格式
除了原始传感器数据之外,日志还包含由Mesh3D计算的全局姿态(位置+方向)最佳估计值,Mesh 3D是Comma.ai的内部后处理基础设施,依赖于Laika处理的数据。它们是用一个紧密耦合的全球导航卫星系统/惯性导航系统/视觉优化器计算的,其中原始的全球导航卫星系统测量值和ORB特征被输入到一个多状态约束卡尔曼滤波器中, 得出的相机的姿态(位置)和对应视频的每帧的时间戳如下:
frame_times: timestamps of video frames in boot time (s)frame_gps_times: timestamps of video frames in gps_time: ([gps week (weeks), time-of-week (s)])frame_positions: global positions in ECEF of camera(m)frame_velocities: global velocity in ECEF of camera (m/s)frame_orientations: global orientations as quaternion needed torotate from ECEF frame to local camera framedefined as [forward, right, down] (hamilton quaternion!!!!)
comma2k19中的全局位置以米为单位在ECEF中给出,并且方向被给出为从ECEF旋转到本地框架所需的四元数。其中根据NED[North, East, Down]惯例,本地框架被定义为[向前、向右、向下]。
4.配置项目
现在我们要将项目代码拷贝过来。
先复制项目地址
你想要放置的地方打开终端,输入git命令,如果没有安装git的需要安装一下,安装教程。
此处会遇到第一个坑,直接终端执行命令git clone [url]
会发现openpilot文件夹下是空的。这是因为openpilot它在原项目中的图标带了一个白色箭头,类似于引用,用普通的clone命令将其拷贝下来。
因此在终端运行命令git clone --recurse-submodules [url]
来递归下载所有引用子模块。
- windows系统用户注意:
如果你最终是要在windows系统下做实验,那么你需要把下载好的数据集解压到windows的文件系统中,因为我是装的双系统,所以在ubuntu的文件系统中可以访问到windows的文件系统。终端运行python3 utils/unzip_msft_fs.py <dataset dir> <goal dir>
去将文件解压到windows文件系统,其中<dataset dir>
是你在unbuntu下下载压缩数据集的文件夹,<goal dir>
是你的目标文件夹,这个命令需要执行很长时间,它会并行解压所有的压缩包并将“|”以下划线“_”代替,请保证目标文件夹磁盘有足够的空间并耐心等待。
5.代码示例
项目提供了example数据片段用于实验,notebooks中也有许多示例代码。
ipynb的文件可以在anaconda的jupyter上打开浏览。
- processed_readers: 读取数据并绘图的示例
- position_benchmarks: 运行定位基准的示例,定位基准用于评估定位质量
- raw_readers: 使用OpenPilot tools的示例
- 与GNSS原始数据相关的示例请访问Laika
所有代码只在python 2.7和3.6上测试,但我用python 3.7也没问题。
首先运行pip install -r requirements.txt
去安装一些包,其中你会遇到一个错误
这是由于安装pycurl失败
进入下载地址https://www.lfd.uci.edu/~gohlke/pythonlibs/
安装ctrl+f搜索pycurl,下载对应的版本的pycurl
cp36意思是CPython version 3.6.,win_amd64意思是64位的windows操作系统,按照你自己的配置选择对应的安装包下载。
然后到本地切换到pycurl的下载位置,运行pip3 install [pycurl]
安装。
之后你可以在pycharm上打开该项目文件夹,注意一定要添加openpilot
和notebooks
到PYTHONPATH
中。
添加方式:file->setting->interpreter
这样在import组件的时候就会去这些路径下查找了。
做完上述准备工作后我们就可以运行一下utils
下的代码了,注意在代码中把文件名中的“|”改成“_”,且注意当前工作位置。