aligator  0.14.0
A primal-dual augmented Lagrangian-type solver for nonlinear 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>
17using is_pinocchio_lie_group = std::is_base_of<pin::LieGroupBase<G>, G>;
18
21template <typename _LieGroup>
23 : public ManifoldAbstractTpl<typename _LieGroup::Scalar> {
24public:
25 using LieGroup = _LieGroup;
26 using Scalar = typename LieGroup::Scalar;
30 "LieGroup template argument should be a subclass of "
31 "pinocchio::LieGroupBase.");
32
36 : lg_(lg) {}
38 : lg_(std::move(lg)) {}
41
42 template <typename... Args>
43 PinocchioLieGroup(Args &&...args)
44 : lg_(std::forward<Args>(args)...) {}
45
46 operator LieGroup() { return lg_; }
47
48 inline int nx() const { return lg_.nq(); }
49 inline int ndx() const { return lg_.nv(); }
50
51 bool isNormalized(const ConstVectorRef &x) const {
52 if (x.size() < nx())
53 return false;
54 return lg_.isNormalized(x);
55 }
56
57protected:
59
60 void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
61 VectorRef out) const {
62 lg_.integrate(x, v, out);
63 }
64
65 void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
66 VectorRef vout) const {
67 lg_.difference(x0, x1, vout);
68 }
69
70 void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v,
71 MatrixRef Jout, int arg) const {
72 switch (arg) {
73 case 0:
74 lg_.dIntegrate_dq(x, v, Jout);
75 break;
76 case 1:
77 lg_.dIntegrate_dv(x, v, Jout);
78 break;
79 }
80 }
81
82 void JintegrateTransport_impl(const ConstVectorRef &x,
83 const ConstVectorRef &v, MatrixRef Jout,
84 int arg) const {
85 lg_.dIntegrateTransport(x, v, Jout, pin::ArgumentPosition(arg));
86 }
87
88 void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1,
89 MatrixRef Jout, int arg) const {
90 switch (arg) {
91 case 0:
92 lg_.dDifference(x0, x1, Jout, pin::ARG0);
93 break;
94 case 1:
95 lg_.dDifference(x0, x1, Jout, pin::ARG1);
96 break;
97 }
98 }
99
100 virtual void interpolate_impl(const ConstVectorRef &x0,
101 const ConstVectorRef &x1, const Scalar &u,
102 VectorRef out) const {
103 lg_.interpolate(x0, x1, u, out);
104 }
105
106 virtual void neutral_impl(VectorRef out) const { out = lg_.neutral(); }
107
108 virtual void rand_impl(VectorRef out) const { out = lg_.random(); }
109};
110
111template <int D, typename Scalar>
113
114template <int D, typename Scalar>
116
117} // namespace aligator
Main package namespace.
PinocchioLieGroup< pin::SpecialEuclideanOperationTpl< D, Scalar > > SETpl
std::is_base_of< pin::LieGroupBase< G >, G > is_pinocchio_lie_group
PinocchioLieGroup< pin::SpecialOrthogonalOperationTpl< D, Scalar > > SOTpl
Base class for manifolds, to use in cost funcs, solvers...
Wrap a Pinocchio Lie group into a ManifoldAbstractTpl object.
int nx() const
Get manifold representation dimension.
int ndx() const
Get manifold tangent space dimension.
typename LieGroup::Scalar Scalar
void Jintegrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
virtual void interpolate_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, const Scalar &u, VectorRef out) const
PinocchioLieGroup(PinocchioLieGroup &&lg)=default
ManifoldAbstractTpl< Scalar > Base
void integrate_impl(const ConstVectorRef &x, const ConstVectorRef &v, VectorRef out) const
Perform the manifold integration operation.
virtual void neutral_impl(VectorRef out) const
void Jdifference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, MatrixRef Jout, int arg) const
virtual void rand_impl(VectorRef out) const
void JintegrateTransport_impl(const ConstVectorRef &x, const ConstVectorRef &v, MatrixRef Jout, int arg) const
PinocchioLieGroup(const PinocchioLieGroup &lg)=default
PinocchioLieGroup(const LieGroup &lg)
bool isNormalized(const ConstVectorRef &x) const
Check if the input vector x is a viable element of the manifold.
void difference_impl(const ConstVectorRef &x0, const ConstVectorRef &x1, VectorRef vout) const
Implementation of the manifold retraction operation.