2

2 つのベクトルのペアがあります (回転の前後)。

回転前: [x1,y1,z1] [x2,y2,z2]

回転後: [x1',y1',z1'] [x2',y2',z2']

この回転を表すクォータニオンを作成するには?

4

5 に答える 5

2

ほとんどの場合、2 つのベクトルを別の 2 つのベクトルに変換する回転はありません。理由を視覚化する簡単な方法を次に示します。回転はベクトル間の角度を変更しません。回転前の 2 つのベクトル間の角度が、回転後の 2 つのベクトル間の角度と異なる場合、基準を満たす回転はありません。

これは、2つのベクトルペアを「ほぼ」回転させる許容誤差のある最適な四元数がある可能性があることを示しています。このような四元数を見つけるには、速度と精度が異なるアルゴリズムが多数あります。速度は重要ですが、精度はそれほど重要ではない Arduino アプリケーション用の高速な C++ アルゴリズムを作成しました。

http://robokitchen.tumblr.com/post/67060392720/finding-a-rotation-quaternion-from-two-pairs-of-vectors

回転前: u0, v0. 回転後: u2、v2。

Quaternion q2 = Quaternion::fromTwoVectors(u0, u2);
Vector v1 = v2.rotate(q2.conjugate());
Vector v0_proj = v0.projectPlane(u0);
Vector v1_proj = v1.projectPlane(u0);
Quaternion q1 = Quaternion::fromTwoVectors(v0_proj, v1_proj);
return (q2 * q1).normalized();

これが自分のアプリケーションの要件を満たしていない場合は、Wabha の問題をググってみてください。

于 2013-11-18T01:24:07.057 に答える
0

この問題に対する成熟した解決策は、Triadと呼ばれます。トライアドは、宇宙船の姿勢決定問題に対する最も初期の最も単純な解決策の 1 つであり、計算上非常に効率的です。

トライアドでは、2 つのベクトルのペア セットを3 つのベクトルのペア セットに置き換えるという考え方があり、余分なベクトルはクロス積で生成されます。ベクトルを正規化することにより、逆行列または SVDを使用せずに回転行列を解くことができます(問題のより一般的なインスタンスで必要になるため、 Wahba の問題を参照してください) 。

完全なアルゴリズムについては、https: //en.wikipedia.org/wiki/Triad_methodを参照してください。

次に、解決された回転行列を Triad から回転クォータニオンに変換できます。

qw = √(1 + m00 + m11 + m22) /2
qx = (m21 - m12)/( 4 *qw)
qy = (m02 - m20)/( 4 *qw)
qz = (m10 - m01)/( 4 *qw)

一般に、四元数への変換をロバストにするために、ここで説明するように行列トレースを調べることを検討する必要があります: http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/

最後に、 QUESTと呼ばれる最適な四元数を直接計算する Triad の代替案を検討してください。

于 2019-05-16T05:18:24.087 に答える
0

v1 から v2 までの四元数を見つければ問題ありません。

最後q = (cos A/2, sin A/2 * axis)の 、A は v1 と v2 の間の角度、軸は標準軸です。

両方を掛ける2 * cos A/2,

次に、 2 * cos A/2 *q = (1+cos A, sin A * axis)

(どこcos A = dot(v1, v2)/|v1|/|v2|axis = cross(v1, v2).normalize() = cross(v1, v2)/|v1|/|v2|/sin A。)

それで2 * cos A/2 *q = (1+dot(v1, v2)/|v1|/|v2|, cross(v1, v2)/|v1|/|v2|)

ついにq = (1+dot(v1, v2)/|v1|/|v2|, cross(v1, v2)/|v1|/|v2|).normalize()

于 2020-04-14T20:57:07.057 に答える