Crocoddyl
Loading...
Searching...
No Matches
centroidal-momentum.hpp
1
2// BSD 3-Clause License
3//
4// Copyright (C) 2021-2026, LAAS-CNRS, University of Edinburgh,
5// Heriot-Watt University
6// Copyright note valid unless otherwise stated in individual files.
7// All rights reserved.
9
10#ifndef CROCODDYL_MULTIBODY_RESIDUALS_MOMENTUM_HPP_
11#define CROCODDYL_MULTIBODY_RESIDUALS_MOMENTUM_HPP_
12
13#include "crocoddyl/core/residual-base.hpp"
14#include "crocoddyl/core/utils/conversions.hpp"
15#include "crocoddyl/multibody/data/multibody.hpp"
16#include "crocoddyl/multibody/fwd.hpp"
17#include "crocoddyl/multibody/states/multibody.hpp"
18
19namespace crocoddyl {
20
36template <typename _Scalar>
38 : public ResidualModelAbstractTpl<_Scalar> {
39 public:
40 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
42
43 typedef _Scalar Scalar;
44 typedef MathBaseTpl<Scalar> MathBase;
47 typedef StateMultibodyTpl<Scalar> StateMultibody;
48 typedef ResidualDataAbstractTpl<Scalar> ResidualDataAbstract;
49 typedef ActivationModelAbstractTpl<Scalar> ActivationModelAbstract;
50 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
51 typedef typename MathBase::Vector6s Vector6s;
52 typedef typename MathBase::VectorXs VectorXs;
53 typedef typename MathBase::Matrix6xs Matrix6xs;
54
62 ResidualModelCentroidalMomentumTpl(std::shared_ptr<StateMultibody> state,
63 const Vector6s& href,
64 const std::size_t nu);
65
74 ResidualModelCentroidalMomentumTpl(std::shared_ptr<StateMultibody> state,
75 const Vector6s& href);
76 virtual ~ResidualModelCentroidalMomentumTpl() = default;
77
85 virtual void calc(const std::shared_ptr<ResidualDataAbstract>& data,
86 const Eigen::Ref<const VectorXs>& x,
87 const Eigen::Ref<const VectorXs>& u) override;
88
96 virtual void calcDiff(const std::shared_ptr<ResidualDataAbstract>& data,
97 const Eigen::Ref<const VectorXs>& x,
98 const Eigen::Ref<const VectorXs>& u) override;
99
103 virtual std::shared_ptr<ResidualDataAbstract> createData(
104 DataCollectorAbstract* const data) override;
105
116 template <typename NewScalar>
118
122 const Vector6s& get_reference() const;
123
127 void set_reference(const Vector6s& href);
128
134 virtual void print(std::ostream& os) const override;
135
136 protected:
137 using Base::nu_;
138 using Base::state_;
140
141 private:
142 Vector6s href_;
143 std::shared_ptr<typename StateMultibody::PinocchioModel>
144 pin_model_;
145};
146
147template <typename _Scalar>
148struct ResidualDataCentroidalMomentumTpl
149 : public ResidualDataAbstractTpl<_Scalar> {
150 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
151
152 typedef _Scalar Scalar;
153 typedef MathBaseTpl<Scalar> MathBase;
154 typedef ResidualDataAbstractTpl<Scalar> Base;
155 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
156 typedef typename MathBase::Matrix6xs Matrix6xs;
157
158 template <template <typename Scalar> class Model>
159 ResidualDataCentroidalMomentumTpl(Model<Scalar>* const model,
160 DataCollectorAbstract* const data)
161 : Base(model, data),
162 dhd_dq(6, model->get_state()->get_nv()),
163 dhd_dv(6, model->get_state()->get_nv()) {
164 dhd_dq.setZero();
165 dhd_dv.setZero();
166
167 // Check that proper shared data has been passed
170 if (d == NULL) {
171 throw_pretty(
172 "Invalid argument: the shared data should be derived from "
173 "DataCollectorMultibody");
174 }
175
176 // Avoids data casting at runtime
177 pinocchio = d->pinocchio;
178 }
179 virtual ~ResidualDataCentroidalMomentumTpl() = default;
180
181 pinocchio::DataTpl<Scalar>* pinocchio;
182 Matrix6xs dhd_dq;
183 Matrix6xs dhd_dv;
184 using Base::r;
185 using Base::Ru;
186 using Base::Rx;
187 using Base::shared;
188};
189
190} // namespace crocoddyl
191
192/* --- Details -------------------------------------------------------------- */
193/* --- Details -------------------------------------------------------------- */
194/* --- Details -------------------------------------------------------------- */
195#include "crocoddyl/multibody/residuals/centroidal-momentum.hxx"
196
197CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(
199CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(
201
202#endif // CROCODDYL_MULTIBODY_RESIDUALS_MOMENTUM_HPP_
std::shared_ptr< StateAbstract > state_
ResidualModelAbstractTpl(std::shared_ptr< StateAbstract > state, const std::size_t nr, const std::size_t nu, const bool q_dependent=true, const bool v_dependent=true, const bool u_dependent=true)
Initialize the residual model.
ResidualModelCentroidalMomentumTpl(std::shared_ptr< StateMultibody > state, const Vector6s &href, const std::size_t nu)
Initialize the centroidal momentum residual model.
const Vector6s & get_reference() const
Return the reference centroidal momentum.
virtual void calcDiff(const std::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u) override
Compute the derivatives of the centroidal momentum residual.
void set_reference(const Vector6s &href)
Modify the reference centroidal momentum.
virtual std::shared_ptr< ResidualDataAbstract > createData(DataCollectorAbstract *const data) override
Create the centroidal momentum residual data.
ResidualModelCentroidalMomentumTpl(std::shared_ptr< StateMultibody > state, const Vector6s &href)
Initialize the centroidal momentum residual model.
ResidualModelCentroidalMomentumTpl< NewScalar > cast() const
Cast the centroidal-momentum residual model to a different scalar type.
virtual void calc(const std::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u) override
Compute the centroidal momentum residual.
virtual void print(std::ostream &os) const override
Print relevant information of the centroidal-momentum residual.
State multibody representation.
Definition multibody.hpp:34
Matrix6xs dhd_dq
Jacobian of the centroidal momentum.
DataCollectorAbstract * shared
Shared data allocated by the action model.
Matrix6xs dhd_dv
Jacobian of the centroidal momentum.
pinocchio::DataTpl< Scalar > * pinocchio
Pinocchio data.