如何使用wiimote加速度计计算重力?

时间:2010-11-10 20:43:33

标签: c# accelerometer wiimote gravity

对于一个项目,我和我的团队一直在尝试使用内置的加速度计和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的旋转时,偏航是相同的。

我们发现欧拉角可能是我们的答案,但我们不确定如何恰当地使用它们。如果对此新开发项目有任何意见或任何其他建议,请给予他们。

2 个答案:

答案 0 :(得分:2)

我敢打赌你的加速度计没有在零重力下校准,所以至少要消除重力的影响。

答案 1 :(得分:1)

首先我建议不要使用单独的组件来存储旋转(万向节锁定),矩阵可以更好地工作。保持静止并测量校准(向下1g)。然后对于每次旋转,由它多次旋转矩阵。然后你可以知道哪个方向向上并从表示加速度的向量中减去1g的矩阵。我知道这没有多大意义,但我有点急,如果你有疑问,请添加评论。