SLAMesh论文及代码阅读与思考<五>Real-time LiDAR Simultaneous Localization and Meshing

发布时间 2023-09-05 18:13:29作者: CodeEverything

前言

本节重点对filterMeshGlb()函数进行理解。该函数在可视化模块中重点对全局地图中的每个栅格进行mesh的生成。一开始我的疑惑是代码是如何实现相邻cell之间的mesh连接的,这个应该具有较大的挑战性。其实,代码只考虑栅格内部的mesh的生成,全局mesh地图也就是mesh的并集,并不是一定要做跨栅格的mesh连接。

具体流程

  1. 在每个方向上,将均匀的测试点加入到顶点集合中
  2. 对每个顶点,根据其与边界之间的位置关系,在其邻居中选择相应的另外两个点共同构成mesh
for (auto & i_cell : cells_glb){
        // in each cell, dir, build mesh_msg
        if(i_cell.second.average_viewed_distance > max_show_distance ){
            continue;
        }
        for(int dir = 0; dir < 3; dir ++){
            if(i_cell.second.updated_times[dir] < min_show_updated_times){
                continue;
            }
            PointMatrix & vertices = i_cell.second.ary_cell_vertices[dir];
            if(vertices.num_point == 0){
                continue;
            }
            //inside mesh_msg
            int start_vertex_i = tmp_mesh.mesh_geometry.vertices.size();
            for(int vertex_i = 0; vertex_i < vertices.num_point ; vertex_i ++){
                geometry_msgs::Point tmp_point;
                tmp_point.x =  vertices.point(0, vertex_i);
                tmp_point.y =  vertices.point(1, vertex_i);
                tmp_point.z =  vertices.point(2, vertex_i);
                tmp_mesh.mesh_geometry.vertices.push_back(tmp_point);
            }
            for(int vertex_i = 0; vertex_i < vertices.num_point; vertex_i++){
                int ix_cell = vertex_i % (n_row);
                int iy_cell = vertex_i / (n_row);
                mesh_msgs::MeshTriangleIndices tmp_face;
                if(ix_cell + 1 < n_row && iy_cell - 1 >= 0){
                    double variance_face_i = (vertices.variance(0, vertex_i) +
                                              vertices.variance(0, vertex_i + 1) +
                                              vertices.variance(0, vertex_i + 1 - n_row)) / 3.0;
                    if(variance_face_i < variance_face_show){
                        tmp_face.vertex_indices[0] = start_vertex_i + vertex_i;
                        tmp_face.vertex_indices[1] = start_vertex_i + vertex_i + 1;
                        tmp_face.vertex_indices[2] = start_vertex_i + vertex_i + 1 - n_row;
                        tmp_mesh.mesh_geometry.faces.push_back(tmp_face);
                    }
                }
                if(ix_cell + 1 < n_row && iy_cell + 1 < n_row ){
                    double variance_face_i = (vertices.variance(0, vertex_i) +
                                              vertices.variance(0, vertex_i + 1) +
                                              vertices.variance(0, vertex_i + n_row)) / 3.0;
                    if(variance_face_i < variance_face_show){
                        tmp_face.vertex_indices[0] = start_vertex_i + vertex_i;
                        tmp_face.vertex_indices[1] = start_vertex_i + vertex_i + 1;
                        tmp_face.vertex_indices[2] = start_vertex_i + vertex_i + n_row;
                        tmp_mesh.mesh_geometry.faces.push_back(tmp_face);
                    }
                }
            }
        }
    }
  1. 添加到mesh_msg中并发布出来。