ENU -> 使用四元数的NED帧转换



我在寻找什么:

将向量(X,Y,Z)从ENU旋转到NED的统一方法,反之亦然 将四元数从ENU旋转到NED的统一方法相同,反之亦然


如果可以在python中给出解决方案,将不胜感激,但这对我来说更多的是关于专业知识。

我想我已经知道的

如果我在 ENU 中有这个向量

v_xyz_ENU = [5,2,1] 

翻译为

v_xyz_NED = [2,5,-1]

ENU <-> NED
X, Y, Z <-> Y, X,-Z

如果我在包含 RPY 的向量上使用这种技术(如果这是正确的表达方式),我会感到困惑。

v_rpy_ENU = [0,0,90] 

翻译为

v_rpy_NED = [0,0,-90]

当我写下计算时,我更喜欢使用以度
为单位的角度

这种旋转似乎不正确,因为我知道结果应该是 0°
ENU 偏航 0° 应该是 NED 偏航 -90°ENU 偏航 90° 应该是 NED 偏航 0°ENU 偏航 180° 应该是 NED 偏航 -90°/270°


ENU 偏航 -90° 应该是 NED 偏航 180°

到目前为止我尝试过什么

我确实试图把我的头包裹在四元数上。我在网上其他地方找到的关于使用四元数旋转的解释和例子似乎很简单,但我似乎无法得出我理解的结果。

现在,我忘记了RPY,开始使用四元数。 我在 ENU 中有这个四元数,代表围绕 Z
的相同 90° 旋转

Q_ENU = pq.Quaternion(axis=[0,0,1], degrees=90)

有人声称旋转可以类似于矢量旋转,但保持w分量不变。所以我尝试:

Q_NED = pq.Quaternion(Q_ENU.q[0], Q_ENU.q[2], Q_ENU.q[1], -Q_ENU.q[3])

Quaternion.q 的数据顺序 = [w,x,y,z]

现在我验证一旦我将Q_NED转换为 RPY 角度,我是否会在 NED 中得到 0° 的偏航,但结果似乎是:

Q_ENU: 0.707 +0.000i +0.000j +0.707k
Q_NED: 0.707 +0.000i +0.000j -0.707k
rpy_NED: [0.0, 0.0, -89.99999999999999]
I expect rpy_NED [0.0, 0.0, 0.0]

现在,在我开始写我尝试过的所有其他可能性之前,我认为不这样做可以节省我自己和你很多时间。我真的很感激关于如何做到这一点的一些解释,或者至少朝着正确的方向推动。

-T

前奏曲

欢迎来到四元数的神奇世界!我理解你对试图学习四元数如何工作的沮丧;请放心,您并不孤单。不幸的是,存在各种四元数的"风格",从如何格式化/解释它们,到四元数乘法的工作原理,以及四元数乘法代表什么 - 不必要地使已经复杂的主题复杂化。

"四元数来自汉密尔顿,在他真正出色的工作完成后,虽然精美巧妙,但对于那些以任何方式接触它们的人来说,四元数是一种不混合的邪恶。">

什么是四元数?

许多定义分散在互联网上,但从本质上讲,四元数是 4-D 空间中的向量。一个常见的类比是将复数域扩展为具有 1 个"实"分量和 3 个"虚"分量。下面是一个4x1的四元数向量示例,其中第一个元素是"实"分量,r,最后三个元素是"虚"分量,分别是沿ijk虚轴的"虚"分量xyz[1,2]。

hamilton_quaternion = np.array([
[r],
[x],  # i
[y],  # j
[z]   # k
])

这个类比在三维空间中的旋转矢量的上下文中很有用,或者跨越两个不同的参考系,并且是工程界的主要类比。然而,出于后面解释的原因,纯数学家有时会厌恶这种用法。

并非所有四元数的构造都相同

上面提供的样本四元数被称为汉密尔顿约定,但存在第二个约定:JPL约定[1]。使用JPL约定,前三个元素分别是沿ijk虚轴的"虚"xyz分量,最后一个元素是"实"分量r

jpl_quaternion = np.array([
[x],  # i
[y],  # j
[z],  # k
[r]
])

注意:此后使用的所有四元数都将使用汉密尔顿约定。

并非所有四元数的乘法都相同

四元数乘法,在此解释中表示为⊗,遵循一组严格的规则。一个人不会像线性代数那样简单地将两个四元数交叉相乘。每个分量的虚轴对于确定两个四元数的真实乘积至关重要。

右手乘法将跨虚轴的乘法定义为:

i**2 = j**2 = k**2 = i*j*k = -1
i*j = k
j*k = i
k*i = j
j*i = -k
k*j = -i
i*k = -j

而左手乘法将跨虚轴的乘法定义为:

i**2 = j**2 = k**2 = i*j*k = -1
i*j = -k
j*k = -i
k*i = -j
j*i = k
k*j = i
i*k = j

有关更多详细信息和说明,请参阅 [1] 的第 1.2.2 节。

并非所有四元数都代表同一件事

在通用工程和计算机科学的背景下,四元数用于表示向量从一个参考系到另一个参考系的旋转。但是,这种旋转可以表示矢量的旋转...

  • 本地帧到全局帧,或
  • 全局帧到 *本地

四元数如何旋转矢量?

p'从表示两个参考系q和原始向量之间旋转的四元数获得旋转向量的"形式"方法p如下:

(参考)
Equation
p = [0; p_x; p_y; p_z]: right;">-
q = [q_r; q_x; q_y; q_z]: right;">(1)
q* = [q_r; -q_x; -q_y; -q_z]右;">(2)
p' = q ⊗ p ⊗ q*: right;">(3)

相关内容

  • 没有找到相关文章

最新更新