数学
Maxima
概要 †
- 即刻導出できるようにするための資料
- 6パターンある上に不定性があってつらいので.
全部軸が違うよパターン †
- 参考
- 3パターンあるが,順番をZYXだけ解説すればよい.そしてアルファベータガンマだと直感的でないのでx,y,zで代用
- まずmaximaでzyxを計算 (maxima -b rot.maxima)
Z:matrix([cos(z), -sin(z), 0],[sin(z), cos(z), 0], [0, 0, 1]);
Y:matrix([cos(y), 0, sin(y)],[0, 1, 0], [-sin(y), 0, cos(y)]);
X:matrix([1, 0, 0],[0, cos(x), -sin(x)], [0, sin(x), cos(x)]);
Z.Y.X;
trigreduce(ev(Z.Y.X, y = -%pi/2));
trigreduce(ev(Z.Y.X, y = +%pi/2));
readline(?\*standard\-input\*);
-結果
(%i5) Z . Y . X
[ cos(y) cos(z) ]
[ ]
(%o5) Col 1 = [ cos(y) sin(z) ]
[ ]
[ - sin(y) ]
[ sin(x) sin(y) cos(z) - cos(x) sin(z) ]
[ ]
Col 2 = [ sin(x) sin(y) sin(z) + cos(x) cos(z) ]
[ ]
[ sin(x) cos(y) ]
[ sin(x) sin(z) + cos(x) sin(y) cos(z) ]
[ ]
Col 3 = [ cos(x) sin(y) sin(z) - sin(x) cos(z) ]
[ ]
[ cos(x) cos(y) ]
(%i6) trigreduce(ev(Z . Y . X,y = (-%pi)/2))
[ 0 - sin(z + x) - cos(z + x) ]
[ ]
(%o6) [ 0 cos(z + x) - sin(z + x) ]
[ ]
[ 1 0 0 ]
(%i7) trigreduce(ev(Z . Y . X,y = (+%pi)/2))
[ 0 - sin(z - x) cos(z - x) ]
[ ]
(%o7) [ 0 cos(z - x) sin(z - x) ]
[ ]
[ - 1 0 0 ]
- 実際求めてみると,2番目の回転の成分が一項だけのものが出てくる.これを鍵要素と定義する.ここではm20=-sin(y)が鍵要素であり,yが鍵.-pi/2<=y<=+pi/2で動くと仮定
- cos(鍵)が0でないとき(つまりyが-pi/2でもpi/2でもないとき)
- yを普通にasinで解く.y = asin(-m20)
- x, zは,鍵要素を有する行と列を割り算することで,tanが出てくるので普通に解く.x = atan2(m21, m22), z = atan2(m10, m00)
- cos(鍵)が0の時
- m20が1ならy=-pi/2, m20が-1ならy=+pi/2
- 1番目回転-3番目回転が項にまとまってしまい,不定になるので,3番目回転のx=0としてしまう.
- z = atan2(m12, m02)
- 実装
// zyx Euler
double x = 0, y = 0, z = 0; // [rad]
if (abs(_0sR(2, 0) /*zyxで最も単純になる行列要素*/ - 1) > EPS && abs(_0sR(2, 0) + 1) > EPS) {
y = asin(_0sR(2, 0));
x = atan2(_0sR(2, 1), _0sR(2, 2));
z = atan2(_0sR(1, 0), _0sR(0, 0));
} else {
if (_0sR(2, 0) > 0) { // _0sR(2, 0) == 1
y = -M_PI / 2;
} else { // _0sR(2, 0) == -1
y = +M_PI / 2;
}
x = 0; // xzの不定性より
z = atan2(_0sR(1, 2), _0sR(0, 2));
}
cerr << x << " " << y << " " << z << "#euler" << endl;
初めに回転させた軸でもう一回回転させるよパターン †