用四元数旋转加速度计数据

问题描述 投票:0回答:3

我有一个由加速度计和陀螺仪组成的惯性测量单元。我的目标是获取地球框架内 x 轴的绝对加速度。 由于我的设备是倾斜的,我无法使用原始数据。参考图像,我想得到

x‘
而不是
x

幸运的是,我可以为每次测量检索四元数形式的旋转。不幸的是,我对四元数知之甚少,许多论文对我来说似乎非常先进。 那么我需要如何继续将我的加速度向量像

A = (ax, ay, az)
旋转到全局框架?还是转换四元数并使用欧拉角更直观的方法?

python vector rotation sensors quaternions
3个回答
1
投票

将四元数视为轴角旋转的表示。

如果你的四元数将 x' 旋转到 x,那么这个四元数的倒数将 x 旋转到 x'。

所以如果你已经有了这个四元数,那么将它反转并将它应用于旋转轴 x,这样你就可以获得 x 的未旋转版本,即 x'。

===编辑===

四元数有 4 个值

quat=quaternion(x, y, z, w);

这些值中的 3 个是虚部,与旋转轴相关联。

剩余的值是四元数的实部。

让我假设虚数 3 个值是 x、y、z,(我只是假设,因为它取决于代码中四元数的实现)

然后

x = sin(theta/2.0) * rx;
y = sin(theta/2.0) * ry;
z = sin(theta/2.0) * rz;

其中theta是四元数表示的旋转角度,r=(rx, ry, rz)是旋转轴向量。

w = cos(theta/2.0);

所以,要反转轴角旋转,您要做的是旋转相同的角度,但方向相反。

在这种情况下,您只需反转 x、y、z 的符号,就可以得到四元数的倒数。

至于四元数和向量之间的乘法,你把向量当作一个四元数(它的实部坐标为零)所以基本上你只是将两个四元数相乘。 (使用汉密尔顿产品)。


1
投票

答案取决于您的设备使用什么四元数约定以及您可以使用哪些四元数算术例程进行操作。从这些知识开始:

q = your quaternion
A = your acceleration vector

那么根据惯例,您想要的结果将是这两个计算之一:

Arotated = q * A * inv(q)

Arotated = inv(q) * A * q

其中*理解为四元数乘法,inv(q)为q的倒数,A理解为标量部分为0,向量部分为A的四元数。然后你只需选择 Arotated 的向量部分作为你的答案。

这带来了一个大问题:你知道你的设备的四元数约定吗?它是主动的还是被动的?标量部分是第一个还是最后一个?你有任何描述这个的文件吗?您是否有可用于计算四元数乘法和逆运算的例程,或者您必须从头开始编写这些程序吗?

--编辑--

如果您不知道您的设备使用的四元数约定,那么您将不得不通过反复试验来尝试发现它。也就是说,您必须做出假设并尝试计算以查看哪些结果有意义。例如,假设标量部分是第一个元素,向量部分是最后三个元素。然后运行上面的计算,看看其中一个是否有效。如果不是,则先尝试矢量部分,最后尝试标量部分,然后再次尝试上述计算。

另一种试错技术是围绕已知轴旋转设备,然后查看四元数元素如何响应该旋转而变化。对三个不同的轴执行此操作可以确定四元数中哪些元素是标量与向量。

四元数算术代码,你可以谷歌“四元数乘法”得到算法。例如,维基百科列出了基本公式。四元数乘法在“汉密尔顿乘积”下列出,单位四元数的四元数逆只是对向量部分求反的“共轭”。这些对于你自己编写代码而不求助于图书馆来说是相当微不足道的。


0
投票

您可以查看AHRS工具箱

import numpy as np
from ahrs.filters import EKF
from ahrs.common.orientation import acc2q
ekf = EKF()
num_samples = 1000              # Assuming sensors have 1000 samples each
Q = np.zeros((num_samples, 4))  # Allocate array for quaternions
Q[0] = acc2q(acc_data[0])       # First sample of tri-axial accelerometer
for t in range(1, num_samples):
     Q[t] = ekf.update(Q[t-1], gyr_data[t], acc_data[t])

一旦你得到四元数,你就可以使用前面答案中提到的公式。

© www.soinside.com 2019 - 2024. All rights reserved.