• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:クォータニオンデータの削減)

クォータニオンデータ削減の方法とは?

このQ&Aのポイント
  • 制御系のデータの削減について悩んでいる方へ、クォータニオンデータの削減方法を解説します。データ量が多くなってしまう場合には、同じ値のデータを削除することができます。
  • クォータニオンデータは、回転を表現するために使用されるデータです。例えば、あるオブジェクトが回転する際の姿勢を表すことができます。
  • クォータニオンデータの削減には、微小な変化を無視する方法があります。0.1度以下の変化は削除しても問題ないとされています。具体的には、前後のデータとの差分を計算し、一定の閾値以下であれば削除することができます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

★クォータニオン(quaternion) 先ず単位四元数(unit quaternion)による三次元回転の表現は、  「軸 n = (nx, ny, nz) (n は単位ベクトル)の周りの角度θの回転」  → q = (x, y, z; w) = (n sin(θ/2); cos(θ/2))     = (nx sin(θ/2), ny sin(θ/2), nz sin(θ/2); cos(θ/2)) になります。従って、  sin(θ/2) = √(x²+y²+z²), cos(θ/2) = w なので (例えばC言語なら)  double theta = 2.0*atan2(sqrt(x*x+y*y+z*z), w); /* 式(※1)とする */ などとして求めるのが良いでしょう。 ★エントリーの削除 各エントリーは以下のどちらを表しているのでしょうか? a. おもちゃみたいののモデルの姿勢 (モデルを定義した時の基準角度からの回転量) b. おもちゃみたいのの前回からの回転量 (つまり、直前のエントリーでの姿勢からの回転量) a の場合: 或るエントリ q1 := (x1 y1 z1 w1) → 次のエントリ q2 := (x2 y2 z2; w2) の回転(角度差)は、  q = q2・q1⁻¹, 但し q2⁻¹ = (-x2 -y2 -z2; w2), ・は四元数の積 で与えられます。上式の q を計算して、式(※1)に代入すれば回転量が分かります。 b の場合:  b. であれば 回答No.1 の方の仰る通り、エントリーの削除には慎重にならなければなりません。例えば、0.1度のエントリーが合計で1000回削除された場合、累積で100度の回転が失われる事になり、最終的な結果に影響をおよぼす可能性があります。この場合には、削除した分の回転を次のエントリーに乗算するなどの配慮が必要になるかと思います。取り敢えず配慮の事を忘れれば、各エントリーを q として式(※1)に代入すれば良いです。

参考URL:
http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
TeijigoTeatime
質問者

お礼

早々のご返答ありがとうございます。 エントリーの削除はaです。 削除自体はいい感じにできていますが、理解を深めるためにまだ仕事には反映はしていません。 とても詳しい説明をありがとうございました。

その他の回答 (1)

  • trytobe
  • ベストアンサー率36% (3457/9591)
回答No.1

結論として、「1つ前の状態から、どのように動かすか」というステップを1コマずつ記述しているので、1つでも省略すると、後は全部その影響を受けた状態のまま、そこを基点に動いてしまいます。 そのため、データの精度はそのままに、あまり前回と差が無いという場合は、「前の4元数要素との差だけにして、有効桁数が少なく済むようにする」というのが現実的で、実行速度も単なる加減算で済んでロスが少ないと思います。 2次元平面図形を2次元平面内で移動・回転させるのを行列で記述できるのと同じで、 3次元立体模型を3次元空間内で移動・回転させるのを四元数で記述しているだけなので。

TeijigoTeatime
質問者

お礼

早々のご返答ありがとうございます。 ご指摘の方法では確かに動いてしまいますが、質問は最初の状態から変化でした。 質問の内容が説明不足で申し訳ありません。ただご指摘のようなことも今後出てくると思いますので肝に銘じたいと思います。

関連するQ&A