Go to the documentation of this file.
14 #include <Eigen/Dense>
19 template <
class TScalar,
int kN>
23 template <
class TScalar>
25 template <
class TScalar>
32 template <
class TScalar,
int kDim>
37 static int constexpr
kDof = kDim - 1;
40 using Params = Eigen::Vector<Scalar, kNumParams>;
41 using Tangent = Eigen::Vector<Scalar, kDof>;
56 -> sophus::Expected<Success> {
57 static const Scalar kThr = kEpsilon<Scalar>;
58 const Scalar squared_norm = unit_vector.squaredNorm();
60 if (!(abs(squared_norm - 1.0) <= kThr)) {
62 "unit vector ({}) is not of unit length.\n"
63 "Squared norm: {}, thr: {}",
64 unit_vector.transpose(),
68 return sophus::Expected<Success>{};
72 return matRx(params) * exp(delta);
77 return log((matRx(lhs_params).
transpose() * rhs_params).
eval());
81 return std::vector<Params>(
82 {Params::UnitX(), Params::UnitY(), -Params::UnitX(), -Params::UnitY()});
85 return std::vector<Params>(
86 {Params::Zero(), Params::Ones(), 2.0 * Params::UnitX()});
90 return std::vector<Tangent>({
92 0.01 * Tangent::UnitX(),
93 0.001 * Tangent::Ones(),
98 static auto matRx(
Params const& params)
99 -> Eigen::Matrix<Scalar, kNumParams, kNumParams> {
100 static Eigen::Vector<TScalar, kDim>
const kUnitX =
101 Eigen::Vector<TScalar, kDim>::UnitX();
102 if ((kUnitX - params).squaredNorm() < kEpsilon<Scalar>) {
103 return Eigen::Matrix<Scalar, kNumParams, kNumParams>::Identity();
105 Params v = params - kUnitX;
106 return Eigen::Matrix<Scalar, kNumParams, kNumParams>::Identity() -
107 2.0 * (v * v.transpose()) / v.squaredNorm();
113 Scalar theta = delta.norm();
114 params[0] = cos(theta);
115 params.template tail<kDof>() = sinc(theta) * delta;
122 static Tangent const kUnitX = Tangent::UnitX();
124 Tangent tail = params.template tail<kDof>();
125 Scalar theta = tail.norm();
127 if (abs(theta) < kEpsilon<Scalar>) {
128 return atan2(
Scalar(0.0), x) * kUnitX;
131 return (1.0 / theta) * atan2(theta, x) * tail;
137 if (abs(x) < kEpsilon<Scalar>) {
138 return 1.0 - (1.0 / 6.0) * (x * x);
146 template <
class TScalar,
int kN>
147 class UnitVector :
public linalg::UnitVectorImpl<TScalar, kN> {
151 static_assert(concepts::ManifoldImpl<Impl>);
153 static int constexpr
kDof = kN - 1;
156 using Params = Eigen::Vector<Scalar, kNumParams>;
159 -> Expected<UnitVector> {
162 unit_vector.vector_ = v;
168 if (!e_vec.has_value()) {
171 return e_vec.value();
195 void setParams(Eigen::Matrix<TScalar, kN, 1>
const& v)
const {
200 [[nodiscard]]
auto params() const ->
Eigen::Matrix<TScalar, kN, 1> const& {
204 [[nodiscard]]
auto vector() const ->
Eigen::Matrix<TScalar, kN, 1> const& {
209 [[nodiscard]]
auto ptr()
const {
return this->vector_.data(); }
214 template <concepts::Range TSequenceContainer>
216 size_t const len = std::distance(std::begin(range), std::end(range));
220 for (
auto const& m : range) {
230 Eigen::Matrix<TScalar, kN, 1> vector_;
#define SOPHUS_PANIC(...)
Definition: common.h:50
#define SOPHUS_ASSERT_GE(...)
Definition: common.h:42
static auto paramsExamples() -> std::vector< Params >
Definition: unit_vector.h:80
Definition: unit_vector.h:33
static constexpr int kDof
Definition: unit_vector.h:37
#define SOPHUS_ASSERT(...)
Definition: common.h:40
static auto fromVectorAndNormalize(Eigen::Matrix< TScalar, kN, 1 > const &v) -> UnitVector
Definition: unit_vector.h:180
static auto unitX() -> UnitVector< Scalar, kDim >
Definition: unit_vector.h:43
Definition: lie_group.h:14
Image MutImage, owning images types.
Definition: num_diff.h:20
TScalar Scalar
Definition: unit_vector.h:35
auto ptr() const
Definition: unit_vector.h:209
static constexpr int kNumParams
Definition: unit_vector.h:154
auto params() const -> Eigen::Matrix< TScalar, kN, 1 > const &
Definition: unit_vector.h:200
static constexpr int kNumParams
Definition: unit_vector.h:38
Eigen::Vector< Scalar, kNumParams > Params
Definition: unit_vector.h:156
auto ominus(UnitVector const &rhs_params) const -> Tangent
Definition: unit_vector.h:191
auto vector() const -> Eigen::Matrix< TScalar, kN, 1 > const &
Definition: unit_vector.h:204
static constexpr int kDof
Definition: unit_vector.h:153
Eigen::Vector< Scalar, kNumParams > Params
Definition: unit_vector.h:40
static auto ominus(Params const &lhs_params, Params const &rhs_params) -> Tangent
Definition: unit_vector.h:75
auto unsafeMutPtr()
Definition: unit_vector.h:208
#define SOPHUS_UNEXPECTED(...)
Definition: common.h:57
auto transpose(TPoint p)
Definition: vector_space.h:233
static auto areParamsValid(Params const &unit_vector) -> sophus::Expected< Success >
Definition: unit_vector.h:55
static auto unitZ() -> UnitVector< Scalar, kDim >
Definition: unit_vector.h:51
static auto unitY() -> UnitVector< Scalar, kDim >
Definition: unit_vector.h:47
static auto invalidParamsExamples() -> std::vector< Params >
Definition: unit_vector.h:84
static auto fromParams(Eigen::Matrix< TScalar, kN, 1 > const &v) -> UnitVector
Definition: unit_vector.h:166
static auto tryFromUnitVector(Eigen::Matrix< TScalar, kN, 1 > const &v) -> Expected< UnitVector >
Definition: unit_vector.h:158
static auto average(TSequenceContainer const &range) -> UnitVector
Definition: unit_vector.h:215
auto operator=(UnitVector const &) -> UnitVector &=default
Eigen::Vector< Scalar, kDof > Tangent
Definition: unit_vector.h:41
static auto fromUnitVector(Eigen::Matrix< TScalar, kN, 1 > const &v) -> UnitVector
Definition: unit_vector.h:175
concept Manifold
Definition: manifold.h:33
static auto tangentExamples() -> std::vector< Tangent >
Definition: unit_vector.h:89
auto eval(TPoint const &p)
Definition: vector_space.h:44
Eigen::Vector< Scalar, kDof > Tangent
Definition: unit_vector.h:155
#define SOPHUS_TRY(...)
Definition: common.h:55
auto oplus(Tangent const &delta) const -> UnitVector
Definition: unit_vector.h:185
void setParams(Eigen::Matrix< TScalar, kN, 1 > const &v) const
Definition: unit_vector.h:195
TScalar Scalar
Definition: unit_vector.h:149
static auto oplus(Params const ¶ms, Tangent const &delta) -> Params
Definition: unit_vector.h:71