Вам необходимо повернуть показания акселерометра кватернионом в кадр Земли (в систему координат комнаты, если хотите), а затем вычесть гравитацию. Оставшееся ускорение - это ускорение датчика в системе координат Земли, часто называемое линейным ускорением или ускорением пользователя.
В псевдо-коде, что-то вроде этого
acceleration = [ax, ay, ay] // accelerometer reading
q // quaternion corresponding to the orientation
gravity = [0, 0, -9.81] // gravity on Earth in m/s^2
a_rotated = rotate(acceleration, q) // rotate the measured acceleration into
// the Earth frame of reference
user_acceleration = a_rotated - gravity
Вы говорите, что вы можете получить q
через API. Единственный нетривиальный шаг - реализовать функцию rotate()
.
Чтобы вычислить образ вектора v
при повороте на q
, следующая формула должна быть применена: v повернуты = д v д -1. Чтобы вычислить его с помощью чисел с плавающей запятой, вам нужно сами разработать формулы; они доступны по адресу Using quaternion rotations.
Насколько я могу судить, ссылка, которую вы предоставили, делает именно это, вы видите расширенные формулы там, и теперь вы знаете, откуда они пришли. Кроме того, связанное содержимое, по-видимому, измеряет гравитацию в g, т. Е. Гравитация равна [0,0, -1].
Следите за условными обозначениями (считаете ли вы гравитацию [0,0, -1] или [0,0,1]) и handedness of your coordinate systems!
очень информативно .. спасибо – dragsu
@dragsu Я рад, что это помогло! – Ali