Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Определение движения телефона в пространстве

#c_sharp #android #алгоритм #unity3d #unity3d_faq


Задача состоит в отслеживании движения телефона в пространстве, а именно в отслеживании
определенных "жестов":




вертикальные рывки вверх или вниз
горизонтальные рывки вправо-влево
повороты вокруг вертикальной оси на N градусов 


Общая проблема состоит в том, что нужен именно рывок - т.е. движение на относительно
большое расстояние (или угол) за малое время. И поэтому нужно как-то отфильтровывать
плавное перемещение, трясущиеся руки и т.п.

В качестве исходных данных я обладаю показаниями акселерометра.

Какие существуют алгоритмы для решения подобной задачи? Возможно уже где-то есть
готовые примеры. Желательно все это на C# под Unity, но сойдет и любой другой язык
или просто алгоритм.
    


Ответы

Ответ 1



Я сам таким не занимался, но то как я вижу решение опишу: Нужно написать самому скрипт. В принципе, ничего критически сложного. Для начала узнай что такое Fifo Внутри FixedUpate Считываешь последние показания в Input.Acceleration во всех областях на некоем промежутке времени и записываешь в Fifo. Пусть для начала Fifo будет размеров гдето в 30 ячеек. Потом опытным путем подберешь оптимальный размер Fifo в Upate сравниваешь среднее значение по всему Fifo. Если оно не больше чем некий макс уровень(подбирается опытным путем) - то это просто тряска рук. Иначе... Выясняешь какой из жестов был сделан. Соответственно проходишь по самой большой разнице по соответствующей оси(а в Fifo записываются все 3 оси) с помощью LINQ запроса и генерируешь некий ивент на который подписываешь нужные методы.... ну или же напряму делаешь вызов метода :) PS: повторюсь, я сам такого не делал. Но если бы делал, то в первую очередь действовал по даному описанию. А потом уже если бы не вышло искал бы другие варианты. Вряд ли готовые решения найдешь. А если и найдешь - то вряд ли толковые. Я даже свайпы сам писал когда-то, потому что свайпы что нашел в инете были не фонтан... А это,ведь, достаточно тривиальная задача... Апдейт: У него оказалась проблема, что после рывка, к примеру по направлению оси Х, "отлавливается" сперва событие движения вдоль этой оси, а потом против. Введи еще одну булевую переменную-флаг ReadyForNextAction. При вызове метода ставь ReadyForNextAction = false; И, собственно, просто делай игнорирование всех движений через этот флаг пока снова не устаканится акселерометр до "спокойного уровня" по всему фифо. Снова же, возможно прийдется немного править количество ячеек фифо в большую сторону, скорей всего...Но должно пофиксится. Если получишь хороший результат - кидай код сюда, для следующих поколений, так сказать)

Комментариев нет:

Отправить комментарий