Обнаружение движения независимо от поворота устройства

Я ищу способ обнаружения движения телефона независимо от того, как пользователь держит телефон.

Некоторые примеры:

  • Меня интересует вертикальное движение (например, пользователь поднимает трубку телефона) "игнорируя", если телефон лежит на столе или удерживается в руке (возможно, перевернуто).
  • Также интересуется горизонтальным движением (например, пользователь отталкивает телефон от тела), также игнорируя, как пользователь держит телефон.

Фон состоит в том, что я хочу узнать, вытаскивает ли пользователь телефон из кармана (например, тянет 30-40 см вверх, а также на несколько сантиметров в горизонтальном направлении).

Я думаю, поэтому мне нужно получить комбинацию из userAcceleration и отношения. Но я не нашел правильной математики.

Ответ 1

Не уверен, что вы подразумеваете под "правильной математикой". Но я зачитал акселерометр и суммировал абсолютное значение для всех трех направлений (x/y/z). Это даст вам один номер для ускорения, независимо от ориентации телефона или направления движения.

Еще лучше было бы рассчитать ускорение RMS, т.е. суммировать квадраты ускорения x/y/z и вычислить квадратный корень из суммы.

Очевидным недостатком этого метода является то, что он не дает вам никакой информации о направлении движения. Вы можете добавить некоторый порог или фильтрацию, чтобы отличить одно линейное движение от встряхивания (например, путем измерения времени между двумя событиями ускорения).

Кроме того, вы можете определить изменение высоты (это не зависит от ориентации телефона), хотя я сомневаюсь, что можно измерить разницу в 30... 40 см.

Ответ 2

Возможно, вы сможете это сделать, если ваше приложение находится на переднем плане. Вы можете определить, в каком ландшафте телефон думает, что он находится, используя UIDeviceOrientationLandscapeLeft и UIDeviceOrientationLandscapeRight и UIDeviceOrientationPortraitUpsideDown/UIDeviceOrientationPortrait, и оттуда отрегулируйте, как вы вычисляете движение.

Вероятно, он сдвинется, когда телефон будет поднят. Это изменение, с помощью акселерометра, может дать вам представление о том, как движется телефон. Это потребует тонны тестирования. Я бы установил ваше практическое приложение и получил большой объем данных о изменениях ориентации экрана и о том, как акселерометр ведет себя с каждым изменением и ищет тенденции.