工程(十三)——基于激光视觉的SLAM三维重建

博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论。这是一个科研互助群,主要围绕机器人,无人驾驶,无人机方面的感知定位,决策规划,以及论文发表经验,以方便大家很好很快的科研,少走弯路。欢迎在群里积极提问与回答,相互交流共同学习。

工程(十三)——基于激光视觉的SLAM三维重建_第1张图片

一、简介

目前的主流三维重建算法包括:基于网络的纯视觉三维重建、基于SLAM算法的三维重建

        基于激光视觉SLAM(Simultaneous Localization and Mapping)的三维重建在多个方面具有许多优势,这些优势使其在许多领域如机器人导航、自动驾驶、建筑测绘、室内导航和虚拟现实等应用中受到广泛关注。以下是一些主要的优势:

  1. 高精度:激光传感器能够提供高精度的深度信息,使得三维地图的重建精度很高。这对于需要精确定位和建立精确地图的应用非常重要,如自动驾驶车辆和机器人导航。

  2. 实时性能:激光SLAM系统通常能够实时地生成三维地图,因为激光传感器可以快速地采集大量数据,而SLAM算法可以有效地处理这些数据。这对于需要即时反馈的应用非常关键,如自动驾驶和虚拟现实。

  3. 环境适应性:激光SLAM系统对不同类型的环境具有较强的适应性,可以在室内和室外,光照变化较大的情况下工作,而不受环境条件的影响。

  4. 自主性:激光SLAM系统通常不需要依赖外部参考点或GPS信号,因此可以在没有GPS信号或者在室内等无法使用GPS的环境中工作。这使其在室内导航、地下矿井、建筑内部等场景中非常有用。

  5. 鲁棒性:激光SLAM系统对于噪声和传感器误差的鲁棒性较高,可以处理传感器数据中的噪声和不确定性,从而减小了系统错误积累的可能性。

  6. 长距离探测:激光传感器可以实现较长距离的探测,因此可以用于测绘大型区域或者检测远处的目标,例如在自动驾驶中用于障碍物检测和识别。

  7. 可视化能力:激光SLAM系统通常能够生成高质量的三维地图,这些地图可以用于可视化和分析,使用户能够更好地理解环境结构。

二、SLAM算法

        在基于多传感器融合的SLAM三维重建能够实时估计出传感器的位姿,将每一帧的点云叠加到一起从而形成点云地图,随后利用点云处理软件将点云地图生成稠密化网格以达到三维重建的目的。所以基于激光视觉SLAM的三维重建首先要具有一个稳定鲁棒的SLAM系统,一般包括如下步骤:

1、激光雷达-视觉实验平台搭建

2、适用于大范围高动态LVO紧耦合SLAM算法设计

3、数据集采集策略

4、局部点云地图拼接,生成全局地图

5、点云地图修建重建生成UE模型

       香港大学团队的多传感器紧耦合SLAM  R3live++,其将meshlab直接融入算法具有三维重建的功能,算法的配置详情见:

工程(十三)——从零用自己数据跑R3LIVE_桦树无泪的博客-CSDN博客

工程(十三)——基于激光视觉的SLAM三维重建_第2张图片

三、点云生成网格

3.1准备

      当我们自己利用SLAM算法得到点云地图后,一般要对点云进行修补,以达到生成平滑网格的目的,下面介绍一下如何用meshlab软件对pcd点云进行处理并生成网格。首先安装一下meshlab。

sudo add-apt-repository ppa:zarquon42/meshlab
#####   然后按Enter键,继续
sudo apt-get install meshlab

在将pcd点云变为ply格式导入meshlab,pcd转ply代码如下:

import numpy as np
import open3d as o3d

def pcd_to_ply(pcd_path, ply_path):
    # 读取PCD文件
    pcd = o3d.io.read_point_cloud(pcd_path)
    
    # 获取点云数据
    points = np.asarray(pcd.points)
    colors = np.asarray(pcd.colors)
    
    # 创建PLY格式的点云
    ply = o3d.geometry.PointCloud()
    ply.points = o3d.utility.Vector3dVector(points)
    ply.colors = o3d.utility.Vector3dVector(colors)
    
    # 保存为PLY文件
    o3d.io.write_point_cloud(ply_path, ply)

# 使用示例
pcd_path = "rgb_pt.pcd"
ply_path = "rgb_pt.ply"
pcd_to_ply(pcd_path, ply_path)

3.2 点云拼接

meshlab的拼接视频教程参考如下链接

​​​​​Meshlab软件实现点云拼接配准_哔哩哔哩_bilibili

拼接的步骤如下:

 1.将两个ply点云导入meshlab

工程(十三)——基于激光视觉的SLAM三维重建_第3张图片

上图左右为点云1和点云2,红色框为重合区域,采用meshlab软件进行地图拼接,下图为拼接后的地图。

 2.将两个ply点云导入meshlab,点击Align Tool进入拼接界面

工程(十三)——基于激光视觉的SLAM三维重建_第4张图片

3.选择一个模型点击Glue Here Mesh,固定坐标系。选择另一个模型点击point Based Glueing进行匹配。

工程(十三)——基于激光视觉的SLAM三维重建_第5张图片工程(十三)——基于激光视觉的SLAM三维重建_第6张图片

4.手动选择三个特征明显的点,点击ok进行粗匹配

得到粗匹配的结果如下 

工程(十三)——基于激光视觉的SLAM三维重建_第7张图片

调节匹配参数,点击Process再次匹配

工程(十三)——基于激光视觉的SLAM三维重建_第8张图片

5.之后对匹配后的地图继续旋转矩阵和平移矩阵的细微调整

选择Filters ---》Normals,Curvatures and Orientation ---》Transform:Rotate

工程(十三)——基于激光视觉的SLAM三维重建_第9张图片

工程(十三)——基于激光视觉的SLAM三维重建_第10张图片

工程(十三)——基于激光视觉的SLAM三维重建_第11张图片

6.保存RT矩阵

工程(十三)——基于激光视觉的SLAM三维重建_第12张图片

得到变换矩阵如下所示:

工程(十三)——基于激光视觉的SLAM三维重建_第13张图片

根据变换矩阵生成合并点云地图

工程(十三)——基于激光视觉的SLAM三维重建_第14张图片

3.3 生成网格模型

在得到点云地图后,需要将其转换为mesh模型。视频教程如下

https://www.youtube.com/watch?v=rPEQVBhKJGA

  • 点云修剪
  • 计算法线

Filters→Point Set→Compute normals for point sets

  • 泊松重建

Filters->Remeshing, Simplification and Reconstruction->Surface Reconstruction:Screened Poisson

  • 有效面提取

Filters->Selection->select faces with edges longer than...

  • mesh修补空洞

Filters->Remeshing, Simplification and Reconstruction->close holes

四、材质提取与模型导入

meshlab制作具有UV纹理图的物体模型-CSDN博客

Step1:使用meshlab打开一个具有颜色信息的物体模型

Step2:制作UV map。在Filters中选择Texture -> 在Texture里选择Parametrization:Trivial Per-Triangle。这一步是为了生成一个与物体表面顶点坐标对应的UV map。一般物体的模型用默认设置即可,如果模型的顶点数量过多,需要增大Texture Dimension。

Step3:顶点颜色 -> UV颜色。在Texture中选择Transfer:Vertex Color to Texture,这能够将物体的顶点颜色转换到Step2中生成的UV纹理图。在转换时,需要设置UV纹理图的长宽,最好设置成与Texture Dimension一样的数字。

Step4:保存文件。由于上述的操作制作的是wedge的UV纹理图,接下来我们使用Filters/Texture/Convert PerWedge UV into PerVertex UV来制作Vertex的UV纹理图。

Step5:我们将物体模型导出。  按下图勾选。导出obj模型+材质+mlt链接文件

工程(十三)——基于激光视觉的SLAM三维重建_第15张图片

 导出后,你可以在物体模型文件的同级地址下看到尾缀为tex.png的模型纹理文件。和obj模型文件

Step6:导入UE  Obj mlt png必须在同一文件夹,只导入obj文件UE自动生成纹理材质

工程(十三)——基于激光视觉的SLAM三维重建_第16张图片

你可能感兴趣的:(智能环境感知工程代码调试,SLAM,c++,ubuntu,三维重建)