Точность акселерометра Android (Инерциальная навигация)
Я пытался реализовать Инерциальную навигационную систему для телефона Android, что, как я понимаю, сложно, учитывая точность акселерометра и постоянные колебания показаний.
Для начала я установил телефон на ровную поверхность и сделал выборку из 1000 показаний акселерометра в направлениях X и Y (параллельно таблице, поэтому гравитация в этих направлениях не действовала). Затем я усреднил эти показания и использовал это значение для калибровки телефона (вычитая это значение из каждого последующего считывания).
Затем я проверил систему, снова положив ее на стол и взяв 5000 показаний акселерометра в направлениях X и Y. Я ожидаю, учитывая калибровку, что эти ускорения должны составлять до 0 (примерно) в каждом направлении. Однако это не так, и общее ускорение за 5000 итераций далеко не близко к 0 (в среднем около 10 на каждой оси).
Я понимаю, не видя мой код, это может быть трудно ответить, но в более общем смысле...
Это просто пример того, насколько неточные показания акселерометра на мобильном телефоне (HTC Desire S), или более вероятно, что я допустил некоторые ошибки в своем кодировании?
6 ответов
Вы получаете позицию, интегрируя линейное ускорение дважды, но ошибка ужасна. Это бесполезно на практике.
Вот объяснение, почему (Google Tech Talk) в 23:20. Я очень рекомендую это видео.
Проблема связана не с шумом акселерометра, а с гироскопическим белым шумом, см. Подраздел 6.2.3 Распространение ошибок. (Кстати, вам также понадобятся гироскопы.)
Что касается внутреннего позиционирования, я нашел это полезным:
Отслеживание пешеходов с инерциальными датчиками на обуви
Повышение производительности шагомеров с помощью одного акселерометра
Я понятия не имею, как эти методы будут работать в реальных приложениях или как превратить их в хорошее приложение для Android.
Похожий вопрос такой.
ОБНОВИТЬ:
По-видимому, есть более новая версия, чем упомянутый выше доктор Оливер Дж. Вудман, "Введение в инерциальную навигацию", его кандидатская диссертация:
Я просто размышляю вслух, и я еще не играл с API акселерометра Android, так что терпите меня.
Прежде всего, традиционно, чтобы получить навигацию от акселерометров, вам понадобится 6-осевой акселерометр. Вам нужны ускорения в X, Y и Z, а также вращения Xr, Yr и Zr. Без данных о вращении у вас не будет достаточно данных, чтобы установить вектор, если вы не предполагаете, что устройство никогда не изменит свое положение, что было бы довольно ограничивающим фактором. Никто не читает TOS в любом случае.
О, и вы знаете, что INS дрейфует с вращением Земли, верно? Так что это тоже. Час спустя, и вы загадочным образом взбираетесь на 15° склон в космос. Это предполагает, что у вас была INS, способная поддерживать местоположение так долго, что телефон пока не может сделать.
Лучшим способом использования акселерометров - даже с 3-осевым акселерометром - для навигации было бы подключение к GPS для калибровки INS, когда это возможно. Там, где GPS не хватает, INS приятно дополняет. GPS может внезапно выстрелить в 3 квартала, потому что вы оказались слишком близко к дереву. INS не велик, но, по крайней мере, он знает, что вы не пострадали от метеора.
Что вы можете сделать, это записать данные акселерометра телефона, и многое из этого. Как и недели стоит. Сравните это с хорошими (я имею в виду действительно хорошие) данными GPS и используйте анализ данных, чтобы установить корреляцию трендов между данными акселерометра и известными данными GPS. (Совет для профессионалов: вы захотите проверить альманах GPS в течение нескольких дней с хорошей геометрией и большим количеством спутников. В некоторые дни у вас может быть только 4 спутника, и этого недостаточно). Что вы можете сделать, это найти это, когда человек идет со своим телефоном в кармане, данные акселерометра записывают очень специфическую картину. Основываясь на анализе данных, вы устанавливаете профиль для этого устройства, с этим пользователем, и какую скорость представляет этот шаблон, когда у него есть данные GPS, которые будут сопровождать его. Вы должны быть в состоянии обнаружить повороты, подниматься по лестнице, садиться (калибровка до 0 скорости времени!) И различные другие задачи. То, как телефон удерживается, должно рассматриваться как отдельный ввод данных. Я чувствую запах нейронной сети, используемой для добычи данных. Другими словами, что-то слепое к тому, что означают входные данные. Алгоритм будет искать только тренды в паттернах, не обращая внимания на фактические измерения INS. Все, что он знал бы, это historically, when this pattern occurs, the device is traveling and 2.72 m/s X, 0.17m/s Y, 0.01m/s Z, so the device must be doing that now.
И это продвинет часть вперед соответственно. Важно, чтобы он был полностью слепым, потому что просто положив телефон в карман, вы можете ориентироваться в одной из 4-х разных ориентаций, и 8, если вы переключаете карманы. И есть много способов держать ваш телефон, а также. Мы говорим много данных здесь.
Очевидно, что у вас все еще будет много дрейфа, но я думаю, вам повезет больше, потому что устройство будет знать, когда вы остановились, и позиционный дрейф не будет постоянным. Он знает, что вы стоите на месте, основываясь на исторических данных. Традиционные системы INS не имеют этой функции. Дрейф увековечивает все будущие измерения и составляет экспоненциально. Невероятная точность или наличие вторичной навигации для проверки через регулярные промежутки времени абсолютно необходимы для традиционных INS.
Каждое устройство, и каждый человек должен был бы иметь свой собственный профиль. Это много данных и много расчетов. Все ходят на разных скоростях, с разными шагами, кладут свои телефоны в разные карманы и т. Д. Конечно, для реализации этого в реальном мире потребуется обработать число на стороне сервера.
Если вы использовали GPS для начального базового уровня, часть проблемы в том, что GPS имеет тенденцию иметь свои собственные миграции с течением времени, но они не являются постоянными ошибками. Сядьте в приемник в одном месте и зарегистрируйте данные. Если нет исправлений WAAS, вы можете легко получить исправления местоположения, перемещающиеся в произвольных направлениях на 100 футов вокруг вас. С WAAS, может быть, до 6 футов. На самом деле, вам, возможно, повезет больше, если в рюкзаке установлена система RTK длиной не более метра, чтобы хотя бы сбить алгоритм ANN.
У вас все еще будет угловой дрейф с INS, используя мой метод. Это проблема. Но, если вы зашли так далеко, что создали ANN, чтобы накапливать в течение нескольких недель данные GPS и INS среди n пользователей, и фактически работали до этого момента, вы, очевидно, пока не возражаете против больших данных. Продолжайте идти по этому пути и используйте больше данных, чтобы помочь устранить угловой сдвиг: люди - существа привычки. Мы в основном делаем одни и те же вещи, например, гуляем по тротуарам, через двери, поднимаемся по лестнице, и не делаем сумасшедших вещей, таких как прогулки по шоссе, сквозь стены или с балконов.
Допустим, вы берете страницу у Большого брата и начинаете хранить данные о том, куда идут люди. Вы можете начать составлять карту, где люди будут ходить. Можно с уверенностью поспорить, что если пользователь начинает подниматься по лестнице, он находится на той же лестничной площадке, что и человек до нее. После 1000 итераций и некоторых наименьших квадратов ваша база данных с большой точностью знает, где находятся эти лестницы. Теперь вы можете исправить угловой сдвиг и местоположение, когда человек начинает ходить. Когда она спускается по этой лестнице, или поворачивает вниз по этому коридору, или спускается по тротуару, любой дрейф можно исправить. Ваша база данных будет содержать секторы, взвешенные по вероятности того, что человек будет там ходить, или что этот пользователь ходил туда в прошлом. Пространственные базы данных оптимизированы для этого с помощью divide and conquer
выделять только те сектора, которые имеют смысл. Это было бы похоже на те проекты MIT, где робот, оснащенный лазером, начинает с черного изображения и раскрашивает лабиринт в памяти, делая каждый ход, освещая все стены.
Районы с большим трафиком получат больший вес, а районы, где никто еще не был, - 0 вес. Более высокие зоны трафика имеют более высокое разрешение. По сути, вы бы получили карту, где бы ни был кто-либо, и использовали бы ее в качестве модели прогнозирования.
Я не удивлюсь, если вы сможете определить, какое место человек занимал в театре, используя этот метод. При достаточном количестве пользователей, идущих в театр, и достаточном разрешении, вы получите данные, отображающие каждую строку театра, и их ширину. Чем больше людей посещают какое-либо место, тем выше точность, с которой вы можете предсказать, что этот человек находится.
Кроме того, я настоятельно рекомендую вам получить (бесплатную) подписку на журнал GPS World, если вы заинтересованы в текущих исследованиях такого рода вещей. Каждый месяц я отвлекаюсь на это.
Я не уверен, насколько велико ваше смещение, потому что вы забыли включить единицы измерения. ("Около 10 на каждую ось" мало что говорит.:P) Тем не менее, это все еще вероятно из-за неточности в оборудовании.
Акселерометр подходит для таких вещей, как определение ориентации телефона относительно силы тяжести или обнаружение жестов (тряска или удары телефона и т. Д.)
Тем не менее, попытка сделать точный расчет с помощью акселерометра может привести к серьезным ошибкам. В противном случае акселерометр должен быть безумно точным, и это не обычный случай использования, поэтому я сомневаюсь, что производители оборудования оптимизируют его.
Акселерометр Android является цифровым, он измеряет ускорение, используя то же количество "ведер", скажем, есть 256 ведер, и акселерометр способен измерять от -2g до +2g. Это означает, что ваш вывод будет квантован в терминах этих "сегментов" и будет прыгать вокруг некоторого набора значений.
Чтобы откалибровать акселерометр для Android, вам нужно взять более 1000 точек и найти "режим", вокруг которого колеблется акселерометр. Затем найдите количество цифровых точек по тому, насколько сильно изменяется выходной сигнал, и используйте его для своей фильтрации.
Я рекомендую фильтрацию Калмана, как только вы получите режим и +/- колебания.
Я понимаю, что это довольно старый вопрос, но данный вопрос не рассматривается ни в одном из приведенных ответов.
То, что вы видите, - это линейное ускорение устройства, включая эффект гравитации. Если вы положите телефон на плоскую поверхность, датчик сообщит об ускорении под действием силы тяжести, которая составляет приблизительно 9.80665 m/s2
следовательно, давая 10 вы видите. Датчики неточные, но они НЕ ТОЧНЫЕ! Смотрите здесь для некоторых полезных ссылок и информации о датчике вы можете после.
Вы делаете предположение, что показания акселерометра в направлениях X и Y, которые в данном случае являются полностью аппаратным шумом, будут формировать нормальное распределение вокруг вашего среднего значения. Видимо, это не так.
Одна вещь, которую вы можете попробовать, это вывести эти значения на график и посмотреть, появляется ли какой-либо шаблон. Если нет, то шум является статистически случайным и не может быть откалиброван - по крайней мере, для вашего конкретного оборудования телефона.