diff --git a/src/modules/local_position_estimator/sensors/flow.cpp b/src/modules/local_position_estimator/sensors/flow.cpp index c500b34aca..67079b72d1 100644 --- a/src/modules/local_position_estimator/sensors/flow.cpp +++ b/src/modules/local_position_estimator/sensors/flow.cpp @@ -168,14 +168,18 @@ void BlockLocalPositionEstimator::flowCorrect() // residual Vector r = y - C * _x; + + // residual covariance + Matrix S = C * _P * C.transpose()) + R; + + // publish innovations _pub_innov.get().flow_innov[0] = r(0); _pub_innov.get().flow_innov[1] = r(1); - _pub_innov.get().flow_innov_var[0] = R(0, 0); - _pub_innov.get().flow_innov_var[1] = R(1, 1); + _pub_innov.get().flow_innov_var[0] = S(0, 0); + _pub_innov.get().flow_innov_var[1] = S(1, 1); // residual covariance, (inverse) - Matrix S_I = - inv(C * _P * C.transpose() + R); + Matrix S_I = inv(C); // fault detection float beta = (r.transpose() * (S_I * r))(0, 0); diff --git a/src/modules/local_position_estimator/sensors/gps.cpp b/src/modules/local_position_estimator/sensors/gps.cpp index 945196d47f..da900faadb 100644 --- a/src/modules/local_position_estimator/sensors/gps.cpp +++ b/src/modules/local_position_estimator/sensors/gps.cpp @@ -167,7 +167,6 @@ void BlockLocalPositionEstimator::gpsCorrect() var_vz = gps_s_stddev * gps_s_stddev; } - R(0, 0) = var_xy; R(1, 1) = var_xy; R(2, 2) = var_z; @@ -185,12 +184,17 @@ void BlockLocalPositionEstimator::gpsCorrect() // residual Vector r = y - C * x0; + // residual covariance + Matrix S = C * _P * C.transpose()) + R; + + // publish innovations for (int i = 0; i < 6; i ++) { _pub_innov.get().vel_pos_innov[i] = r(i); - _pub_innov.get().vel_pos_innov_var[i] = R(i, i); + _pub_innov.get().vel_pos_innov_var[i] = S(i, i); } - Matrix S_I = inv(C * _P * C.transpose() + R); + // residual covariance, (inverse) + Matrix S_I = inv(C); // fault detection float beta = (r.transpose() * (S_I * r))(0, 0); diff --git a/src/modules/local_position_estimator/sensors/lidar.cpp b/src/modules/local_position_estimator/sensors/lidar.cpp index 6b55c03140..29d08fedd3 100644 --- a/src/modules/local_position_estimator/sensors/lidar.cpp +++ b/src/modules/local_position_estimator/sensors/lidar.cpp @@ -85,11 +85,14 @@ void BlockLocalPositionEstimator::lidarCorrect() R(0, 0) = cov; } - // residual - Matrix S_I = inv((C * _P * C.transpose()) + R); - Vector r = y - C * _x; + // residual covariance + Matrix S = C * _P * C.transpose()) + R; + // residual covariance, (inverse) + Matrix S_I = inv(C); + + // publish innovations _pub_innov.get().hagl_innov = r(0); - _pub_innov.get().hagl_innov_var = R(0, 0); + _pub_innov.get().hagl_innov_var = S(0, 0); // fault detection float beta = (r.transpose() * (S_I * r))(0, 0); diff --git a/src/modules/local_position_estimator/sensors/mocap.cpp b/src/modules/local_position_estimator/sensors/mocap.cpp index 027af444b8..5c04afad60 100644 --- a/src/modules/local_position_estimator/sensors/mocap.cpp +++ b/src/modules/local_position_estimator/sensors/mocap.cpp @@ -74,8 +74,22 @@ void BlockLocalPositionEstimator::mocapCorrect() R(Y_mocap_z, Y_mocap_z) = mocap_p_var; // residual - Matrix S_I = inv((C * _P * C.transpose()) + R); - Matrix r = y - C * _x; + Vector r = y - C * _x; + // residual covariance + Matrix S = C * _P * C.transpose()) + R; + + // publish innovations + for (int i = 0; i < 3; i ++) { + _pub_innov.get().vel_pos_innov[i] = r(i); + _pub_innov.get().vel_pos_innov_var[i] = S(i, i); + } + for (int i = 3; i < 6; i ++) { + _pub_innov.get().vel_pos_innov[i] = 0; + _pub_innov.get().vel_pos_innov_var[i] = 1; + } + + // residual covariance, (inverse) + Matrix S_I = inv(C); // fault detection float beta = (r.transpose() * (S_I * r))(0, 0); diff --git a/src/modules/local_position_estimator/sensors/sonar.cpp b/src/modules/local_position_estimator/sensors/sonar.cpp index 2eaebcc69d..7d12daf4c9 100644 --- a/src/modules/local_position_estimator/sensors/sonar.cpp +++ b/src/modules/local_position_estimator/sensors/sonar.cpp @@ -105,12 +105,15 @@ void BlockLocalPositionEstimator::sonarCorrect() // residual Vector r = y - C * _x; + // residual covariance + Matrix S = C * _P * C.transpose()) + R; + + // publish innovations _pub_innov.get().hagl_innov = r(0); - _pub_innov.get().hagl_innov_var = R(0, 0); + _pub_innov.get().hagl_innov_var = S(0, 0); // residual covariance, (inverse) - Matrix S_I = - inv(C * _P * C.transpose() + R); + Matrix S_I = inv(C); // fault detection float beta = (r.transpose() * (S_I * r))(0, 0); @@ -149,5 +152,3 @@ void BlockLocalPositionEstimator::sonarCheckTimeout() } } } - -