diff --git a/include/core/factor/factor_block_difference.h b/include/core/factor/factor_block_difference.h index 22ec994a4338e9ff15e5b7457ae5aafce52e9f0e..8f62b63838d79c6a654c80120bff4e4a144f4098 100644 --- a/include/core/factor/factor_block_difference.h +++ b/include/core/factor/factor_block_difference.h @@ -26,8 +26,8 @@ class FactorBlockDifference : public FactorAnalytic SizeEigen sb1_constrained_size_; // the size of sb1 the state segment that is constrained SizeEigen sb2_constrained_start_; // the index of the first state element of sb2 that is constrained SizeEigen sb2_constrained_size_; // the size of sb2 the state segment that is constrained - Eigen::MatrixXd J1_; // Jacobian - Eigen::MatrixXd J2_; // Jacobian + Eigen::MatrixXd J_res_sb1_; // Jacobian + Eigen::MatrixXd J_res_sb2_; // Jacobian public: @@ -69,11 +69,11 @@ class FactorBlockDifference : public FactorAnalytic assert(sb1_constrained_size_ == sb2_constrained_size_); // precompute Jacobian (Identity with zero columns if the stateblock part is not constrained) - J1_ = Eigen::MatrixXd::Zero(sb1_constrained_size_,sb1_size_); - J1_.middleCols(sb1_constrained_start_,sb1_constrained_size_) = - Eigen::MatrixXd::Identity(sb1_constrained_size_,sb1_constrained_size_); + J_res_sb1_ = Eigen::MatrixXd::Zero(sb1_constrained_size_,sb1_size_); + J_res_sb1_.middleCols(sb1_constrained_start_,sb1_constrained_size_) = Eigen::MatrixXd::Identity(sb1_constrained_size_,sb1_constrained_size_); - J2_ = Eigen::MatrixXd::Zero(sb2_constrained_size_,sb2_size_); - J2_.middleCols(sb2_constrained_start_,sb1_constrained_size_) = Eigen::MatrixXd::Identity(sb2_constrained_size_,sb2_constrained_size_); + J_res_sb2_ = Eigen::MatrixXd::Zero(sb2_constrained_size_,sb2_size_); + J_res_sb2_.middleCols(sb2_constrained_start_,sb1_constrained_size_) = - Eigen::MatrixXd::Identity(sb2_constrained_size_,sb2_constrained_size_); } virtual ~FactorBlockDifference() = default; @@ -131,8 +131,8 @@ inline Eigen::VectorXd FactorBlockDifference::evaluateResiduals(const std::vecto assert(getMeasurement().size() == sb2_constrained_size_); // residual: meas -> measurement of the difference between partial stateblocks - return getMeasurementSquareRootInformationUpper() * ((_st_vector[1].segment(sb1_constrained_start_, sb1_constrained_size_) - - _st_vector[0].segment(sb2_constrained_start_, sb2_constrained_size_)) - getMeasurement()); + return getMeasurementSquareRootInformationUpper() * (getMeasurement() - (_st_vector[1].segment(sb2_constrained_start_, sb2_constrained_size_) + - _st_vector[0].segment(sb1_constrained_start_, sb1_constrained_size_))); } inline void FactorBlockDifference::evaluateJacobians(const std::vector<Eigen::Map<const Eigen::VectorXd> >& _st_vector, @@ -148,8 +148,8 @@ inline void FactorBlockDifference::evaluateJacobians(const std::vector<Eigen::Ma assert(_st_vector[1].size() >= getMeasurement().size() && "StateBlock size and measurement size should match"); // normalized jacobian - _jacobians[0] = getMeasurementSquareRootInformationUpper() * J1_; - _jacobians[1] = getMeasurementSquareRootInformationUpper() * J2_; + _jacobians[0] = getMeasurementSquareRootInformationUpper() * J_res_sb1_; + _jacobians[1] = getMeasurementSquareRootInformationUpper() * J_res_sb2_; } inline void FactorBlockDifference::evaluateJacobians(const std::vector<Eigen::Map<const Eigen::VectorXd>>& _st_vector, @@ -165,16 +165,16 @@ inline void FactorBlockDifference::evaluateJacobians(const std::vector<Eigen::Ma assert(_st_vector[1].size() >= getMeasurement().size() && "StateBlock size and measurement size should match"); // normalized jacobian - _jacobians[0] = getMeasurementSquareRootInformationUpper() * J1_; - _jacobians[1] = getMeasurementSquareRootInformationUpper() * J2_; + _jacobians[0] = getMeasurementSquareRootInformationUpper() * J_res_sb1_; + _jacobians[1] = getMeasurementSquareRootInformationUpper() * J_res_sb2_; } -inline void FactorBlockDifference::evaluatePureJacobians(std::vector<Eigen::MatrixXd>& jacobians) const +inline void FactorBlockDifference::evaluatePureJacobians(std::vector<Eigen::MatrixXd>& _pure_jacobians) const { - assert(jacobians.size() == 1 && "Wrong number of jacobians!"); + assert(_pure_jacobians.size() == 1 && "Wrong number of jacobians!"); - jacobians[0] = J1_; - jacobians[1] = J2_; + _pure_jacobians[0] = J_res_sb1_; + _pure_jacobians[1] = J_res_sb2_; } inline unsigned int FactorBlockDifference::getSize() const diff --git a/test/gtest_factor_block_difference.cpp b/test/gtest_factor_block_difference.cpp index 4585edaab87c4a94d23712cdafe9a7856c04510a..65adac95533d0e14f4a16697248daa84e0bc8bd5 100644 --- a/test/gtest_factor_block_difference.cpp +++ b/test/gtest_factor_block_difference.cpp @@ -202,10 +202,10 @@ TEST_F(FixtureFactorBlockDifference, DiffPyz) KF0_->getP()->setState(Vector3d::Random()); KF1_->getP()->setState(Vector3d::Random()); - // problem_->print(4,true,true,true); + problem_->print(4,true,true,true); std::string report = ceres_manager_->solve(SolverManager::ReportVerbosity::BRIEF); - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); + std::cout << report << std::endl; + problem_->print(4,true,true,true); ASSERT_MATRIX_APPROX(KF1_->getP()->getState().segment<2>(1) - KF0_->getP()->getState().segment<2>(1), diff, 1e-8); }