此为转载文章,原文链接如下链接,感谢原文作者 Author : Chakhsu Lau
这是一篇跟着官方教程走的深入文章,官方教程有6篇。现在这篇是 can_bus_tutorial.ipynb,也就是第四篇,链接:here
6篇教程分别如下:
- nuscenes_tutorial.ipynb
- nuscenes_lidarseg_panoptic_tutorial.ipynb
- nuimages_tutorial.ipynb
- can_bus_tutorial.ipynb
- map_expansion_tutorial.ipynb
- prediction_tutorial.ipynb
背景
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)
如果我们要绘制的数据是多维的,我们需要提供一个额外的参数来选择维度。这里我们绘制沿横向维度(y轴)的加速度。我们可以看到最初这个加速度较高。
message_name = 'pose'
key_name = 'accel'
nusc_can.plot_message_data(scene_name, message_name, key_name, dimension=1)
我们还可以获取原始数据并比较轮速与车辆速度。这里我们将轮速从每分钟转数转换为米/秒,将车辆速度从公里/小时转换为米/秒。我们可以看到速度之间存在一个小的偏差。
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']);
现在让我们渲染这个场景的基准路线。下面的蓝线显示了在场景的起始和结束点之外延伸50米的基准路线。橙色线条表示自车姿态。为了区分起点和终点,我们用一个红色十字标记起点。我们可以看到实际姿态与路线之间存在轻微偏差。
nusc_can.plot_baseline_route(scene_name)
错误处理
请注意,某些场景与基准路线的对齐不太好。这可能是由于改道或者因为人类驾驶员没有按照路线行驶造成的。我们通过检查每个自车姿态是否与基准路线在5米范围内来计算所有未对齐的路线。
print(nusc_can.list_misaligned_routes())
此外,少数场景根本没有CAN总线数据。因此,这些场景不能被使用。
print(nusc_can.can_blacklist)