SLAMesh论文及代码阅读与思考<五>Real-time LiDAR Simultaneous Localization and Meshing
前言
本节重点对filterMeshGlb()函数进行理解。该函数在可视化模块中重点对全局地图中的每个栅格进行mesh的生成。一开始我的疑惑是代码是如何实现相邻cell之间的mesh连接的,这个应该具有较大的挑战性。其实,代码只考虑栅格内部的mesh的生成,全局mesh地图也就是mesh的并集,并不是一定要做跨栅格的mesh连接。
具体流程
- 在每个方向上,将均匀的测试点加入到顶点集合中
- 对每个顶点,根据其与边界之间的位置关系,在其邻居中选择相应的另外两个点共同构成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);
}
}
}
}
}
- 添加到mesh_msg中并发布出来。