Как вычислить кватернион из максимальных и минимальных значений координат куба? - PullRequest
0 голосов
/ 08 апреля 2020

Я столкнулся с некоторой проблемой при создании ориентации куба (ограничительной рамки обнаруженных объектов в ROS). Я знаю максимальные и минимальные значения координат (xmin, xmax, ymin, ymax, zmin, zmax). Итак, я могу легко найти вершину объектов Bounding BOX (Cube), которые являются

[xmin ymin zmin; 
 xmax ymin zmin; 
 xmax ymax zmin; 
 xmin ymax zmin;
 xmin ymin zmax; 
 xmax ymin zmax; 
 xmax ymax zmax;
 xmin ymax zmax]

Теперь, как я могу создать кватернион из этих вершин, чтобы получить ориентацию ограничительной рамки? Я знаю, что кватернион - это набор из 4 чисел [xyzw], который представляет вращения следующим образом:

// RotationAngle is in radians
x = RotationAxis.x * sin(RotationAngle / 2)
y = RotationAxis.y * sin(RotationAngle / 2)
z = RotationAxis.z * sin(RotationAngle / 2)
w = cos(RotationAngle / 2)

Как получить RotationAxis и RotationAngle при знании вершины объекта (в моем случае такое куб или трехмерный прямоугольник)? Спасибо

Ответы [ 3 ]

0 голосов
/ 08 апреля 2020

(я не знаю, что такое ROS, но вот абстрактное обсуждение вашего вопроса.)

Прежде всего, «вращение» начинается с состояния «из» и заканчивается на «к» " штат. Вы знаете свое состояние «до», но вам нужно будет указать состояние «от». Давайте предположим, что ваш ящик начинается с состояния по умолчанию, с одним углом в (0, 0, 0) и другим в (1, 1, 1).

Это состояние по умолчанию, как и ваш последний "" по оси Теперь коробка могла повернуться на 90, 180 или 270 градусов, но если разные грани коробки не отличаются друг от друга, это может не иметь значения. Этот сценарий будет иметь вращение на 0 градусов, и кватернион, представляющий это вращение, тривиально вычисляется как (0, 0, 0, 1). Вам все еще понадобится масштабирование и перевод (которые также тривиальны для вычисления), чтобы перейти из этого состояния по умолчанию к вашему BB, но без вращения.

Теперь, если грани на самом деле разные, то мы действительно есть вращение. Давайте назовем это «вращением по оси» или AAR, который может использовать поле по умолчанию для любого из 24 различных состояний. Думайте об этом так: ось вращения может быть любым из 6 базисных векторов в любом направлении (+ x, -x, + y, -y, + z, -z), а угол может быть 0, 90, 180 или 270 градусов (6 * 4 - это 24!)

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

Я могу придумать для этого две ментальные модели: либо выбрать одну «переднюю» грань и одну «верхнюю» грань для вашей коробки и выяснить, где они оказались в состоянии "to" (6 мест для "front" и 4 места для "top".) Или вы можете выбрать вершину "origin" и "соседнюю" вершину и найти, где они оказались (8 мест для «origin» и 3 места для «neighbour».) В любом случае, у вас, вероятно, будет таблица с 24 записями для предварительно рассчитанных кватернионов, которую вы выберете на основе своего «вращения».

0 голосов
/ 16 апреля 2020

Код (из учебника) для извлечения 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 - Координаты:

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

Bu rotational_matrix_OBB как получить?

0 голосов
/ 08 апреля 2020

То, как вы создали свою ограничивающую рамку с использованием минимальных и максимальных значений, приводит к ограничивающей рамке, выровненной по осям x, y и z. Таким образом, у него нет вращения, и его кватернион будет [0, 0, 0, 1].

Получение матрицы вращения случайно ориентированных кубов или прямоугольников не сложно, если вы знаете, к какой вершине относится какой угол куба / прямоугольника. Тогда вы можете просто использовать два перпендикулярных ребра в качестве осей x и y в координатной системе объектов. После нормализации этих векторов вы можете создать ось z во фрейме объекта, построив перекрестное произведение векторов x и y. Столбцы матрицы вращения 3x3 представляют собой следующие три вектора:

    | x_0  y_0  z_0 |
R = | x_1  y_1  z_1 |
    | x_2  y_2  z_2 |

Вы можете искать в inte rnet ресурсы, чтобы получить ось вращения и кватернион из матрицы вращения.

Для общие объекты, вы можете использовать тот же метод, если у вас есть вершины точек на двух перпендикулярных осях в системе координат объекта. Если вы не знаете точку corespondig в фрейме объекта для ваших вершин, она становится более сложной. Если ваши вершины равномерно покрывают ваш объект (например, вершины с 3D-камер или лазерное сканирование), вы можете использовать Анализ основных компонентов, чтобы найти главные оси вершин. Эти оси образуют столбцы матрицы вращения (убедитесь, что главные оси образуют правую рамку, т. Е. Определитель матрицы вращения равен +1).

Если эти методы также не применяются к Вы можете искать методы оценки поз в контексте облаков точек (например: Библиотека облаков точек PCL , Open3D ).

...