小强ROS机器人教程(17)_利用ORB_SLAM2建立环境三维模型

小强主页

想要实现视觉导航,空间的三维模型是必须的。ORB_SLAM2就是一个非常有效的建立空间模型的算法。这个算法基于ORB特征点的识别,具有准确度高,运行效率高的特点。我们在原有算法的基础上进行了修改,增加了地图的保存和载入功能,使其更加适用于实际的应用场景。下面就介绍一下具体的使用方法。

注意:由于小强的ORB_SLAM2版本已经升级到伽利略版本,所以运行时会检测是否有有效的证书。默认发货时小强是配置好证书的。如果没有证书也可以联系客服免费获取。如果你不是小强用户,那么下面的教程无法执行。

准备工作

在启动ORB_SLAM2之前,请先确认小强的摄像头工作正常。 ORB_SLAM2建图过程中需要移动小车,移动小车过程中ORB_SLAM2的运行状态不方便显示(ssh方式比较卡顿,也不可能拖着显示器),因此请先安装好小强图传遥控windows客户端

启动ORB_SLAM2

更改配置文件 ORB_SLAM2的配置文件位于/home/xiaoqiang/Documents/ros/workspace/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Data文件夹内。更改setting4.yaml其中的LoadMap的值,将其设置为0。当设置为1的时候程序会在启动后自动从/home/xiaoqiang/slamdb文件夹内载入地图数据。当设置成0时,就不会载入地图数据。由于我们是要创建地图,所以LoadMap要设置为0。 0_1489828772487_4.png ssh方式进入小强,执行以下指令

ssh -X xiaoqiang@192.168.xxx.xxx

roslaunch ORB_SLAM2 map.launch

0_1489829013495_5.png

开始建立环境三维模型

打开小强图传遥控windows客户端,点击“未连接“按钮连接小强。在图传窗口右键打开”原始图像“和”ORB_SLAM2的特征点图像“ 0_1489829229351_1.png 0_1489829544143_0.png 上图中,左侧图像是摄像头原始彩色图像,右侧是ORB_SLAM2处理后的黑白图像。当前ORB_SLAM2还没有初始化成功,所以黑白图像没有特征点。 按住”w”键开始遥控小强往前缓慢移动,使ORB_SLAM2初始化成功,即黑白图像开始出现红绿色特征点 0_1489829731061_2.png 现在就可以开始遥控小强对周围环境建图,遥控过程中需要保证黑白图像一直存在红绿色特征点,不存在则说明视觉lost了,需要遥控小强退回到上次没lost的地方找回视觉位置。

使用rviz查看建图效果

在本地虚拟机hosts中添加小强ip地址,然后新开一个终端打开rviz

export ROS_MASTER_URI=http://xiaoqiang-desktop:11311
rviz

打开/home/xiaoqiang/Documents/ros/src/ORB_SLAM/Data/rivz.rviz配置文件 有些系统可能无法如此打开,可以先把文件复制到本地,然后再在本地打开 0_1489831624309_6.png 如下图所示,红黑色点是建立的三维模型(稀疏特征点云),蓝色方框是keyframe可以表示小强轨迹 0_1489831763020_7.png

保存地图

当地图建立的范围满足自己要求后,在虚拟机新开一个命令窗口,输入下列命令保存地图

ssh -X xiaoqiang@192.168.xxx.xxx
rostopic pub /map_save std_msgs/Bool '{data: true}'  -1

0_1489832316715_8.png

地图文件会被保存进用户主目录的slamdb文件夹内。

地图的载入

保存地图之后可以再次载入ORB_SLAM2程序中。地图载入后程序可以非常迅速的定位出摄像头的具体位置。这样就可以开发出基于视觉定位的导航算法了。 载入地图的方式也非常简单。

运行

roslaunch ORB_SLAM2 run.launch

此处的run.launch实际上就是把LoadMap 设置成1.

地图的后期处理

在建立地图之后,想要使用这个地图进行导航,还需要对地图文件做进一步的操作。比如创建导航的线路,标记导航路径的行走方式等等。这一部分内容可以参见这篇文章视觉导航路径编辑器使用教程

对于小强用户可以直接使用导航客户端进行地图处理。详情可参见 导航系统文档

ORB_SLAM2参数说明

下面是一个ORB_SLAM2的setting.yaml文件例子,具体参数含义可以参考注释

%YAML:1.0
Camera.RGB: 1 
# 摄像头标定参数,2018.6月之后的版本标定参数已经移至usb_cam包
Camera.cx: 325.0466266836216
Camera.cy: 238.9974356449355
Camera.fps: 30.0
Camera.fx: 395.6779619478691
Camera.fy: 397.4934332366201
Camera.k1: -0.2805598785308578
Camera.k2: 0.06685114307459132
Camera.k3: 0.0
Camera.p1: -0.0009688764167839786
Camera.p2: -0.0002636873513136712
LoadMap: 0 # 是否载入地图,0为不载入,1为载入
updateMap: 1 # 是否更新地图,0为不更新,1为更新。对于已经建立好的比较稳定的地图,一般设置为不更新。防止由于意外导致地图效果变差。
drawTxt: 1 # 是否显示文字提示
# ORB_SLAM2 slam算法相关参数
ORBextractor.iniThFAST: 20 
ORBextractor.minThFAST: 7
ORBextractor.nFeatures: 2000
ORBextractor.nLevels: 8
ORBextractor.scaleFactor: 1.2
# ORB_SLAM2显示相关参数,并没有什么用
Viewer.CameraLineWidth: 3
Viewer.CameraSize: 0.08
Viewer.GraphLineWidth: 0.9
Viewer.KeyFrameLineWidth: 1
Viewer.KeyFrameSize: 0.05
Viewer.PointSize: 1000
Viewer.ViewpointF: 500
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
UseImu: 1 # 是否使用IMU,0为不使用,1为使用
updateScale: 1 # 是否开启更新尺度,如果开启则会根据里程计信息动态调整视觉尺度
DealyCount: 5 
# 摄像头和base link的相对位置
TbaMatrix: !!opencv-matrix
   rows: 4
   cols: 4
   dt: f
   data: [ 0., 0.03818382, 0.99927073, 0.06, -1., 0., 0., 0., 0., -0.99927073, 0.03818382, 0.0, 0., 0., 0., 1.]
#   data: [ 0., 0.55176688, 0.83399839, 0., -1., 0., 0., 0., 0., -0.83399839, 0.55176688, 0., 0., 0., 0., 1.]
EnableGBA: 1 # 是否启动全局BA优化, 0为不启动,1为启动
dropRate: 2 # 跳帧数,防止相邻帧的重复计算,跳过对应的相邻帧以提高计算效率
minInsertDistance: 0.3 # 最小关键帧距离,防止关键帧过于稠密,在这个距离只插入一帧
EnableGC: 0 # 是否开启内存回收,0为不开启,1为开启。开启内存回收可以更有效的利用内存,相对的计算效率会降低

常见问题

Q: 不使用客户端是否可以开始建立地图
A: 可以,客户端实际上起的是遥控和图传的作用。你也可以采用命令行遥控。但是推荐使用客户端,这样有更好的体验。

Q: 可不可以不使用IMU
A: 小强的ORB_SLAM2是经过修改的版本,增加了IMU的融合。如果不想使用IMU可以在setting.yaml里面设置UseImu为0.

Q: 小强的标定文件在什么地方
A: 小强的标定文件,2018.6之后发货的,位于usb_cam包launch文件夹下ov2610.yaml。之前发货的位于ORB_SLAM2包内的setting.yaml,setting4.yaml 和setting5.yaml分别是map.launch和run.launch使用的。

Q: 小强的摄像头很不清晰
A: 可能是摄像头的镜头被碰到了导致没有聚焦。可以转动摄像头镜头,调整到图像清晰的位置。注意调整过之后摄像头参数需要重新标定。标定方法可以参见如何标定单目摄像头

小强主页 返回目录

results matching ""

    No results matching ""