aligator  0.15.0
A versatile and efficient C++ library for real-time constrained trajectory optimization.
Loading...
Searching...
No Matches
tangent-bundle.hpp
Go to the documentation of this file.
1#pragma once
2
4
5namespace aligator {
6
8template <class Base>
9struct TangentBundleTpl : ManifoldAbstractTpl<typename Base::Scalar> {
10protected:
11 Base base_;
12
13public:
15 using Scalar = typename Base::Scalar;
16 static constexpr int Options = Base::Options;
20 using ManifoldBase::nx;
21
23 TangentBundleTpl(const Base &base)
24 : ManifoldBase(base.nx() + base.ndx(), 2 * base.ndx())
25 , base_(base) {}
26
28 template <typename... BaseCtorArgs>
29 TangentBundleTpl(BaseCtorArgs... args)
30 : ManifoldBase(0, 0)
31 , base_(args...) {
32 this->nx_ = base_.nx() + base_.ndx();
33 this->ndx_ = 2 * base_.ndx();
34 }
35
36 bool isNormalized(const ConstVectorRef &x) const {
37 auto p = getBasePoint(x);
38 return base_.isNormalized(p);
39 }
40
41 const Base &getBaseSpace() const { return base_; }
42
45 template <typename Point>
46 typename Point::ConstSegmentReturnType
47 getBasePoint(const Eigen::MatrixBase<Point> &x) const {
48 return x.head(base_.nx());
49 }
50
51 template <typename Point>
52 typename Point::SegmentReturnType
53 getBasePointWrite(const Eigen::MatrixBase<Point> &x) const {
54 return x.const_cast_derived().head(base_.nx());
55 }
56
57 template <typename Tangent>
58 typename Tangent::ConstSegmentReturnType
59 getBaseTangent(const Tangent &v) const {
60 return v.head(base_.ndx());
61 }
62
63 template <typename Tangent>
64 typename Tangent::SegmentReturnType
65 getTangentHeadWrite(const Eigen::MatrixBase<Tangent> &v) const {
66 return v.const_cast_derived().head(base_.ndx());
67 }
68
69 template <typename Jac>
70 Eigen::Block<Jac, Eigen::Dynamic, Eigen::Dynamic>
71 getBaseJacobian(const Eigen::MatrixBase<Jac> &J) const {
72 return J.const_cast_derived().topLeftCorner(base_.ndx(), base_.ndx());
73 }
74
75protected:
77
78 void neutral_impl(VectorRef out) const;
79 void rand_impl(VectorRef out) const;
80
81 void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &dx,
82 VectorRef out) const;
83
84 void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
85 VectorRef out) const;
86
87 void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
88 MatrixRef Jout, int arg) const;
89
90 void JintegrateTransport_impl(const ConstVectorRef &x,
91 const ConstVectorRef &v, MatrixRef Jout,
92 int arg) const;
93
94 void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
95 MatrixRef Jout, int arg) const;
96
97 void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
98 const Scalar &u, VectorRef out) const;
99};
100
101} // namespace aligator
102
103#include "aligator/modelling/spaces/tangent-bundle.hxx"
Main package namespace.
void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, MatrixRef Jout, int arg) const
Point::SegmentReturnType getBasePointWrite(const Eigen::MatrixBase< Point > &x) const
void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, const Scalar &u, VectorRef out) const
Interpolation operation.
typename Base::Scalar Scalar
TangentBundleTpl(BaseCtorArgs... args)
Constructor using base space constructor.
void rand_impl(VectorRef out) const
Tangent::SegmentReturnType getTangentHeadWrite(const Eigen::MatrixBase< Tangent > &v) const
void neutral_impl(VectorRef out) const
void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &dx, VectorRef out) const
Perform the manifold integration operation.
int nx() const
Get manifold representation dimension.
const Base & getBaseSpace() const
Point::ConstSegmentReturnType getBasePoint(const Eigen::MatrixBase< Point > &x) const
void JintegrateTransport_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
bool isNormalized(const ConstVectorRef &x) const
Check if the input vector x is a viable element of the manifold.
void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
int ndx() const
Get manifold tangent space dimension.
Eigen::Block< Jac, Eigen::Dynamic, Eigen::Dynamic > getBaseJacobian(const Eigen::MatrixBase< Jac > &J) const
ManifoldAbstractTpl< Scalar > ManifoldBase
void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, VectorRef out) const
Implementation of the manifold retraction operation.
TangentBundleTpl(const Base &base)
Constructor using base space instance.
static constexpr int Options
TangentBundleTpl< Base > Self
Tangent::ConstSegmentReturnType getBaseTangent(const Tangent &v) const