Если подумать, значения акселерометров являются компонентами вектора, который я искал... Вам нужно только выразить кратчайшую дугу между эталонным вектором и этим вектором в виде кватерниона.
Например, если 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} в качестве опорного вектора, потому что это значения акселерометров в «положении покоя» (Wiimote на столе, направленный на вас).
Это дает тот же тип движений, что и преобразование тангажа / крена акселерометров X / Z, но без блокировки карданного подвеса в вертикальных положениях.
Единственная проблема в том, что вы не получаете информацию о вращениях вокруг оси земного притяжения... Думаю, для этого и создан MotionPlus.
person
Luper Rouch
schedule
31.07.2009