aligator 0.19.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_v =
19
22template <typename LieGroup_>
23struct PinocchioLieGroup : ManifoldAbstractTpl<typename LieGroup_::Scalar> {
24public:
25 using LieGroup = LieGroup_;
27 using Scalar = typename LieGroup::Scalar;
29 using Base::ndx;
30 using Base::nx;
32
34
36 : Base(0, 0) {
37 this->nx_ = lg_.nq();
38 this->ndx_ = lg_.nv();
39 }
41 : Base(lg.nq(), lg.nv())
42 , lg_(lg) {}
45
46 template <typename... Args>
47 PinocchioLieGroup(Args &&...args)
48 : Base(0, 0)
49 , lg_(std::forward<Args>(args)...) {
50 this->nx_ = lg_.nq();
51 this->ndx_ = lg_.nv();
52 }
53
54 operator LieGroup() const { return lg_; }
55 LieGroup lieGroup() const { return lg_; }
56
57 bool isNormalized(const ConstVectorRef &x) const {
58 if (x.size() < nx())
59 return false;
60 return lg_.isNormalized(x);
61 }
62
63protected:
65
66 void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
67 VectorRef out) const {
68 lg_.integrate(x, v, out);
69 }
70
71 void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
72 VectorRef vout) const {
73 lg_.difference(x0, x1, vout);
74 }
75
76 void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
77 MatrixRef Jout, int arg) const {
78 switch (arg) {
79 case 0:
80 lg_.dIntegrate_dq(x, v, Jout);
81 break;
82 case 1:
83 lg_.dIntegrate_dv(x, v, Jout);
84 break;
85 }
86 }
87
88 void JintegrateTransport_impl(const ConstVectorRef &x,
89 const ConstVectorRef &v, MatrixRef Jout,
90 int arg) const {
91 lg_.dIntegrateTransport(x, v, Jout, pin::ArgumentPosition(arg));
92 }
93
94 void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
95 MatrixRef Jout, int arg) const {
96 switch (arg) {
97 case 0:
98 lg_.dDifference(x0, x1, Jout, pin::ARG0);
99 break;
100 case 1:
101 lg_.dDifference(x0, x1, Jout, pin::ARG1);
102 break;
103 }
104 }
105
106 virtual void interpolate_impl(const ConstVectorRef &x0,
107 const ConstVectorRef &x1, const Scalar &u,
108 VectorRef out) const {
109 lg_.interpolate(x0, x1, u, out);
110 }
111
112 virtual void neutral_impl(VectorRef out) const { out = lg_.neutral(); }
113
114 virtual void rand_impl(VectorRef out) const { out = lg_.random(); }
115};
116
117template <typename G> PinocchioLieGroup(const G &) -> PinocchioLieGroup<G>;
118
119template <int D, typename Scalar>
121
122template <int D, typename Scalar>
124
125} // namespace aligator
Main package namespace.
constexpr bool is_pinocchio_lie_group_v
PinocchioLieGroup< pin::SpecialEuclideanOperationTpl< D, Scalar > > SETpl
constexpr bool is_tpl_base_of_v
Definition math.hpp:69
PinocchioLieGroup(const G &) -> PinocchioLieGroup< G >
PinocchioLieGroup< pin::SpecialOrthogonalOperationTpl< D, Scalar > > SOTpl
Wrap a Pinocchio Lie group into a ManifoldAbstractTpl object.
PinocchioLieGroup(PinocchioLieGroup &&lg)=default
void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
virtual void rand_impl(VectorRef out) const
ManifoldAbstractTpl< Scalar > Base
void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, VectorRef vout) const
Implementation of the manifold retraction operation.
PinocchioLieGroup(const PinocchioLieGroup &lg)=default
typename LieGroup::Scalar Scalar
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.
virtual void neutral_impl(VectorRef out) const
PinocchioLieGroup(const LieGroup &lg)
void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, MatrixRef Jout, int arg) const
bool isNormalized(const ConstVectorRef &x) const
Check if the input vector x is a viable element of the manifold.
virtual void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, const Scalar &u, VectorRef out) const