Направление движения iphone с использованием акселерометра

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

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

Velocity = (Расстояние * timeintercal) {здесь расстояние означает новое расстояние-превентивное расстояние и интервал времени для этого расстояния}

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

Помощь будет оценена. Благодарю.

3 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам