如何根据三维陀螺数据更新四元数?

use*_*726 8 velocity quaternions orientation gyroscope

我有一个初始四元数,q0.我得到了角速度测量,我整合了速度,所以我得到了50Hz左右的3个角度.如何根据3个角度制作四元数?我不能只做3个四元数,是吗?

所以说清楚.

Q.new = Q.new*Q.update(-α,β,γ)

Q.new表示我在四元数中的当前方向,我想通过乘以Q.update四元数来更新它.如何用角度制作Q.update?

谢谢!

Mic*_*ker 6

我认为你正在整合欧拉角,因为你喜欢让你的生活变得困难.首先,陀螺仪并没有直接融入你的欧拉角.如果你问这个问题,我会假设你也不知道如何从你的陀螺测量中正确找到变化率欧拉角.您需要一个转换矩阵才能工作.我强烈建议您选择Farrell的"辅助导航"副本第57页,他解释了如何计算变换矩阵以将陀螺仪速率更改为欧拉速率.但是,当您可以直接从四元数和您的陀螺仪数据获得变化率四元数时,为什么还要烦恼:

rate of change quaternion  = qdot
quaternion = q
gyro quaternion = w = [0,gyrox,gyroy,gyroz]
Run Code Online (Sandbox Code Playgroud)

所以

qdot = 0.5 *  q ? w
Run Code Online (Sandbox Code Playgroud)

其中Ⓧ代表四元数产品.这里要小心你的框架.陀螺仪表示传感器框架相对于传感器框架中表示的惯性框架的角速率.这意味着您的四元数需要表示从传感器到惯性框架的类似旋转.在这种情况下,它应表示从惯性框架到陀螺仪框架的旋转.如果我们忽略诸如地球自转之类的事情,那么前面的等式是有效的.

注意"辅助导航".在我看来,他对四元数的处理非常混乱.


小智 5

您可以将角速度积分到角位置(如欧拉角),将欧拉角转换为四元数,然后乘以四元数以累积方向.

假设您的输入是由角速度的3D矢量给出的:omega =(alpha,beta,gamma),以度/秒为单位给出.要获得欧拉角度E,以度为单位,将欧米茄乘以时间的变化,我们称之为dt.结果是:

Vector3D omega = new Vector3D(alpha, beta, gamma);
Vector3D E = omega * dt;
Run Code Online (Sandbox Code Playgroud)

您可以通过在上次更新时减去当前时间来获得dt.从陀螺仪数据中获取3D欧拉角后,通过此等式(来自维基百科)将其转换为四元数(w,x,y,z ):

float w = cos(E.x/2) * cos(E.y/2) * cos(E.z/2) + sin(E.x/2) * sin(E.y/2) * sin(E.z/2);
float x = sin(E.x/2) * cos(E.y/2) * cos(E.z/2) - cos(E.x/2) * sin(E.y/2) * sin(E.z/2);
float y = cos(E.x/2) * sin(E.y/2) * cos(E.z/2) + sin(E.x/2) * cos(E.y/2) * sin(E.z/2);
float z = cos(E.x/2) * cos(E.y/2) * sin(E.z/2) - sin(E.x/2) * sin(E.y/2) * cos(E.z/2);

Quaternion q = new Quaternion(w, x, y, z);
Run Code Online (Sandbox Code Playgroud)

只需将上面的两个代码段复制粘贴到Q.update()方法中,然后返回Quaternion.如果您想知道方程式如何工作,只需查看Wiki链接并阅读它.

  • 我很确定这是错误的。第一部分关闭。角速度的积分使您可以改变角位置,即从起始方向旋转一圈。旋转矢量具有分量x,y和z,但很明显,它们不是欧拉角。旋转围绕旋转轴发生,并且同时绕三个轴发生。这里的另一个答案给出了x,y,z与四元数的相当接近的关系。欧拉角将旋转描述为三个旋转的顺序集合,并且该顺序有多种约定。 (2认同)

Fir*_*ger 5

原谅我线程坏死,但答案似乎都很复杂,有些人,例如我,可能更喜欢这种“方便”的方法:

假设ω=(alpha,beta,gamma)是陀螺仪的测得速度矢量。然后我们旅行

theta = ||omega||*dt; //length of velocity vector
Run Code Online (Sandbox Code Playgroud)

周围有许多单位(度数或弧度取决于陀螺仪)

v = omega / ( ||omega|| ); // normalized orientation of velocity vector
Run Code Online (Sandbox Code Playgroud)

因此,我们可以将旋转四元数构造为:

Q.update = (cos(theta/2),v_x * sin(theta/2), v_y * sin(theta/2), v_z * sin(theta/2));
Run Code Online (Sandbox Code Playgroud)

现在剩下的就是将当前旋转旋转Q.update。这很简单:

Q.new = multiply_quaternions(Q.update,Q.new); 
// note that Q.update * Q.new != Q.new * Q.update for quaternions
Run Code Online (Sandbox Code Playgroud)

做完了 四元数很漂亮,不是吗?

关于陀螺仪和四元数的一些幻灯片可能会有用:http : //stanford.edu/class/ee267/lectures/lecture10.pdf

  • 为什么使用 Q.new = multip_quaternions(Q.update,Q.new) 而不是 Q.new =multiply_quaternions(Q.new,Q.update)?在您链接的脚本的第 26 页上,它们乘以右侧的 Q.update。 (2认同)

edu*_*du_ 0

您可以将这些角度转换为单个四元数,然后执行您所描述的操作,或者您可以将它们中的每一个转换为轴角对,然后转换为四元数,然后将三个四元数相乘。请参阅http://en.wikipedia.org/wiki/Conversion_ Between_quaternions_and_Euler_angles和 http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q60了解更多详细信息。