원점 (0,0,0)에 위치한 RGBD 센서에서 포인트 클라우드의 어느 점을 볼 수 있는지 알아야합니다. 나는 pcl의 voxelgridOcclusionEstimation 클래스를 사용하여 센서에서 볼 수있는 클라우드의 가시 영역을 결정하려고했습니다. 광선 추적 기술을 사용합니다. 실험으로서 pcl voxelgridOcclusionEstimation을 사용하여 포인트 클라우드에서 폐색 예측
는, I는 그 중심은 다음 중 하나를 만족하는 영역에서 가시 영역을 얻으려고 노력 :- 중심 (X)을 따르는
- 센터
- 중심 (Z)을 따르는 Y 따라 절취
- 센터
- 센터
- 센터 YZ 평면을 따라 XY 평면을 따라이다 XZ 평면을 따라있다.
모든 경우 센서의 원점이 0 회전입니다.
voxelgridOcclusionEstimation yeilds wierd 결과. 녹색 영역은 가시 영역을 나타내며 빨간색 영역은 차단 영역을 나타냅니다.
내 코드는 다음과 같습니다
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<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;
}