为何要用 3D SLAM 方案


在ROS平台上使用RGB-D相机实现SLAM


查看产品

移动机器人和 ROS

移动机器人正在工业、商业和家庭中开始得到大量的应用,不同于PC和手机等传统电子产品,机器人行业还没有出现像Windows和Android那样成熟的OS和开发者生态系统。其中一个重要的原因是机器人产品的多样性和复杂性,另外一个原因是以前机器人产品的数量和普及率也不够支撑起一个庞大和完整的生态系统。

近年来情况正在发生变化,随着机器人实际部署数量的增加,尤其是商业和消费类机器人普及应用的前景显现,整个工程技术领域对机器人行业的技术发展投入了巨大的热情和资源,在系统和软件平台层面,出现了像ROS这样广泛接受的平台。

ROS(Robot Operating System)是一套面向机器人软件开发的framework,它提供类似操作系统提供的功能,包含了工具、软件库、硬件抽象描述、驱动管理、程序间消息传递等。ROS流行的原因除了能够帮助机器人研发人员提高代码复用和开发效率之外,还因为其免费且开源的。目前很多的移动机器人采用了双系统,由ROS来进行运动和机械控制,而应用程序则交由Android来掌管。

机器人常用 SLAM 传感器介绍

不同的机器人拥有各自不同的型态和功能,但是对具备自主移动功能的机器人,SLAM是其必然的共性功能。任何一台可自主移动的机器人,必然需要具备能够进行环境和障碍物感知、并在此基础上进行建图和定位的能力。

下面是目前移动机器人上面常用的一些传感器介绍,因为单一传感器的局限性,通常一个真正的机器人会配置多个传感器进行组合,以提高机器人移动的正确度和可靠性。

  • 相机 + 标记点
    这是AGV和当前很多餐厅机器人采用的方案,方案实现简单、可靠性也不错,但是需要对机器人的活动场地进行布置或装修,且机器人只能在预先设定的移动路径上运动。因此这种方案的使用量虽然不小,但其应用场所非常受限,只局限于固定场所内的固定运动模式。
    常用的标记包括画线、二维码或其它专门设计的易识别图像标识,标记的放置位置多为地面或天花板。下图是一个实际例子。image1
  • 激光雷达
    激光雷达是多数高端移动机器人SLAM用的主要传感器,通过激光雷达建立的平面地图质量相对比较好,但其主要缺点是价格昂贵,根据不同的检测距离和精度,价格多在几千美金范围。目前国内从事激光雷达开发的创业公司也出现了不少,预计届时价格会有大幅度的降低。
    激光雷达的原理是利用单点激光测距的精度(无论是TOF还是三角方法,激光单点测距的精度都比较良好),再利用电机(或其它等效的光学方法)带动单点测试模组进行360度转动扫描采样,获得周边的障碍物距离信息。因此在结构上激光雷达有几个大的缺点需要注意,一是转动部件本身的稳定性和寿命问题,以及转动结构带来的电信号接触传输困难;二是所需的360度视场很难满足,比如下面这款扫地机其扫描部件只能突出于其本体之上以避免遮挡,难言美观,更多的商业机器人无法将雷达置于头顶位置,在本体结构设计上只能采取各种妥协方案。

image3

  • 惯性传感器
    惯性传感器(IMU:Inertial measurement unit)通常泛指加速度传感器和陀螺仪的组合,有时也可包括地磁传感器。加速度传感器能够测量直线运动而陀螺仪能够测量旋转运动,两者组合便能够测算出连续时间内的运动轨迹。不过这种方法有两个比较严重的问题:一是只能获取前后时间内的相对位移轨迹,没有绝对位置概念;二是误差会累积,一定时间后其累积的误差会漂移到不可接受的程度,比如对于普通的手机用IMU传感器来说,通常几分钟后的累积误差就达到需要采取措施进行干预的地步了。
    image4
    IMU的工作对环境没有依赖性,这可以跟视觉方案形成一种互补。视觉方法虽然能在给定的环境条件下、在大多数时间内正常工作,但总是不可避免地会因为特殊环境条件的原因而产生失效或误判,比如环境光照条件的不利变化或玻璃墙的出现等,在这些视觉方案不能很好工作时间片段内,利用IMU进行衔接是一种常见的方法。另外,像单目视觉这种方案与IMU进行组合,也能对空间定位能力形成一种不错的组合。
  • 无线网络定位
    利用常见的近场无线网络(比如WiFi或蓝牙等)进行定位也达到了实用的成熟程度,有不少商业场所已经利用这些无线网络定位方案部署了面向消费者的LBS服务。其定位精度根据无线节点的部署密度而异,通常可以达到5米左右,这种方案的延时会比较大,可能会高达1秒,这对于机器人而言需要加以重点考虑。
    一般而言,出于这种方案的实施复杂度和成本原因,通常只适合于一些大商场和酒店的服务机器人应用。无线定位只提供大范围但粗粒度的网格化定位,而近场的细节和周边导航避障则交由视觉来处理。
  • 单目相机
    比上面方案更先进且应用范围可以更加宽广的方法是不依赖于预设的光学标记,让摄像头能够主动识别外界环境的成像特征点,通过在移动过程中连续的跟踪,进行相机姿态和跟物体之间相对位置变化的估计,从而建立起地图。显然这种方案的优点是光学和成像系统非常简单且低成本,但是对算法和计算资源的要求很高,并且对最终能够实现到多好的工程效果存疑。在过去很多年里,有不少关于SfM(Structure from Motion)的研究,应用于三维建模和SLAM相关。目前在移动机器人方面最有代表性的一个产品是iRobot的Roomba 980扫地机,如下图所示。image2
    扫地机这个产品型态虽然看起来不是个高端机器人,但是在单目SLAM这个技术方案的工程实现上,iRobot是走在了业界前沿的,这款Roomba 980目前的公开售价是裸机900美金,相当不便宜。除此之外,其它能真正应用这种方案的机器人非常罕见,而且,即便是这台机器,其建图和定位的能力,也离商业机器人的要求有很大距离,尤其是在运动物体比较多的场所。
  • 深度相机
    深度相机(Depth Camera)是一种三维测距装置,在功能上比激光雷达跟进一步,能够对周边环境和障碍物进行三维测量。激光雷达是一种典型的2D测距设备,如下图绿色所示,它通过转动能够拥有360度的水平视场角,但没有垂直方向的市场角度。3D测距设备除了水平视场角之外(不过跟普通相机一样,视场角会有限制),还拥有一个垂直视场角,因而能够对障碍物的高度和完整轮廓进行测量,获得详尽的数据,能同时完成建图和障碍物的三维识别。
    wechatimg2
    从理论上来看,3D vSLAM比2D vSLAM拥有压倒性的优势,但限于目前的工程水平,3D vSLAM还没有大规模的实用,主要的瓶颈有两个:一是3D传感器,也就是深度相机的远距离测量精度还不够理想,从3D数据上抽取出来的平面数据,比激光雷达测到的平面数据其精度和稳定性都要差一些;二是3D vSLAM的算法和软件还在发展完善过程中,其效果和计算资源的消耗都离成熟商用有段距离。
    目前的深度相机多跟激光雷达配合,完成障碍物高度检测的作用;一些低端的移动机器人开始采用深度相机承担SLAM的任务(比如,一台定价500美金的机器人,完全无法配置激光雷达)。但是,基于深度相机天然具有的数据完整程度以及硬件上的高性价比(民用深度相机的价格在人民币千元上下),其发展正得到业界的高度重视,特别是3D vSLAM的软件演变现在很快,预计从技术和应用两方面都将快速进步。
  • 超声波
    超声波传感器的优点是成本低,实现方法简单。但是缺点也很大,它的检测距离较近,轮廓识别度很差,而且在多障碍物环境下的多径干扰问题难以解决,多个传感器之间的相互干扰也是个大问题。
    但超声波与上述所有的相机或激光雷达方案相比有一个最大的优点是对玻璃等光学不友好物体的识别。所有的相机和激光雷达本质上都是以光学成像为物理基础的(包括可见光或不可见光),光学系统面对透明物体(包括像玻璃这样的弱反射物体或者一些强吸收某些波段光谱的特殊材料物体)和镜面反射物体时都存在物理上不可克服的成像困难,从而导致测距和物体识别错误。而超声波的反射对物体材料没有特殊依赖,对玻璃和镜面等物体的存在有很好的识别能力。
    综合起来,作为避障的最后一道防线,超声波有其独特的价值,绝大部分移动机器人上面都会标配一个或多个,成为各种视觉方案之外的辅助传感器。
  • GPS
    对于需要在室外行动的机器人而言,GPS基本是一种标配的定位方式,不可或缺,GPS的绝对位置定位能力能够给在室外大范围移动的机器人最可靠的定位,尤其是结合AGPS以后,定位精度更高。当然室内机器人是无法使用GPS的。
    在实际应用中,很少有机器人只采用一种传感器方案来实现移动所需的SLAM能力,多数都需要至少两种以上的传感器组合。一台高配的商业移动机器人可能同时配备“无线(大范围网格定位)+激光雷达(近场精确SLAM)+深度相机(立体避障)+超声波(防撞)”;像Google的Project Tango则从低成本传感器融合入手,采用了“单目+IMU+深度相机”的组合。如果出一个难题,只能用一个传感器来实现基本SLAM的话,目前条件下,不差钱的多数会选择激光雷达,而低成本方案会优先考虑深度相机。

图漾 RGB-D 相机介绍

  • 深度相机介绍
    深度相机的技术方案也有几种,常见的有(1)双目;(2)结构光;(3)TOF;(4)主动双目。其中双目方案最为直观,但是因为无法对颜色或纹理特征稀少的物体进行测量,无法在室内高精度场景下工作,因此一直以来都没能得到太多的实际应用。结构光因为之前PrimeSense方案的推动(具体产品包括微软的Kinect-1和华硕的xTion),在机器人市场里有不少的部署,不过结构光方案对靠近窗户的阳光和来自其它机器人的结构光干扰都极其敏感,只适合于全封闭室内和单机器人场景。TOF方案则受制于底层传感器芯片的制约还缺少成熟产品,在分辨率、测量距离和角度、功耗、测量精度和成本等方面还需要从芯片开始逐步优化。主动双目是图漾科技主推的一种创新技术方案,结合了双目和结构光方法的优点,既解决了双目对待测物体的苛刻要求,也规避了传统结构光对阳光和其它设备干扰的难题。
    图漾的深度相机方案如下图所示,其深度测量单元有2颗堆成的红外摄像头和1个结构光投射器组成,这种组合对环境光照条件没有要求,可以在黑暗、正常照明甚至阳光干扰环境下正常工作。通过深度相机获取的是深度图或者点云数据,只包含几何维度的信息。如果同时还需要RGB颜色信息的话,可以通过额外的一路RGB通道得到,RGB摄像头是根据不同客户需要可选的。

深度相机的选择

跟其它光学相机类似,深度相机也根据其光学参数的不同,存在很多不同的规格型号。主要的测量参数包括:

  • 距离:典型远中近范围为0.3-2m、0.5-5m、1-10m,光学上无法做到远近兼得;

  • FOV视场角:测量设备的FOV比拍照更难做大,常见水平FOV 60度左右,90度以上比较少见;
  • 测量精度:视觉方法的测量精度跟测量距离是负相关的,常见的测距精度大致如下,近距离可到mm级,远距离cm级;
  • 深度图分辨率:从实际应用需求出发,仅用于避障目的的话249-480p分辨率以及足够,而要做SLAM的话最好有480p以上的分辨率,但是分辨率的提升对于计算带宽的压力会急剧增加;
  • 帧率:对以慢速的移动机器人而言(1m/s左右),30fps的帧率已经足够,机器人的速度越快,所需的帧率越高,当然数据带宽也越大。

作为一家专业的深度相机开发公司,图漾提供了多种规格的产品型号供客户选择,大家可以访问我们的产品网页获取实时更新的产品信息:XYZ。后面的例子以我们的入门级产品DM460为例进行使用介绍。

DM460的主要规格如下:

  • 输出数据:深度图或点云可选,无RGB;
  • 深度图分辨率:560*460;
  • 深度图帧率:30fps;
  • 测量范围:0.5-5m;
  • FOV:水平56度 / 垂直46度;
  • 硬件接口:USB2.0
  • 外形尺寸:宽:90毫米 高:21毫米深:24毫米

FM860是更高规格的一款产品,测量效果更好,功耗和成本也比DM460略高。

ROS对深度相机的支持

如前所述,目前3D vSLAM尚属热门研究课题,还缺乏可成熟商用的软件方案。目前ROS里面集成的深度相机SLAM模块里面实际上是通过把3D depth map采样成2D depth map来进行的(就是ROS里面的LaserScan),而在2D depth map数据之上可直接使用传统的各种成熟SLAM算法。
LaserScan的机制如下图所示,深度相机输出的深度图是有垂直视场的,一定高度范围内的物体信息都包含在里面;LaserScan做的事情就是简单地在深度图上,只对一个预先设定的高度平面上的数据进行采样,忽略其它高度上的数据,如此就形成了一个“面”上的地图数据采集,而这个数据集可以等同于如激光雷达这类2D测距设备的输出数据。
image6
所以,在ROS中调用深度相机,其主要工作是把设备接入ROS,让系统能够读取深度相机的3D depth map,然后通过LaserScan进行数据的映射转换,再调用2D vSLAM实现建图和路径规划。

基于图漾科技RGB-D相机的ROS SLAM实现步骤

下面是一个示范例子,在“ARM开发板 + TurtleBot机器人运动平台”上加载ROS并接入图漾的深度相机,实现ROS中自带的xxxSLAM建图和路径规划。

平台说明

硬件:

  • 基于 ARM 的开发板,这里我们使用 Firefly(RK3288)
  • TurtleBot 2
  • 图漾 3D 深度摄像头

软件:

  • Ubuntu 14.04
  • ros-indigo-desktop
  • 图漾 ROS wrapper (camport_ros)

安装步骤

1. ros-indigo-desktop 
http://wiki.ros.org/in2digo/Installation/UbuntuARM
2. Turtlebot Installation
 http://wiki.ros.org/turtlebot/Tutorials/indigo
3. Install Turtlebot bringup and turtlebot navigation
$sudo apt-get install ros-indigo-turtlebot-bringup
$sudo apt-get install ros-indigo-turtlebot-navigation
4. Install Percipio SDK
$mkdir ~/percipio
4.1. camport_linux (arm or x86_64)
$cd ~/percipio
$git clone https://github.com/percipioxyz/camport_linux.git
$cd camport_linux $sudo cp lib_(armv7hf/x64)/libcamm.so /usr/lib/        (arm7hf or x64) 
$sudo cp include/percipio_camport.h /usr/include/
4.2. camport_openni2
$cd ~/percipio
$git clone https://github.com/percipioxyz/camport_openni2.git
$cd camport_openni2/binary $sudo cp primesense-usb.rules /etc/udev/rules.d/
$sudo service udev reload
$sudo service udev restart (For ARM)
$sudo dpkg -i libopenni2-0_2.2.0.33+dfsg-4_armhf.deb
$sudo dpkg -i libopenni2-dev_2.2.0.33+dfsg-4_armhf.deb (For x64)
$sudo dpkg -i libopenni2-0_2.2.0.33+dfsg-4_amd64.deb
$sudo dpkg -i libopenni2-dev_2.2.0.33+dfsg-4_amd64.deb (note to re-plugin the 3d camera)
4.3. camport_ros
$cd ~/percipio/ $git clone https://github.com/percipioxyz/camport_ros.git
$cd camport_ros
$catkin_make $echo "source
$HOME/percipio/camport_ros/devel/setup.bash" >> ~/.bashrc
$source ~/.bashrc
5. launch turtlebot navigation app
5.1. on turtlebot side
$roslaunch turtlebot_bringup minimal.launch
$roslaunch turtlebot_navigation gmapping_demo.launch
5.2. on PC side
$roslaunch turtlebot_rviz_launchers view_navigation.launch

图漾科技RGB-D摄像头用于SLAM的安装和测试效果

TurtleBot2上安装示意图
TurtleBot2上安装示意图

室外走廊 SLAM 测试效果
室外走廊 SLAM 测试效果

从实测的 SLAM 效果来看,存在以下问题:

  1. 走廊两侧的一些玻璃门对于深度摄像头来说都是不稳定的数据,摄像头会直接穿过玻璃门,测到门内部物体的深度。所以实际情况需要解决玻璃、金属等特殊材质对深度摄像头的干扰。
  2. 图中黑色直线显示的走廊墙壁数据看上去有毛刺,原因是摄像头前后帧深度数据之间存在细微的抖动,后续产品中我们会持续提高摄像头的稳定性和精度。

可优化方向

目前采用深度相机,把3D Depth Map转换成2D Depth Map后再利用传统2D vSLAM进行建图、定位和路径规划的功能,在要求不高的移动机器人上面已经可以实用。后续进一步的可优化之处如下,随着技术的进步,3D vSLAM的进展应该会越来越快。

  1. 测量精度和稳定性
    深度相机测量效果本身的提升会对SLAM结果带来显著的进步,比如用图漾的FM860  XYZ。
  2. 测量距离
    如在前面介绍深度相机时讨论的,深度相机的测量精度随距离而下降,从图漾的DM460来看,3米以内的数据比较不错,5米以外的数据开始明显变差。因此,提升深度相机的远距离测量稳定性,对SLAM有直接正面意义。
  3. 与最新的3D vSLAM软件算法配合,利用更多的数据特征实现更好的3D vSLAM
    虽然需要付出数据带宽和计算量的代价,但是3D数据相比于2D肯定会有更多的数据特征可以利用,这一点需要3D vSLAM社区在工程实现上的突破,目前来看前景非常可期。
  4. 与其它传感器的融合实现更好的效果和鲁棒性
    这一点在前面介绍各种传感器的时候已经有了比较充分的说明。融合传感器的组合,由机器人整体设计者根据需求和制约条件加以选择。