internal override void ProcessNewImuReadings(ref SensorReadings imuReadings)
        {
            SampleNumber++;

            Gyro = EnableGyro && imuReadings.GyroValid
                ? (Vector3?)imuReadings.Gyro
                : null;

            Acceleration = EnableAcceleration && imuReadings.AccelerationValid
                ? (Vector3?)imuReadings.Acceleration
                : null;

            MagneticField = EnableMagneticField && imuReadings.MagneticFieldValid
                ? (Vector3?)imuReadings.MagneticField
                : null;

            LastFusionTime = imuReadings.Timestamp;
            CalculatePose(Acceleration, MagneticField, CompassAdjDeclination);

            //  initialize the poses
            StateQ.FromEuler(MeasuredPose);
            FusionQPose = StateQ;
            FusionPose  = MeasuredPose;

            imuReadings.FusionPoseValid  = true;
            imuReadings.FusionQPoseValid = true;
            imuReadings.FusionPose       = FusionPose;
            imuReadings.FusionQPose      = FusionQPose;
        }
Example #2
0
        internal override void ProcessNewImuReadings(ref ImuSensorReadings imuReadings)
        {
            SampleNumber++;

            Gyro = EnableGyro && imuReadings.GyroValid
                ? (Vector3?)imuReadings.Gyro
                : null;

            Acceleration = EnableAcceleration && imuReadings.AccelerationValid
                ? (Vector3?)imuReadings.Acceleration
                : null;

            MagneticField = EnableMagneticField && imuReadings.MagneticFieldValid
                ? (Vector3?)imuReadings.MagneticField
                : null;

            if (FirstTime)
            {
                LastFusionTime = imuReadings.Timestamp;
                CalculatePose(Acceleration, MagneticField, CompassAdjDeclination);

                //  initialize the poses

                StateQ.FromEuler(MeasuredPose);
                FusionQPose = StateQ;
                FusionPose  = MeasuredPose;
                FirstTime   = false;
            }
            else
            {
                TimeDelta = imuReadings.Timestamp - LastFusionTime;
                if (TimeDelta > TimeSpan.Zero)
                {
                    CalculatePose(Acceleration, MagneticField, CompassAdjDeclination);
                    Predict();
                    Update();
                    StateQ.ToEuler(out FusionPose);
                    FusionQPose = StateQ;
                }

                LastFusionTime = imuReadings.Timestamp;
            }

            imuReadings.FusionPoseValid  = true;
            imuReadings.FusionQPoseValid = true;
            imuReadings.FusionPose       = FusionPose;
            imuReadings.FusionQPose      = FusionQPose;
        }