2015-03-26 2 views
0

Я слежу за учебником http://pointclouds.org/documentation/tutorials/pcl_visualizer.php#pcl-visualizer и могу получить простой просмотрщик.Eigen with PointCloud (PCL)

Я просмотрел документацию и нашел функцию getMatrixXfMap, которая возвращает Eigen::MatrixXf от PointCloud.

// Get Eigen matrix 
Eigen::MatrixXf M = basic_cloud_ptr->getMatrixXfMap(); 
cout << "(Eigen) #row :" << M.rows() << endl; 
cout << "(Eigen) #col :" << M.cols() << endl; 

Следующие обрабатывают M (в основном повороты, переводы и некоторые другие преобразования). Я как можно установить M в PointCloud эффективно. Или это то, что мне нужно pushback() по одному пункту за раз?

+0

Просто используйте 'Eigen :: Matrix4f trans;' Установите матрицу по своему усмотрению. 'pcl :: transformPointCloud (* beforeTransCloud, * afterTransCloud, trans)' – Deepfreeze

+0

Что делать, если мои манипуляции не так просты, как линейное преобразование? Как я могу получить облако точек в качестве матрицы для управления? – mkuse

+0

Затем используйте push_back или более эффективно используйте 'cloud-> resize', а затем за точку' cloud-> points [i] .x = ... ' – Deepfreeze

ответ

0

Вам не нужно бросать ваше облако pcl в Eigen :: MatrixXF, выполнять преобразования и отбрасывать назад. Вы можете просто выполнять на входе облака:

pcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud (new pcl::PointCloud<pcl::PointXYZ>()); 
          \\ Fill the cloud 
          \\ ..... 
Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity(); 
// Define a translation of 2.5 meters on the x axis. 
transform_2.translation() << 2.5, 0.0, 0.0; 
// The same rotation matrix as before; theta radians arround Z axis 
transform_2.rotate (Eigen::AngleAxisf (theta, Eigen::Vector3f::UnitZ())); 
// Print the transformation 
printf ("\nMethod #2: using an Affine3f\n"); 
std::cout << transform_2.matrix() << std::endl; 
// Executing the transformation 
pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud (new pcl::PointCloud<pcl::PointXYZ>()); 
// You can either apply transform_1 or transform_2; they are the same 
pcl::transformPointCloud (*source_cloud, *transformed_cloud, transform_2); 

Взятые из pcl transformation tutorial.