基于点云对挡墙边界进行提取
算法思路
- 将点转到极坐标系下,并得到极坐标系下的索引值,并输出距离信息。
double getCellIndexFromPoints(double x, double y, int& chI)
{// 计算点到原点的欧几里得距离double distance = sqrt(x * x + y * y);// 将极坐标中的角度映射为一个标准化的值,确保在 [0, 1) 范围内double chP = (atan2(y, x) + M_PI) / (2 * M_PI);// 将标准化的角度值映射为索引值(在 numChannel_ 范围内)chI = floor(chP * numChannel_);// 返回点到原点的欧几里得距离return distance;
}
2. 定义一个栅格Cell,栅格存储x,y坐标以及距离distance。定义一个map,key为索引,value是栅格。在索引相同时判断栅格的距离,小距离的保留下来。
typedef struct
{double x,y;double distance = 9999;
}Cell;cell_map.clear();for(auto point : cloud->points){int chI = -1;double distance = getCellIndexFromPoints(point.x,point.y,chI);if (chI >= 0 && chI < numChannel_){if(cell_map.find(chI)==cell_map.end() || cell_map[chI].distance > distance){cell_map[chI] = {point.x,point.y,distance};}}}
- 遍历map,将Value中的x,y填入边界线中,得到最后的内容
for(auto map_item : cell_map){PointSany point{map_item.second.x,map_item.second.y,1.0};hull->points.push_back(point);}