通过修改livox loam源代码来提高算法效率
看过代码的都知道,我们一般使用的kd-tree是pcl自带的,然后使用的时候肯定会有删除节点的情况,删除节点是一个很消耗时间的动作,因为删除节点有可能会需要重建树。
所以我的思路是,重写kd-tree,在节点的struct中我们添加boolean属性:
struct KD_TREE_NODE
{
// 该节点对应的点坐标
PointType point;
// 划分轴
int division_axis;
int TreeSize = 1;
int invalid_point_num = 0;
int down_del_num = 0;
bool point_deleted = false;
bool tree_deleted = false;
bool point_downsample_deleted = false;
bool tree_downsample_deleted = false;
bool need_push_down_to_left = false;
bool need_push_down_to_right = false;
bool working_flag = false;
pthread_mutex_t push_down_mutex_lock;
float node_range_x[2], node_range_y[2], node_range_z[2];
// 左右子节点
KD_TREE_NODE *left_son_ptr = nullptr;
KD_TREE_NODE *right_son_ptr = nullptr;
// 父节点
KD_TREE_NODE *father_ptr = nullptr;
// For paper data record
float alpha_del;
float alpha_bal;
};
point_deleted和tree_deleted这两个属性初始都是false,当一个节点不被需要的时候,point_deleted会被设置为true,当以这个节点为root的子树中的节点都不被需要的时候,tree_deleted会被设置为true。然后我们最后在去处理节点,节省了很多时间。