我需要将一个四元数从右手坐标系转换为左手坐标系:
x = 从左到右
y = 从前到后
z = 从上到下
转换后的左手坐标系为:
x = 从左到右
y = 从上到下
z = 从前到后
应该如何进行此操作?
我需要将一个四元数从右手坐标系转换为左手坐标系:
x = 从左到右
y = 从前到后
z = 从上到下
转换后的左手坐标系为:
x = 从左到右
y = 从上到下
z = 从前到后
应该如何进行此操作?
我不认为这些答案中有任何一个是正确的。
安德烈斯是正确的,四元数没有手性(*)。手性(或者我所说的“轴约定”)是人类应用的一种属性;它是我们将“前进,向右,向上”的概念映射到X、Y、Z轴的方式。
这些事情是真的:
mat_to_quat()
例程可能不会崩溃,但它不会给出正确答案(在这样的意义下,quat_to_mat(mat_to_quat(M)) == M
不成立)。要更改四元数的基,比如从ROS(右手)到Unity(左手),我们可以使用.的方法。
mat3x3 ros_to_unity = /* construct this by hand */;
mat3x3 unity_to_ros = ros_to_unity.inverse();
quat q_ros = ...;
mat3x3 m_unity = ros_to_unity * mat3x3(q_ros) * unity_to_ros ;
quat q_unity = mat_to_quat(m_unity);
第1至4行只是https://dev59.com/R3M_5IYBdhLWcg3wt1g0#39519079中的方法:“如何对矩阵执行基变换?”
第5行很有趣。我们知道mat_to_quat()
仅适用于纯旋转矩阵。我们怎么知道m_unity
是一个纯旋转矩阵?它很可能不是,因为unity_to_ros
和ros_to_unity
都具有行列式-1(这是由于左右手性切换的结果)。
模糊的答案是手性会切换两次,因此结果没有手性切换。更深入的答案与相似变换保留运算符的某些方面有关,但我没有足够的数学来证明。
请注意,这将给出一个正确的结果,但如果unity_to_ros
是一个简单的矩阵(例如,只有轴交换),那么您可能可以更快地完成它。但是,您应该通过扩展此处所做的数学来导出更快的方法。
(*) 实际上,存在Hamilton和JPL四元数之间的区别;但是每个人都使用Hamilton,所以没有必要用它来混淆问题。
我认为解决方案是:
Given: Right Hand: {w,x,y,z}
Convert: Left Hand: {-w,z,y,x}
new Quaternion(rhQz,rhQy,rhQx,-rhQw)
一旦你这样做了,你就不再有一个四元数了,即通常的乘法规则将不起作用。如果你交换j和k(在右手坐标系中是y和z),那么等式i^2 = j^2 = k^2 = ijk = -1将不再成立。
我知道这个问题很老了,但下面的方法经过测试可行。 我使用pyquaternion来操作四元数。
从右手坐标系转换到左手坐标系。 找到右手四元数的轴和角度。 然后将轴转换为左手坐标系。 取负右手角度以获得左手角度。 使用左手坐标系和左手角度构造四元数。