赞
踩
总结(工程部分)
简介:OpenREALM是一个实时航空地图制作的框架,利用了视觉SLAM和3D重建的技术。它可以用于无人机的定位和导航,也可以用于生成高分辨率的影像和地形数据。它支持多种操作模式,包括平面拼接,3D重建,以及PSM(平面扫描匹配)。
本文提出的框架包含以下几个主要模块:
Stage 1: Image Acquisition:这个模块负责从无人机的相机获取图像,并将它们存储在一个缓冲区中,等待后续处理。这个模块使用了一个线程安全的队列来存储图像,并且可以根据无人机的速度和方向动态调整图像的采样频率,以保证图像之间有足够的重叠度和视差。
Stage 2: Visual Odometry:这个模块负责根据图像序列估计无人机的相对位姿,并将其与全局定位系统(GPS)的数据进行融合,得到更精确的绝对位姿。这个模块使用了ORB-SLAM2作为视觉里程计的算法,并且利用GPS数据进行尺度校正和轨迹平滑。此外,这个模块还可以检测并修复视觉里程计的漂移和闭环。
Note:目前作者使用OpenVSLAM代替ORB-SLAM2,并将其设置成了default SLAM,详见官方仓库的Changelog部分
Stage 3: Map Update:这个模块负责根据当前图像和位姿更新地图,包括影像拼接和三维重建。不同的地图模式有不同的算法和输出,例如平面拼接模式(PSM),高程拼接模式(ESM)和结构拼接模式(SSM)。PSM假设地面是一个近似平面,并且使用基于特征点匹配的方法进行影像拼接,输出一个高分辨率的正射影像。ESM利用视差图和深度学习方法进行三维重建,并且输出一个高程图和一个几何校正的正射影像。SSM使用基于稠密匹配的方法进行三维重建,并且输出一个点云或网格模型和一个几何校正的正射影像。
Stage 4: Map Visualization:这个模块负责将地图数据发送给地面站,以便操作员实时查看地图的进展情况,并进行交互操作,例如放大、缩小、旋转等。这个模块使用了ROS作为通信框架,并且提供了一个基于Qt的可视化界面,可以显示无人机的实时位置、轨迹、地图等信息。
要使用本文提出的框架,需要安装ROS、QT、OpenCV、PCL、Fbow、g2o等相关库,并且下载本文提供的源代码。然后,需要配置好无人机的相机和GPS设备,并且在CMakeLists.txt文件中指定相应的参数。最后,你可以运行rosrun命令来启动框架,并且在地面站上观察地图结果。
laxnpander/OpenREALM: OpenREALM is a pipeline for real-time aerial mapping utilizing visual SLAM and 3D reconstruction frameworks. (github.com)
详见官方仓库代码
根据论文中提供的仓库¹,具体代码和上面四个模块功能的一一对应关系如下:
Stage 1: Image Acquisition:这个模块对应于 realm_ros 包中的 realm_exiv2_grabber 节点,它使用 exiv2_grabber 类来从文件夹中读取图像和GPS数据,并且发布到 /realm_exiv2_grabber/rgb_image 和 /realm_exiv2_grabber/camera_pose 话题上。
Stage 2: Visual Odometry:这个模块对应于 realm_vslam_base 包中的 realm_vslam_base_nodelet 节点,它使用 vslam_base 类来调用视觉里程计的算法,并且发布到 /realm_vslam_base_nodelet/pose 和 /realm_vslam_base_nodelet/keyframe_pose 话题上。目前支持的视觉里程计算法有ORB-SLAM2²和OpenVSLAM³。
Stage 3: Map Update:这个模块对应于 realm_stages 包中的多个节点,它们使用不同的类来实现不同的地图模式。例如,PSM对应于 realm_stages::StageSettings::Load(“plane_stitching”) ,ESM对应于 realm_stages::StageSettings::Load(“elevation”) ,SSM对应于 realm_stages::StageSettings::Load(“structure”) 。这些节点都会订阅视觉里程计的话题,并且发布地图数据到不同的话题上,例如 /plane_stitching/map_update , /elevation/map_update , /structure/map_update 等。
Stage 4: Map Visualization:这个模块对应于 realm_rviz_plugin 包中的一个RViz插件,它可以订阅地图更新的话题,并且在RViz中显示地图的结果,并且提供一些交互功能,例如保存地图,导出地图等。
这个库的实现主要分为四个模块:realm_core, realm_io, realm_vslam_base和realm_stages。每个模块的作用如下:
具体阶段说明
realm_pose_estimation是一个ROS节点,它实现了PoseEstimationStage类,用于从视觉SLAM获取图像和位姿,并将它们转换为地理坐标系下的位姿。它还可以根据图像的EXIF信息或GPS信息进行地理参考。它是OpenREALM框架的第一个阶段,为后续的拼接和重建提供输入数据,realm_pose_estimation是一个必须要有的阶段,因为它提供了图像和位姿的数据,如果没有这些数据,后续的拼接和重建就无法进行
realm_surface_generation是一个ROS节点,它实现了SurfaceGenerationStage类,用于从点云生成三维表面,并将其转换为网格或体素格式。它是OpenREALM框架的最后一个阶段,为后续的应用提供三维表面信息。realm_surface_generation阶段不是必须的,它只是为了生成三维表面信息,如果不需要这些信息,可以跳过这个阶段。
realm_ortho_rectification是一个ROS节点,它实现了OrthoRectificationStage类,用于将图像变换和拼接成正射影像,它是拼接阶段的实现。
realm_mosaicing是一个ROS节点,它实现了MosaicingStage类,用于将正射影像进一步处理,生成高程图和几何校正的正射影像。该阶段不是必须的,但如果你需要更高质量的拼接,你可以使用realm_mosaicing,它会在realm_ortho_rectification的基础上进行后处理,需要同时打开realm_mosaicing,同时也要打开realm_ortho_rectification,因为realm_mosaicing阶段需要realm_ortho_rectification阶段的输出作为输入。可以在配置文件中设置这两个阶段的参数,以达到你想要的效果。
官方demo示例说明
GNSS only mapping和2D mapping with visual SLAM在使用的不同的stage上有一些代码层面的区别。具体来说:
使用2D mapping with visual SLAM的方法来运行作者提供的数据并进行拼接,按照以下步骤:
官方github项目剖析【初步】
【1. 概览】
作者提供的这个开源代码的各个部分,以及和实际的代码文件的对应关系,如下:
【2. modules文件夹内容详解】
realm_core: 这个模块是提供了一些基础的类和函数,如相机模型,地理坐标系,图像处理等。它的功能是为其他模块提供一些通用的数据结构和工具函数。它主要使用了C++标准库,OpenCV和GDAL等第三方库来实现。它对应的代码文件在realm_core/include和realm_core/src中,其中主要有以下几个类和函数:
realm_io: 这个模块是提供了一些输入输出的接口,如读写图像,点云,地图等。它的功能是为其他模块提供一些数据的加载和保存的方法。它主要使用了OpenCV,PCL和GDAL等第三方库来实现。它对应的代码文件在realm_io/include和realm_io/src中,其中主要有以下几个类和函数:
realm_vslam_base: 这个模块是提供了一个视觉SLAM的抽象基类,以及对OpenVSLAM和ORB SLAM2的封装。它的功能是为其他模块提供一些视觉SLAM的接口和功能。它主要使用了OpenVSLAM和ORB SLAM2等第三方库来实现。它对应的代码文件在realm_vslam_base/include和realm_vslam_base/src中,其中主要有以下几个类和函数:
realm_stages: 这个模块是提供了一些处理阶段的类,如拼接,重建,表面生成等。每个阶段都可以独立运行,也可以通过ROS或其他框架进行通信。realm_stages模块还有以下几个类和函数:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。