HBA: 3D激光点云大地图的位姿图优化

23 篇文章 2 订阅
4 篇文章 0 订阅
HBA是一个基于BALM的优化版本,专注于位姿图和大地图的优化。它使用多线程进行分布式处理,包括downsample_voxel、cut_voxel和recut等步骤来优化点云数据。内存管理中,通过swap技巧确保了内存的有效回收。cut_func和recut用于数据的更新和补充,tras_opt涉及变换优化。
摘要由CSDN通过智能技术生成

hku-mars/HBA (github.com)

HBA是基于BALM(BALM:3D激光点云地图离线优化代码剖析) 做的相关优化,主打就是位姿图优化和大地图优化

 时序图:

HBA->distribute_thread->update_next_layer_state->global_ba->pose_graph_optimization

HBA

HBA构造函数给LAYER赋值,LAYER开始做初始化的工作:init_parameter和init_storage;

init_parameter和init_storage: 根据分层和线程给每层分配相应的关键帧堆;

distribute_thread

    for (int i = 0; i < total_layer_num - 1; i++)
    {
        std::cout << "--------------------<<<< std::endl;
        distribute_thread(hba.layers[i], hba.layers[i + 1]);
        hba.update_next_layer_state(i);
    }

这里面首先有个策略,比如16个线程,15个线程都是进入parallel_comp,最后一个线程进入parallel_tail

    if(i < thread_num-1)
    {
      layer.mthreads[i] = new thread(parallel_comp, ref(layer), i, ref(next_layer)); 
    }
    else{
    layer.mthreads[i] = new thread(parallel_tail, ref(layer), i, ref(next_layer));
    }

 parallel_comp

downsample_voxel->cut_voxel->recut->tras_opt->remove_outlier->damping_iter->assign_qt->downsample_voxel

downsample_voxel

一个简单将点云值差的少合并,简单有效

cut_voxel

没啥好说的,将位置相近的点合并到一个格子OCTO_TREE_NODE里

 unordered_map<VOXEL_LOC, OCTO_TREE_ROOT*>& feat_map

大概的数据结构如图所示

recut

OCTO_TREE_NODE

其中遇到写法,我记得是为了更好的清除数据:

vector<PLV(3)>().swap(vec_orig);

查了下:

在《effective STL》和其实很多C++文章中都有指明,用clear()无法保证内存回收。但是swap技法可以。 那么如何释放内存呢?我们用swap交换到一个新的类型的vector,将原来的a拷贝出去,然后自然销毁,而新的到的a是全新的没有存任何数据的。

时序:judge_eigen-> cut_func->recut

cut_func recut看样子是为了重新补充数据;

tras_opt 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值