Я пытаюсь отфильтровать определенную область c с помощью pcl::CropBox
и показывать только точки в установленном поле, но что-то не совсем правильно. Облака точек исходят от датчика lidar
. Лидар находится в фиксированном положении, как показано ниже, и все точки в поле, которые я хотел бы сохранить, находятся в желтом поле (также показаны координаты). Все точки за пределами рамки не должны быть видны или стерты. Датчик находится в позиции (0,0,0)
и представляет начало координат XYZ
, выделенное красным ниже.
Ниже и в рамке область, которую я пытаюсь сохранить:
Ниже кода, который я использую для фильтрации, и шаги:
1) Получение облаков точек - это работает
2 ) Фильтрация и понижающая дискретизация: я фильтрую только точку на 180 градусов, направленную вверх, и фильтрую во всех XYZ
направлениях, устанавливая пределы - это работает
3) Установка фиксированного окна с использованием pcl::CropBox
и оставьте только точки внутри поля выше - это не работает, так как я все еще вижу все точки за пределами поля
processlidar.h
class SubscribeProcessPublish
{
public:
SubscribeProcessPublish();
pcl::PointCloud<pcl::PointXYZ> filterPointCloudData(const pcl::PCLPointCloud2ConstPtr& cloud);
void processLidarMeasurementCallBack(const pcl::PCLPointCloud2ConstPtr& cloud);
void removePointsOutsideBox();
}
processlidar. cpp
void SubscribeProcessPublish::removePointsOutsideBox()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_xyz_toRemove (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_xyz_removed (new pcl::PointCloud<pcl::PointXYZ>);
pcl::fromPCLPointCloud2(*cloud_xyz_toRemove, *cloud_xyz_removed);
pcl::CropBox<pcl::PointXYZ> boxFilter;
// Establishing the size of the CropBox
float x_min = 0.0, y_min = -25.0, z_min = -1.5;
float x_max = 50.0, y_max = +25.0, z_max = +1.5;
boxFilter.setMin(Eigen::Vector4f(x_min, y_min, z_min, 1.0));
boxFilter.setMax(Eigen::Vector4f(x_max, y_max, z_max, 1.0));
boxFilter.setInputCloud(cloud_xyz_toRemove);
boxFilter.filter(*cloud_xyz_removed);
std::cout<<"Box established"<<std::endl;
std::cout<<"Constantly Keeping only points inside the box"<<std::endl;
}
pcl::PointCloud<pcl::PointXYZ> SubscribeProcessPublish::filterPointCloudData(const pcl::PCLPointCloud2ConstPtr& cloud)
{
// Before establishing the XYZ limits we already have the box defined above
removePointsOutsideBox()
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_xyz_filtered (new pcl::PointCloud<pcl::PointXYZ>);
pcl::fromPCLPointCloud2(*cloud, *cloud_xyz_filtered);
// define a PassThrough
pcl::PassThrough<pcl::PointXYZ> pass;
// set input to cloudVoxel
pass.setInputCloud(cloud_xyz_filtered);
// filter along z-axis
pass.setFilterFieldName("z");
pass.setFilterLimits(z_min, z_max);
pass.filter(*cloud_xyz_filtered);
// filter along y-axis
pass.setFilterFieldName("y");
pass.setFilterLimits(y_min, y_max);
pass.filter(*cloud_xyz_filtered);
// filter along x-axis
pass.setFilterFieldName("x");
pass.setFilterLimits(x_min, x_max);
pass.filter(*cloud_xyz_filtered);
// cascade the floor removal filter and define a container for floorRemoved
pcl::PCLPointCloud2::Ptr filtered_cloud (new pcl::PCLPointCloud2 ());
// copy the contents of the cloud_xyz_filtered to filtered_cloud
pcl::toPCLPointCloud2(*cloud_xyz_filtered, *filtered_cloud);
// define a voxelgrid
pcl::VoxelGrid<pcl::PCLPointCloud2> voxelGrid;
// set input to cloud
voxelGrid.setInputCloud(filtered_cloud);
// set the leaf size (x, y, z)
voxelGrid.setLeafSize(0.1, 0.1, 0.1);
// apply the filter to dereferenced cloudVoxel
voxelGrid.filter(*filtered_cloud);
pcl::PointCloud<pcl::PointXYZ> pclXYZ;
pcl::fromPCLPointCloud2(*filtered_cloud, pclXYZ);
this->publisher.publish (*filtered_cloud);
return pclXYZ;
}
То, что я сделал до сих пор:
Перед тем, как перейти к коду, который я опубликовал выше, у меня было провести много исследований о том, как использовать функции фильтрации pcl
. Сначала я изучил туториал, связанный с фильтрацией, созданием вокселей и установкой желаемых мне пределов XYZ
. Очень полезными сообщениями были этот , а также этот .
Я просмотрел официальную документацию pcl
и проконсультировался с CropBox API , но также пошел дальше и проконсультировался с this .
Следующий источник также был полезен, но все еще не мог понять, почему он не работает.
Однако чего-то не хватает, что мешает мне видеть только точки в рамке. Укажите правильное направление для решения этой проблемы.