【SLAM】稠密建图的讨论与八叉树三维地图的构建

1.前言

我们已经讲过了单目相机构建稠密地图,当然,对于视觉,这是一个简单有效的办法,对于SLAM系统来讲,它还有很多不足。

> 稀疏地图反而更容易做导航,稠密地图作用一般是三维重建考虑的问题。

主要缺陷有如下几点:

  1. 像素梯度
  2. 深度参数
  3. 图像投影
  4. 多线程

我们接下来先讨论一下这些缺陷以及他的解决办法。

2.梯度与深度

1.像素梯度

对于极线约束,最简单就是使用单个像素的对比,找到最相似的一个作为匹配,但是这有很多误差,所以,诞生了使用块匹配作为匹配方式,虽然这个已经很大程度降低了他的误匹配率,但是任然不是一个很好的方法和解决方案。

比如,梯度问题,对于纹理明显的区域,他的像素梯度可以非常明显,但是,对于不明显的区域呢,比如白墙,天空等等。

这个问题依然需要更好的解决办法。

2.深度参数

在估计他的深度参数时,我们假设它是服从高斯分布的,但是,在实际系统中,它不一定服从高斯分布。

但是,深度有如下特点:

  1. 非负性;
  2. 广域性。

所以,很多研究者根据这两个特点,开发出逆深度这个概念,就是在深度估计时,使用逆深度假设服从高斯分布。

但这只是对于传统SLAM中,这是一个技巧,但是对于深度学习对于其的估计,通常得出的不再是逆深度了。

3.图像变化和多线程

1.图像变化

对于之前的块匹配,我们有一个前提,是只发生变化而没旋转变化,对于发生了旋转变化呢,就需要考虑图像间的变化而不是直接使用极线约束。

这里考虑的图像变化就是旋转矩阵和平移矩阵。

2.多线程

我们知道,上述的各种计算都是大批量的计算,但一个计算线程难以估计如此大规模的计算,对于实时性,这是个挑战。

但是多线程的计算可以大大缓解这个问题。

4.八叉树地图

>  把三维空间建模为许多个小方块(或体素)是一种常见的做法。如果把一个小方块的每个面都平均切成2片,那么这个小块就会变成同样大小的八个小方块。这个步骤可以不断的重复,直到最后的方块大小达到建模的最高精度。在这个过程中,把“将一个小方块分成同样大小的八个”看成”从一个结点展开成八个子节点”,那么整体从最大空间细分到最小空间的过程,就是一颗八叉树。整个大方块可以看成是根节点,而最小的块可以看作是“叶子节点”。于是在八叉树中,当我们由下一层结点往上走一层时,地图的体积就能扩大为原来的八倍。如果叶子结点的方块大小为1平方厘米,那么当我们限制八叉树为10层时,总共能建模的体积大约为8的10次幂立方厘米,也就是1073平方米。这足够建模一间屋子。由于体积与深度呈指数关系,所以当用更大的深度时,建模的体积会增长的非常快。

大家都应该了解二叉树的概念,一个节点,2个分支,而八叉树,顾名思义,就是一个节点,8个分支。

八叉树最大的优点就是它非常节约空间。

5.实践

//八叉树实例

int main( int argc, char** argv )
{
    if (argc != 3)
    {
        cout<<"Usage: pcd2colorOctomap <input_file> <output_file>"<<endl;
        return -1;
    }

    string input_file = argv[1], output_file = argv[2];
    pcl::PointCloud<pcl::PointXYZRGBA> cloud;
    pcl::io::loadPCDFile<pcl::PointXYZRGBA> ( input_file, cloud );

    cout<<"point cloud loaded, piont size = "<<cloud.points.size()<<endl;

    //声明octomap变量
    cout<<"copy data into octomap..."<<endl;
    // 创建带颜色的八叉树对象,参数为分辨率,这里设成了0.05
    octomap::ColorOcTree tree( 0.05 );

    for (auto p:cloud.points)
    {
        // 将点云里的点插入到octomap中
        tree.updateNode( octomap::point3d(p.x, p.y, p.z), true );
    }

    // 设置颜色
    for (auto p:cloud.points)
    {
        tree.integrateNodeColor( p.x, p.y, p.z, p.r, p.g, p.b );
    }

    // 更新octomap
    tree.updateInnerOccupancy();
    // 存储octomap, 注意要存成.ot文件而非.bt文件
    tree.write( output_file );
    cout<<"done."<<endl;

    return 0;
}

6.小结

这里,我们就讲完了,入门SLAM的最后一个知识点,相信大家对于SLAM系统有了全新的认识,从传感器数据、前端估计、后端优化、回环检测、地图重建。希望这一个系列可以帮助大家深入的理解相关的概念,但是研究人在不断探索,欢迎大家深入SLAM 方向,推动机器人感知领域的科技发展。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
SLAM(Simultaneous Localization and Mapping)也称为同时定位和建图,是一种利用传感器数据在未知环境中同时定位自身位置并构建地图的技术。而稠密建图SLAM中的一种方法,其目的是生成一个精细且包含详细信息的地图。 实时相机点云图是SLAM中的一个关键元素。点云是由相机或激光扫描仪等传感器收集到的大量三维点的集合。建立点云图的过程就是将这些离散的点云通过特定的算法进行处理和融合,形成一个连续和连贯的三维地图。 关于为何SLAM稠密建图中的实时相机点云图通常显示为白色,可以有以下解释: 1.可视化表示:白色是一种常用的可视化表示方法,它可以有效地将点云图的信息进行编码和传达。白色亮度高,易于观察点云的密集程度以及地图的细节。 2.点云原始颜色:在大多数SLAM系统中,相机采集到的点云往往没有颜色信息,只包含三维坐标。因此,在进行稠密建图时,为了将点云以一种直观的方式呈现,通常会选用白色作为其默认颜色。 3.清晰度和对比度:通过使用白色作为点云图的颜色,可以确保点云在不同背景色的环境下具有良好的清晰度和对比度。这对于观察和分析点云图非常重要。 总之,SLAM稠密建图中的实时相机点云图通常显示为白色,这是为了更好地传达点云信息、提高观察效果,并与不同背景色环境保持良好的清晰度和对比度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值