направление движения iphone с использованием акселерометра - PullRequest
0 голосов
/ 20 мая 2010

Мне нужна помощь в классе UIAccelerometer. Я хочу найти какой-нибудь способ узнать или отличить, когда я машу устройством iphone справа налево и слева направо. Я получаю значения x, y, z, а также значение интервала. Я также получаю скорость и расстояние, вычисленные по правилу обычной физики.

Расстояние = (prevDist + sqrt (pow ((prevx - ускорение. X), 2) + pow ((предыдущий - ускорение. Y), 2) + pow ((prevz - ускорение. Z), 2)))

Velocity = (Distance * timeintercal) {здесь дистанция означает новое расстояние-prevdistance и timeinterval для этого расстояния}

Когда я перемещаю устройство iphone справа налево, то слева направо, я получаю общее расстояние, пройденное в обоих направлениях и скорости через равные промежутки времени. Не могли бы вы помочь мне узнать, как я перемещаю устройство iphone слева направо или справа налево?

Помощь будет оценена. Спасибо.

Ответы [ 3 ]

1 голос
/ 25 ноября 2010

Это зависит от того, каким образом пользователь будет держать устройство.Вам не нужна скорость или расстояние, чтобы выяснить, в каком направлении поворачивается устройство.Вместо этого вы можете сохранить историю прошлых (скажем, 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

Надеюсь, это поможет!

1 голос
/ 20 мая 2010

Во-первых, у вас есть несколько физических ошибок. Ваша distance не является переменной 'расстояния', потому что вы суммируете значения ускорения от акселерометра. Кроме того, ваша velocity на самом деле является переменной 'speed', потому что вы умножаете ускорение на временной интервал.

То, что вы действительно хотите сделать, это следить за ускорением.x для значений, которые превышают определенную заранее определенную величину. Эта величина должна быть достаточно низкой, чтобы пользователю не приходилось размахивать iPhone, но достаточно высокой, чтобы простые движения не пересекали ваш порог. Если acceleration.x больше 0 по вашему заранее заданному порогу или больше, то вы ускоряетесь правильно. Если acceleration.y меньше 0 на предварительно определенную сумму или больше, значит, вы ускоряетесь влево.

Гораздо сложнее определить скорость телефона за определенный период времени, потому что вам придется постоянно интегрировать значения ускорения. Акселерометр iPhone не невероятно точен и может быть шумным, поэтому через небольшой промежуток времени ваше приложение, вероятно, убедится, что ваш телефон движется в случайных направлениях. Кроме того, помните, что гравитация всегда будет отображаться в ваших значениях ускорения.

0 голосов
/ 20 мая 2010

Следует иметь в виду, что сила тяжести всегда влияет на акселерометры, поэтому это необходимо учитывать. К сожалению, вы не можете рассчитывать на прямые методы для вычисления расстояний и фактической скорости, потому что в любой момент не знаете, где находится «вниз».

Чтобы заметить, когда происходит «поворот влево» или «поворот вправо», также учтите, что движение, вероятно, будет по дуге, и вы получите противоположное ускорение, когда качание прекратится. Чтобы знать, что качание идет, взгляните на вектор ускорения «вне», например, тот, который указывает от центра вращения. Используя это, вы можете различать состояние «начало движения» и «состояние остановки движения», которые в противном случае будут иметь равные, но противоположные значения ускорения.

...