Directory: | ./ |
---|---|
File: | include/crocoddyl/multibody/residuals/com-position.hpp |
Date: | 2025-01-16 08:47:40 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 7 | 8 | 87.5% |
Branches: | 2 | 12 | 16.7% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /////////////////////////////////////////////////////////////////////////////// | ||
2 | // BSD 3-Clause License | ||
3 | // | ||
4 | // Copyright (C) 2021-2024, LAAS-CNRS, University of Edinburgh, | ||
5 | // Heriot-Watt University | ||
6 | // Copyright note valid unless otherwise stated in individual files. | ||
7 | // All rights reserved. | ||
8 | /////////////////////////////////////////////////////////////////////////////// | ||
9 | |||
10 | #ifndef CROCODDYL_MULTIBODY_RESIDUALS_COM_POSITION_HPP_ | ||
11 | #define CROCODDYL_MULTIBODY_RESIDUALS_COM_POSITION_HPP_ | ||
12 | |||
13 | #include "crocoddyl/core/residual-base.hpp" | ||
14 | #include "crocoddyl/multibody/data/multibody.hpp" | ||
15 | #include "crocoddyl/multibody/fwd.hpp" | ||
16 | #include "crocoddyl/multibody/states/multibody.hpp" | ||
17 | |||
18 | namespace crocoddyl { | ||
19 | |||
20 | /** | ||
21 | * @brief CoM position residual | ||
22 | * | ||
23 | * This residual function defines the CoM tracking as | ||
24 | * \f$\mathbf{r}=\mathbf{c}-\mathbf{c}^*\f$, where | ||
25 | * \f$\mathbf{c},\mathbf{c}^*\in~\mathbb{R}^3\f$ are the current and reference | ||
26 | * CoM position, respectively. Note that the dimension of the residual vector is | ||
27 | * obtained from 3. Furthermore, the Jacobians of the residual function are | ||
28 | * computed analytically. | ||
29 | * | ||
30 | * As described in `ResidualModelAbstractTpl()`, the residual value and its | ||
31 | * Jacobians are calculated by `calc` and `calcDiff`, respectively. | ||
32 | * | ||
33 | * \sa `ResidualModelAbstractTpl`, `calc()`, `calcDiff()`, `createData()` | ||
34 | */ | ||
35 | template <typename _Scalar> | ||
36 | class ResidualModelCoMPositionTpl : public ResidualModelAbstractTpl<_Scalar> { | ||
37 | public: | ||
38 | EIGEN_MAKE_ALIGNED_OPERATOR_NEW | ||
39 | |||
40 | typedef _Scalar Scalar; | ||
41 | typedef MathBaseTpl<Scalar> MathBase; | ||
42 | typedef ResidualModelAbstractTpl<Scalar> Base; | ||
43 | typedef ResidualDataCoMPositionTpl<Scalar> Data; | ||
44 | typedef StateMultibodyTpl<Scalar> StateMultibody; | ||
45 | typedef ResidualDataAbstractTpl<Scalar> ResidualDataAbstract; | ||
46 | typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract; | ||
47 | typedef typename MathBase::Vector3s Vector3s; | ||
48 | typedef typename MathBase::VectorXs VectorXs; | ||
49 | |||
50 | /** | ||
51 | * @brief Initialize the CoM position residual model | ||
52 | * | ||
53 | * @param[in] state State of the multibody system | ||
54 | * @param[in] cref Reference CoM position | ||
55 | * @param[in] nu Dimension of the control vector | ||
56 | */ | ||
57 | ResidualModelCoMPositionTpl(boost::shared_ptr<StateMultibody> state, | ||
58 | const Vector3s& cref, const std::size_t nu); | ||
59 | |||
60 | /** | ||
61 | * @brief Initialize the CoM position residual model | ||
62 | * | ||
63 | * The default `nu` value is obtained from `StateAbstractTpl::get_nv()`. | ||
64 | * | ||
65 | * @param[in] state State of the multibody system | ||
66 | * @param[in] cref Reference CoM position | ||
67 | */ | ||
68 | ResidualModelCoMPositionTpl(boost::shared_ptr<StateMultibody> state, | ||
69 | const Vector3s& cref); | ||
70 | virtual ~ResidualModelCoMPositionTpl(); | ||
71 | |||
72 | /** | ||
73 | * @brief Compute the CoM position residual | ||
74 | * | ||
75 | * @param[in] data CoM position residual data | ||
76 | * @param[in] x State point \f$\mathbf{x}\in\mathbb{R}^{ndx}\f$ | ||
77 | * @param[in] u Control input \f$\mathbf{u}\in\mathbb{R}^{nu}\f$ | ||
78 | */ | ||
79 | virtual void calc(const boost::shared_ptr<ResidualDataAbstract>& data, | ||
80 | const Eigen::Ref<const VectorXs>& x, | ||
81 | const Eigen::Ref<const VectorXs>& u); | ||
82 | |||
83 | /** | ||
84 | * @brief Compute the derivatives of the CoM position residual | ||
85 | * | ||
86 | * @param[in] data CoM position residual data | ||
87 | * @param[in] x State point \f$\mathbf{x}\in\mathbb{R}^{ndx}\f$ | ||
88 | * @param[in] u Control input \f$\mathbf{u}\in\mathbb{R}^{nu}\f$ | ||
89 | */ | ||
90 | virtual void calcDiff(const boost::shared_ptr<ResidualDataAbstract>& data, | ||
91 | const Eigen::Ref<const VectorXs>& x, | ||
92 | const Eigen::Ref<const VectorXs>& u); | ||
93 | virtual boost::shared_ptr<ResidualDataAbstract> createData( | ||
94 | DataCollectorAbstract* const data); | ||
95 | |||
96 | /** | ||
97 | * @brief Return the CoM position reference | ||
98 | */ | ||
99 | const Vector3s& get_reference() const; | ||
100 | |||
101 | /** | ||
102 | * @brief Modify the CoM position reference | ||
103 | */ | ||
104 | void set_reference(const Vector3s& cref); | ||
105 | |||
106 | /** | ||
107 | * @brief Print relevant information of the com-position residual | ||
108 | * | ||
109 | * @param[out] os Output stream object | ||
110 | */ | ||
111 | virtual void print(std::ostream& os) const; | ||
112 | |||
113 | protected: | ||
114 | using Base::nu_; | ||
115 | using Base::state_; | ||
116 | using Base::u_dependent_; | ||
117 | using Base::v_dependent_; | ||
118 | |||
119 | private: | ||
120 | Vector3s cref_; //!< Reference CoM position | ||
121 | }; | ||
122 | |||
123 | template <typename _Scalar> | ||
124 | struct ResidualDataCoMPositionTpl : public ResidualDataAbstractTpl<_Scalar> { | ||
125 | EIGEN_MAKE_ALIGNED_OPERATOR_NEW | ||
126 | |||
127 | typedef _Scalar Scalar; | ||
128 | typedef MathBaseTpl<Scalar> MathBase; | ||
129 | typedef ResidualDataAbstractTpl<Scalar> Base; | ||
130 | typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract; | ||
131 | typedef typename MathBase::Matrix3xs Matrix3xs; | ||
132 | |||
133 | template <template <typename Scalar> class Model> | ||
134 | 9538 | ResidualDataCoMPositionTpl(Model<Scalar>* const model, | |
135 | DataCollectorAbstract* const data) | ||
136 | 9538 | : Base(model, data) { | |
137 | // Check that proper shared data has been passed | ||
138 | 9538 | DataCollectorMultibodyTpl<Scalar>* d = | |
139 |
1/2✓ Branch 0 taken 9538 times.
✗ Branch 1 not taken.
|
9538 | dynamic_cast<DataCollectorMultibodyTpl<Scalar>*>(shared); |
140 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 9538 times.
|
9538 | if (d == NULL) { |
141 | ✗ | throw_pretty( | |
142 | "Invalid argument: the shared data should be derived from " | ||
143 | "DataCollectorMultibody"); | ||
144 | } | ||
145 | |||
146 | // Avoids data casting at runtime | ||
147 | 9538 | pinocchio = d->pinocchio; | |
148 | 9538 | } | |
149 | |||
150 | pinocchio::DataTpl<Scalar>* pinocchio; //!< Pinocchio data | ||
151 | using Base::r; | ||
152 | using Base::Ru; | ||
153 | using Base::Rx; | ||
154 | using Base::shared; | ||
155 | }; | ||
156 | |||
157 | } // namespace crocoddyl | ||
158 | |||
159 | /* --- Details -------------------------------------------------------------- */ | ||
160 | /* --- Details -------------------------------------------------------------- */ | ||
161 | /* --- Details -------------------------------------------------------------- */ | ||
162 | #include "crocoddyl/multibody/residuals/com-position.hxx" | ||
163 | |||
164 | #endif // CROCODDYL_MULTIBODY_RESIDUALS_COM_POSITION_HPP_ | ||
165 |