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看样子是为了重新补充数据;