Я работаю над приложением для iPhone, где мы пытаемся рассчитать ускорение движущегося автомобиля. Подобные приложения достигли этого (Dynolicious), но разница в том, что это приложение предназначено для использования во время общего вождения по городу, а не на транспортной полосе.
Это приводит нас к одной большой проблеме, которой, к счастью, Dynolicious удалось избежать: холмам. Да, холмы.
Есть два важных этапа: калибровка и фактическое вождение.
Наш начальный забег был прост и перенес последствия. На этапе калибровки я взял среднее усилие на телефоне, а во время бега я просто вычел среднее усилие из текущего усилия, чтобы получить текущее ускорение этого кадра. Проблема заключается в том, что типичный автомобиль получает гораздо больше силы, чем просто прямое усилие - все, от поворота до выбоин, приводило к тому, что значения не синхронизировались с тем, что действительно происходило.
Следующим шагом было добавление условия, согласно которому iPhone должен быть ориентирован так, чтобы экран был обращен к задней части автомобиля. Используя этот метод, я попытался проследить только силу на оси z, но это, очевидно, привело к проблемам, если iPhone не был ориентирован прямо вертикально из-за силы тяжести.
Немного тригонометрии позже, и мне удалось вывести гравитацию из уравнения, так что машина действительно очень и очень хорошо читалась iPhone.
Пока я не попаду на склон. Как только угол поворота машины изменился, я внезапно получил ускорения и замедления, которые не имели смысла, и мы снова вышли из строя.
Разговор с кем-то, кто намного умнее меня по математике, привел к решению, которое я пытался реализовать дольше, чем хотелось бы признать. Это следующие шаги:
1) Во время калибровки измерьте силу тяжести как вектор вместо размера. Сохраните этот вектор.
2) Когда машина изначально движется вперед, возьмите вектор движения и вычтите гравитацию. Используйте это как прямой импульс. (Не обращайте внимания, пока пользовательские случаи, когда это будет сложно, и давайте сосредоточимся на математике :)
3) Из прямого вектора и вектора силы тяжести построить плоскость.
4) Всякий раз, когда принимается сила, спроецируйте ее на указанную плоскость, чтобы избавиться от боковой силы / и т.д.
5) Затем используйте эту силу, известную величину силы тяжести и известное направление движения вперед, чтобы по существу решить треугольник, чтобы получить вектор вперед.
Проблема, которая вызывает наибольшую сложность в этой новой системе, - это не шаг 5, который я дошел до того, что все числа выглядят так, как должны. Сложной частью является на самом деле обнаружение прямого вектора. Я выбираю векторы, величина которых превышает гравитацию, и оттуда усредняю их и вычитая гравитацию. (Я делаю некоторую проверку ошибок, чтобы убедиться, что я не использую силу только потому, что акселерометр iPhone немного отключился, что происходит чаще, чем мне бы хотелось). Но если я нанесу на график эти векторы, которые я использую, они на самом деле меняются на угол около 20-30 градусов, что может привести к серьезным неточностям. В результате приложение стало еще более неточным, чем раньше.
Так что в основном - все, что у вас есть, математика и iPhone - есть какие-то явные ошибки? Какие-нибудь потенциально лучшие решения? Любой опыт, который может быть полезен вообще?
Награда: предлагая вознаграждение в размере 250 долларов за первый ответ, который ведет к решению.