各期間のジャイロスコープと加速度計のデータがありますT
。
C ++を使用して、オブジェクトの回転を毎回計算したいと思います。オブジェクトはその軸を中心に回転できます。システムの回転を(オイラー角ではなく)四元数で表すと便利だと読みました。
角速度(ジャイロスコープから)からクォータニオン表現に変換するにはどうすればよいですか?そのためには、数値解法を使って微分方程式を解く必要があると思います。
各期間のジャイロスコープと加速度計のデータがありますT
。
C ++を使用して、オブジェクトの回転を毎回計算したいと思います。オブジェクトはその軸を中心に回転できます。システムの回転を(オイラー角ではなく)四元数で表すと便利だと読みました。
角速度(ジャイロスコープから)からクォータニオン表現に変換するにはどうすればよいですか?そのためには、数値解法を使って微分方程式を解く必要があると思います。
探している言語がわかりませんが、C ++ Boostライブラリには機能するQuaternionクラス(quaternion.hpp)があります。このライブラリを使用して、結果を計算したり、任意のベクトルを中心に点を回転させたりするための単純な回転クラスをほとんど問題なく作成しました。
更新:あなたのコメントに基づいて、一定の角速度または角加速度のいずれかが与えられた場合、特定の時間における角度位置を把握するために必ずしもクォータニオンライブラリを使用する必要はないと思います。あなたがする必要があるのは、その角度が何であるかを理解し、次にクォータニオンクラスを使用して、計算した角度だけ回転ベクトルを中心に回転したときのベクトルの位置を計算することです。
一定の角加速度α、初期角速度ω(t 0 )、および範囲[ 0、2π )の初期角位置θ (t0)が与えられると、ある時点t> t 0、θ(t)での角位置が与えられます。に:
θ(t)= [θ(t0 ) + ω(t0 )*(tt 0 ) + α*(tt0 ) 2/2 ] mod2π
ここで、mod2π演算は、n2πを減算するときの単純な残差です。ここで、nは、残差が[0,2π)の範囲内にあることを確認するために必要な整数です。一定の角速度(つまりα= 0)の場合、最後の項は脱落します。
とは言うものの、あなたが本当にする必要があるのは、一定の加速度の下で一定の時間間隔にわたって角度を追跡し(または一定でない場合はその時間の平均加速度を決定し)、角度を更新することです。次に、回転ベクトルを中心に得られた回転を、回転を累積するために使用しているクォータニオンに適用します。これは、C++クラスとして簡単に実装できます。
それでも、これを行うためのオープンソースツールを探しているのであれば、ゲーム物理モデリングライブラリのどれでも十分すぎると思います。いくつかのオープンソースは、BulletとOpenDynamicsLibraryです。
スラープについて話しますか?(球面線形補間)
JonathanBlowの記事「Slerpを理解してから使用しない」を参照してください。C++のソースの例があります。
http://number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It/
ジャイロスコープからの各サンプルは、小さな回転を表しています。
rot_x = angV_x * timestep
rot_y = angV_y * timestep
rot_z = angV_z * timestep
結果として生じる回転が小さい場合は、回転角の半分を取ることで、これを直接クォータニオンに変換できます。
// for small rotations, quick & dirty quaternion is sufficient
// (note: all angles *must* be in radians!)
float k = timestep * 0.5;
quaternion raw_delta_Q(1.0, angV_x*k, angV_y*k, angV_z*k); // unnormalized!
// combine rotation for current timestep with orientation state
estimated_orient_Q *= raw_delta_Q; // multiply by unnormalized delta
estimated_orient_Q *= 1 / norm(estimated_orient_Q); // then renormalize it!
回転が数度よりも大きい場合、または最大の精度が必要な場合は、クォータニオンを取得する方法に細心の注意を払う必要があります。
編集:上記のコードは、*=がクォータニオンと実数スカラーの両方によるクォータニオン乗算を行うように定義されていることを前提としていることに注意してください。これらの関数のいくつかの形式(および明らかなコンストラクター)は、妥当なクォータニオンライブラリに存在します。