vector - 将单位向量转换为四元数

标签 vector axis angle quaternions

所以我对四元数很陌生,但我了解如何用它们操作东西的基础知识。我目前正在尝试做的是将已知的四元数与空间中的两个绝对点进行比较。我希望我能做的只是将这些点转换为第二个四元数,让我可以轻松地比较两者。

到目前为止我所做的是将两个点变成一个单位向量。从那里我希望我可以直接将 i j k 插入到标量为零的四元数的虚部中。从那里我可以将一个四元数乘以另一个的共轭,得到第三个四元数。这第三个四元数可以转换成 Axis 角,给出原始两个四元数相差的度数。

这个思维过程正确吗?所以它应该只是 [0 i j k ]。之后我可能需要对四元数进行归一化,但我不确定。

我有一种不好的感觉,它不是从向量到四元数的直接映射。我尝试将单位向量转换为 Axis 角,但我不确定这是否可行,因为我不知道输入什么角度。

最佳答案

书写方式

四元数定义在以 {1, i, j, k} 为底的四空间中。汉密尔顿在都柏林布鲁厄姆大桥的石头上刻下了著名的基本关系:

i2 = j2 = k2 = i j k = -1。

有许多等效的四元数参数化,但在这里我将使用 {scalar, 矢量 } 形式。

1.) A = {a0, } 和 B = {b0, b },其中A和B是四元数,a0和b0是标量, b 是三向量。

2.) X = { 0, x } 是一个向量四元数。

3.) (非交换)四元数积直接从上面 i、j 和 k 的性质推导出来,A⊗B = {a0 b0 - . b , a0 b + b0 + x b }

4.) 四元数共轭是 A* = {a0, - }

5.) 四元数乘积的共轭是逆序共轭的乘积。
(A⊗B)* = B*⊗A*

6.) 向量四元数的共轭是它的负数。 X* = {0, - x } = -X

7.) 四元数范数是 |A| = √(A⊗A*) = √( a0² + a . a )

8.) 单位四元数是范数为 1 的四元数。

9.) 一个单位三向量 x = {x1, x2, x3} 与 x . x = 1 可表示为单位向量四元数 X = { 0, x }, |X| = 1。

10.) 四元数向量 X 以角度 θ 绕单位向量 Axis 的球面旋转 是 Q⊗X⊗Q*,
其中 Q 是四元数 {cos(θ/2), sin(θ/2) }.注意|Q| = 1。

注意四元数向量积的形式。给定向量四元数 X1 = { 0, x1 ) 和 X2 = { 0, x2 },四元数积为X2⊗X1* = { x1 . x2 , x1 × x2 }.四元数将点积重新组合为标量部分和叉积作为向量部分,这在一百多年前就已经分离了。这些乘积都不是可逆的,但四元数是下面描述的方式。

倒置

找到球面变换四元数 Q12 以旋转向量 X1 以与向量 X2 对齐。

从上面

X2 = Q12⊗X1⊗Q12*

两边乘以X1*,

X2⊗X1* = Q12⊗X1⊗(Q12*⊗X1*)

记住旋转 Axis 派生自叉积 x1 × x2 , 所以 . x1 = 0. 并且 Q*⊗X* = (X⊗Q)* = X*⊗Q,离开

X2⊗X1* = Q12⊗X1⊗X1*⊗Q12 = Q12⊗Q12

所以四元数变换可以直接求解为

Q12 = √(X2⊗X1*)

你自己计算四元数平方根。有很多方法可以做到这一点,考虑到速度和稳定性,最好的方法取决于您的应用程序。

--hth,
弗雷德·克林格

关于vector - 将单位向量转换为四元数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4636348/

相关文章:

image - 准确(且快速)的角度匹配

R使用向量创建新列包含变量名称

matlab - 冒号运算符在 MATLAB 中如何工作?

label - Gnuplot,描述到 Axis 的距离

java - Axis :带参数的 createCall

android - 在 android canvas 上绘制有角度的矩形/圆弧

opencv - 将 openCV 矩阵转换为向量

c++ - 由于 C++ 中的段错误而导致应用程序崩溃的方法

colors - gnuplot - 用不同的颜色为一些抽动或 Axis 号着色

android - 确定智能手机摄像头的视角