Задать вопрос

Как найти угл и вектор из матрицы поворота?

Есть формула из книги "Основы управления манипуляционными роботами" С.Л. Зенкевич, А.С. Ющенко 2004г.
4d46f6cec44b4ebaba30690b97e31a71.gif
.
91bb7baf995a455b931b750561138695.gif
.
5a6b3cfc2eff48288811fdf428093b33.gif
.
9d9c8b3b0d2948519baaedf9bbaa08d0.gif
Наговнокодил, так чтобы сходилось с формулами:
<p id="log"></p>
"use strict";
    // ф-я вывода item(string) внутри тега p с id "log"
    var log = function(item) {
      var p = document.getElementById("log");
      Array.isArray(item) ? item.forEach(function(current, i, array) {
        log("[" + current + "]")
      }) : p.innerHTML += item + "<br />"
    };
    var calcAngleAxisFromRotateMatrix = function(rotateMatrix) {
      var R = rotateMatrix,
        cosA = (1 / 2) * (math.subtract((R[0][0] + R[1][1] + R[2][2]), 1)),
        angleRad = math.acos(cosA),
        sinA = math.sin(angleRad),
        sinAx2 = 2 * sinA,
        axis = [(R[2][1] - R[1][2]) / sinAx2, (R[0][2] - R[2][0]) / sinAx2, (R[1][0] - R[0][1]) / sinAx2];
      return [angleRad, axis]
    };
    var AngleAndAxis = calcAngleAxisFromRotateMatrix([
      [1, 0, 0],
      [0, -1, 0],
      [0, 0, 1]
    ]);
    log(AngleAndAxis[0] * 180 / Math.PI); // angle
    log(AngleAndAxis[1]); // angle

Вход - матрица - аргумент функции calcAngleAxisFromRotateMatrix
https://jsfiddle.net/Quncore/1kfsL0b5/
Для матрицы поворота вокруг оси X и Z на 90 и 180 градусов соответственно, определяется угол, но не ось. Для угла 30 градусов в знаменателе получается 0, соответственно вычисления не идут.
Матрицы для теста использовались следующие:
R90x
[1,0,0]
[0,0,-1]
[0,1,0]
R30y
[1,0,0]
[0,1,0]
[0,0,1]
R180z
[-1,0,0]
[0,-1,0]
[0,0,1]
  • Вопрос задан
  • 246 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
mudrenokanton
@mudrenokanton
frontend dev
Матрицы поворота:
----------- по Z
cos(a) sin(a) 0 0
-sin(a) cos(a) 0 0
0 0 1 0
0 0 0 1
----------- по X
1 0 0 0
0 cos(a) sin(a) 0
0 -sin(a) cos(a) 0
0 0 0 1
----------- по Y
cos(a) 0 -sin(a) 0
0 1 0 0
sin(a) 0 cos(a) 0
0 0 0 1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы