iphone使用加速度计移动方向

时间:2010-05-20 16:27:21

标签: iphone accelerometer uiaccelerometer

我想在UIAccelerometer课上提供一些帮助。我想找到一些方法来找出或区分我从右到左和从左到右挥动iphone设备。我得到x,y,z值以及间隔值。我也从正常的物理规则中得到速度和距离。

距离=(prevDist + sqrt(pow((prevx - acceleration.x),2)+ pow((prevy - acceleration.y),2)+ pow((prevz - acceleration.z),2)))

Velocity =(Distance * timeintercal){此处距离表示该距离的newdistance-prevdistance和timeinterval}

当我从右向左移动iphone设备然后从左到右移动时,我会定期以两个方向和速度进行总距离传输。你能帮我解决一下我是如何从左到右或从右到左移动iphone设备的?

帮助将不胜感激。 感谢。

3 个答案:

答案 0 :(得分:1)

首先,您有一些物理错误。您的distance不是“距离”变量,因为您要从加速度计求加速度值。此外,您的velocity实际上是一个'速度'变量,因为您将加速度乘以一个时间间隔。

您真正想要做的是监控加速度x,以获取超过某个预定幅度的值。这个幅度应该足够低,以至于用户不必猛烈摆动iPhone,但足够高,以至于简单的动作不会超过你的门槛。如果acceleration.x大于0超过预定阈值或更高,那么您正在加速。如果按预定量或更多量加速度小于0,则表示您正在加速。

在一段时间内确定手机的速度要困难得多,因为您必须连续整合加速度值。 iPhone加速度计不是非常精确,可能会很嘈杂,因此在一小段时间后,您的应用程序可能会确信您的手机正在随机漂移。另外,请记住,重力将始终显示在加速度值中。

答案 1 :(得分:1)

这取决于用户持有设备的方式。 您不需要速度或距离来确定设备摆动的方向。 相反,您可以保留过去(比如5)加速度的历史记录。 假设设备保持正常方式(纵向,正面向上),您将使用先前x加速度的平均值来确定方向。

基本上我所做的就是加速度计:didAccelerate事件:

//prevAccels is an NSMutableArray
float VAL = .75;
int HISTORY_NUMBER = 5;
if (accleration.x>VAL && acceleration.y>VAL){ //if there has been a sudden jerking motion
        float avgX;
        for (int i = 0; i<[prevAccels count]; i++)
        {
            UIAcceleration *a = [prevAccels objectAtIndex:i];
            avgX += a.x;
        }
        avgX /= HISTORY_NUMBER; //get the average of the previous accelerations

        BOOL flickRight = (avgX<-VAL)?YES:NO;
        //[self wave:flickRight]; //do stuff here
        }

[prevAccels addObject:acceleration]; //add the acceleration to the history
if ([prevAccels count]>HISTORY_NUMBER) [prevAccels removeObjectAtIndex:0]; //trim the list if it is too large

希望有所帮助!

答案 2 :(得分:0)

要记住的一件事是重力总是影响加速度计,因此需要考虑。不幸的是,你不能指望直接计算距离和实际速度的方法,因为在“向下”的任何时刻都不知道。

要注意当“向左摆动”或“向右摆动”发生时,还要考虑到机芯可能处于弧形,并且当摆动停止时,您将获得相反的加速度。要知道摆动正在进行中,请查看“out”加速度矢量,例如指向远离旋转中心的那个。使用它可以区分“开始移动”状态和“停止移动状态”,否则将具有相等但相反的加速度值。