pcl :: CropBox не стирает точки вне поля - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь отфильтровать определенную область c с помощью pcl::CropBox и показывать только точки в установленном поле, но что-то не совсем правильно. Облака точек исходят от датчика lidar. Лидар находится в фиксированном положении, как показано ниже, и все точки в поле, которые я хотел бы сохранить, находятся в желтом поле (также показаны координаты). Все точки за пределами рамки не должны быть видны или стерты. Датчик находится в позиции (0,0,0) и представляет начало координат XYZ, выделенное красным ниже.

Ниже и в рамке область, которую я пытаюсь сохранить:

cropbox

Ниже кода, который я использую для фильтрации, и шаги:

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 .

Следующий источник также был полезен, но все еще не мог понять, почему он не работает.

Однако чего-то не хватает, что мешает мне видеть только точки в рамке. Укажите правильное направление для решения этой проблемы.

...