Определение ускорения в автомобиле (акселерометр iPhone)
Я работаю над приложением для iPhone, где мы пытаемся рассчитать ускорение движущегося автомобиля. Подобные приложения достигли этого (Dynolicious), но разница в том, что это приложение предназначено для использования во время общего вождения по городу, а не на автомобильной полосе.
Это приводит нас к одной большой проблеме, которой, к счастью, Dynolicious удалось избежать: холмам. Да, холмы.
Здесь есть два важных этапа: калибровка и фактическое вождение.
Наш начальный забег был прост и перенес последствия. На этапе калибровки я взял среднее усилие на телефоне, а во время бега я просто вычел среднее усилие из текущего усилия, чтобы получить текущее ускорение в этом кадре. Проблема заключается в том, что типичный автомобиль получает гораздо больше силы, чем просто переднюю силу - все, от поворота к выбоинам, приводило к тому, что значения не синхронизировались с тем, что на самом деле происходило.
Следующим шагом было добавление условия, что iPhone должен быть ориентирован так, чтобы экран был обращен к задней части автомобиля. Используя этот метод, я попытался проследить только силу на оси z, но это, очевидно, привело к проблемам, если iPhone не был ориентирован прямо в вертикальном положении из-за силы тяжести.
Спустя некоторое время тригонометрия, и мне удалось вывести гравитацию из уравнения, так что iPhone действительно очень хорошо читал машину.
Пока я не ударил по склону. Как только угол поворота машины изменился, я внезапно получил ускорения и замедления, которые не имели смысла, и мы снова вышли из строя.
Разговор с кем-то намного умнее меня по математике привел к решению, которое я пытался реализовать дольше, чем хотелось бы признать. Это следующие шаги:
1) Во время калибровки измерьте силу тяжести как вектор вместо размера. Сохраните этот вектор. 2) Когда машина изначально движется вперед, возьмите вектор движения и вычтите гравитацию. Используйте это как прямой импульс. (Пока игнорируйте пользовательские случаи, когда это будет сложно, и давайте сконцентрируемся на математике:) 3) Из вектора вперед и вектора гравитации построим плоскость. 4) Всякий раз, когда принимается сила, спроецируйте ее на указанную плоскость, чтобы избавиться от боковой силы / и т.д. 5) Затем используйте эту силу, известную величину силы тяжести и известное направление движения вперед, чтобы по существу решить треугольник, чтобы получить вектор вперед.
Проблема, которая вызывает наибольшую сложность в этой новой системе, - это не шаг 5, который я дошел до того, что все числа выглядят так, как должны. Сложной частью является на самом деле обнаружение прямого вектора. Я выбираю векторы, величина которых превышает гравитацию, и оттуда усредняю их и вычитая гравитацию. (Я делаю некоторую проверку ошибок, чтобы убедиться, что я не использую силу только потому, что акселерометр iPhone немного отключился, что происходит чаще, чем мне бы хотелось). Но если я нанесу эти векторы, которые я использую, они на самом деле меняются на угол около 20-30 градусов, что может привести к серьезным неточностям. В результате приложение стало еще более неточным, чем раньше.
Таким образом, в основном - все, что у вас есть, и мозги iPhone - какие-либо явные ошибки? Какие-нибудь потенциально лучшие решения? Любой опыт, который может быть полезен вообще?
Награда: предложить вознаграждение в размере 250 долларов за первый ответ, который приведет к решению.
5 ответов
Тебе нужен гироскоп. В противном случае на склоне имеется несколько конфигураций ускоряющей машины, которые могут давать одинаковые показания акселерометра. Их будет совершенно невозможно отличить. Вот почему инерциальные навигационные системы объединяют гироскоп и акселерометр.
Причина, по которой вы не можете этого сделать, была дана Эйнштейном! Используя локальное измерение, вы не можете различить гравитацию и ускорение. У вас есть некоторая полезная нелокальная информация - предположение, что гравитация здесь и гравитация в нескольких ярдах там, имеют одинаковое значение. Но вы не можете сравнивать гравитацию в двух разных местах без средств для выполнения так называемой "параллельной транспортировки". Это то, что делает гироскоп.
Забудьте о 250 долларах, но я думаю, что вы должны дать мне пиво на сумму времени на исследования и разработки, которое я вам экономлю.:-)
Чтобы решить эту проблему, если это возможно, вам нужно будет сослаться на что-то внешнее к автомобилю. Вероятно, использование GPS для измерения усиления по высоте является наиболее прямым подходом. То есть рассчитайте наклон холма, используя измеренный коэффициент усиления, и используйте его для компенсации измерения ускорения.
Как уже упоминали другие, на очень глубоком уровне нет никакого способа отличить гравитацию от ускорения; это известно как принцип эквивалентности (и был одним из самых важных идей Эйнштейна). Таким образом, чтобы решить эту проблему, нужно знать больше, чем выходные данные акселерометра, и это усложняет проблему. Для различных подходов к проблеме, смотрите здесь.
Ваша лучшая надежда - ссылаться на что-то внешнее по отношению к автомобилю, например, сигнал GPS или изображения, чтобы измерить изменение местоположения чего-либо вне автомобиля, или магнитное поле Земли, и т. Д. Поскольку это будет происходить вблизи большого количества металла (автомобиль) поле Земли, вероятно, будет трудно измерить, а непрерывные фотографии какого-либо эталонного объекта (например, солнца), очевидно, затруднительны, поэтому кажется, что GPS - ваш лучший выбор.
Подробнее о том, почему вам нужна внешняя ссылка:
Стоит подумать, можете ли вы использовать уникальные свойства гравитации, которые: 1) всегда включены, 2) всегда имеют одинаковую величину (для этой ситуации). Но когда все, что вы знаете, это общее ускорение, вы не можете надежно разделить два вклада. Как показано на рисунке ниже, просто зная величину силы тяжести недостаточно... изображение ниже рисуется в системе отсчета телефона, где измеряется результирующее ускорение (черный вектор), а цветные стрелки большего размера являются возможными векторами гравитации. в то время как соответствующие цвета меньшие стрелки являются соответствующими векторами ускорения. Таким образом, вы можете видеть, не зная и под углом, у вас недостаточно информации для решения проблемы.
http://i42.tinypic.com/6gasnb.png
Другая вещь, которую вы могли бы сделать, - интегрировать выход гироскопа, чтобы найти угол вектора гравитации. То есть, предполагая, что вы начинаете на флете, а затем всегда отслеживаете, где, по вашему мнению, гравитация будет основываться на накопленных небольших изменениях. Но это очень подвержено ошибкам, и ваша ошибка в вычислениях быстро накапливается со временем; и это также предполагает, что у вас есть доступ к гироскопу.
Поэтому единственным хорошим решением является использование внешней информации.
Это не решит вашу проблему полностью, но, надеюсь, это прояснит то, что вы пытались сделать. Я верю, что в конечном итоге вам понадобится какой-то другой инструмент, чтобы полностью это сделать. GPS, как предложил tom10, звучит как лучший вариант для меня (так как гироскоп недоступен), но я предвижу проблемы с ним, такие как время задержки и неточность в координатах GPS (я не знаю, насколько точен GPS на iPhone).
Во-первых, я предполагаю, что iPhone крепко привязан к машине. Для наклона, который вверх или вниз без кривой влево или вправо, вы можете сделать следующее для калибровки.
калибровка
- Найдите поверхность, такую, чтобы степень ее изгиба не изменилась заметно.
- Найдите вектор ускорения, когда автомобиль не движется относительно дороги. Запишите этот полный вектор (компоненты x,y и z) как v1. г = |v1| это сила тяжести, которая должна оставаться неизменной во всем.
- Начните движение прямо по склону (вверх или вниз по нему, а не в сторону, и, конечно же, плоская поверхность тоже хороша).
- Запишите этот полный вектор ускорения как v2.
- Найдите v3, вектор, указывающий движение вперед, взяв v2 - v1 (вычитая из силы тяжести).
- Найдите v4 = v3 x (v1 x v3), где x - векторное произведение.
- Найти единичный вектор v4, v5 = v4 / | v4 |
v5 указывает направление, в котором гравитация будет указывать, когда автомобиль находится на совершенно плоской поверхности. Теперь вы можете по крайней мере сказать, находитесь ли вы на каком-либо склоне и каков угол этого наклона. Это можно сделать следующим образом:
- Запишите текущий вектор ускорения, а.
- Найдите произведение точек a и v1, c = a. v1
- Если c меньше g (в отличие от g), автомобиль находится на склоне. Угол наклона составляет тета = арккос (с / г).
Однако здесь мы сталкиваемся с проблемами. Даже если мы ограничимся склонами, которые вверх и вниз, а не искривлены / наклонены влево или вправо, мы все равно не можем точно сказать, идет ли наклон вниз или вверх - только угол его наклона. Изначально мы можем определить, движется ли машина вверх или вниз по склону, взяв точечное произведение v1 и v3 (положительное значение указывает на наклон вниз, а отрицательное значение - наклон вверх).
Тем не менее, вы можете использовать факт того, что величина вектора ускорения уменьшается или увеличивается при увеличении или уменьшении наклона, чтобы догадаться об этом, но это не будет точно. Например, если угол (тета) наклона был 0 градусов (или достаточно близко к нему), а теперь это не так, и проекция (точечное произведение) общего ускорения на единичный вектор v3 уменьшается, тогда мы можем сделать вывод, что машина поднимается по склону. Опять же, это просто предположение, которое вполне может быть ошибочным. Я могу сказать, но я имею в виду, что иногда это будет неправильно.
Это примерно столько информации, сколько я могу представить, чтобы выйти из системы, которая использует только акселерометр. Удачи!
Некоторые мысли:
- Гравитация является векторной величиной, а не величиной.
- Ускорение из-за силы тяжести и ускорение из-за какой-то другой силы не различимы (вы также не можете определить разницу между прохождением поворота и поворотом машины).
- Возможно, вам повезет больше с двумя акселерометрами, но тогда вам понадобятся два телефона.
Если бы это был я, я бы написал заявление об отказе от ответственности, которое гласит: "Это не работает на холмах, используйте прямую, ровную дорогу для тестирования".
PS: мне нравится денежное вознаграждение за ответы, я буду уверен и опубликую это как предложение на meta.stackru.com:P
@ Газзардян,
Итак, ваша основная проблема, как я понимаю, заключается в обнаружении прямого вектора. Вы можете выбрать эти:
- Вы производите выборку скорости, скажем, каждые 0,2 секунды в течение 5 секунд и выключаете выборку на следующие n секунд, чтобы ресурс не зависал. Теперь, что вы можете сделать из этих точек данных, вы сможете определить скорость изменения скорости (существуют простые численные методы для нахождения производной с использованием точек данных). Но это не даст вам ускорение в прямом смысле, потому что оно не даст вам направление. AFAIK, акселерометр также определяет направление, то есть насколько он наклонен к одной из осей / силы тяжести.
Обратитесь к этой фигуре, чтобы определить угол: http://lh6.ggpht.com/_p7FIkTnaSc4/S9kkKF7oECI/AAAAAAAABYg/D1tbxNQXo0E/s288/Hill.png
Другой возможный метод, это найти дополнительную силу во время восхождения на холм. Учитывая дополнительную силу, вы можете найти угол. Вертикальная составляющая дополнительной силы противостоит вертикальной составляющей в противоположном направлении, g.