我的团队和我正在尝试使用内置的加速度计和WiiMotion Plus陀螺仪在3D空间中跟踪Wiimote。
我们已经能够使用ODE(在http://www.alglib.net/找到)跟踪旋转和位置,但是我们遇到了从加速度计中去除重力分量的问题。
我们查看了Accelerometer gravity components,其中提供了公式(在C# / XNA中实现)。
private Vector3 RemoveGravityFactor(Vector3 accel)
{
float g = -1f;
float pitchAngle = (Rotation.Z);
float rollAngle = (Rotation.Y);
float yawAngle = (Rotation.X);
float x = (float)(g * Math.Sin(pitchAngle));
float y = (float)(-g * Math.Cos(pitchAngle) * Math.Sin(rollAngle));
float z = (float)(-g * Math.Cos(pitchAngle) * Math.Cos(rollAngle));
Vector3 offset = new Vector3(x, y, z);
accel = accel - offset;
return accel;
}
但它根本没有起作用。加速度是直接从加速计获得的,旋转是指经过常微分方程计算后以弧度测量的。
此外,我们对这个公式如何工作有疑问。由于我们的跟踪考虑了所有维度,为什么偏航角没有被考虑进去呢?
提前感谢任何提供帮助或建议的人。
编辑:
在与我的队友和老板讨论之后,我们发现如果我们正确使用 X、Y 和 Z,则该公式实际上可以起作用。不过我们又遇到了一个问题。
我们遇到的问题是,我们使用的 Wiimote 库基于陀螺仪运动返回相对旋转值。换句话说,如果按钮朝上,将 Wiimote 左右旋转就是偏航角,如果按钮朝向你,偏航角与整个 Wiimote 的旋转应该是相同的,但事实却不是这样。
我们发现欧拉角可能是我们的答案,但我们不确定如何恰当地使用它们。如果在这个新发展方面有任何建议或其他建议,请提出来。