Определение курса в инерциальных навигационных системах
У меня вопрос по инерциальной навигации с помощью мобильного устройства. Я использую планшет Android для разработки, но я думаю, что вопрос связан со всеми типами (даже с лучшими датчиками) аппаратного обеспечения.
Самый основной вопрос при разработке инерциальной системы заключается в том, как определить направление движения носителя. Даже если мы предположим, что показания магнитометра точны на 100% (а они, очевидно, нет!), Все равно остается вопрос об ориентации устройства относительно пользователя.
Простой пример - если пользователь идет на север, но держит устройство так, чтобы его ось Y указывала на северо-восток (ссылка на изображение другой оси: http://developer.android.com/reference/android/hardware/SensorEvent.html) Тогда магнитометр будет указывать на северо-восток. Как мы можем определить, в каком направлении движется пользователь? (То же самое будет верно, если мы используем магнитометр и гироскоп для определения курса)
Возможным решением будет использование показаний оси Y акселерометра и осей X. Что-то в направлении использования arctan(aY/aX) (например - если пользователь держит устройство идеально прямо, то ось X ничего не показывает...) Но так как показания акселерометра не стабильны, это не так легко...
Кто-нибудь знает алгоритм, который действительно работает? Я уверен, что это хорошо известная проблема, но я не могу найти ссылки на решения...
Заранее спасибо!
Ariel
2 ответа
Посмотрите на этот ответ для идеи: получив значения ускорения относительно земли, вы можете затем использовать функцию atan2 для вычисления фактического направления.
Вы упомянули, что пользователь держит планшет, и я предполагаю, что он достаточно стабилен (в отличие от случая, над которым я работаю, когда пользователь постоянно перемещает телефон). Тем не менее, по какой-то причине пользователь может изменить ориентацию устройства, и это может повлиять на показания, которые вы получаете.
Таким образом, в случае изменения ориентации вы должны соответствующим образом вызвать remapCoordinates(), чтобы исправить полученные показания.
ПРИМЕЧАНИЕ. Можно также использовать метод getOrientation() соответствующим образом, и первое поле представляет направление заголовка.
Действительно правильный ответ - оставить устройство на некоторое время на месте, обнаружить вращение Земли, а затем вычислить истинный север от этого. К сожалению, гироскопы в мобильном телефоне недостаточно точны для этого....