Обнаружить вращение iPhone?

Я хочу создать приложение, которое могло бы определять количество вращений, когда пользователь поворачивает устройство iPhone. В настоящее время я использую Compass API для определения угла и пробую много способов определить вращение. Ниже приведен список решений, которые я пробовал: 1 / Создайте 2 угловых ловушки (кусок на полном круге) на полном круге, чтобы определить, прошел ли угол, который мы получаем от компаса, их или нет. 2 / Суммируйте все угловые расстояния между обновлениями компаса (в функции updateHeading). Давайте попробуем разделить суммарный угол на 360 => мы можем получить число вращения

Проблема в том, что когда телефон вращается слишком быстро, компас не может догнать скорость телефона, и он возвращает нам угол с последним временем (не непрерывно, как при реальном вращении).

Мы также стараемся использовать акселерометр для определения вращения. Однако этот способ не может работать, когда вы поворачиваете телефон на плоской плоскости.

Если у вас есть какое-либо решение или опыт по этой проблеме, пожалуйста, помогите мне.

Большое спасибо.


person trandangkhoa    schedule 19.01.2010    source источник


Ответы (3)


В iPhone4 есть гирокомпас MEMS, так что это самый прямой путь.

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

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

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

Получение вращающегося стола может быть проблемой, а обеспечение того, чтобы он не влиял на местное магнитное поле (делая компас бесполезным), является проблемой. Идеальный стол будет из алюминия, и если вам нужно использовать стальной стол (наиболее распространенный), вам нужно будет установить телефон на немагнитной платформе, чтобы расположить его как можно дальше от стали.

Хорошим местом для начала будет местный механический цех: станки с ЧПУ легко справятся с необходимостью.

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

Простая реализация алгоритма будет заключаться в ведении истории показаний и ведении списка разницы между последовательными показаниями. Поскольку мы знаем, что есть запаздывание компаса, когда значение разницы не равно нулю, мы будем знать, что текущее значение имеет некоторую степень неточности из-за запаздывания.

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

Когда кумулятивная коррекция (разница между последними значениями в фактическом и скорректированном списке превышает 360 градусов, это означает, что мы в основном не знаем, куда указывает компас. Надеюсь, эта точка не будет достигнута, поскольку большая часть вращательного движения должна как правило, на довольно короткий срок.

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

person BobC    schedule 03.09.2010
comment
Хотел бы я дать вам более одного голоса за такой исчерпывающий ответ. - person Andy Dent; 06.10.2010

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

person Steve Riggins    schedule 21.01.2010

Если вы используете iPhone 4, проблема решена, и вы можете использовать Core Motion, чтобы получить данные о вращении.

Для более ранних устройств я думаю, что интересным подходом было бы попытаться обнаружить качание при вращении устройства, используя UIAccelerometer с очень точным интервалом между отчетами. Возможно, вы сможете получить некоторые разумные закономерности, обнаруженные при движении под прямым углом к ​​плоскости вращения.

person Andy Dent    schedule 06.10.2010