Maplab开源VI-SLAM框架介绍
1.概述
2.系统架构
3.使用例程
1. 概述
Maplab是一个开源的VI-SLAM(视觉惯性-即时定位与地图构建)框架。它由著名的ETH Zurich, Autonomous Systems Lab (苏黎世联邦理工学院自动系统实验室) 开发,包含了视觉SLAM相关的多种算法与工具:在线VIO(视觉惯性里程计),进行在线位姿估计并创建地图;在线VI-Localization(视觉惯性定位),进行基于地图的全局无漂移视觉定位;地图管理,用于修改和维护地图,包括地图合并,稀疏化,地点识别和可视化。
2. 系统架构
Maplab框架主要由两部分组成:
1) 在线前端ROVIOLI,实现VIO和定位。它接收图像与惯性传感器数据作为输入,输出全局位姿估计,并建立VI(视觉-惯性)地图。
2) 离线maplab-console,允许用户以离线批处理方式在地图上进行各种算法处理,可以作为新算法的研究试验平台。
maplab框架遵循可扩展和模块化的设计原则,所有的软件组件都是按照软件包来组织管理,采用catkin(ROS的官方构建系统)来构建编译。整个框架都使用C ++ 11标准,所依赖的第三方库都是一些流行的和维护良好的库,如线性代数库Eigen,非线性优化库Ceres 等。此外,maplab提供了ROS接口,方便原始传感器数据输入与结果输出,该框架使用RViz作为三维可视化工具。
2.1 ROVIOLI:视觉-惯性建图与定位
系统中建图和定位的典型工作流程如下图所示。
通常,利用多个建图任务,以确保对同一个区域在空间和时间上的覆盖,进而建立一个更好的单一的定位地图。首先,使用ROVIOLI的VIO模式,通过多个任务建立开环地图,并存储到磁盘。 然后利用多种离线工具进行优化,例如闭环检测,视觉惯性优化或联合注册(地图合并)等,生成一个的紧凑定位地图。之后,ROVIOLI利用先前生成的地图,进行在线定位。持续的在线定位提高了全局位姿估计与跟踪的精度。
2.2. maplab console:离线用户界面
maplab框架使用控制台用户界面进行地图的离线操作。能够同时加载多个地图,进行多任务处理。所有的算法都可以通过控制台命令,应用于已加载的地图。所有算法的特定参数都由控制台标志或文件设置,并且可以在运行时修改。结合RViz的可视化,便于算法原型设计和参数调整。
2.3核心软件包
maplab框架包含几种最先进算法的实现,它们都可以通过maplab控制台使用。以下为一些重要的算法软件包:
VIWLS:视觉-惯性加权最小二乘优化。
Loop closure/localization: 闭环检测与定位系统。
ROVIOLI:在线视觉惯性建图和定位。
Posegraph relaxation: 位姿图松弛优化。
aslam cv2:一个计算机视觉数据结构与算法的集合。
Map sparsification: 选择最佳地标以进行地图稀疏化。
Dense reconstruction:稠密重建,深度融合和表面重建的算法集合。
3. 使用例程
maplab主要包含五个常用的功能:mapping and localization(在线建图和定位),multi-session mapping(多地图构建),map maintenance(地图维护),large-scale mapping(大规模建图)和dense reconstruction(稠密重建)。
3.1 在线建图和定位
对于许多机器人应用来说,获取无漂移全局位姿态估计是非常重要的。通过示教或重复场景,以增强机器人操纵或导航的精度。在maplab中,首先使用ROVIOLI来创建一个初始的VI地图。所需的传感器数据可由离线的Rosbag或在线的ROS主题提供。在建图的最后阶段,VI图自动进行闭环检测,优化,关键帧提取等,综合生成一个紧凑的定位地图。 接下来,基于先前生成的定位图,ROVIOLI可以获得无漂移的全局姿态估计,如下图所示。
3.2. 多地图构建
在许多地图应用中,单次建图不可能覆盖整个环境。除此之外,尽可能在多种不同的视觉外观条件下采集环境信息也是有益的。因此,maplab提供了多地图注册工具,合并优化多个地图,生成单一一致的地图。
此用例演示了从4个单独的轨迹创建建筑物地图的过程。每条轨迹都穿过底层,楼梯和另外一层。结合起来,它们覆盖超过1000米,包含约463,000个地标。在如此大的地图上,若未进行细致的数据选择,许多常见的操作如优化或闭环检测将变得棘手。出于这样的原因,Maplab采用基于顶点距离,方向和地标联合可见性的启发式关键帧算法。其闭环检测算法正确识别所有任务之间的几何转换,非线性优化改进几何结构,结果生成一个紧凑的(8.2 MB),几何一致可供ROVIOLI定位的地图。整个建筑如下图所示。
3.3. 地图维护
通过多任务构建的大规模的基于特征的模型,通常包含数千的地标占用相当大的存储。然而对于高质量的定位,这并不是必需的。Maplab提供了一个基于整数优化的地标选择方法,以生成一个概要地图。算法尝试在保持一定环境覆盖率的前提下,去除不常见的地标。此外,Maplab采用关键帧算法去除冗余顶点,仅保留有助于高效高精度状态估计的顶点。同时,通过删除顶点也消除了许多顶点-地标关联。地图概要算法和关键帧算法在没有大的位姿估计质量损失的情况下,显著减小了模型尺寸,如下表所示。
3.4. 大规模建图
此部分Maplab将展示大规模的建图能力以及对除VI传感器之外的传感器适用性。为此使用Google Tango平板电脑,录制了一个大规模、多任务的苏黎世老城区地图。导出原始视觉惯性数据并用ROVIOLI进行处理,生成初始的开环地图。 然后将这些地图加载到maplab控制台中进行对齐,优化等处理。优化后的VI地图在到苏黎世地图上的投影如下图所示。
3.5. 稠密重建
机器人中的许多应用,如路径规划,检测等需要稠密的3d环境信息。Maplab提供了几个稠密重建的工具,使用优化稀疏图中的顶点姿态,来计算稠密的深度信息:
1)立体稠密重建:为了从多相机系统计算深度图,这个工具首先识别立体相机是否适合平面校正。它沿着轨迹,利用SGM(半全局块匹配)算法来计算深度。所得的深度图(或点云)附加到VI地图中,并存储在资源系统中。
2)基于TSDF的深度融合:一旦获取包含深度信息(由上述方法计算得到,或RGB-D传感器获取)的VI地图,就可以利用全局一致的相机位姿创建一个全局一致的三维结构。为此,maplab采用voxblox,进行基于TSDF的深度融合与表面重建。可以将深度图或点云数据放入voxblox网格中,并将表面网格存储到文件系统。
3)导出到CMVS / PMVS2:为了更精确的稠密重建,maplab提供了一个转换命令,将稀疏的VI地图及图像转换到开源多视图立体CMVS / PMVS2的输入格式。尽管支持灰度图像作为输入,但推荐使用RGB图像以获取更好的结果。
参考文献:
maplab: An Open Framework for Research in Visual-inertial Mapping and Localization
https://github.com/ethz-asl/maplab
___________________
https://blog.csdn.net/crp997576280/article/details/82730244
一、引言
1.环境安装
maplab的安装及环境编译可以参考该文档:
https://blog.csdn.net/wendox/article/details/78734422
##2.Maplab主要功能介绍
maplab是ETH在2018年开源的一个VIO平台,该VIO平台分为在线VIO和maplab_console 两个部分,在线VIO为一个是基于ROVIOLI的VIO算法,可以实现mapping模式和localiztion模式。整个maplab主要有以下5个突出的功能:
1.在线的地图构建及定位
maplab 使用的是ROVIOLI的算法,ROVIOLI则是在ROVIO上添加了回环检测及构图的一个扩展版。
2.多单元协同构图(Multi-Session Mapping)
多个构图单元进行构图,通过离线处理的方式(回环检测、优化)完成地图的拼接。
3.地图维护(Map Maintenance)
删除地图中不必要的顶点(也就是关键帧所对应的位姿图)及该关键帧所包含的地标点,以减轻
4.大尺度范围内的地图构建(Large-Scale Mapping)
5.稠密重建(Dense Recoonstruction)
双目视觉稠密重建,block matcher作用于每一个成对的图相对,从而生成深度图像。
RGB-D 稠密重建 maplab使用 voxblox (一中构图库)做深度融合及表面重构 (TSDF)
3.maplab_console介绍
maplab_console的启动命令是:
rosrun maplab_console maplab_console #启动 maplab_console
1
启动以后终端会出现如下界面:
在这里插入图片描述
可以使用 help --all 来查看所有功能包的使用
、、、、、、、待添加
加载地图以后输入命令 ‘v’ ,在另外一个窗口启动rviz可以看到地图信息。
在这里插入图片描述
二、MapLab VIO建图定位
1. VIO mapping On MAV Datasets
1.在运行ROVIOLI之前需要准备好euroc数据集的rosbag包、及校准文件:
Camera calibration, ncamera-euroc.yaml
IMU parameters maplab, imu-adis16488.yaml
IMU parameters Rovio, imu-sigmas-rovio.yaml
Rovio calibration file , rovio_default_config.info
启动脚本文件可在 https://github.com/ethz-asl/maplab/wiki/Running-ROVIOLI-in-VIO-mode 地方查看
2.进入到maplab的工作空间
source ~/maplab_ws/devel/setup.bash
roscore & rosrun rovioli tutorial_euroc save_folder MH_01_easy.bag #无中间结果输出
1
2
这种启动方式是直接传入rosbag,这个是没法看到轨迹及跟踪效果的,我们需要使用tuturrial下的在线节点,然后通过rviz 进行查看
rosrun rovioli tutorial_euroc_live save_folder
rosbag play MH_01_easy.bag
1
2
你可以通过修改maplab/applications/rovioli/scripts/tutorials这个目录下tutorial_euroc_live 脚本的参数进行调整显示的效果,或者直接下载作者配置好的rviz 文件:https://github.com/ethz-asl/maplab/blob/pre_release_public/july-2018/applications/rovioli/share/rviz-rovioli.rviz
下载下来启动rviz就可以看到如下界面了: rviz -d rviz-rovioli.rviz
在这里插入图片描述
运行完毕以后算法会在你设置的map输出目录下存放构建的地图
在这里插入图片描述
这个链接下有讲解部分参数的用法:
https://github.com/ethz-asl/maplab/wiki/Running-ROVIOLI-in-VIO-mode
2.Localization 功能
1、准备好构建的环境地图
2、在终端中启动:
save_map_with_localization 表示定位过程中输出的地图,如果你不需要更新地图可以用 “” 这两个双引号表示空来代替
3、启动rviz 查看定位
rviz -d rviz-rovioli.rviz
1
在这里插入图片描述
参考:
https://github.com/ethz-asl/maplab/wiki/Running-ROVIOLI-in-Localization-mode
http://www.404wx.com/read/eDE2M6bxBjYyQ3Oa3P4QW0Pl3VKLvJOZ
3.双目稠密重建
首先把启动脚本修改为双目构图
–map_builder_save_image_as_resources=true
然后利用ROVIO构建地图
启动maplab console 选中新构建的地图依次输入如下命令生成ply文件
双目视觉恢复深度
sdr --flagfile=src/maplab/algorithms/dense-reconstruction/stereo-dense-reconstruction/parameter/stereo_params.gflags
或
stereo_dense_reconstruction --flagfile=src/maplab/algorithms/dense-reconstruction/stereo-dense-econstruction/parameter/stereo_params.gflags
1
2
3
以上两个命令都可以,注意必须要--flagefile参数才可以看到恢复深度的过程。
在这里插入图片描述
voxblox 处理深度融合表面
Compute a globally consistent dense reconstruction based on VOXBLOX.
create_tsdf_from_depth_resource --flagfile=path_to_stereo_dense_reconstruction_pkg/parameter/stereo_params.gflags
1
实际使用的命令
create_tsdf_from_depth_resource --flagfile=src/maplab/algorithms/dense-reconstruction/stereo-dense-reconstruction/parameter/stereo_params.gflags
1
输出ply文件
Compute and export the surface reconstruction to a PLY file.
export_tsdf --dense_result_mesh_output_file=
1
#实际使用的命令
export_tsdf --dense_result_mesh_output_file=/media/crp/10500AC610500AC6/maplab_map/output_map/euroc_surface_reconstruction.ply
1
保存稠密地图
Save your map
save --map_folder
1
#实际使用的命令
save --map_folder /media/crp/10500AC610500AC6/maplab_map/output_map/euroc_ml3_dense
1
在这个博客中提供的ubuntu安装mesh 的方法进行安装, https://blog.csdn.net/lyx_323/article/details/79813986 ,对保存的成功的ply文件选则mesh打开方式进行查看。
生的稠密图还是不错的。在地图生成的中间过程中,会产生很大中间文件,建立把地图放在移动硬盘或者是空间较大的磁盘上。
##4. 多任务单元建图
首先使用ROVIOLI构建多个独立的子地图
利用maplab console对多个子地图进行融合,当准备好多个地图以后在console中输入如下命令:
your_summary_map 表示合并生成的地图
参考:https://github.com/ethz-asl/maplab/wiki/Multi-session-mapping-with-ROVIOLI