OpenCV で次の式を使用してフレームごとにクォータニオンを更新するために、クォータニオンとして表される角速度が必要です。
q(k)=q(k-1)*qwt;
私の角速度は
Mat w; //1x3
角度の四元数形式を取得したい
Mat qwt; //1x4
これに関する情報が見つかりませんでした。アイデアはありますか?
OpenCV で次の式を使用してフレームごとにクォータニオンを更新するために、クォータニオンとして表される角速度が必要です。
q(k)=q(k-1)*qwt;
私の角速度は
Mat w; //1x3
角度の四元数形式を取得したい
Mat qwt; //1x4
これに関する情報が見つかりませんでした。アイデアはありますか?
If I understand properly you want to pass from this Axis Angle form to a quaternion.
As shown in the link, first you need to calculate the module of the angular velocity (multiplied by delta(t) between frames), and then apply the formulas.
A sample function for this would be
// w is equal to angular_velocity*time_between_frames
void quatFromAngularVelocity(Mat& qwt, const Mat& w)
{
const float x = w.at<float>(0);
const float y = w.at<float>(1);
const float z = w.at<float>(2);
const float angle = sqrt(x*x + y*y + z*z); // module of angular velocity
if (angle > 0.0) // the formulas from the link
{
qwt.at<float>(0) = x*sin(angle/2.0f)/angle;
qwt.at<float>(1) = y*sin(angle/2.0f)/angle;
qwt.at<float>(2) = z*sin(angle/2.0f)/angle;
qwt.at<float>(3) = cos(angle/2.0f);
} else // to avoid illegal expressions
{
qwt.at<float>(0) = qwt.at<float>(0)=qwt.at<float>(0)=0.0f;
qwt.at<float>(3) = 1.0f;
}
}
クォータニオン、3D 空間などに関するほぼすべての変換は、このWeb サイトに集められています。
四元数の時間導関数も見つかります。
四元数の物理的意味の説明は役に立つと思います。これは、軸角度として見ることができます。
a = angle of rotation
x,y,z = axis of rotation.
次に、変換は次を使用します。
q = cos(a/2) + i ( x * sin(a/2)) + j (y * sin(a/2)) + k ( z * sin(a/2))
ここまで徹底解説。
これが明確にするのに役立つことを願っています。
これに合わせて、cos と sin 関数を取り除くためのちょっとしたトリックが 1 つあります。四元数 q(t) の時間導関数は次のとおりです。
dq(t)/dt = 0.5 * x(t) * q(t)
ここで、角速度が {w0, w1, w2} の場合、x(t) は {0, w0, w1, w2} の四元数です。証拠については、David H Eberly の本のセクション 10.5 を参照してください。