Вращающийся акселерометр выводит на новый «нейтральный» для iOS (и другие). - PullRequest
2 голосов
/ 30 июля 2011

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

код показан ... (вместе с двумя изображениями)

первое изображение - это то, как вычисление atan2 естественно поступает из iPad, "pitchAngleRadians = atan2 (accel [0], accel 2 );"(что акселерометр выдает нормально)

что я хочу, это сместить «ноль» на новый угол в градусах, на втором изображении я сместил его на -135 градусов в качестве примера.(все в коде - это радианы), поэтому, например, переменная "pitchNeutralAngle" в этом примере представляет собой радиан, эквивалентный (-135) градусам

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

я прошёл бы промежуточный этап «ранжирования»градусов от 0 до 360, так что пересечение границы 180 градусов не портит вычисление, однако мне все равно нужно вернуть его к форме от 0 до 180, так что это следующий расчет.

Я немного протестировал этот код, и он, кажется, работает.

//------------------------------------------------------------------------------------
- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
    accel[0] = (acceleration.x * kFilteringFactor) + accel[0] * (1.0 - kFilteringFactor);
    accel[1] = (acceleration.y * kFilteringFactor) + accel[1] * (1.0 - kFilteringFactor);
    accel[2] = (acceleration.z * kFilteringFactor) + accel[2] * (1.0 - kFilteringFactor);

    pitchAngleRadians = (atan2(accel[0], accel[2]) - pitchNeutralAngle);
    pitchAngleRadians = pitchAngleRadians - floorf(pitchAngleRadians/6.28318f)*6.28318f;
    if (pitchAngleRadians > 3.14159) pitchAngleRadians = -6.28318f + pitchAngleRadians;

//float a = atan2(accel[0], accel[2]);
//NSLog(@"a = %f", a);
}

naturally comes out of the accelerometer

after re-

1 Ответ

1 голос
/ 01 августа 2011

Вы привязаны к старым устройствам 3.x или можете положиться на iOS 4.x?В общем, «старый» UIAccelerometerDelegate вскоре будет признан устаревшим, поскольку он заменен новым каркасом Core Motion (с. Почему акселерометр: didAccelerate: устарел в IOS5? )

Далее выговорить об iPad, который имеет IMO гироскоп (или это только iPad 2?).Если вы можете положиться на устройства, имеющие такое устройство, вы покончили с Core Motion DeviceMotion, который предоставляет углы Эйлера, готовые к использованию без каких-либо проблем (ОК, не забывайте о блокировке подвеса).См. Простое обнаружение движения iPhone , в частности:

Вы можете проверить образец кода WWDC2010: Образец кода WWDC 2010

Если нет, есть ли шанс убедить вас или ваших деловых партнеров?Хорошо, вы все еще там :-) хммх, у atan и atan2 есть некоторые разрывы, вы уверены, что это работает для всех комбинаций малых значений x и y, т.е. если устройство лежит на столе без или с небольшим движением, нокакой-то сенсорный шум?

Относительно производительности: Да, atan довольно дорогой, так что вы можете проверить, используя альтернативы, такие как FastMath.h (это на французском языке, но не беспокойтесь по ссылке на C ++en un fichier header FastMath.h contenant .

...