Crocoddyl
Loading...
Searching...
No Matches
centroidal-momentum.hpp
1
2// BSD 3-Clause License
3//
4// Copyright (C) 2026, Heriot-Watt University
5// Copyright note valid unless otherwise stated in individual files.
6// All rights reserved.
8
9#ifndef CROCODDYL_MULTIBODY_TASKS_CENTROIDAL_MOMENTUM_HPP_
10#define CROCODDYL_MULTIBODY_TASKS_CENTROIDAL_MOMENTUM_HPP_
11
12#include "crocoddyl/core/task-base.hpp"
13#include "crocoddyl/multibody/data/multibody.hpp"
14#include "crocoddyl/multibody/fwd.hpp"
15#include "crocoddyl/multibody/states/multibody.hpp"
16
17namespace crocoddyl {
18
41template <typename _Scalar>
43 public:
44 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
45 CROCODDYL_DERIVED_CAST(TaskModelBase, TaskModelCentroidalMomentumTpl)
46
47 typedef _Scalar Scalar;
48 typedef MathBaseTpl<Scalar> MathBase;
51 typedef TaskDataAbstractTpl<Scalar> TaskDataAbstract;
52 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
53 typedef StateMultibodyTpl<Scalar> StateMultibody;
54 typedef typename MathBase::Vector6s Vector6s;
55 typedef typename MathBase::VectorXs VectorXs;
56
65 TaskModelCentroidalMomentumTpl(std::shared_ptr<StateMultibody> state,
66 const Vector6s& href, const Vector6s& hdot_ref,
67 const std::size_t nu);
68
78 TaskModelCentroidalMomentumTpl(std::shared_ptr<StateMultibody> state,
79 const Vector6s& href,
80 const Vector6s& hdot_ref);
81
91 TaskModelCentroidalMomentumTpl(std::shared_ptr<StateMultibody> state,
92 const Vector6s& href, const std::size_t nu);
93
103 TaskModelCentroidalMomentumTpl(std::shared_ptr<StateMultibody> state,
104 const Vector6s& href);
105 virtual ~TaskModelCentroidalMomentumTpl() = default;
106
107 virtual void calc(const std::shared_ptr<TaskDataAbstract>& data,
108 const Eigen::Ref<const VectorXs>& x,
109 const Eigen::Ref<const VectorXs>& u) override;
110
111 virtual void calcDiff(const std::shared_ptr<TaskDataAbstract>& data,
112 const Eigen::Ref<const VectorXs>& x,
113 const Eigen::Ref<const VectorXs>& u) override;
114
115 virtual std::shared_ptr<TaskDataAbstract> createData(
116 DataCollectorAbstract* const data) override;
117
118 template <typename NewScalar>
120
121 const Vector6s& get_reference() const;
122 const Vector6s& get_rate_reference() const;
123 void set_reference(const Vector6s& href);
124 void set_rate_reference(const Vector6s& hdot_ref);
125
126 virtual void print(std::ostream& os) const override;
127
128 protected:
129 using Base::nr_;
130 using Base::nu_;
131 using Base::state_;
132
133 private:
134 Vector6s href_;
135 Vector6s hdot_ref_;
136 std::shared_ptr<typename StateMultibody::PinocchioModel> pin_model_;
137};
138
142template <typename _Scalar>
144 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
145
146 typedef _Scalar Scalar;
147 typedef MathBaseTpl<Scalar> MathBase;
148 typedef TaskDataAbstractTpl<Scalar> Base;
149 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
150 typedef typename MathBase::Vector6s Vector6s;
151 typedef typename MathBase::Matrix6xs Matrix6xs;
152
161 template <template <typename Scalar> class Model>
162 TaskDataCentroidalMomentumTpl(Model<Scalar>* const model,
163 DataCollectorAbstract* const data)
164 : Base(model, data),
165 hdot(Vector6s::Zero()),
166 dh_dq(6, model->get_state()->get_nv()),
167 dhdot_dq(6, model->get_state()->get_nv()),
168 dhdot_dv(6, model->get_state()->get_nv()),
169 dhdot_da(6, model->get_state()->get_nv()) {
170 dh_dq.setZero();
171 dhdot_dq.setZero();
172 dhdot_dv.setZero();
173 dhdot_da.setZero();
174
177 if (d == nullptr) {
178 throw_pretty(
179 "Invalid argument: the shared data should be derived from "
180 "DataCollectorMultibody");
181 }
182 pinocchio = d->pinocchio;
185 if (j != nullptr) {
186 joint = j->joint;
187 }
188 }
189
190 virtual ~TaskDataCentroidalMomentumTpl() = default;
191
192 pinocchio::DataTpl<Scalar>* pinocchio;
193 std::shared_ptr<JointDataAbstractTpl<Scalar>>
195 Vector6s hdot;
196 Matrix6xs dh_dq;
197 Matrix6xs dhdot_dq;
198 Matrix6xs dhdot_dv;
199 Matrix6xs dhdot_da;
200
201 using Base::shared;
202};
203
204} // namespace crocoddyl
205
206/* --- Details -------------------------------------------------------------- */
207#include "crocoddyl/multibody/tasks/centroidal-momentum.hxx"
208
209CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(
211CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(
213
214#endif // CROCODDYL_MULTIBODY_TASKS_CENTROIDAL_MOMENTUM_HPP_
State multibody representation.
Definition multibody.hpp:34
TaskModelAbstractTpl(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, const bool has_acceleration=true)
Initialize the task model.
virtual void calcDiff(const std::shared_ptr< TaskDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u) override
Compute task Jacobians using values stored by calc().
TaskModelCentroidalMomentumTpl(std::shared_ptr< StateMultibody > state, const Vector6s &href, const Vector6s &hdot_ref, const std::size_t nu)
Initialize with momentum and momentum-rate references.
TaskModelCentroidalMomentumTpl(std::shared_ptr< StateMultibody > state, const Vector6s &href, const Vector6s &hdot_ref)
Initialize with momentum and momentum-rate references.
TaskModelCentroidalMomentumTpl(std::shared_ptr< StateMultibody > state, const Vector6s &href, const std::size_t nu)
Initialize with a constant momentum reference.
virtual std::shared_ptr< TaskDataAbstract > createData(DataCollectorAbstract *const data) override
Allocate task data and bind it to the action model's shared data.
TaskModelCentroidalMomentumTpl(std::shared_ptr< StateMultibody > state, const Vector6s &href)
Initialize with a constant momentum reference.
virtual void calc(const std::shared_ptr< TaskDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u) override
Compute the task quantity, rate, and acceleration.
virtual void print(std::ostream &os) const override
Print relevant information about the task model.
Preallocated values and derivatives produced by a task model.
TaskDataAbstractTpl(TaskModelAbstract *const model, DataCollectorAbstract *const data)
Allocate and initialize the common task data.
Cached values and derivatives for the centroidal-momentum task.
TaskDataCentroidalMomentumTpl(Model< Scalar > *const model, DataCollectorAbstract *const data)
Bind the task data to the shared Pinocchio data and, optionally, joint data.
std::shared_ptr< JointDataAbstractTpl< Scalar > > joint