Преобразование Эйлер к матрице и матрице Эйлеру

Я пытаюсь преобразовать 3D вращение, описанное с точки зрения эйлеровых углов в матрицу и затем обратно, с помощью.NET/C#. Мои конвенции:

  • предназначенная для левой руки система (x право, y вершина, z вперед)
  • порядок вращений: направляясь вокруг y, сделайте подачу вокруг x, банка вокруг z
  • вращения являются положительным использованием правила левой руки (ползунок, указывающий +infinity)

Моя пробная версия:

Euler к матрице (я удалил x, y, z часть перевода для упрощения),

Matrix3D matrix = new Matrix3D() {
    M11 =   cosH * cosB - sinH * sinP * sinB,
    M12 = - sinB * cosP,
    M13 =   sinH * cosB + cosH * sinP * sinB,
    M21 =   cosH * sinB + sinH * sinP * cosB,
    M22 =   cosB * cosP,
    M23 =   sinB * sinH - cosH * sinP * cosB,
    M31 = - sinH * cosP,
    M32 = - sinP,
    M33 =   cosH * cosP,
};

Матрица Euler

const double RD_TO_DEG = 180 / Math.PI;            
double h, p, b; // angles in degrees

// extract pitch
double sinP = -matrix.M23;            
if (sinP >= 1) {
    p = 90; }       // pole
else if (sinP <= -1) {
    p = -90; } // pole
else {
    p = Math.Asin(sinP) * RD_TO_DEG; }             

// extract heading and bank
if (sinP < -0.9999 || sinP > 0.9999) { // account for small angle errors
    h = Math.Atan2(-matrix.M31, matrix.M11) * RD_TO_DEG;
    b = 0; }
else {
    h = Math.Atan2(matrix.M13, matrix.M33) * RD_TO_DEG;
    b = Math.Atan2(matrix.M21, matrix.M22) * RD_TO_DEG; }

Это должно быть неправильно. Если я беру 3 угла, преобразовываю их в матрицу и преобразовываю матрицу назад в углы, результат, если отличающийся, чем начальные значения.

Я просмотрел несколько сайтов с различными формулами, начиная с euclideanspace.com, но я теперь полностью потерян и не могу найти правильные вычисления. Я' ценю немного справки. На борту существует ли математик?

8
задан Mike 5 April 2014 в 17:06
поделиться

1 ответ

Во-первых, следует:

sinP = -matrix.M32

EDIT: Полное решение следует

Моя производная:

Rx(P)=| 1      0       0 |
      | 0  cos P  -sin P |
      | 0  sin P   cos P |

Ry(H)=|  cos H  0  sin H |
      |      0  1      0 |
      | -sin H  0  cos H |

Rz(B)=| cos B  -sin B  0 |
      | sin B   cos B  0 |
      |     0       0  1 |

Умноженная на ваш заказ:

R = Ry(H)*Rx(P)*Rz(B)
  = | cos H*cos B+sin H*sin P*sin B  cos B*sin H*sin P-sin B*cos H  cos P*sin H |
    |                   cos P*sin B                    cos B*cos P       -sin P |
    | sin B*cos H*sin P-sin H*cos B  sin H*sin B+cos B*cos H*sin P  cos P*cos H |

Что дает обратные производные:

tan B = M12/M22

sin P = -M32

tan H = M31/M33

.
11
ответ дан 5 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

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