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

Мне нужна помощь по классу 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 слева направо или справа налево?

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


person Ruchir Shah    schedule 20.05.2010    source источник


Ответы (3)


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

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

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

person Tom S    schedule 20.05.2010
comment
вектор ускорения * скаляр = другой вектор. Скорость - это скаляр, а скорость - это скорость * направление, не так ли? - person dash-tom-bang; 20.05.2010
comment
Это правильно, но исходный пост не имеет векторов и не умножает ускорение на скаляр. - person Tom S; 20.05.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

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

person Nick    schedule 25.11.2010

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

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

person dash-tom-bang    schedule 20.05.2010