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

21 篇文章 2 订阅
4 篇文章 0 订阅

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、付费专栏及课程。

余额充值