Example #1
0
        public void CalculatePose(RTVector3 accel, RTVector3 mag, double magDeclination)
        {
            RTQuaternion m;
            RTQuaternion q = new RTQuaternion();

            if (EnableAccel)
            {
                accel.AccelToEuler(out mMeasuredPose);
            }
            else
            {
                mMeasuredPose   = mFusionPose;
                mMeasuredPose.Z = 0;
            }

            if (EnableMag && mMagValid)
            {
                q.FromEuler(mMeasuredPose);
                m = new RTQuaternion(0, mag.X, mag.Y, mag.Z);
                m = q * m * q.Conjugate();
                mMeasuredPose.Z = -Math.Atan2(m.Y, m.X) - magDeclination;
            }
            else
            {
                mMeasuredPose.Z = mFusionPose.Z;
            }

            mMeasuredQPose.FromEuler(mMeasuredPose);

            //  check for quaternion aliasing. If the quaternion has the wrong sign
            //  the filter will be very unhappy.

            int    maxIndex = -1;
            double maxVal   = -1000;

            for (int i = 0; i < 4; i++)
            {
                if (Math.Abs(mMeasuredQPose.data(i)) > maxVal)
                {
                    maxVal   = Math.Abs(mMeasuredQPose.data(i));
                    maxIndex = i;
                }
            }

            //  if the biggest component has a different sign in the measured and kalman poses,
            //  change the sign of the measured pose to match.

            if (((mMeasuredQPose.data(maxIndex) < 0) && (mFusionQPose.data(maxIndex) > 0)) ||
                ((mMeasuredQPose.data(maxIndex) > 0) && (mFusionQPose.data(maxIndex) < 0)))
            {
                mMeasuredQPose.Scalar = -mMeasuredQPose.Scalar;
                mMeasuredQPose.X      = -mMeasuredQPose.X;
                mMeasuredQPose.Y      = -mMeasuredQPose.Y;
                mMeasuredQPose.Z      = -mMeasuredQPose.Z;
                mMeasuredQPose.ToEuler(out mMeasuredPose);
            }
        }
Example #2
0
        public void CalculatePose(RTVector3 accel, RTVector3 mag, double magDeclination)
        {
            RTQuaternion m;
            RTQuaternion q = new RTQuaternion();

            if (EnableAccel) {
                accel.AccelToEuler(out mMeasuredPose);
            } else {
                mMeasuredPose = mFusionPose;
                mMeasuredPose.Z = 0;
            }

            if (EnableMag && mMagValid) {
                q.FromEuler(mMeasuredPose);
                m = new RTQuaternion(0, mag.X, mag.Y, mag.Z);
                m = q * m * q.Conjugate();
                mMeasuredPose.Z = -Math.Atan2(m.Y, m.X) - magDeclination;
            } else {
                mMeasuredPose.Z = mFusionPose.Z;
            }

            mMeasuredQPose.FromEuler(mMeasuredPose);

            //  check for quaternion aliasing. If the quaternion has the wrong sign
            //  the filter will be very unhappy.

            int maxIndex = -1;
            double maxVal = -1000;

            for (int i = 0; i < 4; i++) {
                if (Math.Abs(mMeasuredQPose.data(i)) > maxVal) {
                    maxVal = Math.Abs(mMeasuredQPose.data(i));
                    maxIndex = i;
                }
            }

            //  if the biggest component has a different sign in the measured and kalman poses,
            //  change the sign of the measured pose to match.

            if (((mMeasuredQPose.data(maxIndex) < 0) && (mFusionQPose.data(maxIndex) > 0)) ||
                    ((mMeasuredQPose.data(maxIndex) > 0) && (mFusionQPose.data(maxIndex) < 0))) {
                mMeasuredQPose.Scalar = -mMeasuredQPose.Scalar;
                mMeasuredQPose.X = -mMeasuredQPose.X;
                mMeasuredQPose.Y = -mMeasuredQPose.Y;
                mMeasuredQPose.Z = -mMeasuredQPose.Z;
                mMeasuredQPose.ToEuler(out mMeasuredPose);
            }
        }