我需要表示为四元数的角速度,以便在OpenCV中使用以下表达式更新每一帧的四元数:
q(k)=q(k-1)*qwt;
我的角速度是
Mat w; //1x3
我想获得角度的四元数形式
Mat qwt; //1x4
我找不到有关此信息的任何想法?
答案 0 :(得分:6)
如果我理解正确,您希望传递此Axis Angle form to a quaternion。
如链接所示,首先需要计算角速度的模块(乘以帧之间的delta(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;
}
}
答案 1 :(得分:4)
几乎所有关于四元数,3D空间等的转换都是在website收集的。
您还可以找到四元数的时间导数。
我发现四元数的物理意义的解释是有用的,可以看作是一个轴角
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))
完全解释了Here。
希望这有助于使其更清晰。
答案 2 :(得分:1)
与此相关的一个小技巧,摆脱那些cos和sin函数。四元数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节