2015-12-03 2 views
0

Я загрузил образец pcap для velodyne-32E lIDAR и сохранил 1 из кадров в виде файла csv. Используя PCL, я хочу визуализировать облако точек как изображение диапазона, а также взаимодействовать с ним для дальнейшей обработки (калибровка камеры-лидара). До сих пор я следил за учебниками и устанавливал вертикальное/горизонтальное угловое разрешение на 0,16 и 1,33 градуса соответственно. Точечное облако казалось прекрасным, но сгенерированное изображение настолько мало, что я действительно не думаю, что вижу что-либо.PCL (point-cloud-library) диапазон изображения слишком маленький

Поскольку я использую RangeImageVisualiser, а не PCLVisualiser, на самом деле мне не кажется, что здесь какие-либо элементы управления. Любая идея, как я могу сделать свой образ более видимым?

ifstream file (argv[1]); 
float x,y,z; 

pcl::PointCloud<pcl::PointXYZ> pointCloud; 

while (file >> x >> y >> z){ 
    pcl::PointXYZ point; 
    point.x = x; 
    point.y = y; 
    point.z = z; 

    pointCloud.points.push_back(point); 
    //cout << "X: " << x; 
    //cout << "Y: " << y; 
    //cout << "Z: " << z; 
} 

cout << "they are " << pointCloud.points.size() << " points\n"; 
pointCloud.width = (uint32_t) pointCloud.points.size(); 
pointCloud.height = 1; 

//float angularResolution = (float) ( 1.0f * (M_PI/180.0f)); // 1.0 degree in radians 
float angularResolution_x = (float) ( 0.16f * (M_PI/180.0f)); // 1.0 degree in radians 
float angularResolution_y = (float) ( 1.33f * (M_PI/180.0f)); // 1.0 degree in radians 
float maxAngleWidth  = (float) (360.0f * (M_PI/180.0f)); // 360.0 degree in radians 
float maxAngleHeight = (float) (180.0f * (M_PI/180.0f)); // 180.0 degree in radians 
Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f); 
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::LASER_FRAME; 
float noiseLevel=0.00; 
float minRange = 0.0f; 
int borderSize = 1; 

//pcl::RangeImage rangeImage; 
pcl::RangeImageSpherical rangeImage; 
rangeImage.createFromPointCloud(pointCloud, angularResolution_x, angularResolution_y, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize); 
cout << rangeImage << "\n"; 



//visualize point cloud 
boost::shared_ptr<pcl::RangeImage> range_image_ptr(&rangeImage); 
pcl::PointCloud<PointType>::Ptr point_cloud_ptr (&pointCloud); 

pcl::visualization::PCLVisualizer viewer ("3D viewer"); 
viewer.setBackgroundColor(1,1,1); 
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> range_image_color_handler (range_image_ptr, 0, 0, 0); 
viewer.addPointCloud(range_image_ptr, range_image_color_handler, "range image"); 
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "range image"); 

//viewer.addCoordinateSystem(1.0f); 
//pcl::visualization::PointCloudColorHandlerCustom<PointType> point_cloud_color_handler (point_cloud_ptr, 150, 150, 150); 
//viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, "original point cloud"); 


viewer.initCameraParameters(); 
setViewerPose(viewer, rangeImage.getTransformationToWorldSystem()); 

pcl::visualization::RangeImageVisualizer widget("please work"); 
widget.showRangeImage(rangeImage); 
widget.setSize(500, 500); 

while (!viewer.wasStopped()){ 
    widget.spinOnce(); 
    viewer.spinOnce(); 
    pcl_sleep(.01); 
} 

enter image description here

+0

Можете ли вы предоставить файл CSV? –

ответ

0

Для меня это выглядит как ваше изображение просто отлично. Если вы установите разрешения на 0,16 и 1,33 градуса, вы получите изображение, равное количеству лазеров в кольце: 360/0,16 = 2250 пикселей на количество лазеров в вертикальной полосе, приблизительно 40/1,33 = 30 пикселей.

Это потому, что вид velodyne 32 составляет 360 x 40 градусов, как указано в техническом паспорте. Нет никакого способа, чтобы этот образ выглядел по-другому, если только вы не хотите, чтобы ваш пиксель был не квадратным.