diff --git a/src/feature_base.cpp b/src/feature_base.cpp index 71ceb69374d63928ebb379369273bfc9ef819a0b..09e9c0c79702bb8081c38ee3996f059192c9acec 100644 --- a/src/feature_base.cpp +++ b/src/feature_base.cpp @@ -107,10 +107,9 @@ void FeatureBase::setMeasurementInformation(const Eigen::MatrixXs & _meas_info) // set (ensuring symmetry) measurement_covariance_ = _meas_info.inverse().selfadjointView<Eigen::Upper>(); - WOLF_ASSERT_COVARIANCE_MATRIX(measurement_covariance_); // Avoid singular covariance - //avoidSingularCovariance(); + avoidSingularCovariance(); // compute square root information upper matrix measurement_sqrt_information_upper_ = computeSqrtUpper(_meas_info); @@ -145,12 +144,21 @@ void FeatureBase::avoidSingularCovariance() if (eigensolver.info() == Eigen::Success) { // All eigenvalues must be >= 0: - //std::cout << "pre\n" << measurement_covariance_ << std::endl; - if ((eigensolver.eigenvalues().array() < Constants::EPS).all()) + Scalar epsilon = Constants::EPS; + while ((eigensolver.eigenvalues().array() < Constants::EPS).any()) + { + std::cout << "----- any negative eigenvalue or too close to zero\n"; + std::cout << "previous eigenvalues: " << eigensolver.eigenvalues().transpose() << std::endl; + std::cout << "previous determinant: " << measurement_covariance_.determinant() << std::endl; measurement_covariance_= eigensolver.eigenvectors() * - eigensolver.eigenvalues().cwiseMax(Constants::EPS).asDiagonal() * + eigensolver.eigenvalues().cwiseMax(epsilon).asDiagonal() * eigensolver.eigenvectors().transpose(); - //std::cout << "post\n" << measurement_covariance_ << std::endl; + eigensolver.compute(measurement_covariance_); + std::cout << "epsilon used: " << epsilon << std::endl; + std::cout << "posterior eigenvalues: " << eigensolver.eigenvalues().transpose() << std::endl; + std::cout << "posterior determinant: " << measurement_covariance_.determinant() << std::endl; + epsilon *=10; + } } else WOLF_ERROR("Couldn't compute covariance eigen decomposition"); @@ -161,7 +169,7 @@ void FeatureBase::avoidSingularCovariance() measurement_covariance_ += Eigen::MatrixXs::Identity(measurement_covariance_.rows(), measurement_covariance_.cols()) * eps_scalar; // avoid singular covariance eps_scalar*=10; }*/ - assert(measurement_covariance_.determinant() > 0 && "Couldn't avoid singular covariance"); + WOLF_ASSERT_COVARIANCE_MATRIX(measurement_covariance_); } } // namespace wolf