我需要计算iPhone在太空中的速度,例如冲击速度。
我的第一个问题是:使用这些过滤操作,加速度值
最后,将速度计算为向量长度。
但速度值,也就是标签中包含的值,却总是在增加。我的意思是,如果我移动了设备然后停下来,速度值并不会变成0。难道加速度不会在0时自我补偿吗?
我的第一个问题是:使用这些过滤操作,加速度值
accelerometer:didAccelerate
是否正确:gravity_x = acceleration.x * kFilteringFactor + gravity_x * (1.0 - kFilteringFactor);
gravity_y = acceleration.y * kFilteringFactor + gravity_y * (1.0 - kFilteringFactor);
gravity_z = acceleration.z * kFilteringFactor + gravity_z * (1.0 - kFilteringFactor);
float gravityNorm = sqrt(gravity_x * gravity_x + gravity_y * gravity_y + gravity_z * gravity_z);
accelX = acceleration.x - gravity_x / gravityNorm;
accelY = acceleration.y - gravity_y / gravityNorm;
accelZ = acceleration.z - gravity_z / gravityNorm;
这与使用CoreMotion的下面代码是相同的:
motionManager.deviceMotion.userAcceleration.x;
motionManager.deviceMotion.userAcceleration.y;
motionManager.deviceMotion.userAcceleration.z;
?
接下来,根据同样的问题,我做了如下处理。
const float accuracy=10;
float accx = (float) ((int) (accelX * accuracy))/ accuracy;
float accy= (float) ((int) (accelY * accuracy))/ accuracy;
float accz= (float) ((int) (accelZ * accuracy))/ accuracy;
对于进行数值四舍五入,我认为这样可以得到当前速度。
float dx = accx*9.81+prevX*9.81;
float dy = accy*9.81+prevY*9.81;
float dz = accz*9.81+prevZ*9.81;
speed_after_x = dx/2*myAccelerometer.updateInterval+speed_before_x;
speed_after_y = dy/2*myAccelerometer.updateInterval+speed_before_y;
speed_after_z = dz/2*myAccelerometer.updateInterval+speed_before_z;
根据iPhone加速度计的速度和距离
那么
prevX=accx;
prevY=accy;
prevZ=accz;
speed_before_x=speed_after_x;
speed_before_y=speed_after_y;
speed_before_z=speed_after_z;
最后,将速度计算为向量长度。
float speed = sqrt(speed_after_x*speed_after_x+speed_after_y*speed_after_y+speed_after_z*speed_after_z);
if (max_speed<speed) max_speed = speed;
但速度值,也就是标签中包含的值,却总是在增加。我的意思是,如果我移动了设备然后停下来,速度值并不会变成0。难道加速度不会在0时自我补偿吗?
((int) (accelX * accuracy)) / accuracy;
。就像 ((10 * 100) / 100 == 10)。如果你的意图是将数字四舍五入然后转换回浮点数,那么有更好的方法来实现它。 - Dizietacceleration.timestamp
的差值,而不是完全等于updateInterval
。 - Aft3rmath