2013-04-26 169 views
1

我有一个kinect应用程序,它将关节的位置作为3D空间中的点发送给我。 关节的顺序如下图所示。 enter image description here从3D空间中的2点计算四元数/旋转

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

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

简而言之:我如何成功计算一个旋转,在Y UP系统中有2个给定点,并转换为带有Z向上系统的旋转?

回答

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 ] 

注意,这一转变旋转:它是一个反映。 需要这里有一个反映 - 那里没有旋转,可以将左手坐标系映射到右手坐标系(如您的问题要求),而反射总是在左手和右手之间转换,手。

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


一旦你有你的内部坐标系中的一切,确定每个关节的旋转是一个比较复杂的问题(和一个我不解决此处详细,原因遵循...)

首先,没有附加信息,每个关节的旋转不明确。为了看到这一点,假设您有一组旋转与一组给定的关节位置一致:然后,您可以将2个关节之间的任何“骨骼”旋转到任意角度,改变两个关节处的旋转而不改变关节的位置。为了消除这种冗余,您需要在某些关节指定附加约束 - 也就是说,您需要对关于如何(例如)肘部被允许旋转的知识进行编码。第二,一旦你解决了上述歧义之后,你仍然会遇到一些定义不明确的案例 - 例如,如果手臂是直的,你实际上无法分辨上臂相对于你的手是怎么旋转的,肩膀。任何求解器将需要以某种方式处理这种情况 - 记住,你的数据将是嘈杂......

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