From 9b59f5d54f848710b8d7d0f3307e824546cd61fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Fri, 15 Jan 2021 21:42:14 +0100 Subject: [PATCH] Make FactorOdom2dCloseloop inherit from FactorRelativePose2d --- .../core/factor/factor_odom_2d_closeloop.h | 90 +++---------------- 1 file changed, 14 insertions(+), 76 deletions(-) diff --git a/include/core/factor/factor_odom_2d_closeloop.h b/include/core/factor/factor_odom_2d_closeloop.h index 16f1d6770..bee96e573 100644 --- a/include/core/factor/factor_odom_2d_closeloop.h +++ b/include/core/factor/factor_odom_2d_closeloop.h @@ -2,103 +2,41 @@ #define FACTOR_ODOM_2d_CLOSELOOP_H_ //Wolf includes -#include "core/factor/factor_autodiff.h" -#include "core/frame/frame_base.h" -#include "core/math/rotations.h" - -//#include "ceres/jet.h" +#include "core/factor/factor_relative_pose_2d.h" +#include <Eigen/StdVector> namespace wolf { WOLF_PTR_TYPEDEFS(FactorOdom2dCloseloop); //class -class FactorOdom2dCloseloop : public FactorAutodiff<FactorOdom2dCloseloop, 3, 2, 1, 2, 1> +class FactorOdom2dCloseloop : public FactorRelativePose2d { public: FactorOdom2dCloseloop(const FeatureBasePtr& _ftr_ptr, - const FrameBasePtr& _frame_other_ptr, - const ProcessorBasePtr& _processor_ptr = nullptr, - bool _apply_loss_function = false, FactorStatus _status = FAC_ACTIVE) : - FactorAutodiff<FactorOdom2dCloseloop, 3, 2, 1, 2, 1>("FactorOdom2dCloseloop", - _ftr_ptr, - _frame_other_ptr, nullptr, nullptr, nullptr, - _processor_ptr, - _apply_loss_function, _status, - _frame_other_ptr->getP(), - _frame_other_ptr->getO(), - _ftr_ptr->getFrame()->getP(), - _ftr_ptr->getFrame()->getO()) + const FrameBasePtr& _frame_ptr, + const ProcessorBasePtr& _processor_ptr, + bool _apply_loss_function, + FactorStatus _status = FAC_ACTIVE) : + FactorRelativePose2d("FactorOdom2dCloseloop", + _ftr_ptr, + _frame_ptr, + _processor_ptr, + _apply_loss_function, + _status) { // } - virtual ~FactorOdom2dCloseloop() = default; + ~FactorOdom2dCloseloop() override = default; std::string getTopology() const override { return std::string("LOOP"); } - - template<typename T> - bool operator ()(const T* const _p1, const T* const _o1, const T* const _p2, const T* const _o2, - T* _residuals) const; - - public: - static FactorBasePtr create(const FeatureBasePtr& _feature_ptr, const NodeBasePtr& _correspondant_ptr, const ProcessorBasePtr& _processor_ptr) - { - return std::make_shared<FactorOdom2dCloseloop>(_feature_ptr, std::static_pointer_cast<FrameBase>(_correspondant_ptr), _processor_ptr); - } - }; -template<typename T> -inline bool FactorOdom2dCloseloop::operator ()(const T* const _p1, const T* const _o1, const T* const _p2, - const T* const _o2, T* _residuals) const -{ - - // MAPS - Eigen::Map<Eigen::Matrix<T,3,1> > res(_residuals); - Eigen::Map<const Eigen::Matrix<T,2,1> > p1(_p1); - Eigen::Map<const Eigen::Matrix<T,2,1> > p2(_p2); - T o1 = _o1[0]; - T o2 = _o2[0]; - Eigen::Matrix<T, 3, 1> expected_measurement; - Eigen::Matrix<T, 3, 1> er; // error - - // Expected measurement - expected_measurement.head(2) = Eigen::Rotation2D<T>(-o1) * (p2 - p1); - expected_measurement(2) = o2 - o1; - - // Error - er = expected_measurement - getMeasurement().cast<T>(); - er(2)=pi2pi(er(2)); - - // Residuals - res = getMeasurementSquareRootInformationUpper().cast<T>() * er; - - //////////////////////////////////////////////////////// - // print Jacobian. Uncomment this as you wish (remember to uncomment #include "ceres/jet.h" above): -// using ceres::Jet; -// Eigen::MatrixXd J(3,6); -// J.row(0) = ((Jet<double, 6>)(er(0))).v; -// J.row(1) = ((Jet<double, 6>)(er(1))).v; -// J.row(2) = ((Jet<double, 6>)(er(2))).v; -// J.row(0) = ((Jet<double, 6>)(res(0))).v; -// J.row(1) = ((Jet<double, 6>)(res(1))).v; -// J.row(2) = ((Jet<double, 6>)(res(2))).v; -// if (sizeof(er(0)) != sizeof(double)) -// { -// std::cout << "FactorOdom2dCloseloop::Jacobian(c" << id() << ") = \n " << J << std::endl; -// std::cout << "FactorOdom2dCloseloop::Weighted Jacobian(c" << id() << ") = \n " << J << std::endl; -// std::cout << "FactorOdom2dCloseloop::Sqrt Info(c" << id() << ") = \n" << getMeasurementSquareRootInformationUpper() << std::endl; -// } - //////////////////////////////////////////////////////// - - return true; -} - } // namespace wolf #endif -- GitLab