如何解读iPhone的加速度计读数

Sim*_*mon 6 c# iphone accelerometer kinect

我正在尝试构建一个基于Kinect和iPhone的应用程序.

我试图根据kinect返回的轨迹计算我的手在XY和Z轴的每一个上随时间的加速度.基本上我选择的0.5秒或15帧(标准时间间隔dt)和3点,( x0,x1x2)超过其通过0.5秒separeted时间.首先我要提一下,以米为单位提到3点的位置.通过使用这些点,我计算两种速度(v0 = (x1 - x0) / dtv1 = (x2 - x1) / dt).最后,通过使用这个速度,我计算的加速度x1x2作为acc = (v1 - v0) / dt.

我在每一帧重复这些计算,然后获得一系列加速度.

正如我所说,我还有一部iPhone,我想看看我用哪只手拿着我的iPhone,左手还是右手.我想通过尝试将我的手的加速度与保持在正确位置的iPhone的加速度相匹配来做到这一点,这样我就拥有相同的轴系统.

唯一的问题是我的加速度和手机的加速度之间存在巨大差异.

每个轴的手机加速读数介于-2和2之间,而我的介于-10和10之间.我应该如何解释iPhone的加速度,以获得类似于以米/秒为单位的采矿措施?

jha*_*ott 2

iPhone 上的加速计数据以 g 力为单位提供。x 轴与手机屏幕的上边缘对齐,y 轴与左边缘对齐,如果您正在看屏幕,则 z 轴会直接从屏幕指向您。因此,当您的手机正面朝上放在桌子上时,您应该(0, 0, -1)分别获得 x、y 和 z 轴的值。如果您的手机在自由落体状态下掉落,您应该得到(0, 0, 0)

假设您在移动手机时保持手机像这样对齐,以获得以米/秒平方为单位的 3 维加速度:

- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
    float g = 9.80665f;
    float x = acceleration.x * g;
    float y = acceleration.y * g;
    float z = (acceleration.z + 1.0f) * g;
    // x, y, and z now hold the absolute acceleration in ms^-2
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须减去地球引力的影响才能获得相对于您的客厅而不是相对于 4 维时空的加速度。

另请注意,iPhone 加速计的噪音非常大,即使手机处于静态,这些值也会抖动,因此您需要应用一些平滑处理。但是,如果您使用与处理位置数据类似的技术,将每帧的值放入数组中以获得过去 0.5 秒的滚动平均值,这已经为您平滑了数据。

另一件需要注意的事情是 iPhone 加速度计的峰值约为 2.3g。这些重力并不难实现(例如,如果您拍手),因此您可能会超过它们,并且积累数据的技术不会非常可靠。