2017-08-28 2 views
1

同じタイプの2つのIMUを使用しています(BHI160、つまり方位は北に相対し、北にはIMUのローカルY軸は北方向に向いています) 2つのオブジェクトを平行に配置すると、両方のIMUのz軸が上向きになりますが、1つのIMUがz軸を中心に180度回転していくという難しさがあります。IMU方位を整列させてから相対回転を得る

さて、私は正しくここに数学を理解していれば、私はIMUから受信四元データが北方向に半角回転相対的である、north_dirIMU_y_axisはグローバル空間における3次元のベクトルであることと(q * north_dir * q_inv = IMU_y_axisようにまたはこの計算のための純粋な四元数)。

IMUの回転により、両方のペンが同じ方向を指しているときは、q_2 = q_rot_z * q_1というように2番目のペンの向きを計算できるはずです。q_rot_zは、私がペンを北に向けると、q_rot_z * north_dir * q_rot_z_inv

と計算することによって、ペン2のy軸のグローバル方向(すなわち、ペン1のy軸がz軸の周りに180度回転した)を得るという直感に従う。

ペン先の相対的な回転を知りたい場合(例えば、最初のペンの先端から2番目のペンの先端に移動する必要がある)、q_r = q_2 * q_rot_z_inv * q_1_invを計算する必要がありますを計算することによってチップ1からチップ2に到達する?あるいは、この場合、z軸の周りの "先行の"回転は重要ではありません。私はいつものようにq_r = q_2 * q_1_invを計算する必要がありますか?

編集: これは基本的にthis questionの拡張であるが、私は同じ答えはまた、私の場合、または既知の相対IMUの回転が私の場合にも

答えて

2
含まれる必要があるかどうかを適用するかどうかを知りたいです

この手順をステップごとに進んでみましょう。グローバル座標系Gが北方向に整列しています。どのように整列されているか、まったく整列しているかどうかは問題ではありません。

次に、それぞれの座標系がI1I2のIMUにする必要があります。座標系は、グローバルシステムからローカルシステムへの回転として与えられます。以下では、そのために表記R[G->I1]を使用します。これは、GからI1へのローテーションを表します。 Gのベクトルをこの回転で変換すると、座標系Gで表現されたI1に同じベクトルが得られます。ベクトルvの変換をTT ° vで表すとしましょう。次の図は、このことを示しています。この図では

Transform

は、私が翻訳を追加した変換(四元はもちろん表すことができません)。これは、ポイントを明確にするためのものです。ベクトルvです。同じベクトルは座標系GまたはIのいずれかに置くことができます。そして、形質転換されたベクターR[G->I] ° vGvIを表す。これが実際にあなたがIMUから受ける回転であることを確認してください。また、逆変換を得ることも可能です(これはシステム変換ビューですが、モデル変換ビューを使用します)。これは、以下の派生物ではほとんど変わりません。したがって、私はこの最初の仮定に固執するでしょう。逆数が必要な場合は、それに応じて数式を調整してください。

すでに知っているように、操作R ° vは、純粋な四元数にvを回しR * v * conjugate(R)を計算し、そして再びベクトルにそれを回す(またはプロセスを通じて、純粋な四元数で動作)によって行うことができます。

ペンが出現しました。ペンには固有の座標系があり、これは任意に定義できます。あなたの説明から、ペンのローカルy軸が先端に向くように定義したいかのように思えます。したがって、回転ごとにR[I1->P1]R[I2->P2]のペンごとに追加の座標系があります。我々はローカル座標系を整列さ(R[I1->P1]がアイデンティティであることを知って、あなたはペンのローカル座標系を定義したように

R[G->P1] = R[G->I1] * R[I1->P1] 
R[G->P2] = R[G->I2] * R[I2->P2] 

:私たちは、グローバルな姿勢を(*は、四元数の乗算である)を見つけるために回転を連結することができますIMUの場合)、R[I2->P2]はz軸の周りに180°の回転です。 Z軸回転はIMUのローカル座標系(それが右側に乗算される)で行うことが

R[G->P1] = R[G->I1] 
R[G->P2] = R[G->I2] * RotateZ(180°) 

注:だから、これはに簡素化されます。私はあなたがなぜそれが90°であるべきだと思うのか分かりません。それは実際に180°の回転です。

ヒントの相対的な回転を見たい場合は、最初に回転を表現する座標系を定義する必要があります。 P1という座標系で回転を表現したいとしましょう。

R[P1->P2] = conjugate(R[G->I1]) * R[G->I2] * RotateZ(180°) 

:その後、何を検索することはあなたが上記の定義を接続した場合、あなたはなるだろう。これは

R[P1->P2] = conjugate(R[G->P1]) * R[G->P2] 

に解決し、そのような

R[G->P1] * R[P1->P2] = R[G->P2] 

ことを、回転R[P1->P2]です以上です。

多少異なるものがほしいと思うかもしれません。それで私はそれを細かく説明したので、それに応じて計算を変更することができます。

+0

うわー、それは一つの精巧な答えです - ありがとう!私の90°/ 180°回転に関する混乱について:四元数を使って特定の軸の周りでベクトルvを180度回転させたいと思うなら、四元数は角度として90°を使って構築する必要があります'q * v * inv(q)'は基本的にこの角度を2度適用する(180度の回転をもたらす)からです。技術的には、q1 * q_rotというプロダクトが暗黙のうちに再び回転するために使用されると思ったので、これは直接的な四元数の乗算と一貫していないのです。 y軸。 – Sty

+0

角度「a」の回転を表す四元数は、実際には、その中に「cos(a/2)」と「sin(a/2)」という用語を持っています。それにもかかわらず、それはまだ 'a'(ちょうど異なってコード化されている)の回転です。このエンコーディングは、 '°'演算子がクォータニオンを2回使用する理由の一部です。最後に、(単位)四元数は、ある軸の周りのある角度の回転を表します。内部的には、別の方法でエンコードされます。しかし、これは、シンプルなライブラリがサポートしていないクォータニオンと関連する数学をやりたいのでなければ問題ではありません。 –

+0

ああ、私の混乱は主に用語にありますか?つまり、RotateZ(180°)では、角度と軸(この例では180°とz軸)を指定することで得られる四元数を参照しますが、内部的にはquaternionの計算になります異なるコンポーネントの90°の角度の 'cos'と' sin'は正しいのですか? – Sty

関連する問題