基于点云对挡墙边界进行提取
算法思路
- 将点转到极坐标系下,并得到极坐标系下的索引值,并输出距离信息。
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);
}