как да намерите основни компоненти и ориентация на облак от точки с помощта на библиотека с облак от точки

Имам облак от точки на дървен блок. Намерих центроида на този облак от точки. Сега се опитвам да намеря главните компоненти и ориентация, използвайки библиотека с облак от точки. По-долу е кодът, който опитах. Поправете ме ако не сте разбрали нещо.

        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), така че бих препоръчал да вземете първия собствен вектор такъв, какъвто е, като от втория собствен вектор извадите проекцията на втория собствен вектор върху 1-вия и след това изваждане от 3-тия собствен вектор на неговата проекция върху равнината, образувана от 1-вия и 2-рия собствен вектор. Вярвам, че това трябва да е достатъчно.   -  person D.J.Duff    schedule 28.02.2015


Отговори (1)


Ако имате нужда от ротационна матрица, представляваща ориентация, можем да изберем оста, в която обемното разпределение на обекта е най-високо (нормализиран първи собствен вектор - това е собственият вектор, свързан с най-голямата собствена стойност) като първа колона на матрицата.

За 2-ра колона на матрицата изберете 2-ри собствен вектор, но трябва да извадите от него неговата проекция върху 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