Sim*_*mon 6 c# iphone accelerometer kinect
我正在尝试构建一个基于Kinect和iPhone的应用程序.
我试图根据kinect返回的轨迹计算我的手在XY和Z轴的每一个上随时间的加速度.基本上我选择的0.5秒或15帧(标准时间间隔dt
)和3点,( x0
,x1
和x2
)超过其通过0.5秒separeted时间.首先我要提一下,以米为单位提到3点的位置.通过使用这些点,我计算两种速度(v0 = (x1 - x0) / dt
和v1 = (x2 - x1) / dt
).最后,通过使用这个速度,我计算的加速度x1
和x2
作为acc = (v1 - v0) / dt
.
我在每一帧重复这些计算,然后获得一系列加速度.
正如我所说,我还有一部iPhone,我想看看我用哪只手拿着我的iPhone,左手还是右手.我想通过尝试将我的手的加速度与保持在正确位置的iPhone的加速度相匹配来做到这一点,这样我就拥有相同的轴系统.
唯一的问题是我的加速度和手机的加速度之间存在巨大差异.
每个轴的手机加速读数介于-2和2之间,而我的介于-10和10之间.我应该如何解释iPhone的加速度,以获得类似于以米/秒为单位的采矿措施?
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。这些重力并不难实现(例如,如果您拍手),因此您可能会超过它们,并且积累数据的技术不会非常可靠。