LabVIEW Robotics中如何借助二维激光雷达感知三维场景



主要软件: LabVIEW Development Systems>>LabVIEW Professional Development System
主要软件版本: 1.0
主要软件修正版本: N/A
次要软件: LabVIEW Modules>>LabVIEW Robotics

问题:
        在机器人领域,如果要使设计出的移动机器人能够完全自主地应对复杂、未知的环境,使机器人具备精细的环境感知能力就显得至关重要。激光雷达传感器从最初提出就受到广大研究人员的关注,经历了飞速的发展,目前,已经基本实现了模块化、小型化,且由于其应用范围广并适合户外未知环境使用,在帮助机器人精细感知外部环境方面逐步展现出巨大的优势,成为了移动机器人领域的传感器明星。不过,有个现实的问题,激光雷达传感器通常都不便宜,且三维激光雷达传感器要比二维激光雷达传感器贵出不少,如果手头只有二维激光雷达,如何去感知三维环境?


解答:
        毫无疑问,针对二维激光雷达,只要想办法将缺失的维度通过其他方法补上,就能变相实现三维激光雷达的效果。而事实上,这也正是大部分三维激光雷达的实现原理。为此,了解了如何通过二维激光雷达去感知三维环境,对今后直接使用三维激光雷达也大有帮助。不过,需要预先指出的是激光雷达传感器只是众多感知外部环境手段中的一种,为了拓宽大家的眼界,同时也帮助大家加深理解,本文会先跟大家介绍一下当前主流的环境感知手段(主要是非接触式方式),而后介绍一下如何使用LabVIEW去控制及访问二维激光雷达传感器,最后,向大家总结一下使用二维激光雷达感知三维环境的方法,供大家在后续具体项目中参考。
        1、已有环境感知方法总结:
        非接触式感知环境基本上有两大类方法:主动式与被动式。二者的主要区别集中在观测传感器是否主动向环境发出探测光。基于被动观察环境的方法的典型例子如立体视觉技术。要实现立体视觉,通常需要两个及以上的摄像头在不同的位置获取环境图像,在摄像头之间相对位置已知的情况下分析不同摄像头返回的图像并进行像素匹配,以此获得场景的深度信息。整个过程类似于人的双眼观察并解释场景中的物体远近。典型的立体视觉相机及经立体视觉算法处理的场景深度图像可以参见下图。
        主动式观测环境的方法要求观测传感器能向环境中发出已知属性的光扫描场景信息并接收来自场景中物体的反射光。这种方法又可以被细分为光学三角测量法、结构光法及飞行时间法。有兴趣的读者可以自己去找各种方法对应的文献做个详细的了解,此处限于篇幅,不对每种方法详细展开讨论,而是简略地比较一下各个方法的特点并在此基础上着重介绍一下激光雷达传感器。
      (1)光学三角测量法
        使用三角形法通常需要将经过校准的激光发射器和接收摄像头按一定的几何关系布置。该方法的工作原理是激光发射器先将已知的点状或条状图样模版投影到场景中的物体上,接收摄像头通过观察投影模版并按一定的几何关系解算,即可获得场景中特定物体的远近,如下图所示。
        光学三角测量法最初提出开始就有不少针对此法的研究,大多集中在提高测试速度和测距可靠性方面,例如有学者专门研究了大理石纹路表面对光学三角测量法可靠性的影响,还有学者试图通过空间-时域分析方法提高测距可靠性,并给出了光学三角测量法的误差模型。然而,总体来看,这种方法仍存在扰动大,可靠性较低,测试范围小的缺点。特别是当被测对象距离变远、位置接近扫描范围边缘时传感器返回的距离信息不确定性明显增大。鉴于此,光学三角测量法比较适合在室内、已知环境下使用。
      (2)结构光法
        结构光法可以认为是光学三角测量法的推广。与光学三角测量法一次仅照射场景中几个点或条纹相比,结构光法一次性向场景中投射致密的图样模版,传感器对应的接收相机观察到场景反射的图样后进行密集关联运算,最终一次性确定出一大片场景深度信息。微软公司推出的新一代Kinect体感设备(如下图)代表了该方法当前能达到的最先进水平。
        结构光法最先提出后,就出现了大量致力于提高测试速度及鲁棒性的研究。譬如有学者通过增加相机数量来提高立体视觉分析效果;还有学者则研究获取最优致密模版的方法;最近的大的突破体现在使用动态规划方法解决致密图样模版到深度图像的匹配问题,以及后续开发出结构光视频法实现了对场景的三维重建。
        与光学三角测量法类似,结构光法适用于室内已知环境的扫描。扫描距离受投射出的致密模版所限制,一般较小(即便是微软的Kinect,要获得较好的测试效果,最好将测试距离限定在4m范围内),且测距精度随距离的增大逐渐减小。
      (3)飞行时间法
        这种方法一般可以通过声学或光学原理来实现,考虑到声学实现存在噪声大,扫描点存在锥度角发散等缺点,本文主要考虑基于激光的实现方式,而这种传感器一般称为激光雷达(LADAR,取自LAser Detection And Ranging)。扫描时激光雷达会定向发出一束激光脉冲(或经调幅、调频的激光束),通过光速及接收到反射信号的时间,即可测出环境中物体的距离。如果激光雷达一次性获得许多距离点,那一般把这些距离点称为三维点云。与结构光法相比,采用激光雷达测试精度要略低一些,但由于其测试周期短,测距范围大,鲁棒性较好,故而这种方法适用于户外,未知环境。目前,轮式机器人的研究中已经大量使用激光雷达辅助机器人的避障导航,考虑到使用成本,一般二维激光雷达使用较多,如下图。由于只能扫描一个平面,如果想用二维激光雷达获取环境三维点云,则需要通过移动机器人或加装机械结构提供第三个维度的支持。
        激光雷达扫描时可以想象成将超声波传感器发出的声波替换为激光并高速回转扫描,如此就能大概构建出附近的物体轮廓,这个过程非常像潜艇上使用声纳探测周围物体。当然,由于激光雷达使用激光而不是声波,它的探测过程不仅极短,而且能弥补声波广角发散的缺点(激光不易发散,锥度角很小)。激光雷达工作时会先在当前位置发出激光并接收反射光束,解析得到距离信息,而后激光发射器会转过一个角度分辨率对应的角度再次重复这个过程。限于物理及机械方面的限制,激光雷达通常会有一部分盲区。使用激光雷达返回的数据通常可以描绘出一幅极坐标图,极点位于雷达扫描中心,0-360°整周圆由扫描区域及盲区组成。在扫描区域中激光雷达在每个角度分辨率对应位置解析出的距离值会被依次连接起来,这样,通过极坐标表示就能非常直观地看到周围物体的轮廓,激光雷达扫描范围示意图可以参见下图。
        激光雷达通常有四个性能衡量指标:测距分辨率、扫描频率(有时也用扫描周期)、角度分辨率及可视范围。测距分辨率衡量在一个给定的距离下测距的精确程度,通常与距离真实值相差在5-20mm;扫描频率衡量激光雷达完成一次完整扫描的快慢,通常在10Hz及以上;角度分辨率直接决定激光雷达一次完整扫描能返回多少个样本点,对大多数激光雷达这个指标在500个点以上;可视范围指激光雷达完整扫描的广角,可视范围之外即为盲区。激光雷达一般由固定的厂商生产,目前机器人领域使用最广泛的激光雷达由德国的SICK(施克)公司和日本的Hokuyo(北阳电机有限公司)生产。这些公司生产出的激光雷达在测距范围、性能、功耗及成本上各异,基本能涵盖一般的使用需求。
        考虑到三维激光雷达一般体积大,比较笨重,不利于向小型四足机器人集成,且成本高昂(一般是同样性能指标下二维激光雷达的5-10倍),本文后续会介绍借助小型二维激光雷达获取环境的三维点云信息的方法。
2、使用LabVIEW控制及访问激光雷达介绍:
        由于二维激光雷达品种繁多,不可能逐一介绍,在此仅以日本Hokuyo(北阳电机有限公司)生产的Hokuyo URG/UBG系列二维激光雷达传感器为例向大家讲解一下如何使用LabVIEW控制及访问激光雷达传感器。
        如果使用的是LabVIEW 2009(不包括2009)之前版本的开发平台,要驾驭激光雷达是比较费劲的,用户需要自己先到Hokuyo官网去下载对应操作系统(Windows/Linux/Mac)的激光雷达驱动程序,而后再使用LabVIEW VISA进行上层VI编程封装各类读、写操作,最终还要调试,测试确保VI的可用、可靠。这一轮下来,非有点水平的LabVIEW编程者是顾不过来的。即便这一轮搞定了,也不见得能在实际的机器人项目中应用。我们知道,最终的机器人项目代码基本都会部署到嵌入式控制器中,对应到NI,比较理想的硬件无疑是cRIO、sbRIO系列平台(myRIO在这没有列举,因为是2013版的事了),这些嵌入式平台内操作系统(一般是VxWorks)没有对应的激光雷达驱动程序,无法识别外设,因此,即便是将之前PC上辛辛苦苦编好的VI移植到这些平台也是无法完成激光雷达的控制及访问操作的。鉴于此,除非是项目明确要求使用老版本的LabVIEW开发平台,否则还是推荐用高版本的开发平台来做这件事。
        使用LabVIEW 2009及以上版本有个非常大的好处,就是其对应的Robotics 2009工具包集成了大多数激光雷达传感器的驱动,并提供了上层操作VI,无论用户是在计算机(Windows/Linux/Mac)还是在嵌入式控制器(VxWorks/Linux RT)上开发应用程序,只要外部通过串口、USB或网口将雷达连接起来,运行对应的VI就能立刻实现对激光雷达的控制及访问。
安装Robotics工具包后就能在LabVIEW中直接使用对应的VI,如下图所示:
        可以直接使用Hokuyo URG系列选板下的VI编写读取激光雷达返回的距离信息应用程序,程序框图如下图所示:
        读取到的特定方位上障碍物的距离信息在极坐标系下表示出来,就可以得到类似下图描绘的效果:
        有两点需要大家注意:
        1.)无论是什么操作系统平台,访问实物激光雷达使用的是同一套LabVIEW API。如果用户已有基于PC平台的激光雷达数据读取应用程序,想要在嵌入式平台(譬如cRIO)上实现同样的功能,只要将PC端的对应激光雷达操作VI拷贝到cRIO目标上直接运行即可。
        2)NI另外还提供一套功能类似的VI位于I/O with Sin选板下用于支持用户在仿真场景中操作虚拟激光雷达,如果用户当前暂时没有实物激光雷达,或者需要开发激光雷达后续的数据处理算法,不妨先在仿真环境中进行。依笔者的使用经验,NI Robotics Simulator提供的仿真环境不仅功能强大,而且可信度很高,如果算法在仿真环境中通过了验证,基本可以直接部署到实际机器人上使用。
        3、使用二维激光雷达感知三维环境方法介绍:
        前面已经点过,要使用二维激光雷达感知三维环境,把缺失的维度补上是关键。这里,一般有两种思路:
        1)采用截面轮廓扫描后还原拼贴的方法。
这个思路有点类似于医学领域的断层扫描方法,通过X光或核磁共振方式致密地扫描病人身体各个截面而后再将各个截面进行3D拼贴还原,即可得到一份完整的身体三维影像。使用二维激光雷达可以实现对环境截面的扫描,再配合机器人在第三个维度方向的移动,结合每次扫描时机器人的位置信息并将各个扫描截面依次在全局地图上注册,就能达到对整个空间进行三维重建的目的。笔者亲自参与的一个空间环境三维重建项目使用的就是上述思路,机器人硬件配置如下图:
        当机器人沿Y方向行进时,XZ平面内的激光雷达会不断获得环境的截面信息,项目设定机器人行进过程中XZ平面内的激光雷达扫描速度足够快,以获得较为致密的环境截面信息。以机器人通过密闭走廊通道为例,能够获得的原始扫描数据根据位置在全局地图上拼贴后效果如下图:
        当然,直接使用原始的扫描数据表达环境还是显得非常粗糙的,如果要使重建出的三维环境更易于被  人理解,还需要使用算法加工一下原始数据。以使用占有网格算法为例,对上图的原始数据加工后可以得到类似下图的环境描述:
        在占有网格算法处理下,整个走廊的大概样貌已经基本显露出来。如果直接从原始数据上看,天花板如何布局,门、窗大概在什么位置等信息是比较难以获得的,但经算法处理后就大不相同了。如果我们要观察走廊的内部情况,还可以将天花板隐去,这样,走廊的走势、不同位置的凹陷、一些不规则物体的标记都能直接一目了然地显现出来,如下图所示:
        截面轮廓扫描后还原拼贴的方法优点是可以在全局,大范围获得环境的三维描述,缺点是对机器人的定位要求较高,错误的机器人定位会导致还原出的全局地图不可用。
        2)采用固定轴旋转扫描的方法。
考虑到三维激光雷达一般体积大,比较笨重,不利于向小型机器人集成,且成本高昂,当小型机器人有获得局部环境三维信息的需求时,很多时候也还是本考虑借助小型二维激光雷达来完成这件事。由于多数情况下,机器人获取局部三维环境信息是为了帮助自己判断并选取后续行进路线,故二维激光雷达多装在机器人的前部,如下图所示。与截面轮廓扫描后还原拼贴的方法不同,此处更看重局部环境的深度信息,即我们常说的空间三维点云。
        为了获取环境的三维点云信息,还需要给上图中的激光雷达一个额外的自由度,否则,只能扫描一个   平面,获取的地形信息非常有限。这里,可以采用类似下图所示的方法控制额外的电机牵引激光雷达绕其光轴旋转,然后将各个扫描平面的地形轮廓信息顺序收集起来,即可获得机器人前方环境地形的三维点云描述。
        由于激光雷达直接返回的是极坐标系下的三维点云描述,不利于后续算法的统一处理,为此,有必要在激光雷达扫描的同时就将获取的三维点云数据转换到笛卡尔坐标系中。参照下图给出的定义,使用简单的转换公式即可实现这个转换。
        实际运用这种方法获取环境地形的三维点云描述时不可避免的会遇到分辨率选取的问题,分辨率包含水平方向扫描平面中激光雷达每隔多少角度取一个点及纵向方向每隔多少角度取一个扫描平面。理想状况下自然是分辨率越高越好,最好能分别达到方向激光雷达传感器及方向机械牵引装置所支持的极限,这种条件下获取的三维点云会非常稠密,对实际环境地形的描述也非常精准,但是考虑到每次要处理数万个点云对后续运算处理步骤会造成极大的负担,这么做是不可取的。此外,纵向方向及水平扫描方向的扫描范围确定也值得商榷,太大的扫描范围通常没有意义,不仅会造成点云规模的扩大,还有可能扫描到机器人本体。
        对于如何选取方向及方向的分辨率及扫描范围,笔者根据经验建议大家参考下述原则:
        (1)分辨率的选取需要结合激光雷达在实际机器人上的安装高度及需要分辨出的最小尺寸大小,以三维点云中最近点间距小于最小敏感尺寸的一半为宜。
        (2)纵向方向以向上不超过水平面(如为高度方面避障考虑可适当再上调一点),向下不会扫描到正常行进的机器人前端机构为宜。
        (3)扫描平面方向范围选取应不小于机器人能一次性执行的机体最大偏航的四倍,且左右对称分布。
        以笔者的实际项目为例,根据上述参数选取,每次对三维场景的扫描将返回个点。如果使用的激光雷达完成一个二维平面的扫描耗时50ms,完成的纵向扫描共计需2秒。从这可以看出,采用固定轴旋转扫描的方法数据量还是比较大的,而且较为耗时,为了保证扫描的准确性,最好在扫描过程中让机器人保持静止。
        在LabVIEW Robotics Simulator虚拟场景下,使用固定轴旋转扫描的方法获得的环境三维点云如下图所示:
        可以看到,使用固定轴旋转扫描的方法获得的环境三维点云是非均匀的,近处的点密集,远处的点稀疏,这与Kinect这类使用结构光原理返回的均匀点云有根本区别。对非均匀点云信息进行算法分析也是有不少需要考虑的地方的,不过限于篇幅,在本文中不作展开。
使用固定轴旋转扫描的方法优点是能获得环境局部精细的三维点云描述,缺点是数据量较大,获得的点云不均匀,且获取点云较为耗时,后续算法处理也不轻松。不过作为一种可行的方法,在原理性验证及学术研究方面,还是经常性地被采用。
        4.总结
        本文主要介绍了LabVIEW Robotics中如何借助二维激光雷达感知三维场景的方法,从常用的获取环境三维信息的手段及激光雷达传感器原理入手,结合实际的LabVIEW编程,Robotics仿真及项目应用案例,向大家讲述了各类方法的优缺点及实现效果。要指出的是如何使用激光雷达辅助机器人识别环境是当前机器人研究领域里非常热门的分支,本文所写的内容主要是笔者的一些经验及浅见,用于与大家共享。相信随着技术的发展,这一领域未来会出现更多优秀的应用!


相关链接: http://ni.com/robotics

附件:





报告日期: 12/28/2014
最近更新: 12/29/2014
文档编号: 6SRJLTYA