3

我一直在尝试使用 Coremotion APIS,目的是将坐标从手机参考系统转换为“地球”参考系统,作为存储在 CMAttitude 对象中的参考系统。到目前为止,我尝试的是获取 CMRotationMatrix

CMRotationMatrix r = motionManager.deviceMotion.attitude.rotationMatrix;

并进行矩阵乘法

CMAcceleration a = motionManager.deviceMotion.gravity;

以下列方式(typedef float vec3f[3])

vec3f accelerationInReferenceSystem;
accelerationInReferenceSystem[0] = a.x * r.m11 + a.y * r.m12 + a.z * r.m13;
accelerationInReferenceSystem[1] = a.x * r.m21 + a.y * r.m22 + a.z * r.m23;
accelerationInReferenceSystem[2] = a.x * r.m31 + a.y * r.m32 + a.z * r.m33;

但是,没有运气。我对 3D 图形不太感兴趣,也没有太多关于如何使用各种 CMRotationMatrix、四元数等的文档。在此之前,我尝试记录 d.attitude.pitch、d.attitude.roll 的值和d.attitude.yaw。对于我所读到的内容,这不是要走的路,但除此之外,我发现 d.attitude.pitch 返回的值仅跨越 PI 弧度,因此我需要在计算俯仰角时包括偏航0 到 2PI,以便了解手机头部的方向。在我看来,使用旋转矩阵将是一个好方法。另外,我想知道是否需要使用与当前旋转矩阵相反的矩阵才能将坐标带入由 r.attitude 标识的系统中,如果您能提供帮助,谢谢!

4

1 回答 1

0

我不确定我是否理解您想要做什么。但是如果“地球”参考系是指固定参考系,而“坐标”是指 x, y, z 坐标,那么就不可能做什么您正在尝试做(或至少不可能准确地做)。因为您可以使用这些来计算设备的位移,这是不可能做到令人满意的 - 例如:如何找到陀螺仪和加速度计行进的距离?

于 2013-04-07T23:36:24.620 回答