LiDAR原理与点云数据初探

LiDAR

LiDAR(Light Deteation and Ranging),激光探测及测距系统的简称,用激光器作为发射光源,采用光电探测技术手段的主动遥感设备,我们也称其为激光雷达。从名字上可以看出LIDAR是一种主动测量方式,主要有激光发射部分、接收部分组成、信号处理部分组成,其主要功能就是测距和探测。

激光雷达的优点是具有极高的分辨率,抗干扰能力强,获取的信息量丰富,可全天时工作;缺点是容易受到大气条件以及工作环境的烟尘的影响。

LiDAR

激光雷达的类型很多,如下所示。车载激光雷达常用的是多线机械旋转的激光雷达。

type

单线雷达就是只有一个激光发射器和接收器,经过电机的旋转,投射到前面障碍物是一条线,这样的好处是数据量处理起来比较少,效率高,稳定性好,技术成熟,但是只能检测同一个高度的障碍物,不能测量整体轮廓,多应用于扫地机器人、酒店服务机器人

多线雷达目前市场有4线、8线、16线、32线、64线、128线,就是在垂直方向上具有多个发射器和接收器,通过电机的旋转,获得多条线束,线数越多,物体表面轮廓越完善,当然处理的数据量越大,对硬件要求越高;多线雷达主要应用在无人驾驶上,可以计算物体的高度信息,并对周围坏境进行3D建模。每相连激光发射器之间形成的角度就是其角分辨率,一般各角度是相同的,但也有不等的,比如禾赛的40线激光雷达,角分辨率0.33°-6°+2°),角分辨率-16°-2°+2°+7°);这样做的目的是可以充分捕捉远处物体的特征,不至于因视场角过大,激光器的射线在远距离时超出障碍物外而失效。

原理

测距

LiDAR的首要工作就是测距,探测是在测距的基础上进行的。

时间测距
LiDAR是利用发射和接收激光脉冲信号的时间差来实现对被测目标的距离测量,测距公式为:

R =c * t / 2

其中R是测量距离,c是光速,t是激光信号往返的时间差。

时间获取的方法主要脉冲法和相位法。

脉冲法(time of flight, TOF)就是利用被测目标对激光脉冲的漫反射作用,通过接收和发射端的计时,来获取时间差。这种方法容易受到脉冲宽度和计数器时间分辨率的影响,测距很短的情况下,一个微小的时间偏差对于测距精度影响都很大,所以这种测距方法精度不是很高,但是工作方式简单,效率高,适合于精度要求不高的场景。

相位法(phase difference),通过测量连续的调制波在待测距离上往返传播一次所产生的相位差,间接测定激光信号所传播的时间。相位法测距是根据波的周期性进行测距的,所以这里很重要的一点就是如何获取光波的整周期数,一般来说相位法测距精度可达到毫米级,优于脉冲法。

三角测距
LiDAR中另外一种常见的测距方式为三角测量法(triangulation principle)。这种测距方法的LiDAR和时间测距法LiDAR在结构上有一些差别,这种LiDAR内部包含CMOS元件,根据上下两个三角形相似原理计算距离:

f/w=V/D, V=S * sinα, S = (f * D) / (w * sinα)

三角测距

探测

探测即探测物体在特定坐标系的坐标值。根据LiDAR测量的距离S 、激光脉冲的竖直扫描角φ、 水平扫描角Φ,使用极坐标法可以得到物体的坐标:

\begin{cases} x=S*sinφ*cosΦ\\ y=S*sinφ*sinΦ\\ z=S*cosφ\\ \end{cases}

探测

点云

点云是某个坐标系下的点的数据集。点包含了丰富的信息,包括三维坐标XYZ、颜色、分类值、强度值、时间等等。主要是通过三维激光扫描仪进行数据采集获取点云数据,其次通过二维影像进行三维重建,在重建过程中获取点云数据,另外还有一些,通过三维模型来计算获取点

LiDAR点云数据的定向,要通过多个坐标系间的几何关系来确定,包括激光扫描仪的参考坐标系、瞬时激光束坐标系、空中平台坐标系、目标所在水平参考坐标系与垂直坐标系和惯性导航仪的参考坐标系与WGS-84坐标系。

KITT激光雷达点云数据处理

数据描述

KITTI提供了Velodyne激光雷达的点云数据用来进行3D目标检测,点云数据被保存为二进制bin文件,每个点包含3个坐标和反射率信息,即 (x,y,z,r),坐标点存储在笛卡尔坐标系。

KITTI

数据可视化

KITTI官方提供了C++ SDK进行点云数据的处理和开发,python环境下可以使用numpy进行数据的读取。在python下可以选择的点云可视化工具基本只有mayavipython-pcl或者open3d-python这三个选项。其中前两者的安装较为复杂,这里使用open3d-python进行可视化操作。

pip3 install open3d
# or
pip install --user open3d
# or
python3 -m pip install --user open3d
# or
conda install -c open3d-admin -c conda-forge open3d

可视化代码如下,可以使用默认、距离或者反射强度来标定颜色。默认情况下以线数为标准分配颜色。

import numpy as np
import open3d
from matplotlib import cm

def cmap2rgb(cmap, step):
    return np.asarray(getattr(cm, cmap)(step, bytes=True)[:3]) / 255


def vis_open3d(pointcloud, c_type='dist'):
    # create point
    points = pointcloud[:, 0: 3]  # x,y,z position of point
    r = pointcloud[:, 3]  # reflectance value of point

    col = None
    if c_type == 'dist':
        x = pointcloud[:, 0]
        y = pointcloud[:, 1]
        col = np.sqrt(x ** 2 + y ** 2)  # Map Distance from sensor
    elif c_type == 'reflect':
        col = r

    point_cloud = open3d.open3d.geometry.PointCloud()
    point_cloud.points = open3d.open3d.utility.Vector3dVector(points)

    if c_type != 'default':
        col = ((col - np.min(col)) / (np.max(col) - np.min(col)) * 255).astype(np.int)
        color = [cmap2rgb('viridis', col[i]) for i in range(col.shape[0])]
        point_cloud.colors = open3d.utility.Vector3dVector(color)

    # create Visualizer
    vis = open3d.open3d.visualization.Visualizer()
    vis.create_window(window_name="kitti")
    vis.get_render_option().point_size = 1

    opt = vis.get_render_option()
    opt.background_color = np.asarray([0, 0, 0])

    # show
    # open3d.open3d.visualization.draw_geometries([point_cloud])
    vis.add_geometry(point_cloud)

    while True:
        vis.update_geometry(point_cloud)
        vis.poll_events()
        vis.update_renderer()


if __name__ == '__main__':
    path = 'E:\\BaiduNetdiskDownload\\LiDAR\\data_object_velodyne\\training\\velodyne\\000000.bin'

    pointcloud = np.fromfile(path, dtype=np.float32, count=-1).reshape([-1,4])
    print(pointcloud.shape)

    # vis(pointcloud)
    vis_open3d(pointcloud, 'default')

default

颜色越深距离越近。


dist

颜色越深反射越小。


reflection
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容