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

10-13 06:49