Определение ускорения в автомобиле (акселерометр iPhone) - PullRequest
11 голосов
/ 29 апреля 2010

Я работаю над приложением для iPhone, где мы пытаемся рассчитать ускорение движущегося автомобиля. Подобные приложения достигли этого (Dynolicious), но разница в том, что это приложение предназначено для использования во время общего вождения по городу, а не на транспортной полосе.

Это приводит нас к одной большой проблеме, которой, к счастью, Dynolicious удалось избежать: холмам. Да, холмы.

Есть два важных этапа: калибровка и фактическое вождение.

Наш начальный забег был прост и перенес последствия. На этапе калибровки я взял среднее усилие на телефоне, а во время бега я просто вычел среднее усилие из текущего усилия, чтобы получить текущее ускорение этого кадра. Проблема заключается в том, что типичный автомобиль получает гораздо больше силы, чем просто прямое усилие - все, от поворота до выбоин, приводило к тому, что значения не синхронизировались с тем, что действительно происходило.

Следующим шагом было добавление условия, согласно которому iPhone должен быть ориентирован так, чтобы экран был обращен к задней части автомобиля. Используя этот метод, я попытался проследить только силу на оси z, но это, очевидно, привело к проблемам, если iPhone не был ориентирован прямо вертикально из-за силы тяжести.

Немного тригонометрии позже, и мне удалось вывести гравитацию из уравнения, так что машина действительно очень и очень хорошо читалась iPhone.

Пока я не попаду на склон. Как только угол поворота машины изменился, я внезапно получил ускорения и замедления, которые не имели смысла, и мы снова вышли из строя.

Разговор с кем-то, кто намного умнее меня по математике, привел к решению, которое я пытался реализовать дольше, чем хотелось бы признать. Это следующие шаги:

1) Во время калибровки измерьте силу тяжести как вектор вместо размера. Сохраните этот вектор. 2) Когда машина изначально движется вперед, возьмите вектор движения и вычтите гравитацию. Используйте это как прямой импульс. (Не обращайте внимания, пока пользовательские случаи, когда это будет сложно, и давайте сосредоточимся на математике :) 3) Из прямого вектора и вектора силы тяжести построить плоскость. 4) Всякий раз, когда принимается сила, спроецируйте ее на указанную плоскость, чтобы избавиться от боковой силы / и т.д. 5) Затем используйте эту силу, известную величину силы тяжести и известное направление движения вперед, чтобы по существу решить треугольник, чтобы получить вектор вперед.

Проблема, которая вызывает наибольшую сложность в этой новой системе, - это не шаг 5, который я дошел до того, что все числа выглядят так, как должны. Сложной частью является на самом деле обнаружение прямого вектора. Я выбираю векторы, величина которых превышает гравитацию, и оттуда усредняю ​​их и вычитая гравитацию. (Я делаю некоторую проверку ошибок, чтобы убедиться, что я не использую силу только потому, что акселерометр iPhone немного отключился, что происходит чаще, чем мне бы хотелось). Но если я нанесу на график эти векторы, которые я использую, они на самом деле меняются на угол около 20-30 градусов, что может привести к серьезным неточностям. В результате приложение стало еще более неточным, чем раньше.

Так что в основном - все, что у вас есть, математика и iPhone - есть какие-то явные ошибки? Какие-нибудь потенциально лучшие решения? Любой опыт, который может быть полезен вообще?

Награда: предлагая вознаграждение в размере 250 долларов за первый ответ, который ведет к решению.

Ответы [ 5 ]

10 голосов
/ 29 апреля 2010

Вам нужен гироскоп. В противном случае на склоне имеется несколько конфигураций ускоряющей машины, которые могут давать одинаковые показания акселерометра. Их будет совершенно невозможно отличить. Вот почему инерциальные навигационные системы объединяют гироскоп и акселерометр.

Причина, по которой вы не можете этого сделать, была дана Эйнштейном! Используя локальное измерение, вы не можете различить гравитацию и ускорение. У вас есть некоторая полезная нелокальная информация - предположение, что гравитация здесь и гравитация в нескольких ярдах там, имеют одинаковое значение. Но вы не можете сравнивать гравитацию в двух разных местах без средств для выполнения так называемой «параллельной транспортировки». Это то, что делает гироскоп.

Забудьте 250 долларов, но я думаю, что вы должны дать мне пиво на сумму времени на исследования и разработки, которое я вам экономлю. : -)

3 голосов
/ 29 апреля 2010

Чтобы решить эту проблему, если возможно, вам нужно указать что-то внешнее по отношению к машине . Вероятно, использование GPS для измерения усиления по высоте является наиболее прямым подходом. То есть рассчитайте наклон холма, используя измеренный коэффициент усиления, и используйте его для компенсации измерения ускорения.

Как уже упоминали другие, на очень глубоком уровне нет никакого способа отличить гравитацию от ускорения; это известно как принцип эквивалентности (и был одним из самых важных выводов Эйнштейна). Таким образом, чтобы решить эту проблему, нужно знать больше, чем выходные данные акселерометра, и это усложняет проблему. Для различных подходов к проблеме см. здесь .

Ваша лучшая надежда - ссылаться на что-то внешнее по отношению к автомобилю, например, сигнал GPS или изображения, чтобы измерить изменение местоположения чего-либо вне автомобиля или магнитного поля Земли и т. Д. большое количество металла (автомобиля) в поле Земли, вероятно, будет трудно измерить, а непрерывные фотографии какого-либо эталонного объекта (например, солнца), очевидно, затруднительны, поэтому кажется, что GPS - ваш лучший выбор.

Подробнее о том, почему вам нужна внешняя ссылка:

Стоит подумать, можете ли вы использовать уникальные свойства гравитации, которые: 1) всегда включены, 2) всегда имеют одинаковую величину (для этой ситуации). Но когда все, что вы знаете, это общее ускорение, вы не можете надежно разделить два вклада. Как показано на рисунке ниже, просто зная величину силы тяжести недостаточно ... изображение ниже рисуется в системе координат телефона, где он измеряет результирующее ускорение (черный вектор), а цветные стрелки большего размера являются возможными векторами гравитации. в то время как меньшие по цвету стрелки соответствуют соответствующим векторам ускорения. Таким образом, вы можете видеть, не зная и под углом, у вас недостаточно информации для решения проблемы.

альтернативный текст http://i42.tinypic.com/6gasnb.png

Другая вещь, которую вы могли бы сделать, - интегрировать выход гироскопа, чтобы найти угол вектора гравитации. То есть, предполагая, что вы начинаете на флете, а затем всегда отслеживаете, где, по вашему мнению, гравитация будет основываться на накопленных небольших изменениях. Но это очень подвержено ошибкам, и ваша ошибка в вычислениях быстро накапливается со временем; и это также предполагает, что у вас есть доступ к гироскопу.

Следовательно, единственным хорошим решением является использование внешней информации.

1 голос
/ 29 апреля 2010

Это не решит вашу проблему полностью, но, надеюсь, это прояснит то, что вы пытались сделать. Я верю, что в конечном итоге вам понадобится какой-то другой инструмент, чтобы полностью это сделать. GPS, как предложил tom10, звучит как лучший вариант для меня (так как гироскоп недоступен), но я предвижу проблемы с этим, такие как время задержки и неточность в координатах GPS (я не знаю, насколько точен GPS на iPhone ).

Во-первых, я предполагаю, что iPhone крепко привязан к машине. Для наклона, который вверх или вниз, без кривой влево или вправо, вы можете сделать следующее для калибровки.

Калибровка

  1. Найдите поверхность так, чтобы степень ее изгиба не изменилась заметно.
  2. Найдите вектор ускорения, когда автомобиль не движется относительно дороги. Запишите этот полный вектор (компоненты x, y и z) как v1 . g = | v1 | это величина силы тяжести, которая должна оставаться неизменной во всем.
  3. Начинайте движение прямо по склону (вверх или вниз по нему, а не в сторону, и, конечно, плоская поверхность тоже хороша).
  4. Запишите этот полный вектор ускорения как v2 .
  5. Найдите v3 , вектор, указывающий движение вперед, взяв v2 - v1 (вычитая гравитацию).
  6. Найти v4 = v3 x ( v1 x v3 ), где x - векторное перекрестное произведение .
  7. Найти вектор единиц измерения v4 , v5 = v4 / | v4 |

v5 указывает направление, в котором гравитация будет указывать, когда автомобиль находится на совершенно плоской поверхности. Теперь вы можете по крайней мере сказать, находитесь ли вы на каком-либо склоне и каков угол этого наклона. Это можно сделать следующим образом:

  1. Запишите текущий вектор ускорения, a .
  2. Найдите скалярное произведение a и v1 , c = a . v1
  3. Если c меньше g (в отличие от g), машина находится на склоне. Угол наклона равен тета = арккос (с / г).

Однако здесь мы сталкиваемся с проблемами. Даже если мы ограничимся склонами, которые вверх и вниз, а не искривлены / наклонены влево или вправо, мы все равно не можем точно сказать, идет ли наклон вниз или вверх - только угол его наклона. Первоначально мы можем определить, движется ли машина вверх или вниз по склону, взяв точечное произведение v1 и v3 (положительное значение указывает на наклон вниз, а отрицательное - вверх наклон).

Однако вы можете использовать факт уменьшения или увеличения величины общего вектора ускорения при увеличении или уменьшении наклона, чтобы догадаться об этом, но это не будет точно. Например, если угол (тета) наклона был 0 градусов (или достаточно близко к нему), а теперь это не так, и проекция (точечное произведение) общего ускорения на единичный вектор составляет v3 уменьшается, тогда мы можем сделать вывод, что машина едет по склону. Опять же, это будет просто предположение, которое вполне может быть ошибочным. Я могу сказать, но я имею в виду, что иногда это будет неправильно.

Это примерно столько информации, сколько я могу представить, чтобы выйти из системы, которая использует только акселерометр. Удачи!

1 голос
/ 29 апреля 2010

Некоторые мысли:

  • Гравитация является векторной величиной, а не величиной.
  • Ускорение из-за силы тяжести и ускорение из-за какой-то другой силы не различимы (вы также не можете определить разницу между прохождением поворота и поворотом машины).
  • Возможно, вам повезет больше с двумя акселерометрами, но тогда вам понадобятся два телефона.

Если бы это был я, я бы написал заявление об отказе от ответственности: «Это не работает на холмах, используйте прямую, ровную дорогу для тестирования».

P.S .: Мне нравится денежное вознаграждение за ответы, я буду уверен и опубликую это как предложение на meta.stackoverflow.com: P

0 голосов
/ 29 апреля 2010

@ Газзардиан,

Итак, ваша существенная проблема, как я понимаю, заключается в обнаружении прямого вектора. Вы можете выбрать эти:

  1. Вы производите выборку скорости, скажем, каждые 0,2 секунды в течение 5 секунд и выключаете выборку на следующие n секунд, чтобы ресурс не зависал. Теперь, что вы можете сделать из этих точек данных, вы сможете определить скорость изменения скорости (существуют простые численные методы для нахождения производной с использованием точек данных). Но это не даст вам ускорение в прямом смысле, потому что оно не даст вам направление. AFAIK, акселерометр также определяет направление, то есть насколько он наклонен к одной из осей / силы тяжести.

Обратитесь к этой фигуре, чтобы определить угол: Углы и холмы http://lh6.ggpht.com/_p7FIkTnaSc4/S9kkKF7oECI/AAAAAAAABYg/D1tbxNQXo0E/s288/Hill.png

Другой возможный метод, это найти дополнительную силу во время восхождения на холм. Учитывая дополнительную силу, вы можете найти угол. Вертикальная составляющая дополнительной силы противостоит, вертикальная составляющая в противоположном направлении, г.

...