Я пытался разработать приложение Pedestrian Dead Reckoning для Android, и после того, как я позаботился о компонентах обнаружения шагов и длины шага, я решил заняться проблемой определения ориентации.
Наткнувшись на пару сообщений о координате transformation (и даже общение с частым answerer), я постепенно получаю лучшие результаты, но меня все еще беспокоят некоторые вещи.
Эксперимент:
Я пошел вперед на север, повернул назад и пошел обратно на юг. Повторил процедуру в сторону Запада, затем Востока.
Проблемы:
Я ожидал, что при движении прямо в нескольких направлениях значения значений X и Y будут колебаться вместе с шагами и иметь относительно стабильное значение Z на всем протяжении. Вместо этого значения Y ведут себя таким образом, а значение Z имеет ожидаемое поведение. Почему? Это как-то связано с тем, что я не использую remapCoordinates()? (см. график 1)
Я ожидал, что угловые графики будут прыгать примерно на 180º и -180º, но почему они также делают это около 35º? (см. график 2)
Примечания:
- Я использую значения силы тяжести и магнитометра для вычисления матрицы вращения и умножаю ее с помощью OpenGL multiplyMV();
- Я не использую remapCoordinates(), потому что думал, что в этом нет необходимости: телефон лежит в кармане вертикально (Y указывает вверх/вниз, Z обычно вперед) и должен сместиться на 45º вперед назад. и вперед, в худшем случае;
- Значения азимута кажутся нормальными и не имеют колебаний, описанных в проблеме 2 (см. график 3).
Графики:
Ускорение силы тяжести в мире (синий – X, красный – Y, зеленый – Z)
Эталонные углы гравитации мира (синий — это atan2 (Y/X), красный — это atan2 (Z/Y) и зеленый это atan2(Z/X) )
Значения ориентации (синий – азимут, красный – шаг, зеленый – крен)