二、自主移动机器人智能车使用python版本的breezyslam 进行测试
正如我在上一篇文章中提到的那样,自动机器人定位有两个基本步骤:本地建图和行动控制。机器人需要知道它在哪里,然后相应地移动。重复一遍。在已知的环境中(例如,如果您有实验室的地图),本地建图可能会更容易,但是在现实世界中,车辆很可能会在未知区域中运行。这就引起了人们对机器人技术领域的关注之一-SLAM(同步本地化和映射)。这是一个复杂的机制,它将同时构建地图,并将您的机器人(或无人驾驶飞机)放置在该地图上。
要开始绘制地图,您需要一些距离传感器。大多数小型机器人都配备了超声波或红外距离传感器。它们精度低,并且提供的读数数量有限。您可能有3个超声波传感器阵列(前,左和右),然后使用粒子过滤器,过了一会儿就可以在一张已知的地图上找到您的位置,但是构建地图非常困难。您可以阅读一些理论,但这是一个非常随机的解决方案。
标准的SLAM 中距离传感器使用的是激光雷达(Lidar),它是基于激光的扫描仪,通常旋转以覆盖360度。这些设备仍然很昂贵,较便宜的设备约为1,000美元,而高端设备(如安装在自动驾驶汽车上的设备则要超过10,000美元)。
现在,遇到Neato-一种智能真空吸尘器,可在您不在时轻扫地板。与Roomba等竞争对手不同,Neato的顶部有一个小型激光雷达,该雷达在移动时会扫描整个房间,以创建自己的地图。一些聪明的人能够拿出XV-11单元,解码其输出,将其连接到Arduino板,最后通过USB输出其测量值,因此它们可以在您的计算机甚至是Raspberry Pi上使用。
现在您有了一张地图(当您开始扫描周围的房间时,我知道这是一种很酷的感觉),您开始思考当车辆行驶时该怎么做(因此地图会不断变化)。SLAM就是在这里发挥作用的,以便构建地图并在您移动时将您放置在地图上。有很多SLAM算法,但是我自己尝试了几次之后,我遇到了BreezySLAM,它是由WLU的Simon Levy教授创建的非常好,非常快且易于使用的Python实现。它可能是唯一可用的开源Python代码,这对于大多数机器人微板很有用。BreezySLAM是TinySLAM的Python版本,这是一种非常有效的算法,于2010年编写,不到200行C。
说实话,2010年到现在10年了,笔者小v在测试中会不断更新该算法的测试效果,但是这年数的确很长,小v也发现这个breezyslam 维护的也很少,最近一次更新是在2年前,可以先熟悉然后看看是不是再坚持用。目前breezyslam是通过预估里程计的算法实现的,也就是说真正的里程计并未使用,到目前发现的。
更好的是,Levy教授将某些库转换为C,因此程序运行得非常快。到目前为止,我只在Windows笔记本电脑上使用过它,它每秒可以超过50帧。它的使用也非常简单,因此我花了很长时间才将其调整为适用于XV-11激光雷达,进行实时采集或显示实时更新图。要运行BreezeSLAM,您首先需要为Lidar创建一个自定义类,然后该过程非常简单。
slam = RMHC_SLAM(YourLaser(),MAP_SIZE_PIXELS,MAP_SIZE_METERS)
while True :
birinData = ReadLidar() slam.update(birinData)
x,y,theta = slam.getpos()
mapbytes = bytearray(MAP_SIZE_PIXELS * MAP_SIZE_PIXELS)
slam.getmap(mapbytes)
实施和测试此功能的第一步 是在笔记本电脑上运行它,然后使用Lidar。这正是我所做的,下面是我房子一楼的最终地图。这是我扛着笔记本走完的最终的样子。下一步是将所有内容部署到Raspberry Pi,这样我就可以在轮式机器人上使用Lidar了。
接下来,最大的项目是将其安装在无人机上并编写整个导航/避障程序。 通过着篇文章也可以看出这是Chris Fotache 用笔记本实现的建图,而未用到里程计。 关于breezyslam的建图效果,小v已经在本网站整理了好多,有兴趣的读者可以翻翻。另外还有几个测试 没实现会陆续更新。