如何在IMU中使用IMU的局部方向来操纵对象的全局方向?

时间:2019-04-22 13:27:29

标签: c# unity3d quaternions imu

我有一个IMU(惯性测量单位),我以它自己的局部坐标系(图中的LT)表示的四元数方向接收它的方向。我想将此方向转换为在全局坐标系中表示的方向。我发现了一种方法,可以通过在两个不同位置使用来自IMU的重力矢量,在此示例中,将IMU固定在大腿上,并使用重力矢量直立(Gstand)和就座(Gsit)。然后将它们用于创建全局坐标系。现在,本地四元数可以全局表示。

imu

我想使用此方向来设置对象在Unity中的方向。换句话说,我希望能够在任何给定的世界起始方向上模仿IMU的方向。

这是Unity中的代码(我知道它并不整洁,但现在我只希望它能工作)。当IMU处于“站立位置”时,我按s,然后将imu放下并按l。我回到站姿,按空格开始。

    // Update is called once per frame
    void Update() {

        //calibrate standing position
        if (Input.GetKeyDown(KeyCode.S))
        {
            Zvector = -gravity; //gravity Vector3 from IMU
            gravitystand = gravity;
        }

        //calibrate lying position and create Q to global;
        if (Input.GetKeyDown(KeyCode.L))
        {
            gravitylying = gravity;
            Yvector = Vector3.Cross(gravitystand, gravitylying).normalized;
            Xvector = Vector3.Cross(Zvector, Xvector);
            Qglobal = Quaternion.LookRotation(-Xvector, Zvector);
        }

        //set starting position
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Qstart1 = Qimu1; //Qimu1 Quaternion in local from IMU
        }

        //Get orientation relative to starting position
        Qrelative1 = Qstart1 * Quaternion.Inverse(Qimu1);

        //Get orientation in global and use to rotate object
        Quaternion Qdef1 = Qglobal * Qrelative1;
        transform.rotation = Qdef1;

它没有按我预期的那样工作。根据初始起始位置,轴会反转甚至有时会改变。也许与Quaternion.LookRotation有关?我尝试在此函数中更改向量(向前,向上),但到目前为止没有结果。还是我在这里做错了什么?

0 个答案:

没有答案