Menu
我公司是结合网络技术为家电维修行业服务最早,维修技术最专业的家电维修公司。公司总部设立在北京,各个省份均有我们的维修网点,从事20多年家电行业,值得您的信赖!

当前位置柱面镜 > 柱面镜 >

简介-激光扫描仪雷达

日期:2019-11-08 16:09 来源: 柱面镜

  目前机器人的SLAM算法中最理想的设备仍旧是激光雷达(虽然目前可以使用kinect,但他无法再室外使用且精度相对较低)。机器人通过激光扫描得到的所处环境的2D/3D点云,从而可以进行诸如SLAM等定位算法。确定自身在环境当中的位置以及同时创建出所处环境的地图。这也是我制作他的主要目的之一。

  4:Hokuyo 2D激光雷达上图为Hokuyo这家公司生产的2D激光雷达产品,这类产品的售价都是上万元的水平。其昂贵的原因之一在于他们往往采用了高速的光学振镜进行大角度范围(180-270)的激光扫描,并且测距使用了计算发射/反射激光束相位差的手段进行。当然他们的性能也是很强的,一般扫描的频率都在10Hz以上,精度也在几个毫米的级别。

  第一种方式是改变激光器的输出模式,由原先的一个点变成一条线型光。扫描仪通过测量这束线型光在待测目标物体上的反射从而一次性获得一个扫描截面的数据。这样做的好处是扫描速度可以很快,精度也比较高。但缺点是由于激光变成了一条线段,其亮度(强度)将随着距离大幅衰减,因此测距范围很有限。对于近距离(10m)的测距扫描而言,这种方式还是很有效并且极具性价比的,本文介绍的激光雷达也使用这种方式,

  5:一字线红色激光器对于第二种方式,优点是可以很容易用2D激光雷达进行改造,相对第一种做法来说,他在相同的激光器输出功率下扫描距离更远。当然,由于需要控制额外自由度的转轴,其误差可能较大,同时扫描速度也略低。

  对于个人DIY而言,第三个因素可以排除,所谓知识就是力量这里就能体现了:-) 对于前2个因素,如果要实现完全一样的精度和性能,那恐怕成本是无法降低的。但是,如果我们对精度、性能要求稍微降低,那么成本将可以大幅的下降。

  首先要明确的是投入的物料成本与能达成的性能之间并非线型比例的关系,当对性能要求下降到一定水平后,成本将大幅下降。对于第一个因素,可以使用本文将介绍的三角测距方式来进行。而对于扫锚用振镜,则可以使用普通的电机机构驱动激光器来替代。

  对于精度而言,这个低成本方案足以超过kinect,不过扫描速度比较慢,但是对于一般业余用途而言已经足够。不过,该扫描速度是很容易提升的,本文将在分析其制约因素后介绍提高扫描速度的方法。

  6:激光三角测距原理目前有不少爱好者[1][2]基于激光三角测距制作了激光雷达或者测距仪,本制作也采用了这个方式。除了本文外,参考论文[3]也给出了较多的细节。(该论文的作者所在的公司正是将低成本激光雷达用于家用机器人XV-11的开发商)

  图中展现了测量对象Object距离激光器的距离d的示意图。图中的Imager部分是对摄像头的一种抽象表达(机模型)。标有s的线段实际可以是一个固定摄像头和激光器的平面。摄像头成像平面与该固定平面平行,而激光器发出的射线与该平面夹角beta仅存在于图中的视图中。

  如果这些参数在测距设备安装后不再改变(固定)且数值已知,则物体距离激光器距离可由如下公式求得:

  其中,x是测量中唯一需要获得的变量。它的含义是待测物体上激光光点在摄像头感光元件(如CMOS)上的成像到一侧边缘的距离。该距离可以通过在摄像头画面中查找并计算激光点中心位置的像素坐标来求得。对于示意图

  不过,在实际操作中,上述公式仍旧需要扩充。首先时对于变量x的求解,假设我们已经通过算法求出了画面中激光光点的像素坐标(px,py),要求出公式中需要的x,首先需要将像素单位的坐标变换到实际的距离值。为了计算方便,在安装时,可以令摄像头画面的一个坐标轴与上图线段s平行,这样做的好处是我们只需要通过光点像素坐标中的一个参量(px或者py)来求出实际投影距离 x。这里假设我们只用到了px。

  在论文[3]中给出了他的选取规则,这里直接给出一个结论,具体过程就不重复了:

  假设对于激光光点定位能做到0.1个次像素单位,单位像素尺寸为6um。并要求在6m处分辨率(dq/dx)=30mm。

  在我们制作过程中,这个要求还是很容易做到的。另外目前的CMOS摄像头往往具有更小的单位像素尺寸(在同样大小的芯片上做出了更高的分辨率),因此实际fs的取值下限可以更低。

  而对于摄像头分辨率、激光器夹角beta,则决定了测距的范围(最近/最远距离)。这里也同样不再重复了,可以参考[3]。对于使用pX进行测距的摄像头,其分辨率480x640即可做出比较好的效果,更高的分辨率更好(当然后文会提到缺点)。beta一般在83deg左右。

  在实现了单点激光测距后,进行2D激光扫描就非常容易:进行旋转。这里讨论的他的性能问题:扫描速度。

  对于采用三角测距的方式,从摄像头画面上识别出激光点到计算出实际距离对于目前的桌面计算机而言,几乎可以认为不需要时间。那么,制约扫描速度的因素就在于摄像头的祯率了。对于目前市面常见的usb摄像头,其工作在640x480分辨率的模式下最高帧率都在30fps,那么,扫描速度就是30samples/sec。换言之就是每秒钟进行30次的测距计算。

  如果要提高扫描速度,很自然的就是提高祯率。对于usb摄像头,有PS eye摄像头可以做到60fps。但这也只能实现3秒180度扫描。需要更加高的速率,也就意味着更快的传输速度,对于USB2.0而言,保证640x480的分辨率,fps很难有所提升。在论文[3]中,他们采用了高速摄像芯片 DSP 的方式实现了1200fps的帧率。

  8:采用红色一字线激光器捕捉到的画面对于线状激光器进行测距的问题,可以将它转化为前面单点激光测距的计算问题。 对于上图中的激光线条,算法将按照Y轴依次计算出当前Y轴高度下,激光光斑的X坐标值pX。并尝试通过先前的算法求处该点的距离。

  9:激光线条光斑在平行平面上各点的距离问题抽象如上图所示,远处平面为目标待测平面,上面有一条紫色的激光光斑。近处的平面 是摄像头的感光成像平面,经过了翻折后,他可以看作是目标平面到摄像头成像中心点组成的棱锥的一个截面。

  图中的P1点位于摄像头投影画面高度的中点,按照机的定义,该点在画面上的投影P1距离摄像头中心Camera Center的距离应当为摄像头的焦距F。因此,对于P1,可以直接带入式(4)求出实际距离

  11:不同环境和配置下摄像头捕获的画面上面3幅图像分别是在使用红色激光器摄像头所拍摄到的。(a)的图像比较理想,在于画面中除了激光光点外没有别的内容,虽然可以看到上方有光电发射发出的干扰点,但激光光点仍旧可以通过求出画面中最亮点的方式获取。

  (b)画面中出现了日光灯,由于日光灯亮度也较高,从画面上看与激光点中心亮度一致(均为纯白),对于这个图像,一种办法是同时判断临近像素的色彩,红色激光点的外围均为红色。

  在文献[3]和文献[4]中均提及使用滤光片的做法,仅保留激光器发射波长的光线进入,从而可以一定程度的避免光线. 调整摄像头曝光时间

  调整摄像机曝光率也可以有效去除画面的干扰,例如上图(b)和(c),对于5mW的激光器,一定距离内其单位光照强度仍旧比日光强[3](人肉眼可以在室外识别出激光笔照射在地面的光点) ,因此,只要将摄像头曝光率调整的足够短,完全由可能将画面中除了激光点之外的内容剔除。

  例如使用红外激光器,这个做法与遥控器使用红外LED理由一样,在人造环境中少有红外光干扰。配合红外滤光片,可以有效滤除来自诸如日光灯等的干扰。但是,对于日光和白炽灯, 其中也含有足够强的红外光,无法单纯采用此法。

  配合曝光率控制,增加激光器发射功率也足以使得画面中仅保留光点,但这样也有危险性,尤其采用点状激光时。

  本制作采用了上述的所有方法,将在后文具体介绍。对于问题(2),最简单的做法是直接找出光电中最亮的像素的坐标。但是由于前面公式得知,这样的得到的pX值是整数,计算得到的q将会有比较大的跳变。因此这里介绍如何将pX变为更 加精确的次像素级别。

  对于这个问题,学术界已有不少的研究,这里推荐参考论文[5],其中介绍了几种次像素激光光点定位算法的介绍以及分析了他们的优劣。这里也不再重复了。

  简单来说,可以认为激光光点的亮度是一个二维的Gauss函数经过了一次采样得到了画面上的激光点。那么,可以通过拟合或者简单的线性插值/求质心的手段,估计出光点的中心。

  :采用滤光片后,从白色日光灯画面(右上图)中识别并计算出激光光点中心坐标

  13:摄像头原始画面和经过相机校正后的修正画面上图左侧图片是一种摄像头拍摄到的原始画面,可以明显看出图像存在着扭曲,对相机校正后,我们可以校正后的参数修正扭曲的画面,得到右侧图像的效果。对于摄像机校正的具体原理、算法和过程超过了本文的介绍范围,具体信息可以参考如下的文献和教程:[8][9][10]。在本文后续的制作部分,也会介绍本次制作的校正过程和结果。

  对于激光器的选择,主要是考虑他的发射波长和功率。由于我的制作并不用像产品那样考虑激光器功率安全[2]问题 ,因此,采用了200mW的红外一字线激光器。较大功率的优势是可以通过缩短摄像机曝光速率,从而从画面上过滤到环 境光的干扰,同时也可以扫描较远的距离。当然,200mW的激光器功率的确有点太大了,

  在使用时注意不能用 眼睛直视,并且红外激光器人肉眼不可见,所以需要额外的当心

简介-激光扫描仪雷达

  在使用了红外激光器后,可以通过给摄像头加装红外滤光片。它可以将肉眼可见光过滤,仅允许激光器发出的红外 光进入摄像头。从而有效地过滤环境光带来的干扰。对于红外滤光片,最佳的选择是使用与激光器发射波长相匹配的滤 光片,比如如果使用的是808nm的激光器,那么滤光片选择808nm的窄带滤光片最合适,这样做可以最大程度的降低干扰 。因为现实中,日光、白炽灯、遥控器也都会发出红外光谱。

简介-激光扫描仪雷达

  但是这样的滤光片一般价格偏贵,在本制作中,我使用了800nm截至的低通滤光片。它允许任何波长低于800nm的红 外光通过。不过实际效果还是不错的。

简介-激光扫描仪雷达

简介-激光扫描仪雷达

  beta角度可以在安装完成后进行多次修正,保证在较远处,画面中仍然可以看到激光轨迹,再进行固定。

  首先是要移除摄像头镜片中的红外截止滤光片。该滤光片的作用与前文提到的红外滤光片功能恰好相反:它将红外 光谱过滤。一般摄像头内都会含有这种滤光片。如果不移除,则只能够感受到很微弱的红外信号。(题外话,可以用拆 除截至滤光片的摄像头观察kinect投射出来的红外图案)

  这里我才用了我们RoboPeak机器人团队设计的一款AVR开源控制版:RoboPeak Usb Connector[2]来实现这部分功能。它使用单片AVR(Atmega88)芯片通过软 件方式模拟出USB协议栈,并且使用了HID协议使得无需在PC上安装驱动程序。对于这部分的细节属于固件实现部分,将 在后文提到。

  同时,固件代码采用了我之前写的Arduino-Lite[5]轻量级AVR固件库。因此如果需要使用这里的固件代码,请在 google code上下载并配置Arduino-Lite[6]。

  RoboPeak USB Connector使用的是不含有USB接口的AVR芯片。因此,USB通讯支持是采用软件方式进行的。索性目前 v-usb开源库[4]已经提供了很优秀的封装。

  软件模拟usb的优势在于可以降低设备成本(带有USB的AVR芯片成本较高),缺点是稳定性和速率上不如硬件实现。 对于本制作,稳定性和速度并不关键。

  这里采用了另一种思路:利用那些OS自带驱动支持的USB类设备。(USB协议中预先定义了几类USB设备的种类,比如 Mass Storage就是平时用的移动硬盘、UVC设备常用于实现摄像头、HID设备用于实现键盘鼠标。OS往往会自带驱动支持 这类设备)。这里我也使用了HID类设备。理由如下:

  采用了HID设备后,及时在计算机上第一次使用本扫描仪,OS也能直接识别,不会要求安装驱动或者配置文件。

  接下来的问题是如何利用HID设备进行通讯了。这里的做法千差万别。为了提高通讯质量,这里我使用 了带有checksum交验的,基于数据包的通讯协议,将它运行在HID协议之上。因为本固件是基于RP USB Connector固件 的缘故,我直接采用了用于AVR芯片烧录器的STK500v2协议。

简介-激光扫描仪雷达

简介-激光扫描仪雷达

  在AVR上有很多舵机驱动库,这里我使用的是RoboPeak对Arduino自带舵机库的修改版本,该版本使用 Arduino-Lite进行了重写,精度上也较高。但这部分不影响具体效果,因此就不多介绍了。

  在RP USB Connector上引出了SPI总线,因此很自然的我使用SPI协议驱动74595芯片,直接通过AVR控制 数码管的每个LED,从而支持显示任意的图案。

  要注意的是,由于双米字管的每个字符上相同位置的LED公用信号线,因此在驱动上需要采用传统的扫 描方式,轮流点亮LED。

  本制作使用了OpenCV库简化图像计算的开发难度。同时这样也有利于代码的跨平台移植。对于摄像头的校正,会在 后文介绍。

简介-激光扫描仪雷达

  在视频中看到了实时扫描并显示点云的画面。在明白了扫描原理后,这点就没什么特别的了。基本上都是基本的3D 渲染得技巧。我使用了Irrlicht[7]开源3D引擎简化了这部分的实现工作。

  除了自行编写软件外,也有很多工具可以用来查看3D点云。比如开源的MeshLab[8],Blender[9]以及Matlab。在后 文我将给出可以在Meshlab中观看的点云数据。

  Calibration results (with uncertainties):

  理想的校正环境是比较空旷的区域,前方有垂直的白墙用于反射激光光斑。并配 备高精度的测距仪器参考。我没有这样的条件,也没有必要如此,因此采用了比较山寨的参考设备:卷尺。

  上图正是在制作本测距仪时进行校正所拍摄的照片。所需要的设备就是一把卷尺 ,当然最好能够足够长,有5-6m。这样可以校正到较远的距离。一般校正到5米是必须的。

简介-激光扫描仪雷达

  校正至少需要采集2个参数:实际的距离值,激光光斑中心点位置。校正采集到的数据自然是越多也好 ,但一般6个以上的点即可。

  在完成了数据采集后,可以在matlab等工具帮助下,进行曲线拟合。拟合的曲线公式正式前一篇文章提 到的式(4)。可以看出采集的数据和理论曲线非常吻合:

简介-激光扫描仪雷达

  这里给出前面图像和视频中出现的我的扫描像的点云数据,可以在MeshLab中导入察看:

简介-激光扫描仪雷达

  这里主要看看扫描精度实现的情况。如果之前校正用的基准数据没有任何误差(实际不可能),激光光点提取算法没有问题,那么实际工作时刻的误差主要就体现在拟合的曲线与实际的函数曲线的差距。换句话说,就是拟合得到的参数于实际正确的参数(我们并不知道)。

  当然,上面2个假设实际都是不成立的,不过,我们先加设他们都没有误差,先来分析校正曲线与实际曲线的误差:

  上表是在之前校正中收集的数据基础上得到的,其中Calc列的数据是通过校正后的拟合曲线)的计算得到的测距数据,而Diff就是计算得到的距离和真实距离(Dist)的差值。这里的单位除了X列外都是毫米。

  从数据上很直观的可以看到在4046mm处进行测距时,计算结果和实际值相差了98.64mm。相比这个,对于近距离的数据,误差也比较大。对于第二个现象,在前一篇文章的文献[3]猜测这是由于镜头扭曲造成的。但是,大家可能会有疑问了,我的实现不是已经做过相机校正了吗?为何还会有镜头扭曲?这里给出几个可能的解释

  相机校正也是基于实现设计出来的数学模型,实际情况有很多其他因素均能导致画面扭曲,但他们无法通过目前的校正修正

  红外光的折射率与自然光不同,校正是针对自然光频率范围进行的,因此对于红外光,扭曲依然存在

  除了测距精度外,这里也提一下扫描的分辨率。在前文中我提到过目前的舵机可以实现0.3度的角度定位精度。但实际上对于近距离物体扫描,这是不够的。目前的设备比较适合进行大范围扫描,这也比较符合他作为激光雷达的用途。

  其实动机在前一篇文章中已经点到,就是用于我们RoboPeak团队的机器人,进行SLAM。这也是接下来我即将进行的事情。当然,其实能做的事情还有很多,比如:

  其实商业的扫描仪都会支持这个应用。目前一次3D扫描只能采集物体的一个表面,而他的背面则无法扫描。如果对物体的背面也进行3D扫描,那就能得到完整的3D模型了。

  1的实现和原理很简单,2的核心问题是如何将2次扫描的点云对应起来?除了人肉拼接外,实际上也有比较成熟的算法,这类算法成为Surface Registration。如ICP-Slam也是采用了这样的算法。

  这里也提一下一个可用的工具和库:PCL (Point Cloud Library)[10]。他也是又机器人公司WillowGarage推出的开源库。其中包含了可以实现上述扩展的基础库。可以尝试。

  自激光器出现以来,激光作为高亮度、低发散的相干光特别适合作光雷达的光源,所以现在的光雷达均使用激光器作光源,名称也就统称为激光雷达了。这就是激光雷达能测距的原理。按照不同功能,激光雷达可...

  自制激光虚拟投影键盘 DIY小组 果壳网 科技有意思。由于人眼对激光的反应不一样,780nm-808nm的激光人眼不敏感,可看到微弱的一丝红光。850nm至1064nm波长人眼不可见,通过红外感光仪器等专业设备...

柱面镜

上一篇:

下一篇: