2

原点(0,0,0)にあるRGBDセンサーからポイントクラウドのどのポイントが見えるかを調べる必要があります。pcl の voxelgridOcclusionEstimation クラスを使用して、センサーから見た雲の可視領域を決定しようとしました。レイトレーシング技術を使用しています。

実験として、中心が次のいずれかを満たす球の可視領域を取得しようとしました。

  1. 中心はxに沿っています
  2. 中心はyに沿っています
  3. 中心はzに沿っています
  4. 中心は xz 平面に沿っています
  5. 中心は yz 平面に沿っています
  6. 中心は xy 平面に沿っています。

センサーはすべての場合においてゼロ回転の原点にあります。

voxelgridOcclusionEstimation は奇妙な結果をもたらします。緑の領域は可視領域を表し、赤は遮られた領域を表します。

x軸に沿った球

z軸に沿った球

y軸に沿った球

xy平面に沿った球

yz 平面に沿った球

私のコードは次のとおりです。

int main(int argc, char * argv[])
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_occluded(new pcl::PointCloud<pcl::PointXYZ>);

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_visible(new pcl::PointCloud<pcl::PointXYZ>);

pcl::io::loadPCDFile(argv[1],*cloud_in);

Eigen::Quaternionf quat(1,0,0,0); 
cloud_in->sensor_origin_  = Eigen::Vector4f(0,0,0,0); 

cloud_in->sensor_orientation_= quat; 
pcl::VoxelGridOcclusionEstimation<pcl::PointXYZ> voxelFilter; 
voxelFilter.setInputCloud (cloud_in); 

float leaf_size=atof(argv[2]); 
voxelFilter.setLeafSize (leaf_size, leaf_size, leaf_size); 
voxelFilter.initializeVoxelGrid(); 

std::vector<Eigen::Vector3i, 
Eigen::aligned_allocator&lt;Eigen::Vector3i> > occluded_voxels; 

for (size_t i=0;i<cloud_in->size();i++) 
{ 

    PointT pt=cloud_in->points[i]; 

    Eigen::Vector3i grid_cordinates=voxelFilter.getGridCoordinates (pt.x, pt.y, pt.z); 

    int grid_state; 

    int ret=voxelFilter.occlusionEstimation( grid_state, grid_cordinates ); 

    if (grid_state==1) 
    { 
        cloud_occluded->push_back(cloud_in->points[i]); 
    } 
    else 
    { 
    cloud_visible->push_back(cloud_in->points[i]); 
    } 

}
pcl::io::savePCDFile(argv[3],*cloud_occluded);
pcl::io::savePCDFile(argv[4],*cloud_visible);

return 0;
}
4

2 に答える 2