Exemplo n.º 1
0
        void IAnimoji.SetLocal(Vector3 position, Quaternion rotation)
        {
            // Appliy Kalman Filter
            float[] z  = { position.x, position.y, position.z, rotation.x, rotation.y, rotation.z, rotation.w };
            float[] nz = filter.Update(z, Time.deltaTime);

            // kalman-filtered position
            Vector3 np = new Vector3(nz[0], nz[1], nz[2]);
            // kalman-filtered rotation
            Quaternion nr = new Quaternion(nz[3], nz[4], nz[5], nz[6]);

            this.transform.localPosition = (correction * np);
            this.transform.localRotation = iR * nr;
        }
Exemplo n.º 2
0
    void FixedUpdate()
    {
        /* Get current sample time */
        float T = Time.deltaTime;

        totalTime += T;

        if (totalTime - timerSensors >= SAMPLE_TIME_SENSORS)
        {
            /* Read sensors and update state estimator */
            ac.GetSensorMeasurements();

            /* Filter barometer measurements */
            altFilter.Update(ac.baroAltitude);

            timerSensors = totalTime;
        }

        if (totalTime - timerStateEstimation >= SAMPLE_TIME_KALMAN)
        {
            float T_KF = totalTime - timerStateEstimation;

            /* Update state estimate */
            kf.Update(ac.gyroQ, ac.accX, ac.accZ, ac.pitotVa, T_KF);

            timerStateEstimation = totalTime;
        }

        /* Get controller outputs */
        if (totalTime - timerCtrlAirspeed >= SAMPLE_TIME_CTRL_AIRSPEED)
        {
            float T_CTRL_AIRSPEED = totalTime - timerCtrlAirspeed;

            throttleSetting = piAirspeed.Update(airspeedSetpoint, kf.VaFilt, T_CTRL_AIRSPEED);

            timerCtrlAirspeed = totalTime;
        }

        if (totalTime - timerCtrlAltitude >= SAMPLE_TIME_CTRL_ALTITUDE)
        {
            float T_CTRL_ALTITUDE = totalTime - timerCtrlAltitude;

            pitchAngleSetpoint = piAltitude.Update(altitudeSetpoint, altFilter.output, T_CTRL_ALTITUDE);

            timerCtrlAltitude = totalTime;
        }

        if (totalTime - timerCtrlPitch >= SAMPLE_TIME_CTRL_PITCH)
        {
            float T_CTRL_PITCH = totalTime - timerCtrlPitch;

            piPitch.Update(pitchAngleSetpoint, kf.theta, T_CTRL_PITCH);

            timerCtrlPitch = totalTime;
        }

        /* Calculate elevator deflection */
        elevatorDeflection = -actElevator.Update(piPitch.output, T);

        /* Calculate engine thrust */
        engineThrust = engine.GetThrust(actEngine.Update(throttleSetting, T));

        /* Update aircraft state vector */
        ac.Update(engineThrust, elevatorDeflection, T);

        /* Update 3D position and view */
        trans.eulerAngles = new Vector3(-ac.acState[3] * RADTODEG, 0.0f, 0.0f);
        trans.position    = new Vector3(0.0f, ac.acState[5], ac.acState[4]);
        camTrans.position = trans.position + camOffset;

        /* Update GUI */
        UpdateGUI();

        /* Log data */
        if (csvLogging)
        {
            csv.AddLine(new string[] { totalTime.ToString("F6"),
                                       ac.acState[0].ToString("F6"), ac.acState[1].ToString("F6"), ac.acState[2].ToString("F6"), ac.acState[3].ToString("F6"), ac.acState[4].ToString("F6"), ac.acState[5].ToString("F6"),
                                       ac.GetAirspeed(ac.acState[0], ac.acState[1]).ToString("F6"), ac.GetAngleOfAttack(ac.acState[0], ac.acState[1]).ToString("F6"),
                                       kf.qFilt.ToString("F6"), kf.axFilt.ToString("F6"), kf.azFilt.ToString("F6"), kf.VaFilt.ToString("F6"), altFilter.output.ToString("F6"), kf.theta.ToString("F6"),
                                       elevatorDeflection.ToString("F6"), throttleSetting.ToString("F6"),
                                       airspeedSetpoint.ToString("F6"), pitchAngleSetpoint.ToString("F6"), altitudeSetpoint.ToString("F6") });
        }
    }