Во-первых, я собираюсь предположить, что вы передаете в свою функцию хорошо обусловленную матрицу правостороннего вращения. Я собираюсь использовать ту же последовательность вращения, которую вы указали выше, X Y 'Z''
Если вы знаете символическую конструкцию матрицы поворота, из которой пытаетесь извлечь углы, математика довольно проста. Ниже приведен пример кода Matlab для определения построения матрицы вращения порядка X-Y'-Z''
a = sym('a');%x
b = sym('b');%y
g = sym('g');%z
Rx = [1 0 0;0 cos(a) -sin(a);0 sin(a) cos(a)];
Ry = [cos(b) 0 sin(b);0 1 0;-sin(b) 0 cos(b)];
Rz = [cos(g) -sin(g) 0;sin(g) cos(g) 0;0 0 1];
R = Rz*Ry*Rx
Вывод выглядит следующим образом:
R =
[ cos(b)*cos(g), cos(g)*sin(a)*sin(b) - cos(a)*sin(g), sin(a)*sin(g) + cos(a)*cos(g)*sin(b)]
[ cos(b)*sin(g), cos(a)*cos(g) + sin(a)*sin(b)*sin(g), cos(a)*sin(b)*sin(g) - cos(g)*sin(a)]
[ -sin(b), cos(b)*sin(a), cos(a)*cos(b)]
Вот тот же результат в более красивом формате:
![введите здесь описание изображения](https://i.stack.imgur.com/G6tnw.gif)
Теперь давайте пройдемся по математике, чтобы извлечь углы из этой матрицы. Сейчас самое время освоиться с функцией atan2().
Сначала найдите угол бета (кстати, альфа — это вращение вокруг оси X, бета — это вращение вокруг оси Y’, а гамма — это угол вокруг оси Z’’):
beta = atan2(-1*R(3,1),sqrt(R(1,1)^2+R(2,1)^2))
Написано более официально,
![введите здесь описание изображения](https://i.stack.imgur.com/raYYH.gif)
Теперь, когда мы решили для бета-угла, мы можем более просто решить для двух других углов:
alpha = atan2(R(3,2)/cos(beta),R(3,3)/cos(beta))
gamma = atan2(R(2,1)/cos(beta),R(1,1)/cos(beta))
Упрощенный и в более приятном формате,
![введите здесь описание изображения](https://i.stack.imgur.com/7Dewd.gif)
![введите здесь описание изображения](https://i.stack.imgur.com/sKUGg.gif)
Приведенный выше метод является довольно надежным способом получения углов Эйлера из вашей матрицы вращения. Функция atan2 действительно делает это намного проще.
Наконец, я отвечу, как решить углы поворота после серии поворотов. Сначала рассмотрим следующие обозначения. Вектор или матрица вращения будут обозначаться следующим образом:
![введите здесь описание изображения](https://i.stack.imgur.com/2q2nn.gif)
Здесь «U» представляет собой универсальную систему координат или глобальную систему координат. «Fn» представляет собой n-ю локальную систему координат, отличную от U. R означает матрицу вращения (это обозначение также можно использовать для однородных преобразований). Верхний индекс с левой стороны всегда будет представлять родительскую систему отсчета матрицы вращения или вектора. Нижний индекс слева указывает на дочернюю систему отсчета. Например, если у меня есть вектор в F1, и я хочу знать, что он эквивалентен в универсальной системе отсчета, я бы выполнил следующую операцию:
![введите здесь описание изображения](https://i.stack.imgur.com/adeoC.gif)
Чтобы получить вектор, разрешенный в универсальной системе отсчета, я просто умножил его на матрицу вращения, которая преобразует вещи из F1 в U. Обратите внимание, как нижние индексы «отменяются» верхним индексом следующего элемента в уравнении. Это умная нотация, чтобы помочь кому-то не запутаться. Если вы помните, особым свойством хорошо обусловленных матриц вращения является то, что обратная матрица является транспонированной матрицей, которая также будет обратным преобразованием, подобным этому:
![введите здесь описание изображения](https://i.stack.imgur.com/qIDXk.gif)
Теперь, когда детали обозначений убраны, мы можем приступить к рассмотрению сложных серий вращений. Допустим, у меня есть "n" количество координатных кадров (другой способ сказать "n" различных поворотов). Чтобы определить вектор в «n-м» кадре универсального кадра, я бы сделал следующее:
![введите здесь описание изображения](https://i.stack.imgur.com/f82nc.gif)
Чтобы определить углы Кардана/Эйлера, возникающие в результате «n» поворотов, вы уже знаете, как разложить матрицу, чтобы получить правильные углы (также известные как инверсная кинематика в некоторых областях), вам просто нужна правильная матрица. В этом примере меня интересует матрица вращения, которая берет объекты в «n-й» системе координат и переводит их в универсальную систему координат U:
![введите здесь описание изображения](https://i.stack.imgur.com/xucbF.gif)
Вот он, я объединил все вращения в интересующее, просто перемножив в правильном порядке. Этот пример был легким. Более сложные случаи возникают, когда кто-то хочет найти систему отсчета одного твердого тела, разрешенную в системе отсчета другого, и единственное, что объединяет два твердых тела, это их измерение в универсальной системе отсчета.
Хочу также отметить, что эти обозначения и метод можно использовать и с однородными преобразованиями, но с некоторыми ключевыми отличиями. Обратной матрицей вращения является ее транспонирование, это неверно для однородных преобразований.
person
willpower2727
schedule
25.08.2016