Обнаружение Ускорения в автомобиле (iPhone Accelerometer)

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

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

Существует два важных этапа к этому: калибровка и фактическое управление.

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

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

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

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

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

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

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

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

Премия: предложение щедрости 250$ к первому ответу, который приводит к решению.

11
задан RickNotFred 28 April 2010 в 21:28
поделиться

5 ответов

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

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

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

.
10
ответ дан 3 December 2019 в 08:03
поделиться

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

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

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

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

1
ответ дан 3 December 2019 в 08:03
поделиться

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

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

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

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

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

alt text

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

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

3
ответ дан 3 December 2019 в 08:03
поделиться

@The Gazzardian,

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

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

Для определения угла воспользуйтесь этим рисунком: Углы и холмы http://lh6.ggpht.com/_p7FIkTnaSc4/S9kkKF7oECI/AAAAAAAABYg/D1tbxNQXo0E/s288/Hill.png

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

0
ответ дан 3 December 2019 в 08:03
поделиться

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

Во-первых, я предполагаю, что 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), автомобиль находится на склоне. Угол наклона равен theta = arccos (c / g).

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

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

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

1
ответ дан 3 December 2019 в 08:03
поделиться