Использование pcl :: MomentOfInertiaEstimation
Официальное руководство по PCL по дескрипторам, основанным на моменте инерции и эксцентриситета.
Если вас интересует рыскание, вам нужно использовать OBB (ориентированную ограничивающую рамку), а не AABB (ограничивающая рамка с выравниванием по оси). AABB, как следует из названия, выровнен по оси и в основном эквивалентен минимальному / максимальному значению каждой координаты. OBB в PCL основан на собственных векторах анализа главных компонентов (направления максимальной дисперсии) .
Код (из учебника) для извлечения OBB:
pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
feature_extractor.setInputCloud (cloud);
feature_extractor.compute ();
pcl::PointXYZ min_point_OBB;
pcl::PointXYZ max_point_OBB;
pcl::PointXYZ position_OBB;
Eigen::Matrix3f rotational_matrix_OBB;
Eigen::Vector3f major_vector, middle_vector, minor_vector;
Eigen::Vector3f mass_center;
feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);
feature_extractor.getEigenVectors (major_vector, middle_vector, minor_vector);
feature_extractor.getMassCenter (mass_center);
Из документации:
Обратите внимание, что для получения OBB каждая вершина данного AABB (указанного с помощью min_point и max_point) должна быть повернута с заданной матрицей вращения (преобразование вращения), а затем позиционирована.
Итак, чтобы получить окончательный OBB - координаты:
Eigen::Vector3f p1 (min_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
Eigen::Vector3f p2 (min_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p3 (max_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p4 (max_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
Eigen::Vector3f p5 (min_point_OBB.x, max_point_OBB.y, min_point_OBB.z);
Eigen::Vector3f p6 (min_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p7 (max_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p8 (max_point_OBB.x, max_point_OBB.y, min_point_OBB.z);
p1 = rotational_matrix_OBB * p1 + position;
p2 = rotational_matrix_OBB * p2 + position;
p3 = rotational_matrix_OBB * p3 + position;
p4 = rotational_matrix_OBB * p4 + position;
p5 = rotational_matrix_OBB * p5 + position;
p6 = rotational_matrix_OBB * p6 + position;
p7 = rotational_matrix_OBB * p7 + position;
p8 = rotational_matrix_OBB * p8 + position;
Использование pcl :: pca
Документация PCL
Учебное пособие на codextechnicanum.blogspot.co. il
Если вас просто интересует вектор направления транспортного средства, предположим, что он находится вдоль основного собственного вектора:
pcl::PCA<pcl::PointXYZ> pca(cloud, true);
Eigen::Matrix3f eigen_vector = pca.getEigenVectors(); // returns a matrix where the columns are the axis of your bounding box
Eigen::Vector3f direction = eigen_vector.col(0);
person
Mark Loyman
schedule
07.04.2018