Для приложения Android мне нужно получить измерения магнитного поля по оси глобальной (мировой) системы координат. Вот как я собираюсь (предполагаю) реализовать это. Пожалуйста, поправьте меня, если это необходимо. Также обратите внимание, что речь идет об алгоритмической части задачи, а не об Android API для сенсоров — у меня есть опыт работы с последними.
Первым шагом является получение данных датчика TYPE_MAGNETIC_FIELD
(M
) и данных датчика TYPE_ACCELEROMETER
(G
). Второй должен использоваться в соответствии с документацией Android, но я не уверен, что он не должен быть вместо этого TYPE_GRAVITY
(опять же как G
), потому что акселерометр, похоже, обеспечивает не чистую гравитацию.
Следующим шагом будет получение матриц поворота через getRotationMatrix(R, I, G, M)
, где R
и I
— матрицы поворота и наклона соответственно.
А теперь самая сомнительная часть: чтобы перевести M
вектор в мировую систему координат, я полагаю умножить [R * I] * M
.
Я не уверен, что это правильный способ преобразования показаний магнитного поля в другую основу. Кроме того, я не знаю, следует ли использовать remapCoordinateSystem
в дополнение или в качестве замены для чего-то выше.
Если существует какой-то исходный код, который уже делает это, я был бы признателен за размещение ссылки, но я не хочу использовать большие библиотеки общего назначения (например, для поддержки дополненной реальности) для этой конкретной задачи, потому что я бы хотел, чтобы это было как можно проще.
P.S.
Мне пришла в голову мысль добавить немного информации в исходный пост для ясности.
Предположим, что устройство лежит на столе и непрерывно считывает данные со своего магнитного датчика. Каждое измерение содержит 3 значения, представляющие магнитное поле по осям X, Y, Z, которые являются локальной системой координат устройства. Я так понимаю, что флуктуациями поля окружающей среды (сглаженными фильтром нижних частот) можно пренебречь, поэтому эти 3 значения должны оставаться почти одинаковыми все время, пока устройство остается на месте. Если мы вращаем устройство вокруг любой оси, значения меняются, потому что мы меняем локальную систему координат. Но само поле фактически не изменяется. Итак, я хочу преобразовать локальные измерения поля X, Y, Z в такие X', Y', Z', чтобы они сохраняли свои соответствующие значения независимо от вращения устройства, при условии, что устройство не перемещается со своего местоположения (только вращается).
Я реализовал алгоритм, описанный выше, и получил регулярные и заметные изменения значений X', Y', Z', полученных в результате предложенных преобразований, а значит, что-то здесь не так.
P.P.S.
Иногда я находил точную копию моего вопроса здесь, на SO - of-the-device-rotation">Как я могу получить вектор магнитного поля, не зависящий от вращения устройства? - но, к сожалению, ответ содержит мои предложения, и ОП этого вопроса подтверждает, что они не работают.