From 9492839751b6972e757b0158a9bf0d589364bd16 Mon Sep 17 00:00:00 2001 From: Dinesh Atchuthan <datchuth@laas.fr> Date: Fri, 15 Dec 2017 14:40:19 +0100 Subject: [PATCH] added constraint_quaternion_absolute --- src/CMakeLists.txt | 1 + src/constraint_quaternion_absolute.h | 66 ++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/constraint_quaternion_absolute.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 93fe9bc18..f146f97a9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -253,6 +253,7 @@ SET(HDRS constraint_odom_3D.h constraint_point_2D.h constraint_point_to_line_2D.h + constraint_quaternion_absolute.h constraint_relative_2D_analytic.h feature_corner_2D.h feature_gps_fix.h diff --git a/src/constraint_quaternion_absolute.h b/src/constraint_quaternion_absolute.h new file mode 100644 index 000000000..60a1f8e09 --- /dev/null +++ b/src/constraint_quaternion_absolute.h @@ -0,0 +1,66 @@ +/** + * \file constraint_quaternion_absolute.h + * + * Created on: Dec 15, 2017 + * \author: AtDinesh + */ + +#ifndef CONSTRAINT_QUATERNION_ABSOLUTE_H_ +#define CONSTRAINT_QUATERNION_ABSOLUTE_H_ + +//Wolf includes +#include "constraint_autodiff.h" +#include "frame_base.h" + + +namespace wolf { + +WOLF_PTR_TYPEDEFS(ConstraintQuaternionAbsolute); + +//class +class ConstraintQuaternionAbsolute: public ConstraintAutodiff<ConstraintQuaternionAbsolute,3,4> +{ + public: + + ConstraintQuaternionAbsolute(StateBlockPtr _sb_ptr, bool _apply_loss_function = false, ConstraintStatus _status = CTR_ACTIVE) : + ConstraintAutodiff<ConstraintQuaternionAbsolute,3,4>(CTR_BLOCK_ABS, nullptr, nullptr, nullptr, nullptr, nullptr, _apply_loss_function, _status, _sb_ptr) + { + setType("FIX Q"); + } + + virtual ~ConstraintQuaternionAbsolute() = default; + + template<typename T> + bool operator ()(const T* const _o, T* _residuals) const; + + virtual JacobianMethod getJacobianMethod() const override + { + return JAC_AUTO; + } + +}; + +template<typename T> +inline bool ConstraintQuaternionAbsolute::operator ()(const T* const _o, T* _residuals) const +{ + + // states + Eigen::Quaternion<T> q(_o); + + // measurements + Eigen::Quaternions q_measured(getMeasurement().data() + 0); + + // error + Eigen::Matrix<T, 3, 1> er; + er = q2v(q.conjugate() * q_measured.cast<T>()); + + // residual + Eigen::Map<Eigen::Matrix<T, 3, 1>> res(_residuals); + res = getFeaturePtr()->getMeasurementSquareRootInformationUpper().cast<T>() * er; + + return true; +} + +} // namespace wolf + +#endif -- GitLab