10

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

我们发现欧拉角可能是我们的答案,但我们不确定如何正确使用它们。如果对这一新发展有任何意见或任何其他建议,请给他们。

4

2 回答 2

2

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

于 2010-11-10T20:46:58.100 回答
1

首先,我建议不要使用单个组件来存储旋转(万向节锁),矩阵会更好。通过保持静止并测量来校准(它将向下 1g)。然后对于每次旋转,将旋转矩阵乘以它。然后你可以知道哪条路是向上的,然后从代表加速度的向量中减去一个向下 1g 的矩阵。我知道这没有多大意义,但我有点着急,如果您有问题,请添加评论。

于 2010-11-10T21:07:22.817 回答