Преобразование угловой скорости в кватернион в OpenCV

мне нужна угловая скорость, выраженная как кватернион для обновления кватерниона каждый кадр со следующим выражением в OpenCV:

q(k)=q(k-1)*qwt;

моя угловая скорость

Mat w;  //1x3

Я хотел бы получить кватернионную форму углов

Mat qwt;   //1x4

Я не мог найти информацию об этом, какие-либо идеи?

3 ответов


Если я правильно понимаю, вы хотите перейти от этого форма угла оси к кватерниону.

как показано в ссылке, сначала нужно вычислить модуль угловой скорости (умноженный на дельту (t) между кадрами), а затем применить формулы.

пример функции, для этого будет

// 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-пространства и т. д. собрано в этом сайт.

вы также найдете производные времени для кватернионов.

Я нахожу полезным объяснение физического значения кватерниона, которое можно рассматривать как угол оси, где

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. Производная по времени кватерниона q (t) равна:

dq(t)/dt = 0.5 * x(t) * q (t)

где, если угловая скорость {w0, w1, w2}, то x(t) является кватернионом {0, w0, w1, w2}. В разделе Давида ч. Eberly книгу 10.5 для доказательства