2015-02-24 1 views
0

У меня есть облако точки деревянного блока. Я нашел центр тяжести этого облака точек. Теперь я пытаюсь найти основные компоненты и ориентацию, используя библиотеку облаков точек. Ниже приведен код, который я попробовал. Поправьте меня, если вы ничего не поняли.Как найти основные компоненты и ориентацию облака точек с помощью облачной библиотеки точек

 Eigen::Vector4f centroid; 
     Eigen::Matrix3f covariance_matrix; 

     // Extract the eigenvalues and eigenvectors 
     Eigen::Vector3f eigen_values; 
     Eigen::Matrix3f eigen_vectors; 

     pcl::compute3DCentroid(*cloud_filtered,cluster_indices,centroid); 

     // Compute the 3x3 covariance matrix 
     pcl::computeCovarianceMatrix (*cloud_filtered, centroid, covariance_matrix); 
     pcl::eigen33 (covariance_matrix, eigen_vectors, eigen_values); 
     std::cout << "centroid-x:"<<centroid[0]<<"centroid-y:"<<centroid[1]<<"centroid-z:"<<centroid[2]<<std::endl; 
+0

Все хорошо. Есть проблема? –

+0

Я хочу найти ориентацию облака точек в cluster_indices. – RoboticsNovice

+0

Собственный вектор, соответствующий наибольшему собственному значению, должен быть приблизительно ориентирован на максимальное распределение по объему объекта, которое, как я полагаю, является тем, что вы хотите. Есть ли другая форма, в которой вы хотели бы выразить эту ориентацию? –

ответ

1

Если вам нужна матрица поворота, представляющее ориентацию, можно выбрать ось, в которой распределение объема объекта является самым высоким (нормированным первым собственным вектором - это собственный вектор, связанным с наибольшим собственным значением) в качестве первого столбец матрицы.

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

Для 3-й колонки останется только один выбор - перекрестное произведение двух вычисленных выше.

+0

Есть ли способ представления собственных векторов как оси ?. – RoboticsNovice

+0

Как я написал в ответ, обработав их так, чтобы они стали ортонормированными, их можно использовать в качестве осей системы координат. Пожалуйста, не стесняйтесь задавать больше вопросов, но, возможно, требуется больше деталей, если я снова пропустил ваш вопрос. –

+0

Обратите внимание, что столбцы матрицы поворота являются фактически осями повернутой системы координат. –

Смежные вопросы