.. _program_listing_file_sophus_cartesian.hpp: Program Listing for File cartesian.hpp ====================================== |exhale_lsh| :ref:`Return to documentation for file ` (``sophus/cartesian.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include namespace Sophus { template class Cartesian; template using Cartesian2 = Cartesian; template using Cartesian3 = Cartesian; using Cartesian2d = Cartesian2; using Cartesian3d = Cartesian3; } // namespace Sophus namespace Eigen { namespace internal { template struct traits> { using Scalar = Scalar_; using ParamsType = Sophus::Vector; }; template struct traits, Options>> : traits> { using Scalar = Scalar_; using ParamsType = Map, Options>; }; template struct traits const, Options>> : traits const> { using Scalar = Scalar_; using ParamsType = Map const, Options>; }; } // namespace internal } // namespace Eigen namespace Sophus { // (M+1) x (M+1) homogeneous matrix: template class CartesianBase { public: using Scalar = typename Eigen::internal::traits::Scalar; using ParamsType = typename Eigen::internal::traits::ParamsType; static int constexpr DoF = M; static int constexpr num_parameters = M; static int constexpr N = M + 1; static int constexpr Dim = M; using Transformation = Sophus::Matrix; using Point = Sophus::Vector; using HomogeneousPoint = Sophus::Vector; using Line = ParametrizedLine; using Hyperplane = Eigen::Hyperplane; using Tangent = Sophus::Vector; using Adjoint = Matrix; template using ReturnScalar = typename Eigen::ScalarBinaryOpTraits< Scalar, typename OtherDerived::Scalar>::ReturnType; template using CartesianSum = Cartesian, M>; template using PointProduct = Sophus::Vector, M>; template using HomogeneousPointProduct = Sophus::Vector, N>; SOPHUS_FUNC Adjoint Adj() const { return Adjoint::Identity(); } template SOPHUS_FUNC Cartesian cast() const { return Cartesian(params().template cast()); } SOPHUS_FUNC Matrix Dx_this_mul_exp_x_at_0() const { Sophus::Matrix m; m.setIdentity(); return m; } SOPHUS_FUNC Matrix Dx_log_this_inv_by_x_at_this() const { Matrix m; m.setIdentity(); return m; } SOPHUS_FUNC Cartesian inverse() const { return Cartesian(-params()); } SOPHUS_FUNC Tangent log() const { return params(); } SOPHUS_FUNC Transformation matrix() const { Sophus::Matrix matrix; matrix.setIdentity(); matrix.col(M).template head() = params(); return matrix; } template SOPHUS_FUNC CartesianBase& operator=( CartesianBase const& other) { params() = other.params(); return *this; } template SOPHUS_FUNC CartesianSum operator*( CartesianBase const& other) const { return CartesianSum(params() + other.params()); } template ::value>::type> SOPHUS_FUNC PointProduct operator*( Eigen::MatrixBase const& p) const { return PointProduct(params() + p); } template ::value>::type> SOPHUS_FUNC HomogeneousPointProduct operator*( Eigen::MatrixBase const& p) const { const auto rp = *this * p.template head(); HomogeneousPointProduct r; r << rp, p(M); return r; } SOPHUS_FUNC Line operator*(Line const& l) const { return Line((*this) * l.origin(), l.direction()); } SOPHUS_FUNC Hyperplane operator*(Hyperplane const& p) const { return Hyperplane(p.normal(), p.offset() - params().dot(p.normal())); } template >::value>::type> SOPHUS_FUNC CartesianBase& operator*=( CartesianBase const& other) { *static_cast(this) = *this * other; return *this; } SOPHUS_FUNC ParamsType& params() { return static_cast(this)->params(); } SOPHUS_FUNC ParamsType const& params() const { return static_cast(this)->params(); } }; template class Cartesian : public CartesianBase, M> { using Base = CartesianBase, M>; public: static int constexpr DoF = Base::DoF; static int constexpr num_parameters = Base::num_parameters; static int constexpr N = Base::N; static int constexpr Dim = Base::Dim; using Scalar = Scalar_; using Transformation = typename Base::Transformation; using Point = typename Base::Point; using HomogeneousPoint = typename Base::HomogeneousPoint; using Tangent = typename Base::Tangent; using ParamsMember = Sophus::Vector; using Base::operator=; SOPHUS_FUNC Cartesian& operator=(Cartesian const& other) = default; EIGEN_MAKE_ALIGNED_OPERATOR_NEW SOPHUS_FUNC Cartesian() { params_.setZero(); } SOPHUS_FUNC Cartesian(Cartesian const& other) = default; template SOPHUS_FUNC Cartesian(CartesianBase const& other) : params_(other.params()) { static_assert(std::is_same::value, "must be same Scalar type"); } template explicit SOPHUS_FUNC Cartesian(Eigen::MatrixBase const& m) { static_assert( std::is_same::Scalar, Scalar>::value, ""); if (m.rows() == DoF && m.cols() == 1) { // trick so this compiles params_ = m.template block(0, 0); } else if (m.rows() == N && m.cols() == N) { params_ = m.template block(0, M); } else { SOPHUS_ENSURE(false, "{} {}", m.rows(), m.cols()); } } SOPHUS_FUNC Scalar* data() { return params_.data(); } SOPHUS_FUNC Scalar const* data() const { return params_.data(); } SOPHUS_FUNC static Sophus::Matrix Dx_exp_x_at_0() { Sophus::Matrix m; m.setIdentity(); return m; } SOPHUS_FUNC static Sophus::Matrix Dx_exp_x( Tangent const&) { return Dx_exp_x_at_0(); } SOPHUS_FUNC static Sophus::Matrix Dx_exp_x_times_point_at_0( Point const&) { Sophus::Matrix J; J.setIdentity(); return J; } SOPHUS_FUNC static Transformation Dxi_exp_x_matrix_at_0(int i) { return generator(i); } SOPHUS_FUNC ParamsMember& params() { return params_; } SOPHUS_FUNC ParamsMember const& params() const { return params_; } SOPHUS_FUNC static Transformation generator(int i) { SOPHUS_ENSURE(i >= 0 && i <= M, "i should be in range [0,M-1]."); Tangent e; e.setZero(); e[i] = Scalar(1); return hat(e); } // from the M-vector. SOPHUS_FUNC static Cartesian exp(Tangent const& a) { return Cartesian(a); } SOPHUS_FUNC static Transformation hat(Tangent const& a) { Transformation Omega; Omega.setZero(); Omega.col(M).template head() = a.template head(); return Omega; } SOPHUS_FUNC static Tangent lieBracket(Tangent const&, Tangent const&) { return Tangent::Zero(); } template static Cartesian sampleUniform(UniformRandomBitGenerator& generator) { std::uniform_real_distribution uniform(Scalar(-1), Scalar(1)); Vector v; for (int i = 0; i < M; ++i) { v[i] = uniform(generator); } return Cartesian(v); } SOPHUS_FUNC static Tangent vee(Transformation const& m) { return m.col(M).template head(); } protected: ParamsMember params_; }; } // namespace Sophus namespace Eigen { template class Map, Options> : public Sophus::CartesianBase, Options>, M> { public: using Base = Sophus::CartesianBase, Options>, M>; using Scalar = Scalar_; using Transformation = typename Base::Transformation; using Point = typename Base::Point; using HomogeneousPoint = typename Base::HomogeneousPoint; using Tangent = typename Base::Tangent; using Base::operator=; using Base::operator*=; using Base::operator*; SOPHUS_FUNC explicit Map(Scalar* coeffs) : params_(coeffs) {} SOPHUS_FUNC Map>& params() { return params_; } SOPHUS_FUNC Map> const& params() const { return params_; } protected: Map, Options> params_; }; template class Map const, Options> : public Sophus::CartesianBase< Map const, Options>, M> { public: using Base = Sophus::CartesianBase const, Options>, M>; using Scalar = Scalar_; using Transformation = typename Base::Transformation; using Point = typename Base::Point; using HomogeneousPoint = typename Base::HomogeneousPoint; using Tangent = typename Base::Tangent; using Base::operator*; SOPHUS_FUNC Map(Scalar const* coeffs) : params_(coeffs) {} SOPHUS_FUNC Map const, Options> const& params() const { return params_; } protected: Map const, Options> const params_; }; } // namespace Eigen