iPhone4 содержит гирокомпас MEMS, так что это самый прямой маршрут.
Как вы заметили, магнитометр имеет вялый отклик. Это может быть уменьшено с помощью упреждающего алгоритма, который использует медлительность, чтобы сделать обоснованное предположение о том, каково текущее направление на самом деле.
Сначала необходимо определить фактическую производительность датчика. Чтобы сделать это, вам нужно повернуть его с точной скоростью на каждой из нескольких скоростей вращения и записать поведение компаса. Поворотная платформа должна иметь возможность считывать мгновенное положение.
На более медленных скоростях вы увидите различную степень фиксированной задержки. По мере увеличения скорости запаздывание будет увеличиваться, пока не достигнет 180 градусов, после чего компас внезапно перевернется. На более высоких скоростях все, что вы увидите, это переворачивание, хотя может показаться, что оно не переворачивается, когда перевороты повторяются с тем же значением. На некоторых из этих более высоких скоростей может показаться, что компас вращается назад, противоположно направлению вращения.
Получение вращающегося стола может быть проблемой, и обеспечение того, чтобы оно не влияло на локальное магнитное поле (делая компас бесполезным), является сложной задачей. Идеальный стол будет изготовлен из алюминия, и если вам нужно использовать стальной стол (чаще всего), вам нужно будет установить телефон на немагнитную платформу, чтобы отвести его как можно дальше от стали.
Хорошим местом для начала будет местный механический цех: станки с ЧПУ легко могут сделать то, что нужно.
Как только вы получите данные о производительности компаса, вам нужно будет построить модель наблюдаемых показаний в зависимости от фактической ориентации и частоты вращения. Инвертируйте модель и примените ее к показаниям, чтобы получить предположение о фактических значениях.
Простая реализация алгоритма состоит в том, чтобы вести историю показаний и вести список различий между последовательными показаниями. Так как мы знаем, что есть задержка компаса, когда значение разности не равно нулю, мы будем знать, что текущее значение имеет некоторую степень неточности из-за задержки.
Следующим шагом является создание списка «исправленных» показаний, где запаздывание известных фактических значений используется для создания обновленного значения, которое используется для создания обновленного значения, которое добавляется к последнему значению в «исправленный» список, и сохраняется как новейшее значение.
Когда кумулятивная коррекция (разница между последними значениями в фактическом и исправленном списке превышает 360 градусов, это означает, что мы в основном не знаем, куда указывает компас. Надеемся, что эта точка не будет достигнута, так как большинство вращательное движение обычно должно быть достаточно коротким.
Однако, поскольку ваша цель состоит только в подсчете оборотов, вы будете выключены менее чем на полный оборот, пока накопленная ошибка не достигнет существенно более высокого значения. Я не уверен, каким будет это значение, так как оно зависит как от фактической задержки компаса, так и от фактической скорости вращения. Но если вы заботитесь только о небольшом числе поворотов (5 или около того), вы сможете получить полезные результаты.