(я не знаю, что такое 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 записями для предварительно рассчитанных кватернионов, которую вы выберете на основе своего «вращения».