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