激光SLAM简介
小飞1 SLAM概述
1.1 应用背景
目前SLAM技术应用的场景和行业十分广泛,如大家熟知的扫地机器人,无人机和现在火热的无人驾驶。同时一些AR, VR设备也都需要SLAM技术。
对于扫地机器人,无人机和无人驾驶,我们都将其规划为移动机器人应用范畴。这些移动机器人常常需要在陌生的环境中完成路径规划及控制行走。在这种情形下,就需要机器可以像人一样,首先对周围环境进行观察,构建出环境的地图,提取出地图中有用的地标。同时,借助这些地标与自己位置的关系,来进行定位,从而进一步完成控制和导航。
对于VR 和 AR 这方面应用,要么是需要将用户本身至于一个虚拟的三维场景中,要么是将虚拟的物体安置在现实的场景中。为了使这些交互具备“现实性”,也需要实时对环境进行地图构建,并确定自身位置。
为了更直观地理解这个构建地图,和定位的过程,可以看下波士顿机器狗的移动视频。
1.2 SLAM 技术框架
通过上面的应用背景描述,可以明确SLAM是一种涵盖了同时建图与定位的技术,即所谓的“Simultaneous Localization and Mapping".
以一个机器人为例,其具备一个初始位置,当向任意方向移动时,里程计会告诉它,距离初始位置移动的方向和距离,以此可以推测出它当前的位置。与此同时,其自带的camera,lidar等观测类传感器,基于当前位置不断对环境地标进行观测,通过已经观测过的地标修正自己的位置。由于里程计和传感器均存在误差,因此SLAM需要解决的问题是求取位置和周围地标最优解。常采用的框架流程为:
为更好的解释其流程框架,我们用数学模型表示出SLAM需要解决的问题。
将得到的一系列误差加起来,将误差和作为目标函数,若目标函数为线性函数则可以基于最小二乘求解。但一般目标函数常常为非线性,则需要通过非线性优化方法得到其最小值。
通过上面的描述,滤波和图优化即为SLAM中后端优化的两类方法。
对于图优化来说,图中的结点有时候会存在冗余,即某一结点其实在历史中出现过,为了把图简化,因此需要回环检测,即判断当前结点是否在历史中出现过,也就是位置上是否形成闭环。如果形成闭环,则将当前位置匹配到搜索出的历史位置上。
聊完了SLAM的流程框架,也就知道了学习SLAM所要掌握哪些知识和技术。其中前端里程计需要了解传感器模型,和计算机视觉算法。后端优化则需要了解几何学,图论和概率论等数学方法。当然代码编写能力是硬基础。
1.3 SLAM的分类
行业中通常以所用的主要传感器类型进行SLAM分类,如以视觉传感器采集到图像为数据源进行的SLAM称为视觉SLAM(VSLAM); 以激光雷达传感器采集点云为数据源进行的SLAM称为激光SLAM(LSLAM);还有以毫米波雷达传感器为主的SLAM则为毫米波雷达SLAM。
2 激光SLAM概述
SLAM 聊了这么多,激光SLAM的概念就不言而喻了。其基本框架流程依然是“前端-后端优化-回环检测”,后端优化中仍包括滤波和图优化两类方法。体现出激光SLAM特点的则是SLAM全程基于点云数据处理,那么我们首先需要了解激光雷达的运作原理。
2.1 激光雷达的工作原理
激光雷达通过发射激光,可以获取目标的真实三维坐标。目前常用的两种激光雷达类型为机械式激光雷达和固态式激光雷达。机械式激光雷达的工作原理和获取到的数据如下,通过同时发射多条激光束,再加上内部电机的旋转,基于TOF原理获取360°范围内的激光点。随着旋转频率的加快,单帧获取的点云数量将减少。
固态激光雷达的工作原理为:通过控制内部两个棱镜的旋转,形成螺旋或花瓣式的激光点云,且对于静止目标,随着时间的累积,点云密度会逐渐变大,中心位置点云密度最大。
两类型激光雷达的对比如下:
类型 | 典型品牌 | 优势 | 劣势 |
---|---|---|---|
机械式激光雷达 | velodyne 禾赛 | 精度较高,视场大 | 价格贵,寿命短 |
固态激光雷达 | livox | 价格低廉,寿命长 分辨率高 |
精度较低,视场小 |
2.2 点云数据应用特点
点云数据表示的是无序离散空间点的集合,其包含了高精度的空间位置信息(x,y,z),除此之外常用的激光雷达传感器还包含了可以表示目标物体反射率的回光强度信息(intensity)。通过回光强度信息可以分辨出不同物体的类别。
常用到的点云数据有如下几种存储格式:(1).txt 文本格式 (2).bin 二进制格式 (3).pcd pcl存储格式
(4).las 标准点云存储格式 (5).bag ros存储格式;这里推荐一款开源软件可以支持大部分格式点云数据的可视化及编辑处理:
CloudCompare - Open Source projectwww.danielgm.net/cc/2.3 点云数据的应用算法
点云数据处理中,常用到的处理算法有如下几种:
(1)点云配准(registration): 通过配准算法可以求出两帧点云的相对变换,从而将点云的坐标系统一化。常用的点云配准算法包括ICP和NDT方法;
(2)点云滤波(去噪)(filtering): 将点云数据中存在的异常点(噪声点)进行过滤,以消除这些异常数据对后续处理的干扰。常用的滤波方法包括基于欧式距离的滤波方法和基于统计的滤波方法。
(3)点云采样(sampling):点云采样多指点云下采样,可以将点云数据按照一定规则稀疏化,减小数据量加快数据处理速度。常用的采用算法包括均匀采样,泊松采样等。
(4) 点云索引(indexing):基于树的数据结构为点云数据建立索引,可以加快点云的检索。常用的建树方式包括八叉树索引和kd树索引。
2.4 激光SLAM算法流程
参考本文第一部分,激光SLAM的算法流程同样分为:前端,后端优化,回环检测。在激光SLAM中,前端主要包括通过相邻帧点云配准进行位姿估计,也就是里程计推算。后端优化则和SLAM通用的方法一样,采用滤波或图优化的方法对位姿或和观测量进行优化。回环检测则主要采取scan to map的方式完成。
2.4 激光SLAM常用算法框架及特点
激光SLAM算法 | 算法框架 | 特点 |
---|---|---|
gmapping | 后端采用粒子滤波 | 2D 依赖里程计 |
hector-slam | scan-matching | 2D 初值敏感 |
cartographer | scan to submap 图优化 回环检测 |
2D/3D 引入submap |
LOAM | scan-to-scan submap-to-map |
3D 实时性好,匀速运动假设 无回环检测 |
LEGO-LOAM | scan-to-scan 图优化 回环检测 |
3D LOAM + 图优化+回环检测 |
LIO-SAM | imu+lidar 求取里程计 GPS因子辅助后端优化 |
3D LOAM + 融合imu和GPS约束 |
2.5 3D 激光SLAM特点与发展
首先看一下激光SLAM与视觉SLAM的对比
优势 | 劣势 | |
激光SLAM | 精度高,可靠性高 | 成本高,缺乏语义信息 |
视觉SLAM | 成本低,具备语义信息 | 收环境干扰严重,精度有限 |
激光SLAM与视觉SLAM具备各自的优势和劣势,对于激光SLAM来说:激光雷达高精度的特性,被业界认为是不可或缺的;同时固态激光雷达的优化生产,使得激光雷达的成本不断变低,达到车规级标准。对于视觉SLAM来说:视觉相机可获取丰富的纹理信息,同时价格低廉,因此仍是使用者的首选(特斯拉,阿波罗);采用视觉图像求取深度信息依然具有很高的研究意义。
2.6 激光SLAM中的难点问题
由上述内容可知,激光SLAM发展至今已经出现许多成熟的开源方案;但由于实际环境的多变性与复杂性,还会造成激光SLAM的结果受到很大影响。本章节中列举了几种SLAM典型难题场景:
(1)含有大量动态物体的场景:由于周边物体的不断运动,造成这些目标上的点云也在前后帧发生了位姿变换,使得配准结果不准确。举个列子当自车静止不动,而周围车在不断运动,通过点云配准算法会估算出自车也在发生位姿变换。为解决该类问题常需要采用一定的方法识别并滤除掉周围的动态物体再进行后续里程计的估算,目前业内常采用一些深度学习方法滤除动态物体如point-pillar ,Lidar-MOS等;
(2)坡度或高度连续变化的场景:对于机械式激光雷达来说,其垂直分辨率有限,因此常造成激光雷达估计出的Z值不是很准确,当遇到高度或坡度连续变化的场景,Z误差的累积会造成定位和建图结果出现错误。解决此类问题常采用一些配准优化手段如添加地面约束或采用回环优化的来减少Z值的误差。
(3)无GPS的弱纹理场景:隧道为典型的无GPS弱纹理场景,弱纹理的意思是结构纹理没有明显变化,比如当身处隧道中时,是没办法通过周围特征识别出自己到底处于哪个位置。对于激光雷达也一样,扫描得到的前后帧点云十分近似,因此没办法很好的估算出里程计;同时隧道内又无GPS信号,无法借助GPS的定位信息来完成定位估计。解决此类问题则需要通过多传感器融合的手段比如融合IMU或轮速计等数据源来完成前端里程计的估计。
3 ROS在SLAM中的应用
3.1 ROS 系统介绍
ROS(机器人操作系统,Robot Operation System), 是专为机器人软件开发所设计出来的一套电脑操作系统架构。它提供了一些机器人开发相关的服务:硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理、它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。ROS 的首要设计目标是在机器人研发领域提高代码复用率。ROS是一种分布式处理框架。这使可执行文件能被单独设计,并且运行时松散耦合。这些过程可以封装到数据包(Packages)和 堆栈 (Stacks)中,以便共享和分发。
其整体框架和运作流程如下:
(1)节点 node
代表单独的可执行程序,每个node独立的完成一项任务。
(2)消息 message
节点之间为了通信,可以将数据组织成message,ROS中已经为我们定义了许多message,如sensormsgs, nav_msgs, geometry_msgs. 每个message 中都具备不同的字段,如C++中封装的类或结构体,消息类型可以自定义。
(3)话题 topic
不同节点之间通过topic,来发布(publish)或 订阅 (subscribe)消息,来实现通信。
(4)服务 service
服务端在接受客户端请求时,才作出回应,不是周期性的。
3.2 ROS中的功能包与插件
ROS中自带了很多机器人相关的功能包和插件,如有SLAM算法相关的功能包,或者IMU滤波相关的功能包。
ROS中常用的插件:
(1)rosbag
可以存储多个topic的message,并可以回放。
(2)rviz
对于各类消息可视化显示
(3)tf 和 urdf
ROS中的tf是一个可以让用户随时记录多个坐标系的软件包。
URDF(Unified Robot Description Format)统一机器人描述格式,用于仿真描述。
(4) Gazebo 仿真
ROS中的仿真工具
(5)rqt_graph
ROS中的节点图查看命令
3.3 ROS 在SLAM中的应用
(1)SLAM 相当于机器人的一部分
gamapping, hector-slam, cartographer 均作为ros中的一个功能包使用
(2) ROS 可以支持各类传感器数据,以及位姿和建图结果数据的发布和接收
geometry_msgs/Pose
sensor_msgs/PointCloud
sensor_msgs/imu
(3) SLAM中的前端和后端均可以作为一个node,支持各自运行并相互通信
4 KITTI数据集介绍
需要测试自己的SLAM算法在无人驾驶领域中的应用,如果自己没有传感器设备的话,那离不开采用公开的测试数据集KITTI。KITTI 采集了Velodyne-64线的激光雷达点云数据,相机的彩色图像以及真实的轨迹数据。同时提供了传感器之间的标定系数。
KITTI 官方网站上也包括了一些LSLAM算法和VSLAM算法在其上的测试精度对比和排名。
如对相关内容有兴趣,可进入下方链接了解具体课程内容:
https://lgo.xet.tech/s/1vCfxtlgo.xet.tech/s/1vCfxt