0

我想要一些关于 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) {这里的距离是指该距离的新距离-前距离和时间间隔}

当我从右到左然后从左到右移动 iphone 设备时,我会定期在方向和速度上移动总距离。你能帮我看看我是从左到右还是从右到左移动 iPhone 设备?

帮助将不胜感激。谢谢。

4

3 回答 3

1

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

您真正想要做的是监视超过某个预定幅度的值的 acceleration.x。这个幅度应该足够低,以至于用户不必用力挥动 iPhone,但又足够高,以至于简单的动作不会超过你的门槛。如果您预先确定的阈值或更大的加速度.x 大于 0,那么您正在正确加速。如果 acceleration.y 小于 0 或更多,那么您正在向左加速。

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

于 2010-05-20T17:10:51.690 回答
1

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

所以基本上我所做的是在 accelerometer: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

希望有帮助!

于 2010-11-25T04:38:14.390 回答
0

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

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

于 2010-05-20T17:16:51.317 回答