как найти главные компоненты и ориентацию облака точек с помощью библиотеки облаков точек

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

        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;

person RoboticsNovice    schedule 24.02.2015    source источник
comment
Это выглядит хорошо. Есть проблема?   -  person D.J.Duff    schedule 25.02.2015
comment
Я хочу найти ориентацию облака точек в файле cluster_indices.   -  person RoboticsNovice    schedule 25.02.2015
comment
Собственный вектор, соответствующий наибольшему собственному значению, должен приблизительно совпадать с направлением максимального распределения объема объекта, что, как я полагаю, вам нужно. Есть ли какая-то другая форма, в которой вы хотели выразить эту направленность?   -  person D.J.Duff    schedule 26.02.2015
comment
Да, я хочу найти матрицу преобразования основных компонентов относительно мировой координаты.   -  person RoboticsNovice    schedule 27.02.2015
comment
Три собственных вектора, которые вы хотите, должны быть независимыми, и вам просто нужно, чтобы они были ортонормированы, чтобы они составляли матрицу вращения (IIRC), поэтому я бы рекомендовал взять первый собственный вектор как есть, вычитая из 2-го собственного вектора проекцию 2-го собственного вектора на 1-й, а затем вычитая из 3-го собственного вектора его проекцию на плоскость, образованную 1-м и 2-м собственными векторами. Я считаю, что этого должно быть достаточно.   -  person D.J.Duff    schedule 28.02.2015


Ответы (1)


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

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

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

person D.J.Duff    schedule 28.02.2015
comment
Есть ли способ представить собственные векторы в виде оси? - person RoboticsNovice; 03.03.2015
comment
Как я написал в ответе, обработав их так, чтобы они стали ортонормированными, их можно использовать в качестве осей системы координат. Пожалуйста, не стесняйтесь задавать дополнительные вопросы, но, возможно, потребуется больше деталей, если я снова упустил вашу мысль. - person D.J.Duff; 04.03.2015
comment
Обратите внимание, что столбцы матрицы вращения на самом деле являются осями повернутой системы координат. - person D.J.Duff; 04.03.2015
comment
Спасибо. Можете ли вы сослаться на эту ссылку и сказать мне, если у вас есть какие-либо предложения. stackoverflow.com/q/28844865/2981361 - person RoboticsNovice; 04.03.2015
comment
Для ответа на этот вопрос я рекомендую вам изучить API для PCLVisualizer. - person D.J.Duff; 06.03.2015