对于一个项目,我和我的团队一直在尝试使用内置加速度计和 WiiMotion Plus 陀螺仪在 3D 空间中跟踪 wiimote。
我们已经能够使用 ODE(可在http://www.alglib.net/找到)跟踪旋转和位置,但我们遇到了从加速度计中移除重力分量的问题。
我们查看了具有公式的加速度计重力分量(在 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;
}
但它根本不起作用。作为参考,加速度直接来自加速度计,旋转在通过 ODE 后以弧度测量。
此外,我们在理解这个公式的工作原理方面遇到了问题。由于我们的跟踪考虑了所有维度,为什么不考虑 Yaw?
提前感谢您提供的任何建议或帮助。
编辑:
在与我的队友和老板讨论之后,我们发现如果我们正确使用 X、Y 和 Z,这个公式实际上会起作用。不过,我们来到了另一个树桩。
我们遇到的问题是,我们使用的 Wiimote 库会根据陀螺仪的运动返回相对旋转值。换句话说,如果按钮朝上,左右旋转wiimote就是yaw,如果按钮朝向你,yaw应该是整个wiimote的旋转。
我们发现欧拉角可能是我们的答案,但我们不确定如何正确使用它们。如果对这一新发展有任何意见或任何其他建议,请给他们。