计算四维空间中2个点的四元数/旋转

时间:2013-04-26 08:28:48

标签: c++ 3d rotation quaternions

我有一个kinect应用程序,它将关节的位置作为3D空间中的点发送给我。 关节的顺序如下图所示。 enter image description here

现在我想在另一个使用COLLADA坐标系的应用程序中移动它们。 enter image description here

我的想法:如果我想旋转肩膀,我需要Vector(Rshoulder - Relbow)并将其存储为VX,然后我需要找到2个正交向量作为Y和Z然后计算四元数。我可能完全错了,但这只是我的心态......

简而言之:如何在Y UP系统中使用2个给定点成功计算旋转,并使用Z up系统进行旋转?

1 个答案:

答案 0 :(得分:0)

在执行任何其他操作之前,您应首先将点转换为内部坐标系。交换Y轴和Z轴非常简单 - 只需交换y和z坐标即可。如果你想用矩阵链做所有事情,你可以为你做一个矩阵:

swapYZ_xyz = [ 1 0 0 ]    or,   swapYZ_xyzw = [ 1 0 0 0 ]
             [ 0 0 1 ]                        [ 0 0 1 0 ]
             [ 0 1 0 ]                        [ 0 1 0 0 ]
                                              [ 0 0 0 1 ]

请注意,此转换是一个旋转:它是一个反射。你需要一个反射 - 那里没有旋转,可以将左手坐标系统映射到右手坐标系统(如你的问题请求),而反射< em>总是在左撇子和右撇子之间转换。

这也是四元数表示对于整体坐标转换没有任何意义的原因:四元数自然只表示旋转。


一旦你的内部坐标系统中有了所有东西,确定每个关节的旋转是一个更复杂的问题(我不会在这里详细解释,原因可以跟随...)

首先,没有附加信息,每个关节的旋转都没有明确定义。为了看到这一点,假设你有一组与一组给定关节位置一致的旋转:然后你可以将两个关节之间的任何“骨骼”旋转到任何角度,改变两个关节处的旋转而不改变关节的位置。要消除这种冗余,您需要在某些关节处指定其他约束 - 也就是说,您需要编码有关如何(例如)允许肘部旋转的知识。

其次,一旦你解决了上述歧义,你仍然会有一些定义不明确的情况 - 例如,如果手臂是直的,你实际上无法分辨上臂相对于你的手和肩膀是如何旋转的。任何解算器都需要以某种方式处理这个案例 - 并记住你的数据会很吵......

最佳整体解决方案可能是创建姿势的数学模型,并运行Kalman filter来整合(嘈杂的)输入数据。这是一项重大任务,但它可以让您以稳健的方式处理噪声数据和瞬态模糊。