Преобразование угловой скорости в кватернион в 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 для доказательства