在OpenCV中将角速度转换为四元数

在OpenCV中将角速度转换为四元数,opencv,quaternions,Opencv,Quaternions,我需要用四元数表示的角速度,以便在OpenCV中使用以下表达式更新每一帧的四元数: q(k)=q(k-1)*qwt; 我的角速度是 Mat w; //1x3 我想得到角的四元数形式 Mat qwt; //1x4 我找不到关于这方面的信息,有什么想法吗?如果我理解正确,你想从这里传下去 如链接中所示,首先需要计算角速度的模(乘以帧之间的增量(t)),然后应用公式 这方面的一个示例函数是 //w等于两帧之间的角速度*时间 空四角速度(垫和qwt、常数垫和w) { 常数浮点x=w.at(0

我需要用四元数表示的角速度,以便在OpenCV中使用以下表达式更新每一帧的四元数:

q(k)=q(k-1)*qwt;
我的角速度是

Mat w;  //1x3
我想得到角的四元数形式

Mat qwt;   //1x4

我找不到关于这方面的信息,有什么想法吗?

如果我理解正确,你想从这里传下去

如链接中所示,首先需要计算角速度的模(乘以帧之间的增量(t)),然后应用公式

这方面的一个示例函数是

//w等于两帧之间的角速度*时间
空四角速度(垫和qwt、常数垫和w)
{
常数浮点x=w.at(0);
常数浮点数y=w.at(1);
常数浮点数z=w.at(2);
常数浮点角=sqrt(x*x+y*y+z*z);//角速度模
if(angle>0.0)//链接中的公式
{
(0)处的质量=x*sin(角度/2.0f)/角度;
(1)处的质量=y*sin(角度/2.0f)/角度;
(2)处的质量=z*sin(角/2.0f)/角;
(3)处的重量=cos(角/2.0f);
}else//以避免非法表达式
{
在(0)处的质量分数=在(0)处的质量分数=在(0)处的质量分数=0.0f;
(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}的四元数。请参见David H Ebery的书第10.5节,以获取证据

四元数表示旋转或方向。角速度是它的导数。现在还不清楚你想做什么。我猜他想把角速度表示成一个四元数来更新四元数的值,这个乘积是:q(k)=q(k-1)*qwt是qwt,角速度表示成四元数,就是这样!我想用角速度来更新每一帧的四元数值。好吧,如果你用角速度,每一帧都要小心,因为w应该乘以帧间的时间。这可能是你在下面这行中犯了错误吗<代码>质量分数(0)=质量分数(0)=质量分数(0)=0.0f你一遍又一遍地设置相同的组件。你的四元数是{x,y,z,w}还是{w,x,y,z}?