一、参考资料
17篇点云处理综述-点云语义分割、点云物体检测、自动驾驶中的点云处理……
#三维视觉
#点云
3D点云数据标准
自动驾驶之心
自动驾驶之心-专栏
二、重要信息
1. 黑车检测难题
从2018年至今,高线数机械式激光雷达的测距能力一直停留在200米@10%反射率,似乎成为了905nm方案一个上限。
RoboSense(速腾聚创)在保证人眼安全的前提下,完成905nm激光雷达测距能力的突破,赋予RS-Ruby Plus 240米@10%标准反射率的超强测距能力(100,000Lux太阳光照环境下),整体测距性能比同类产品提高了20%以上。RS-Ruby Plus升级要点:200米→240米(@10%NIST标准反射率),大幅提升黑色车辆检测能力。
黑色车辆是典型的低反射率障碍物,对激光的回波强度低,激光雷达扫描黑色车辆的点数明显少于相同距离下的白色车辆,是考验激光雷达测距能力的经典Corner Case(长尾问题)。
假设有一款分辨率为0.125°x0.1°、测距能力为200米@10%反射率的激光雷达。当它检测200米处大小相同的白色和黑色车辆时,白色车辆会返回5-7个点,而黑色车辆则只有3-6个点,有些车漆特殊的黑色车辆甚至可能无法返回点。然而,主流的感知算法要能稳定检出并识别障碍物,一般至少需要5个点。
测距能力是激光雷达解决对黑车检测难题的关键。
三、相关介绍
1. 点云
三维点云直接提供了三维空间数据,而图像则需要通过透视几何来反推三维数据。
2. 激光雷达类型
2.1 固态激光雷达
2.2 机械式激光雷达
2.3 静态激光雷达
3. 激光雷达重要参数
RoboSense(速腾聚创)
线数
128
激光波长
905nm
测距方式
脉冲式
测距能力
0.4m~240m(10% NITS标准反射率)
盲区
≤0.4m
最大测距采样速率
84KHz
最高扫描频率
50Hz
数据获取速度
32万点/秒
测距精度
Up to ±3cm(0.4~3米)
Up to ±2cm(3~240米)
水平视场角
360°
垂直视场角
30°(-15°,+15°)
水平角分辨率
[均衡模式] 0.2° / 0.4°(@10HZ)
[高性能模式] 0.1° / 0.2°(@10HZ)
垂直角分辨率
0.1° (104个通道,-6.51°~+3.81°)
垂直角度分辨率
2°
激光安全等级
class1人眼安全
回波模式
单回波和双回波
出点数(单回波)
[均衡模式] ~2,304,000pts/s
[高性能模式] ~4,608,000pts/s
出点数(双回波)
[均衡模式] ~4,608,000pts/s
[高性能模式] ~9,216,000pts/s
转速
600/1200rpm (10/20Hz)
输出数据协议
UDP packets over Ethernet
UDP数据包内容
三维空间坐标、反射强度、时间戳等
车载以太网输出
1000M Base T1
工作电压
9 - 32V
工作温度
(-20°,65°)
产品功耗
[均衡模式] 27W
[高性能模式] 30W
存储温度
-40°C ~ +85°C
防护等级
IP67、IP6K9K
时间同步
$GPRMC with 1pps, PTP & gPTP
尺寸
φ125mm * H128 mm
重量 (不包含数据线)
~1.85 kg
4. 搭载激光雷达重点上市车型
四、Velodyne LiDAR
Velodyne LiDAR 官网
1. 公司简介
Velodyne成立于1983年,是一家位于加州硅谷的技术公司。Velodyne最早以音响业务起家,随后业务拓展至激光雷达等领域。2016年Velodyne将核心业务激光雷达部门剥离,成立新公司Velodyne LiDAR。2016年8月Velodyne公司发布公告称,旗下激光雷达公司Velodyne LiDAR获得百度与福特公司1.5亿美元的共同投资,三方将围绕无人驾驶领域展开全方位合作。
2. 相关产品
Velodyne LiDAR,作为激光雷达领域无可争议的领头羊,自2007年正式开始商业化生产,Velodyne LiDAR先后发布了7款激光雷达新品。这些产品通过在测量距离和精度上不断优化,以更好地满足自动驾驶大规模量产所需的高安全标准,正逐渐被认为是L3+自动驾驶汽车的“标配”。其中HDL-32、PUCK LITE、 PUCK Hi-Res、PACK 32MR、Alpha Puck、Puck、Ultra Puck等,都是目前自动驾驶领域最炙手可热的明星产品。
Velodyne Lidar 激光雷达产品专为高级驾驶辅助系统 (ADAS)、自动驾驶车辆、自主机器人、智慧城市基础设施、配送、工业等领域而设计,并提供灵活性、高质量和可靠性能,满足各行各业的需求。尤其在智能出行领域,Velodyne Lidar 能够赋能电动汽车和自动驾驶汽车,助力安全的自动化出行。此外,结合专利技术,合作伙伴及生产战略优势, Velodyne Lidar 将持续推动激光雷达的成本降低,致力为中国的自动化汽车市场带来高性价比的激光雷达解决方案。
Alpha Puck
Alpha Puck:世界上分辨率最高的激光雷达。
Alpha Puck原名为VLS-128,是Velodyne LiDAR在2018 CES上发布的一款128线激光雷达。与Velodyne LiDAR 64线激光雷达HDL-64相比,Alpha Puck的探测距离是前者的3倍——达到300米。而除了探测距离更远,Alpha Puck的分辨率相较于上一代产品也更高,这使得其不仅可以直接用于物体检测,无需额外的传感器融合,而且还能够充分满足从低速到高速不同的自动驾驶场景,甚至包括其他传感器无法处理的Corner Case,从而确保自动驾驶车辆的驾乘安全性。
Puck
Puck:全球应用最广的激光雷达。
该产品于2015年正式推出,具有体积小、测量精准、性能可靠、价格合理等多重优势,用于探测时可实现100米范围内的实时三维视图以及360度环视场景,是全球应用最广的一款激光雷达传感器——除了自动驾驶汽车,Puck还被广泛用于货运、3D制图、无人机、工业及机器人等多个领域。
五、KITTI数据集
KITTI 3D目标检测数据集解析(完整版)
KITTI-CARLA:由CARLA模拟器生成的类似KITTI的数据集
KITTI数据集下载及解析
1. 传感器配置
由于彩色相机成像过程中的拜耳阵列(Bayer Pattern)插值处理过程,彩色图像分辨率较低,而且对于光照敏感性不高,所以采集车配备了两组双目相机,一组灰度的,一组彩色的。个人猜测为了增加相机的水平视场角,每个相机镜头前又各安装了一个光学镜头。
传感器类型 | 详细信息 |
---|---|
灰度相机 | 2台140像素的PointGray Flea2灰度相机, FL2-14S3M-C |
彩色相机 | 2台140万像素PointGray Flea2彩色相机, FL2-14S3C-C |
光学镜头 | 4个Edmund光学镜头,焦距4mm,90°水平孔径,35°垂直孔径角 |
激光雷达 | 1台Velodyne HDL-64E激光,扫描频率10Hz,64线,0.09°角度分辨率,2cm探测精度,每秒130万点数,探测距离120m |
GPS/IMU惯导系统 | 1个OXTS TR3003惯导,6轴,采集频率100Hz,L1/L2信号波段,0.02m和0.1°的精度 |
传感器车身排布如下图所示:
坐标系
- camera: x = right, y = down, z = forward
- velodyne: x = forward, y = left, z = up
- GPS/IMU: x = forward, y = left, z = up
2. 数据集解析
图片、激光点云、标注真值、标定参数通过图片序号一一对应。
2.1 image_2文件
image文件以8位PNG格式存储,图片如下:
2.2 label_2文件 [file]
3D框标注信息,即ground truth label信息。
label文件是KITTI中object的标签和评估数据,以“000001.txt”文件为例,包含样式如下:
Truck 0.00 0 -1.57 599.41 156.40 629.75 189.25 2.85 2.63 12.34 0.47 1.49 69.44 -1.56
Car 0.00 0 1.85 387.63 181.54 423.81 203.12 1.67 1.87 3.69 -16.53 2.39 58.49 1.57
Cyclist 0.00 3 -1.65 676.60 163.95 688.98 193.93 1.86 0.60 2.02 4.59 1.32 45.84 -1.55
DontCare -1 -1 -10 503.89 169.71 590.61 190.13 -1 -1 -1 -1000 -1000 -1000 -10
DontCare -1 -1 -10 511.35 174.96 527.81 187.45 -1 -1 -1 -1000 -1000 -1000 -10
DontCare -1 -1 -10 532.37 176.35 542.68 185.27 -1 -1 -1 -1000 -1000 -1000 -10
DontCare -1 -1 -10 559.62 175.83 575.40 183.15 -1 -1 -1 -1000 -1000 -1000 -10
对每一帧点云数据, label是 n 个15维的向量, 组成了8个维度的信息。
字段 | 单位 | 含义 | 样例 | |
---|---|---|---|---|
0 | Type | - | 目标类别,总共有9类,分别是:Car、Van、Truck、Pedestrian、Person_sitting、Cyclist、Tram、Misc、DontCare。其中DontCare标签表示该区域没有被标注,比如由于目标物体距离激光雷达太远。 | Car |
1 | Truncated | float | 目标截断程度,表示目标距离图像边界的程度 | 0~1之间的浮点 从 0 (non-truncated) 到 1 (truncated) |
2 | Occluded | int | 目标遮挡程度 | 0:完全可见 1:部分遮挡 2:大部分遮挡 3:未知 |
3 | Alpha | 弧度 | 目标的观察角度,在相机坐标系下,以相机原点为中心,相机原点到物体中心的连线为半径,将物体绕相机y轴旋转至相机z轴,此时物体方向与相机x轴的夹角 | [-pi, pi] |
4:8 | bbox | 像素 | 目标2D检测框位置,左上顶点和右下顶点的坐标 | (712.40 143.00 810.73 307.92) |
8:11 | Dimensions | 米 | 3D目标尺寸:高、宽、长 | (1.89 0.48 1.20) |
11:14 | Location | 米 | 相机坐标系下,目标3D框的底面中心坐标(x, y, z) | (1.84 1.47 8.41) |
14 | Rotation_y | 弧度 | 相机坐标系下,目标的方位角(空间方向),在照相机坐标系下,物体的全局方向角(物体前进方向与相机坐标系x轴的夹角) | [-pi, pi] |
- 训练时主要用到的是类别信息(type) 和3d bbox 信息 (location, dimension, rotation_y).
- 观测角(alpha)和旋转角(rotation_y)的区别和联系可以参考博客: KITTI 3D目标检测数据集解析(完整版)。
2.3 velodyne文件
velodyne文件是激光雷达的测量数据(绕其垂直轴(逆时针)连续旋转),以“000001.bin”文件为例,内容如下:
7b14 4642 1058 b541 9643 0340 0000 0000
46b6 4542 1283 b641 3333 0340 0000 0000
4e62 4042 9643 b541 b072 0040 cdcc 4c3d
8340 3f42 08ac b541 3bdf ff3f 0000 0000
e550 4042 022b b841 9cc4 0040 0000 0000
10d8 4042 022b ba41 4c37 0140 0000 0000
3fb5 3a42 14ae b541 5a64 fb3f 0000 0000
7dbf 3942 2731 b641 be9f fa3f 8fc2 f53d
cd4c 3842 3f35 b641 4c37 f93f ec51 383e
dbf9 3742 a69b b641 c3f5 f83f ec51 383e
2586 3742 9a99 b741 fed4 f83f 1f85 6b3e
...
...
...
点云数据以浮点二进制文件格式存储,每行包含8个数据,每个数据由四位十六进制数表示(浮点数),每个数据通过空格隔开。一个点云数据由4个浮点数数据构成,分别表示点云的x、y、z、r(强度 or 反射值),点云的存储方式如下表所示:
2.4 calib文件
calib文件是相机、雷达、惯导等传感器的矫正数据。为了尽可能减少标定的系统误差,KITTI每天都会重新对传感器进行一次标定,因此每张图片都有一个对应的txt标定参数文件,以“000001.txt”文件为例,内容如下:
P0: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 0.000000000000e+00 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P1: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 -3.875744000000e+02 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P2: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 4.485728000000e+01 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 2.163791000000e-01 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 2.745884000000e-03
P3: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 -3.395242000000e+02 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 2.199936000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 2.729905000000e-03
R0_rect: 9.999239000000e-01 9.837760000000e-03 -7.445048000000e-03 -9.869795000000e-03 9.999421000000e-01 -4.278459000000e-03 7.402527000000e-03 4.351614000000e-03 9.999631000000e-01
Tr_velo_to_cam: 7.533745000000e-03 -9.999714000000e-01 -6.166020000000e-04 -4.069766000000e-03 1.480249000000e-02 7.280733000000e-04 -9.998902000000e-01 -7.631618000000e-02 9.998621000000e-01 7.523790000000e-03 1.480755000000e-02 -2.717806000000e-01
Tr_imu_to_velo: 9.999976000000e-01 7.553071000000e-04 -2.035826000000e-03 -8.086759000000e-01 -7.854027000000e-04 9.998898000000e-01 -1.482298000000e-02 3.195559000000e-01 2.024406000000e-03 1.482454000000e-02 9.998881000000e-01 -7.997231000000e-01
参数名称 | 含义 |
---|---|
P0~P3( P r e c t ( i ) P^{(i)}_{rect} Prect(i)) | 矫正后的相机投影矩阵( R 3 ∗ 4 R^{3*4} R3∗4),0~3分别对应左侧灰度相机、右侧灰度相机、左侧彩色相机、右侧彩色相机 |
R0_rect( P r e c t ( i ) P^{(i)}_{rect} Prect(i)) | 矫正后的相机旋转矩阵( R 3 ∗ 3 R^{3*3} R3∗3) |
Tr_velo_to_cam( T v e l o c a m T^{cam}_{velo} Tvelocam ) | 从激光雷达到相机的旋转平移矩阵( R 3 ∗ 4 R^{3*4} R3∗4) |
Tr_imu_to_velo( T i m u v e l o T^{velo}_{imu} Timuvelo ) | 从惯导或GPS装置到激光雷达的旋转平移矩阵( R 3 ∗ 4 R^{3*4} R3∗4) |
目标3D框到图像的投影
X = ( x , y , z , 1 ) T X=(x, y, z, 1)^T X=(x,y,z,1)T 到图像像素坐标系 Y = ( u , v , 1 ) T Y=(u, v, 1)^T Y=(u,v,1)T 的投影遵循:
Y = P r e c t ( i ) X Y=P^{(i)}_{rect}X Y=Prect(i)X
激光点云到图像的投影
如果要将激光雷达坐标系中的点 X = ( x , y , z , 1 ) T X=(x, y, z, 1)^T X=(x,y,z,1)T 投影到左侧的彩色图像(P2) Y = ( u , v , 1 ) T Y=(u, v, 1)^T Y=(u,v,1)T 中,可使用如下公式:
Y = P r e c t i R r e c t 0 T v e l o c a m X Y=P^{i}_{rect}R^{0}_{rect}T^{cam}_{velo}X Y=PrectiRrect0TvelocamX
其中 P r e c t i P^{i}_{rect} Precti 对应标定参数的 P 0 P_0 P0 ~ P 3 P3 P3,因为这里使用的是左侧彩色相机,所以用的是 P 2 P_2 P2 投影矩阵。另外, R r e c t 0 R^{0}_{rect} Rrect0 和 T v e l o c a m T^{cam}_{velo} Tvelocam 在标定文件中是 3x3的矩阵,在实际计算时,需要将该3x3的矩阵扩展为4x4的矩阵,方法为在第四行和第四列添加全为0的向量,并赋值 R r e c t 0 ( 3 , 3 ) = 1 , T v e l o c a m ( 3 , 3 ) = 1 R^{0}_{rect}(3, 3)=1,T^{cam}_{velo}(3, 3)=1 Rrect0(3,3)=1,Tvelocam(3,3)=1。
Tr_velo_to_cam( T v e l o c a m T^{cam}_{velo} Tvelocam )
在实际计算时,需要将该3x4的矩阵扩展为4x4的矩阵,方法为增加第四行向量[0,0,0,1]。这个矩阵其实包括了两个部分,其一是3x3的旋转矩阵,其二是1x3的平移向量。
T v e l o c a m = ( R v e l o c a m t v e l o c a m 0 1 ) T^{cam}_{velo} = \left( \begin{array}{cc} R^{cam}_{velo} & t^{cam}_{velo} \\ 0 & 1 \end{array} \right) Tvelocam=(Rvelocam0tvelocam1)
R v e l o c a m ∈ R 3 ∗ 3 . . . r o t a t i o n m a t r i x : v e l o d y n e → c a m e R^{cam}_{velo} ∈ R^{3*3} ...rotation matrix : velodyne \rightarrow came Rvelocam∈R3∗3...rotationmatrix:velodyne→came
t v e l o c a m ∈ R 3 ∗ 3 . . . t r a n s l a t i o n v e c t o r : v e l o d y n e → c a m e r a t^{cam}_{velo} ∈ R^{3*3}... translation vector : velodyne \rightarrow camera tvelocam∈R3∗3...translationvector:velodyne→camera
3. 解析激光点云
激光点云数据采用二进制存储,逐点保存,每个激光点对应4个float数据( x , y , z , r ) (x,y,z,r)(x,y,z,r),依次解析即可,python解析代码如下:
import numpy as np
import struct
def read_lidar_info(file_path):
size = os.path.getsize(file_path)
point_num = int(size / 16)
assert point_num * 16 == size
lidar_pt_list = np.zeros((point_num, 4), np.float)
with open(file_path, 'rb') as f:
for i in range(point_num * 4):
data = f.read(4)
val = struct.unpack('f', data)
row = int(i / 4)
col = i % 4
lidar_pt_list[row][col] = val[0]
lidar_pt_list = lidar_pt_list.transpose()
return lidar_pt_list
4. AOS(average orientation similarity)
关于KITTI的AOS的计算,参考官方这篇论文:Are we ready for Autonomous Driving?The KITTI Vision Benchmark Suite。