两个向量对的四元数

问题描述 投票:1回答:4

我有两个矢量对(旋转前后)。

旋转前:[x1,y1,z1] [x2,y2,z2]

旋转后:[x1',y1',z1'] [x2',y2',z2']

如何创建表示此轮换的四元数?

quaternions
4个回答
1
投票

在大多数情况下,没有旋转将2个矢量转换成2个其他矢量。这是一种可视化原因的简单方法:旋转不会改变矢量之间的角度。如果旋转前2个矢量之间的角度与旋转后2个矢量之间的角度不同,则没有符合您标准的旋转。

这就是说可能存在一个具有可接受误差的最佳四元数,它几乎“旋转”你的2个矢量对。有许多算法在速度和精度上有所不同以找到这样的四元数。我为Arduino应用程序编写了一个快速C ++算法,其中速度很关键,但精度不那么重要。

http://robokitchen.tumblr.com/post/67060392720/finding-a-rotation-quaternion-from-two-pairs-of-vectors

旋转前:u0,v0。旋转后:u2,v2。

Quaternion q2 = Quaternion::fromTwoVectors(u0, u2);
Vector v1 = v2.rotate(q2.conjugate());
Vector v0_proj = v0.projectPlane(u0);
Vector v1_proj = v1.projectPlane(u0);
Quaternion q1 = Quaternion::fromTwoVectors(v0_proj, v1_proj);
return (q2 * q1).normalized();

如果这不符合您自己的应用程序的要求尝试google Wabha的问题。


2
投票

那么,首先你可以使用向量乘法(交叉乘法)找到旋转轴:

axis = v1 x v2;

然后你可以计算旋转角度:

sinA = |axis| / |v1|*|v2|
cosA = v1 . v2 / |v1|*|v2|

这里| | - 是矢量长度操作,和。 - 是点乘法

最后,你的四元数是:

Q(w,x,y,z) = (cosA, axis.x * sinA, axis.y * sinA, axis.z * sinA)

1
投票

我将marcv81非常有用的博客文章翻译成了Three.js:

const rotateVectorsSimultaneously = (u0, v0, u2, v2) => {
    const q2 = new THREE.Quaternion().setFromUnitVectors(u0, u2);

    const v1 = v2.clone().applyQuaternion(q2.clone().conjugate());

    const v0_proj = v0.projectOnPlane(u0);
    const v1_proj = v1.projectOnPlane(u0);

    let angleInPlane = v0_proj.angleTo(v1_proj);
    if (v1_proj.dot(new THREE.Vector3().crossVectors(u0, v0)) < 0) {
        angleInPlane *= -1;
    }
    const q1 = new THREE.Quaternion().setFromAxisAngle(u0, angleInPlane);

    const q = new THREE.Quaternion().multiplyQuaternions(q2, q1);
    return q;
};

因为angleTo总是返回一个正值,我手动翻转角度的符号,这取决于u0-v0平面v1的哪一侧。


0
投票

这个问题的成熟解决方案叫做Triad。 Triad是航天器姿态确定问题的最早和最简单的解决方案之一,并且计算效率极高。

使用Triad时,我们的想法是用一组三个向量替换两个向量的成对集合,其中使用交叉积生成额外的向量。通过对矢量进行归一化,您可以求解没有矩阵逆或SVD的旋转矩阵(在更常见的问题实例中需要 - 参见Wahba的问题)

有关完整算法,请参阅:https://en.wikipedia.org/wiki/Triad_method

然后,您可以将已解决的旋转矩阵从Triad转换为旋转四元数:

qw = √(1 + m00 + m11 + m22) /2
qx = (m21 - m12)/( 4 *qw)
qy = (m02 - m20)/( 4 *qw)
qz = (m10 - m01)/( 4 *qw)

通常,为了使四元数转换为鲁棒性,您应该考虑查看矩阵迹线,如下所述:http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/

最后,考虑Triad的替代方案,直接计算称为QUEST的最佳四元数。

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