Вопрос

Интересно, возможно ли, поскольку Wiimote оснащен 3 акселерометрами, преобразовать показания акселерометров в 3D-вектор.

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

То, что я хотел бы, - это полный 3D-вектор, который может быть преобразован в представление вращения кватерниона.

Это было полезно?

Решение

Размышляя об этом дальше, значения акселерометров являются компоненты вектора, которые я искал...Вам нужно только выразить кратчайшую дугу между опорным вектором и этим вектором в виде кватерниона.

Например, если accel является (нормализованным) вектором, содержащим значения акселерометра:

reference = Vector3(0, 0, 1)
axis = crossp(accel, reference)
angle = acos(dotp(accel, reference))
q = Quaternion::from_xyzr(axis, angle)
rotation_matrix = q.matrix()

Я выбрал {0, 0, 1} в качестве опорного вектора, потому что это значения акселерометров в "положении покоя" (обратите внимание на таблицу, указывающую на вас).

Это обеспечивает те же движения, что и преобразование тангажа / крена с помощью акселерометров X / Z, но без блокировки кардана в вертикальном положении.

Единственная проблема заключается в том, что вы не получаете информации о вращениях вокруг оси притяжения Земли...Я думаю, именно для этого и создан MotionPlus.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top