Круто, есть люди, которые борются с той же проблемой, поэтому стоит потратить некоторое время: -)
Я согласен с утверждением westsider, поскольку я провел несколько недель, экспериментируя с различными подходами, и закончилс плохими результатами.Я уверен, что не будет приемлемого решения ни для больших расстояний, ни для медленных движений, длящихся более 1 или 2 секунд.Если вы можете жить с некоторыми ограничениями, такими как небольшие расстояния (<10 см) и заданная минимальная скорость для ваших движений, то я полагаю, что может быть шанс найти решение - вообще никаких гарантий.Если это так, то вам понадобится довольно трудное время для исследований и много разочарований, но если вы его получите, это будет очень и очень круто :-) Возможно, вы найдете эти советы полезными: </p>
Прежде всегочтобы упростить задачу, достаточно взглянуть на одну ось, например, на x, но рассмотреть возможность представления представленной ситуации как слева (-x), так и справа (+ x).
Да, вы правы, вам нужно дважды интегрироваться, чтобы получитьположение как функция времени.А для дальнейшей обработки вы должны сохранить результат первой интеграции (== скорость), потому что он понадобится вам на более позднем этапе для оптимизации.Делайте это очень осторожно, потому что каждая крошечная ошибка приведет к огромным ошибкам через короткий промежуток времени.
Всегда имейте в виду, что даже очень маленькая ошибка (например, <0,1%) будет быстро расти после выполнения интеграции дважды.Ситуация станет еще хуже через одну секунду, если вы настроите акселерометр, скажем, с частотой 50 Гц, то есть обработано 50 тиков, и незначительная ошибка пренебрегает «истинным» значением.Я настоятельно рекомендую не полагаться на трапециевидное правило, а использовать по крайней мере Симпсона или формулу Ньютона-Кота с более высокой степенью. </p>
Если вам это удалось, вам придется следить за настройкой правильного нижнего проходафильтрация.Я не могу дать общую оценку, но, как правило, эксперименты с коэффициентами фильтрации от 0,2 до 0,8 будут хорошей отправной точкой.Правильное значение зависит от бизнес-ситуации, которая вам нужна, например, какая игра, как быстро реагировать на события, ...
Теперь у вас будет решение, которое работает довольно хорошо при определенных обстоятельствах и в рамкахкороткий промежуток времени.Но через несколько секунд вы столкнетесь с неприятностями, потому что ваш объект уходит.Теперь вы войдете в трудную часть решения, с которой мне не удалось справиться в течение заданного промежутка времени: - (
Один из многообещающих подходов - ввести то, что я называю «синтетическими силами» или «виртуальными силами»).Это некоторая стратегия реагирования на несколько плохих ситуаций, приводящих к смещению объекта, хотя устройство остается неподвижным («без динамика», я имею в виду, не двигаясь) в ваших руках. Наиболее тревожной является скорость выше 0 без какого-либо ускорения.является неизбежным результатом распространения ошибки и может быть обработан путем искусственного замедления, что означает введение виртуального замедления, даже если нет реального аналога. Очень упрощенный пример:
if (vX > 0 && lastAccelerationXTimeStamp > 0.3sec) {
vX *= 0.9;
}
`
Вам понадобится комбинация таких условий, чтобы приручить зверя. Много попыток и ошибок требуется, чтобы почувствовать правильный путь, и это будет трудной частью проблемы.
Если выкогда-нибудь удалось взломать код, пожалуйста, дайте мне знатьМне очень любопытно посмотреть, возможно ли это вообще или нет: -)
Cheers Kay