对于一个项目,我的团队和我一直在尝试使用内置的加速度计和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;
}
但这根本不起作用。作为引用,加速度来自加速度计,是直的,旋转通过ODE后以弧度为单位进行测量。
另外,我们在理解此公式的工作方式时遇到了问题。由于我们的跟踪考虑了所有方面,为什么不考虑偏航?
在此先感谢您提供的任何建议或帮助。
编辑:
与我的队友和老板讨论之后,我们发现如果正确使用X,Y和Z,则此公式将真正起作用。不过,我们到了另一个树桩。
我们遇到的问题是,我们使用的Wiimote库基于陀螺仪的运动返回相对旋转值。换句话说,如果按钮朝上,则向左和向右旋转wiimote是偏航的;如果按钮朝向您,则当整个Wiimote旋转时,偏航是相同的。
我们发现欧拉角可能是我们的答案,但是我们不确定如何正确使用它们。如果对此新开发有任何意见或其他建议,请给他们。
最佳答案
我敢打赌,您的加速度计并未在零重力下进行校准,因此,至少要消除重力的影响将非常困难。
关于c# - 如何使用Wiimote加速度计解决重力问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4148877/