【开发背景】
想必对 Movebase 导航包熟悉的同学都知道,Movebase需要一个模块给他提供机器人的定位信息,通常我们用 AMCL 包来提供定位,所以 AMCL + Movebase是比较古老而经典的一套定位导航控制方案。针对环境简单的小型室内场景来说,这套方案足以达到我们的使用需求。然而,AMCL定位有个不好的毛病,就是需要人为给定一个机器人初始的大概位置,这对于用户来说是很不友好的。用户肯定是希望,不管何时,他将机器人扔到一个已建好地图的环境中,机器人就能进行自定位,从而开始完成导航目标。那有没有办法实现这种自定位呢?答案是肯定的。
【开发环境】
硬件:
小幂双目相机(其实只要是个双目相机既可以)
单线激光雷达
因特尔NUC
软件:
Ubuntu 18.04
ROS Melodic
ORB-SLAM2
Gmapping
AMCL + Movebase
【源码获取】
1、下载ORB-SLAM2
GitHub - ros-planning/navigation: ROS Navigation stack. Code for finding where the robot is and how it can get somewhere else.ROS Navigation stack. Code for finding where the robot is and how it can get somewhere else. - GitHub - ros-planning/navigation: ROS Navigation stack. Code for finding where the robot is and how it can get somewhere else.https://github.com/ros-planning/navigation4、至于双目相机的ROS驱动,以及单线激光雷达的ROS驱动就自行寻找下载吧,毕竟每个人手头的设备都不一样,按照自己的工具来。
【方案设计】
1、用ORB-SLAM2建图
2、用Gmapping建图
3、求取 ORB地图 和 激光扫描地图 间的坐标转换关系(对齐两个坐标系的方法有很多,可以采用三对点求解,也可以基于优化的方法用一系列点去逼近,或者最简单的方法就是直接按照10厘米一对点的粒度把两个坐标系下的点保存下来,之后使用的时候直接查表即可)
4、实际应用时,先利用 ORB-SLAM2 进行重定位,获得机器人在ORB地图中的位姿,然后通过坐标转换关系算得二维栅格地图下的对应位置,将该位置发布给AMCL模块;AMCL模块以此作为初始位姿开始工作,同时ORB那边就可以结束了。
【后言】
上面的方案描述比较粗,因为时间有限,大家可以照着这个思路先做,然后我后面也会慢慢抽时间补齐的。