SLAM 是simultaneous localization and mapping的缩写,中文名称翻译为同时定位与地图构建。
最近,在机器人的导航领域,SLAM大火。作为一个对SLAM略知一二的选手,也想记录一下自己对SLAM的理解,整理一下自己的思路。
SLAM目前大量用于机器人导航领域,要进行导航,简而言之,一般需要几大块:
- 建图。机器人得知道自己将要在一个什么样的环境里面运动。这个环境提前是不知道的,机器人需要在里面跑一段时间之后,才能知道整个的外部环境是怎么样的,才能建成外部的图。
- 定位。简单来说就是,我在哪里。
- 路径规划。 我现在在这里,我要去另一个地方,我怎么去呢? 中间肯定有很多障碍物,我如何绕开这些障碍物,选择一条最合适的路径,到达我们的目的地呢?
- 运动。让机器人的轮子,按照步骤3规划好的路径前进。
SLAM目前常见的分为两大类:激光SLAM和视觉SLAM。
激光SLAM使用的Sensor是激光雷达,测距建图时,激光SLAM比视觉SLAM准。缺点是,激光雷达在室外效果不好,所以激光SLAM常用于室内导航。另外,激光雷达扫描的是一个二维平面。比如室内有一个桌子,激光SLAM的高度如果低于桌面,那么它就只能扫描到4个桌腿,于是机器人就有可能会撞上桌子面。另外,激光SLAM面对玻璃墙时,可靠性不高。当然,玻璃是千古难题,视觉SLAM本身也不见得有多好的解决方案,工程上对付玻璃的常见办法是在机器人上加一个测距的超声波。
视觉SLAM通常使用多目摄像头。多个摄像头拍到同一个物体,提取上面的特征点进行匹配。然后,由于这几个摄像头本身的物理距离是固定已知的,通过立体视觉的算法,就能算出物体的实际距离了。视觉SLAM对视觉匹配算法的要求较高,如果算法出错,算出来的距离会差很多。所以,不如激光SLAM那种直接用激光测出来的距离可靠。当然,视觉SLAM基于单目也有相应的做法,但是计算量大而且可靠性都不好,实际应用较少。
目前的常见的建图和定位算法: cartogragher
经典的路径规划算法:全局路径规划RRT和A* 局部路径规划DWA
机器人的运动,现在靠谱使用的都是依靠轮子的轮式机器人。我们曾经尝试做过双足,但是后来失败了。轮式机器人的运动中,会有一些常见问题:比如轮子打滑;比如两轮的同步的问题。
两轮同步的问题: 比如让机器人走一段直线,理论上走直线是很简单的,实际工程这是一个很复杂的过程。左右轮不可能绝对对称,所以机器人必然会往左或者往右偏,如果运动轨迹是闭环的,这种误差会相互抵消,稍微好点;但是如果轨迹是开环的,这个误差会非常明显。这时我们就需要进行实时的修正。
于是我们就需要IMU了。
于是我们就需要底盘融合信息。
于是我们就需要卡尔曼滤波了。