aligator  0.16.0
A versatile and efficient C++ library for real-time constrained trajectory optimization.
Loading...
Searching...
No Matches
pinocchio-groups.hpp
Go to the documentation of this file.
1
3#pragma once
4
6
7#include <pinocchio/multibody/liegroup/liegroup-base.hpp>
8#include <pinocchio/algorithm/joint-configuration.hpp>
9
10namespace aligator {
11
12namespace pin = pinocchio;
13
16template <typename G>
17inline constexpr bool is_pinocchio_lie_group =
18 std::is_base_of_v<pin::LieGroupBase<G>, G>;
19
22template <typename G, std::enable_if_t<is_pinocchio_lie_group<G>> * = nullptr>
23struct PinocchioLieGroup : ManifoldAbstractTpl<typename G::Scalar> {
24public:
25 using LieGroup = G;
26 using Scalar = typename LieGroup::Scalar;
28 using Base::ndx;
29 using Base::nx;
31
33
35 : Base(0, 0) {
36 this->nx_ = lg_.nq();
37 this->ndx_ = lg_.nv();
38 }
40 : Base(lg.nq(), lg.nv())
41 , lg_(lg) {}
44
45 template <typename... Args>
46 PinocchioLieGroup(Args &&...args)
47 : Base(0, 0)
48 , lg_(std::forward<Args>(args)...) {
49 this->nx_ = lg_.nq();
50 this->ndx_ = lg_.nv();
51 }
52
53 operator LieGroup() const { return lg_; }
54
55 bool isNormalized(const ConstVectorRef &x) const {
56 if (x.size() < nx())
57 return false;
58 return lg_.isNormalized(x);
59 }
60
61protected:
63
64 void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
65 VectorRef out) const {
66 lg_.integrate(x, v, out);
67 }
68
69 void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
70 VectorRef vout) const {
71 lg_.difference(x0, x1, vout);
72 }
73
74 void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
75 MatrixRef Jout, int arg) const {
76 switch (arg) {
77 case 0:
78 lg_.dIntegrate_dq(x, v, Jout);
79 break;
80 case 1:
81 lg_.dIntegrate_dv(x, v, Jout);
82 break;
83 }
84 }
85
86 void JintegrateTransport_impl(const ConstVectorRef &x,
87 const ConstVectorRef &v, MatrixRef Jout,
88 int arg) const {
89 lg_.dIntegrateTransport(x, v, Jout, pin::ArgumentPosition(arg));
90 }
91
92 void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
93 MatrixRef Jout, int arg) const {
94 switch (arg) {
95 case 0:
96 lg_.dDifference(x0, x1, Jout, pin::ARG0);
97 break;
98 case 1:
99 lg_.dDifference(x0, x1, Jout, pin::ARG1);
100 break;
101 }
102 }
103
104 virtual void interpolate_impl(const ConstVectorRef &x0,
105 const ConstVectorRef &x1, const Scalar &u,
106 VectorRef out) const {
107 lg_.interpolate(x0, x1, u, out);
108 }
109
110 virtual void neutral_impl(VectorRef out) const { out = lg_.neutral(); }
111
112 virtual void rand_impl(VectorRef out) const { out = lg_.random(); }
113};
114
115template <typename G> PinocchioLieGroup(const G &) -> PinocchioLieGroup<G>;
116
117template <int D, typename Scalar>
119
120template <int D, typename Scalar>
122
123} // namespace aligator
Main package namespace.
PinocchioLieGroup< pin::SpecialEuclideanOperationTpl< D, Scalar > > SETpl
constexpr bool is_pinocchio_lie_group
PinocchioLieGroup(const G &) -> PinocchioLieGroup< G >
PinocchioLieGroup< pin::SpecialOrthogonalOperationTpl< D, Scalar > > SOTpl
Wrap a Pinocchio Lie group into a ManifoldAbstractTpl object.
void JintegrateTransport_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, VectorRef out) const
Perform the manifold integration operation.
void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
PinocchioLieGroup(const PinocchioLieGroup &lg)=default
bool isNormalized(const ConstVectorRef &x) const
Check if the input vector x is a viable element of the manifold.
virtual void rand_impl(VectorRef out) const
virtual void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, const Scalar &u, VectorRef out) const
PinocchioLieGroup(PinocchioLieGroup &&lg)=default
virtual void neutral_impl(VectorRef out) const
ManifoldAbstractTpl< Scalar > Base
void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, MatrixRef Jout, int arg) const
void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, VectorRef vout) const
Implementation of the manifold retraction operation.
typename LieGroup::Scalar Scalar
PinocchioLieGroup(const LieGroup &lg)