深入nuScenes数据集(4/6)
in Tutorial with 0 comment
深入nuScenes数据集(4/6)
in Tutorial with 0 comment

这是一篇跟着官方教程走的深入文章,官方教程有6篇。现在这篇是 can_bus_tutorial.ipynb,也就是第四篇,链接:here

6篇教程分别如下:

背景

CAN bus扩展是在2019年3月初次发布nuScenes之后于2020年1月发布的额外信息。这些数据可以用于诸如轨迹估计、目标检测和跟踪等任务。

CAN bus用于汽车之间的通信,包括有关位置、速度、加速度、转向、灯光、电池等方面的低级消息。除了原始数据,还提供一些元数据,如不同消息类型的统计信息。请注意,CAN bus数据是高度实验性的。一些数据可能在不同的消息中存在冗余。最后,还提取了车辆当前行驶路线的片段信息。

准备工作

下载数据集:需要先注册,邮箱注册即可,然后进入下载页:https://www.nuscenes.org/download,找到 CAN bus expansion,md5: 32ce964b131988c3ff6279731a516e6f,点击 Asia,即可下载,因为是官方是使用了 aws s3 进行存储,如果遇到下载不畅,请自备魔法。

将下载好的数据集解压到~/data_sets,完整的目录是/Users/lau/data_sets/nuscenes,这个目录后面会用到。

阅读数据集

初始化

启动 jupyter,创建can_bus.ipynb

from nuscenes.can_bus.can_bus_api import NuScenesCanBus
nusc_can = NuScenesCanBus(dataroot='/Users/lau/data_sets/nuscenes')

总览

让我们对所有的CAN总线消息和一些基本统计数据(最小值、最大值、平均值、标准差等)进行概述。我们将选择一个任意的场景来进行分析。

scene_name = 'scene-0001'
nusc_can.print_all_message_stats(scene_name)

# 输出结果
{
  "ms_imu": [
    "ms_imu",
    "pose",
    "steeranglefeedback",
    "vehicle_monitor",
    "zoe_veh_info",
    "zoesensors"
  ],
  "pose": [
    "ms_imu",
    "pose",
    "steeranglefeedback",
    "vehicle_monitor",
    "zoe_veh_info",
    "zoesensors"
  ],
  "steeranglefeedback": [
    "ms_imu",
    "pose",
    "steeranglefeedback",
    "vehicle_monitor",
    "zoe_veh_info",
    "zoesensors"
  ],
  "vehicle_monitor": [
    "ms_imu",
    "pose",
    "steeranglefeedback",
    "vehicle_monitor",
    "zoe_veh_info",
    "zoesensors"
  ],
  "zoesensors": [
    "ms_imu",
    "pose",
    "steeranglefeedback",
    "vehicle_monitor",
    "zoe_veh_info",
    "zoesensors"
  ],
  "zoe_veh_info": [
    "ms_imu",
    "pose",
    "steeranglefeedback",
    "vehicle_monitor",
    "zoe_veh_info",
    "zoesensors"
  ]
}

可视化

接下来,我们将绘制CAN总线消息随时间变化的值。

以转向角反馈消息为例,使用README中描述的"值"关键字。下面的图显示了转向角。看起来场景以一个强烈的左转开始,然后继续基本上直行。

message_name = 'steeranglefeedback'
key_name = 'value'
nusc_can.plot_message_data(scene_name, message_name, key_name)

2023-05-26T13:45:55.png

如果我们要绘制的数据是多维的,我们需要提供一个额外的参数来选择维度。这里我们绘制沿横向维度(y轴)的加速度。我们可以看到最初这个加速度较高。

message_name = 'pose'
key_name = 'accel'
nusc_can.plot_message_data(scene_name, message_name, key_name, dimension=1)

2023-05-26T13:46:37.png

我们还可以获取原始数据并比较轮速与车辆速度。这里我们将轮速从每分钟转数转换为米/秒,将车辆速度从公里/小时转换为米/秒。我们可以看到速度之间存在一个小的偏差。

import numpy as np
import matplotlib.pyplot as plt

# Retrieve raw data.
wheel_speed = nusc_can.get_messages(scene_name, 'zoe_veh_info')
wheel_speed = np.array([(m['utime'], m['FL_wheel_speed']) for m in wheel_speed])

veh_speed = nusc_can.get_messages(scene_name, 'vehicle_monitor')
veh_speed = np.array([(m['utime'], m['vehicle_speed']) for m in veh_speed])

# Convert to m/s.
radius = 0.305  # Known Zoe wheel radius in meters.
circumference = 2 * np.pi * radius
wheel_speed[:, 1] *= circumference / 60
veh_speed[:, 1] *= 1 / 3.6

# Normalize time.
wheel_speed[:, 0] = (wheel_speed[:, 0] - wheel_speed[0, 0]) / 1e6
veh_speed[:, 0] = (veh_speed[:, 0] - veh_speed[0, 0]) / 1e6

plt.plot(wheel_speed[:, 0], wheel_speed[:, 1])
plt.plot(veh_speed[:, 0], veh_speed[:, 1])
plt.xlabel('Time in s')
plt.ylabel('Speed in m/s')
plt.legend(['Wheel speed', 'Vehicle speed']);

2023-05-26T13:47:57.png

现在让我们渲染这个场景的基准路线。下面的蓝线显示了在场景的起始和结束点之外延伸50米的基准路线。橙色线条表示自车姿态。为了区分起点和终点,我们用一个红色十字标记起点。我们可以看到实际姿态与路线之间存在轻微偏差。

nusc_can.plot_baseline_route(scene_name)

2023-05-26T13:48:45.png

错误处理

请注意,某些场景与基准路线的对齐不太好。这可能是由于改道或者因为人类驾驶员没有按照路线行驶造成的。我们通过检查每个自车姿态是否与基准路线在5米范围内来计算所有未对齐的路线。

print(nusc_can.list_misaligned_routes())

此外,少数场景根本没有CAN总线数据。因此,这些场景不能被使用。

print(nusc_can.can_blacklist)

参考

Responses