aligator  0.15.0
A versatile and efficient C++ library for real-time constrained trajectory optimization.
Loading...
Searching...
No Matches
explicit-dynamics.hpp
Go to the documentation of this file.
1
3#pragma once
4
8
9#include <fmt/format.h>
10
11namespace aligator {
12using xyz::polymorphic;
13
18// are \f[ \bar{f}(x_k, u_k, x_{k+1}) = f(x_k, u_k) \ominus
19// x_{k+1}. \f]
21template <typename _Scalar> struct ExplicitDynamicsModelTpl {
22 using Scalar = _Scalar;
27 static constexpr bool is_explicit = true;
29 /// Constructor requires providing the next state's manifold.
30 ExplicitDynamicsModelTpl(const polymorphic<Manifold> &space, const int nu)
33 , nu(nu) {}
34
35 const Manifold &space() const { return *space_; }
36 const Manifold &space_next() const { return *space_next_; }
37
38 int nx1() const { return space_->nx(); }
39 int ndx1() const { return space_->ndx(); }
40 int nx2() const { return space_next_->nx(); }
41 int ndx2() const { return space_next_->ndx(); }
42
44 void virtual forward(const ConstVectorRef &x, const ConstVectorRef &u,
45 Data &data) const = 0;
46
48 void virtual dForward(const ConstVectorRef &x, const ConstVectorRef &u,
49 Data &data) const = 0;
50
51 virtual shared_ptr<Data> createData() const {
52 return std::make_shared<Data>(*this);
53 }
54
55 virtual ~ExplicitDynamicsModelTpl() = default;
56
57 polymorphic<Manifold> space_;
58 polymorphic<Manifold> space_next_;
59 int nu;
60};
61
64template <typename _Scalar> struct ExplicitDynamicsDataTpl {
65protected:
66 int ndx1, nu, ndx2;
67
68 ExplicitDynamicsDataTpl(int ndx1, int nu, int nx2, int ndx2)
69 : ndx1(ndx1)
70 , nu(nu)
71 , ndx2(ndx2)
72 , xnext_(nx2)
75 , Hxx_(ndx1, ndx1)
76 , Hxu_(ndx1, nu)
77 , Huu_(nu, nu) {
78 xnext_.setZero();
79 jac_buffer_.setZero();
80 Jtmp_xnext.setZero();
81 Hxx_.setZero();
82 Hxu_.setZero();
83 Huu_.setZero();
84 }
85
86public:
87 using Scalar = _Scalar;
91 VectorXs xnext_;
92 // Jacobians
93 MatrixXs jac_buffer_;
94 MatrixXs Jtmp_xnext;
95
96 // Vector-Hessian products
97 MatrixXs Hxx_;
98 MatrixXs Hxu_;
99 MatrixXs Huu_;
100
101 auto Jx() { return jac_buffer_.leftCols(ndx1); }
102 auto Jx() const { return jac_buffer_.leftCols(ndx1); }
103 auto Ju() { return jac_buffer_.rightCols(nu); }
104 auto Ju() const { return jac_buffer_.rightCols(nu); }
105
106 explicit ExplicitDynamicsDataTpl(const Model &model)
107 : ExplicitDynamicsDataTpl(model.ndx1(), model.nu, model.nx2(),
108 model.ndx2()) {
109 xnext_ = model.space().neutral();
110 }
111
112 virtual ~ExplicitDynamicsDataTpl() = default;
113
114 friend std::ostream &operator<<(std::ostream &oss,
115 const ExplicitDynamicsDataTpl &self) {
116 oss << "ExplicitDynamicsData { ";
117 oss << fmt::format("ndx: {:d}, ", self.ndx1);
118 oss << fmt::format("nu: {:d}", self.nu);
119 oss << " }";
120 return oss;
121 }
122};
123
124#ifdef ALIGATOR_ENABLE_TEMPLATE_INSTANTIATION
125extern template struct ExplicitDynamicsModelTpl<context::Scalar>;
126extern template struct ExplicitDynamicsDataTpl<context::Scalar>;
127#endif
128} // namespace aligator
Main package namespace.
Specific data struct for explicit dynamics ExplicitDynamicsModelTpl.
ExplicitDynamicsDataTpl(int ndx1, int nu, int nx2, int ndx2)
ExplicitDynamicsModelTpl< Scalar > Model
friend std::ostream & operator<<(std::ostream &oss, const ExplicitDynamicsDataTpl &self)
virtual ~ExplicitDynamicsDataTpl()=default
Explicit forward dynamics model .
virtual ~ExplicitDynamicsModelTpl()=default
virtual void forward(const ConstVectorRef &x, const ConstVectorRef &u, Data &data) const =0
Evaluate the forward discrete dynamics.
virtual shared_ptr< Data > createData() const
ExplicitDynamicsModelTpl(const polymorphic< Manifold > &space, const int nu)
Constructor requires providing the next state's manifold.
virtual void dForward(const ConstVectorRef &x, const ConstVectorRef &u, Data &data) const =0
Compute the Jacobians of the forward dynamics.
Base class for manifolds, to use in cost funcs, solvers...