Вычислить матрицу вращения с помощью акселерометра - PullRequest
4 голосов
/ 10 декабря 2011

Я сейчас сталкиваюсь с более математической проблемой. Я разрабатываю приложение, которое заинтересовано в ускорении по осям X и Y. Другими словами, я хочу отслеживать ускорение, которое идет влево или вправо и вперед или назад.

Если устройство лежит на столе лицом вверх, все ускорения в нужном направлении видны в значениях ускорения этих осей. Возникает проблема, если устройство не находится в таком положении и имеет определенный поворот вокруг оси X или Y (шаг, крен).

Мне нужна матрица вращения (Rm), которую я могу умножить на вектор ускорения (x), чтобы получить новый калиброванный вектор (x '), с которым могут работать другие классы: x' = Rm * x . Это должно быть вычислено из опорного вектора (0,0, -1) и текущего вектора силы тяжести устройства.

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

Пример:

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

Проблема в том, что когда iPhone находится в портретном режиме, дисплей указывает на вас. Тогда торможение увеличит не значение y, а значение z. Поэтому вам нужно повернуть значение ускорения на -90 градусов вокруг оси x.

Мне нужна эта матрица вращения для произвольного вращения устройства. Я знаю, что невозможно вычислить вращение вокруг оси z по гравитационным векторам, но, если длинные вращения по осям x и y сведены на нет, я в порядке.

Большое спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

я думаю, что следующая ссылка должна быть полезной Преобразование данных акселерометра iPhone в автомобильные оси обратите внимание, что в матрице вращения есть ошибка, элемент rm11 должен быть cos "Beta" * cos "гамма "а не потому" альфа "* потому что" гамма "

1 голос
/ 10 декабря 2011

Чтобы рассчитать угол Эйлера, вам нужно вычислить угол между вектором отсчета и текущим вектором силы тяжести.

http://chemistry.about.com/od/workedchemistryproblems/a/scalar-product-vectors-problem.htm

После этого матрица вращения довольно проста.http://en.wikipedia.org/wiki/Rotation_matrix

Примечание. Я уверен, что существует множество простых способов сделать это в iOS и Android без необходимости выполнять эти вычисления вручную.Этот ответ таков, как работает геометрия.

...