对于一个项目,我和我的团队一直在尝试使用内置的加速度计和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工作之后以旋转角度测量旋转。
另外,我们在理解这个公式是如何工作方面遇到了问题。由于我们的跟踪考虑了所有维度,为什么不考虑Yaw?
提前感谢您提供的任何建议或帮助。
编辑:
在与我的队友和老板讨论之后,我们发现如果我们正确使用X,Y和Z,这个公式实际上会有效。我们来到另一个树桩了。
我们遇到的问题是我们使用的Wiimote库根据陀螺仪运动返回相对旋转值。换句话说,如果按钮朝上,左右旋转wiimote是偏航,如果按钮面向你,当它应该是整个wiimote的旋转时,偏航是相同的。
我们发现欧拉角可能是我们的答案,但我们不确定如何恰当地使用它们。如果对此新开发项目有任何意见或任何其他建议,请给予他们。
答案 0 :(得分:2)
我敢打赌你的加速度计没有在零重力下校准,所以至少要消除重力的影响。
答案 1 :(得分:1)
首先我建议不要使用单独的组件来存储旋转(万向节锁定),矩阵可以更好地工作。保持静止并测量校准(向下1g)。然后对于每次旋转,由它多次旋转矩阵。然后你可以知道哪个方向向上并从表示加速度的向量中减去1g的矩阵。我知道这没有多大意义,但我有点急,如果你有疑问,请添加评论。