Датчик ориентации фактически получает показания от реального магнитометра и акселерометра.
Я думаю, может быть, это и есть источник путаницы. Где это указано в документации? Что еще более важно, в документации где-то явно указано, что показания гироскопа игнорируются? Насколько я знаю реализован метод описанный в этом видео:
Sensor Fusion на устройствах Android: революция в обработке движения
Этот метод использует гироскопы и объединяет их показания. Это в значительной степени делает остальную часть вопроса спорной; тем не менее я постараюсь ответить на него.
Датчик ориентации уже интегрирует для вас показания гироскопа, так вы получаете ориентацию. Я не понимаю, почему вы делаете это сами.
Вы неправильно выполняете интеграцию показаний гироскопа, это сложнее, чем CurrentOrientation += dR
(что неверно). Если вам нужно интегрировать показания гироскопа (не понимаю, почему, SensorManager уже делает это за вас), пожалуйста, прочтите Матрица косинуса направления IMU: теория, как это сделать правильно (уравнение 17).
Не пытайтесь интегрировать углы Эйлера (азимут, тангаж, крен), ничего хорошего не выйдет.
Используйте в своих вычислениях либо кватернионы, либо матрицы вращения вместо углов Эйлера. Если вы работаете с матрицами вращения, вы всегда можете преобразовать их в углы Эйлера, см.
Вычисление углов Эйлера по матрице вращения, Грегори Г. Слабо
(То же верно и для кватернионов.) Есть (в невырожденном случае) два способа представить вращение, то есть вы получите два угла Эйлера. Выберите тот, который находится в нужном вам диапазоне. (В случае карданного замка, существует бесконечно много углов Эйлера, см. PDF-файл выше). Просто пообещайте, что вы больше не будете использовать углы Эйлера в своих вычислениях после преобразования матрицы вращения в углы Эйлера.
Непонятно, что вы делаете с дополнительным фильтром. Вы можете реализовать чертовски хорошее слияние датчиков на основе Матрица направленного косинуса IMU: теория, которая по сути является учебным пособием. Это нетривиально, но я не думаю, что вы найдете лучший и более понятный учебник, чем эта рукопись.
Одна вещь, которую мне пришлось открыть для себя, когда я реализовал слияние датчиков на основе этой рукописи, заключалась в том, что так называемый интегральный может произойти зависание. Я позаботился об этом, ограничив TotalCorrection
(стр. 27). Вы поймете, о чем я говорю, если реализуете этот сплав датчиков.
ОБНОВЛЕНИЕ: Здесь я отвечаю на ваши вопросы, которые вы разместили в комментариях после принятия ответа.
Я думаю, что компас дает мне мою текущую ориентацию, используя гравитацию и магнитное поле, верно? Используется ли гироскоп в компасе?
Да, если телефон более или менее неподвижен хотя бы полсекунды, вы можете получить хорошую оценку ориентации, используя только гравитацию и компас. Вот как это сделать: Может ли кто-нибудь сказать мне, используется ли датчик силы тяжести как датчик наклона для повышения точности курса?
Нет, гироскопы в компасе не используются.
Не могли бы вы объяснить, почему интеграция, сделанная мной, неверна? Я понимаю, что если шаг моего телефона указывает вверх, угол Эйлера не работает. Но что еще не так с моей интеграцией?
Есть две несвязанные вещи: (i) интегрирование должно быть выполнено по-другому, (ii) углы Эйлера вызывают проблемы из-за блокировки карданного подвеса. Повторяю, эти двое не связаны.
Что касается интеграции: вот простой пример того, как вы на самом деле можете увидеть, что не так с вашей интеграцией. Пусть x и y — оси горизонтальной плоскости комнаты. Возьмите телефон в руки. Поверните телефон вокруг оси x (комнаты) на 45 градусов, затем вокруг оси y (комнаты) на 45 градусов. Затем повторите эти шаги с самого начала, но теперь вращайте сначала вокруг оси Y, а затем вокруг оси X. Телефон оказывается в совершенно другой ориентации. Если сделать интеграцию по CurrentOrientation += dR
разницы не увидите! Пожалуйста, прочтите связанную выше матрицу косинуса направления IMU: рукопись Theory, если вы хотите правильно выполнить интеграцию.
Насчет углов Эйлера: они портят стабильность приложения и мне достаточно их не использовать для произвольных поворотов в 3D.
Я до сих пор не понимаю, почему вы пытаетесь сделать это сами, почему вы не хотите использовать оценку ориентации, предоставленную платформой. Скорее всего, вы не можете сделать лучше, чем это.
person
Ali
schedule
08.08.2013