예제 #1
0
        /// <summary>
        /// Update the EKF.
        /// 更新
        /// </summary>
        /// <param name="q">Q.</param>
        /// <param name="error">Error.</param>
        /// <param name="points">Points.</param>
        /// <param name="callback">Callback.</param>
        public IEnumerator UpdateEnumerator(Quaternion q, float error, Dictionary <int, Vector3> points)
        {
            _updateStatus = true;
            int nowSize      = StateMatrix.rows();
            int N            = (nowSize - 4) / 3;
            Mat uStateMatrix = g(StateMatrix, q);
            Mat uVarianceCovarianceMatrix = G(N) * VarianceCovarianceMatrix * GT(N) + FxT(N) * R(error) * Fx(N);

            yield return(null);

            Mat        I = Mat.eye(nowSize, nowSize, Type);
            Quaternion uStateMatrix_q = new Quaternion((float)uStateMatrix.get(0, 0)[0], (float)uStateMatrix.get(1, 0)[0], (float)uStateMatrix.get(2, 0)[0], (float)uStateMatrix.get(3, 0)[0]);

            foreach (int pointID in points.Keys)
            {
                Vector3    ZT             = points[pointID];
                Vector3    uStateMatrix_j = new Vector3((float)uStateMatrix.get(4 + pointID * 3, 0)[0], (float)uStateMatrix.get(4 + pointID * 3 + 1, 0)[0], (float)uStateMatrix.get(4 + pointID * 3 + 2, 0)[0]);
                Quaternion qi             = new Quaternion(-uStateMatrix_q.x, -uStateMatrix_q.y, -uStateMatrix_q.z, uStateMatrix_q.w);
                Vector3    ZTH            = qi * uStateMatrix_j;
                Mat        h      = H(uStateMatrix_j, uStateMatrix_q) * FxJ(pointID, N);
                Mat        K      = uVarianceCovarianceMatrix * h.t() * (h * uVarianceCovarianceMatrix * h.t() + Q).inv();
                Mat        deltaZ = Mat.zeros(3, 3, Type);
                deltaZ = deltaZ.resize(3, 1);
                deltaZ.put(0, 0, (double)(ZT.x - ZTH.x));
                deltaZ.put(1, 0, (double)(ZT.y - ZTH.y));
                deltaZ.put(2, 0, (double)(ZT.z - ZTH.z));
                uStateMatrix = uStateMatrix + K * deltaZ;
                uVarianceCovarianceMatrix = (I - K * h) * uVarianceCovarianceMatrix;
                yield return(null);
            }
            _stateMatrix = uStateMatrix;
            _varianceCovarianceMatrix = uVarianceCovarianceMatrix;
            _updateStatus             = false;
        }
예제 #2
0
        /// <summary>
        /// Add the EKF.
        /// 追加
        /// </summary>
        /// <param name="q">Q.</param>
        /// <param name="error">Error.</param>
        /// <param name="points">Points.</param>
        /// <param name="Descriptors">Descriptors.</param>
        public IEnumerator AddEnumerator(Quaternion q, float error, IList <Vector3> points, MatOfFloat Descriptors)
        {
            _updateStatus = true;
            if (points.Count != Descriptors.rows())
            {
                throw new OutLookARException("KeyVectorとDescriptorsの数が合いません");
            }
            int nowSize     = StateMatrix.rows();
            int N           = (nowSize - 4) / 3;
            int pointsCount = points.Count;
            int newSize     = nowSize + pointsCount * 3;

            Mat uStateMatrix = g(StateMatrix, q);

            uStateMatrix = uStateMatrix.resize(newSize);
            yield return(null);

            Mat uVarianceCovarianceMatrix = G(N) * VarianceCovarianceMatrix * GT(N) + FxT(N) * R(error) * Fx(N);

            uVarianceCovarianceMatrix = uVarianceCovarianceMatrix.resize(newSize, newSize);
            for (int i = 0; i < pointsCount; i++)
            {
                for (int c = 0; c < 3; c++)
                {
                    uVarianceCovarianceMatrix.put(nowSize + c + 3 * i, nowSize + c + 3 * i, Infinite);
                }
                yield return(null);
            }
            Mat        I = Mat.eye(newSize, newSize, Type);
            Quaternion uStateMatrix_q = new Quaternion((float)uStateMatrix.get(0, 0)[0], (float)uStateMatrix.get(1, 0)[0], (float)uStateMatrix.get(2, 0)[0], (float)uStateMatrix.get(3, 0)[0]);
            int        j = N + 1;

            foreach (Vector3 point in points)
            {
                Vector3 uStateMatrix_j = uStateMatrix_q * point;
                uStateMatrix.put(j * 3 + 1, 0, uStateMatrix_j.x);
                uStateMatrix.put(j * 3 + 2, 0, uStateMatrix_j.y);
                uStateMatrix.put(j * 3 + 3, 0, uStateMatrix_j.z);
                Mat h = H(uStateMatrix_j, uStateMatrix_q) * FxJ(j, N + pointsCount);
                Mat K = uVarianceCovarianceMatrix * h.t() * (h * uVarianceCovarianceMatrix * h.t() + Q).inv();
                uVarianceCovarianceMatrix = (I - K * h) * uVarianceCovarianceMatrix;

                yield return(null);

                j++;
            }
            _stateMatrix = uStateMatrix;
            _varianceCovarianceMatrix = uVarianceCovarianceMatrix;
            _stateDescriptors.Add(Descriptors);
            _updateStatus = false;
        }
예제 #3
0
        /// <summary>
        /// Add the EKF.
        /// 追加
        /// </summary>
        /// <param name="q">Q.</param>
        /// <param name="error">Error.</param>
        /// <param name="points">Points.</param>
        public void Add(Quaternion q, float error, IList <Vector3> points)
        {
            _updateStatus = true;
            int nowSize     = StateMatrix.rows();
            int N           = (nowSize - 4) / 3;
            int pointsCount = points.Count;
            int newSize     = nowSize + pointsCount * 3;

            Mat uStateMatrix = g(StateMatrix, q);

            uStateMatrix = uStateMatrix.resize(newSize);

            Mat uVarianceCovarianceMatrix = G(N) * VarianceCovarianceMatrix * GT(N) + FxT(N) * R(error) * Fx(N);

            uVarianceCovarianceMatrix = uVarianceCovarianceMatrix.resize(newSize, newSize);
            for (int i = 0; i < pointsCount; i++)
            {
                for (int c = 0; c < 3; c++)
                {
                    uVarianceCovarianceMatrix.put(nowSize + c + 3 * i, nowSize + c + 3 * i, Infinite);
                }
            }
            Mat        I = Mat.eye(newSize, newSize, Type);
            Quaternion uStateMatrix_q = new Quaternion((float)uStateMatrix.get(0, 0)[0], (float)uStateMatrix.get(1, 0)[0], (float)uStateMatrix.get(2, 0)[0], (float)uStateMatrix.get(3, 0)[0]);
            int        j = N + 1;

            foreach (Vector3 point in points)
            {
                Vector3 uStateMatrix_j = uStateMatrix_q * point;
                uStateMatrix.put(j * 3 + 1, 0, uStateMatrix_j.x);
                uStateMatrix.put(j * 3 + 2, 0, uStateMatrix_j.y);
                uStateMatrix.put(j * 3 + 3, 0, uStateMatrix_j.z);
                Mat h = H(uStateMatrix_j, uStateMatrix_q) * FxJ(j, N + pointsCount);
                Mat K = uVarianceCovarianceMatrix * h.t() * (h * uVarianceCovarianceMatrix * h.t() + Q).inv();
                uVarianceCovarianceMatrix = (I - K * h) * uVarianceCovarianceMatrix;
                j++;
            }
            _stateMatrix = uStateMatrix;
            _varianceCovarianceMatrix = uVarianceCovarianceMatrix;
            _updateStatus             = false;
        }