void EKFTask(Quaternion u, float error, IDictionary <int, Vector3> z) { ArrayMat uStateMatrix = g(_stateMatrix, u); ArrayMat uVarianceCovarianceMatrix = _varianceCovarianceMatrix; uVarianceCovarianceMatrix.At(0, 0, error); uVarianceCovarianceMatrix.At(1, 1, error); uVarianceCovarianceMatrix.At(2, 2, error); uVarianceCovarianceMatrix.At(3, 3, error); foreach (KeyValuePair <int, Vector3> zit in z) { int ObservingKey = zit.Key; Vector3 ObservingValue = zit.Value; if (InitList[ObservingKey]) { Vector3 newVector = u * ObservingValue; uStateMatrix.At(4 + 3 * ObservingKey, 0, (double)newVector.x); uStateMatrix.At(5 + 3 * ObservingKey, 0, (double)newVector.y); uStateMatrix.At(6 + 3 * ObservingKey, 0, (double)newVector.z); uVarianceCovarianceMatrix.At(4 + 3 * ObservingKey, 4 + 3 * ObservingKey, (double)Mathf.Infinity); uVarianceCovarianceMatrix.At(5 + 3 * ObservingKey, 5 + 3 * ObservingKey, (double)Mathf.Infinity); uVarianceCovarianceMatrix.At(6 + 3 * ObservingKey, 6 + 3 * ObservingKey, (double)Mathf.Infinity); InitList[ObservingKey] = false; } Vector3 j = new Vector3((float)uStateMatrix.At(4 + 3 * ObservingKey, 0), (float)uStateMatrix.At(5 + 3 * ObservingKey, 0), (float)uStateMatrix.At(6 + 3 * ObservingKey, 0)); Vector3 hObservingValue = new Quaternion(-u.x, -u.y, -u.z, u.w) * j; ArrayMat hit = H(j, u) * FxJ(ObservingKey, MaxMapSize); ArrayMat kit = uVarianceCovarianceMatrix * hit.t() * (hit * uVarianceCovarianceMatrix * hit.t() + Q).inv(); Vector3 Difference = ObservingValue - hObservingValue; ArrayMat DifferenceMat = new ArrayMat(3, 1); DifferenceMat.At(0, 0, Difference.x); DifferenceMat.At(1, 0, Difference.y); DifferenceMat.At(2, 0, Difference.z); uStateMatrix = uStateMatrix + kit * DifferenceMat; } }