Crocoddyl
Loading...
Searching...
No Matches
com-position.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_COM_POSITION_HPP_
10#define CROCODDYL_MULTIBODY_TASKS_COM_POSITION_HPP_
11
12#include <pinocchio/algorithm/center-of-mass-derivatives.hpp>
13#include <pinocchio/algorithm/center-of-mass.hpp>
14
15#include "crocoddyl/core/task-base.hpp"
16#include "crocoddyl/core/utils/conversions.hpp"
17#include "crocoddyl/multibody/data/multibody.hpp"
18#include "crocoddyl/multibody/fwd.hpp"
19#include "crocoddyl/multibody/states/multibody.hpp"
20
21namespace crocoddyl {
22
43template <typename _Scalar>
45 public:
46 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
47 CROCODDYL_DERIVED_CAST(TaskModelBase, TaskModelCoMPositionTpl)
48
49 typedef _Scalar Scalar;
50 typedef MathBaseTpl<Scalar> MathBase;
52 typedef TaskDataAbstractTpl<Scalar> TaskDataAbstract;
54 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
55 typedef StateMultibodyTpl<Scalar> StateMultibody;
56 typedef typename MathBase::Matrix3xs Matrix3xs;
57 typedef typename MathBase::Vector3s Vector3s;
58 typedef typename MathBase::VectorXs VectorXs;
59
63 TaskModelCoMPositionTpl(std::shared_ptr<StateMultibody> state,
64 const Vector3s& cref, const std::size_t nu);
65
70 TaskModelCoMPositionTpl(std::shared_ptr<StateMultibody> state,
71 const Vector3s& cref);
72
73 virtual ~TaskModelCoMPositionTpl() = default;
74
78 virtual void calc(const std::shared_ptr<TaskDataAbstract>& data,
79 const Eigen::Ref<const VectorXs>& x,
80 const Eigen::Ref<const VectorXs>& u) override;
81
85 virtual void calcDiff(const std::shared_ptr<TaskDataAbstract>& data,
86 const Eigen::Ref<const VectorXs>& x,
87 const Eigen::Ref<const VectorXs>& u) override;
88
92 virtual std::shared_ptr<TaskDataAbstract> createData(
93 DataCollectorAbstract* const data) override;
94
98 template <typename NewScalar>
100
102 const Vector3s& get_reference() const;
104 void set_reference(const Vector3s& cref);
105
107 virtual void print(std::ostream& os) const override;
108
109 protected:
110 using Base::nr_;
111 using Base::nu_;
112 using Base::q_dependent_;
113 using Base::state_;
114 using Base::u_dependent_;
115 using Base::v_dependent_;
116
117 private:
118 Vector3s cref_;
119 std::shared_ptr<typename StateMultibody::PinocchioModel> pin_model_;
120};
121
125template <typename _Scalar>
126struct TaskDataCoMPositionTpl : public TaskDataAbstractTpl<_Scalar> {
127 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
128
129 typedef _Scalar Scalar;
130 typedef MathBaseTpl<Scalar> MathBase;
131 typedef TaskDataAbstractTpl<Scalar> Base;
132 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
133 typedef typename MathBase::Matrix3xs Matrix3xs;
134 typedef typename MathBase::Vector3s Vector3s;
135
136 template <template <typename Scalar> class Model>
137 TaskDataCoMPositionTpl(Model<Scalar>* const model,
138 DataCollectorAbstract* const data)
139 : Base(model, data),
140 com(Vector3s::Zero()),
141 vcom(Vector3s::Zero()),
142 acom(Vector3s::Zero()),
143 dvc_dq(3, model->get_state()->get_nv()),
144 dacom_dq(3, model->get_state()->get_nv()),
145 dacom_dv(3, model->get_state()->get_nv()) {
146 dvc_dq.setZero();
147 dacom_dq.setZero();
148 dacom_dv.setZero();
149
152 if (d == nullptr) {
153 throw_pretty(
154 "Invalid argument: the shared data should be derived from "
155 "DataCollectorMultibody");
156 }
157
158 pinocchio = d->pinocchio;
161 if (j != nullptr) {
162 joint = j->joint;
163 }
164 }
165
166 virtual ~TaskDataCoMPositionTpl() = default;
167
168 pinocchio::DataTpl<Scalar>* pinocchio;
169 std::shared_ptr<JointDataAbstractTpl<Scalar>>
171 Vector3s com;
172 Vector3s vcom;
173 Vector3s acom;
174 Matrix3xs dvc_dq;
175 Matrix3xs dacom_dq;
176 Matrix3xs dacom_dv;
177
178 using Base::shared;
179};
180
181} // namespace crocoddyl
182
183/* --- Details -------------------------------------------------------------- */
184#include "crocoddyl/multibody/tasks/com-position.hxx"
185
186CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(crocoddyl::TaskModelCoMPositionTpl)
187CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(crocoddyl::TaskDataCoMPositionTpl)
188
189#endif // CROCODDYL_MULTIBODY_TASKS_COM_POSITION_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 the task Jacobians.
TaskModelCoMPositionTpl< NewScalar > cast() const
Cast the task model to a different scalar type.
const Vector3s & get_reference() const
Return the reference CoM position.
TaskModelCoMPositionTpl(std::shared_ptr< StateMultibody > state, const Vector3s &cref, const std::size_t nu)
Construct a CoM position task.
void set_reference(const Vector3s &cref)
Update the reference CoM position.
virtual std::shared_ptr< TaskDataAbstract > createData(DataCollectorAbstract *const data) override
Allocate task data.
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 value and task rate.
virtual void print(std::ostream &os) const override
Print relevant information.
TaskModelCoMPositionTpl(std::shared_ptr< StateMultibody > state, const Vector3s &cref)
Construct a CoM position task using the default control dimension.
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 center-of-mass position task.
Matrix3xs dacom_dv
Partial derivative of CoM acceleration w.r.t. v.
Matrix3xs dvc_dq
Partial derivative of CoM velocity w.r.t. q.
Vector3s acom
Center-of-mass acceleration.
Matrix3xs dacom_dq
Partial derivative of CoM acceleration w.r.t. q.
Vector3s com
Center-of-mass position.
Vector3s vcom
Center-of-mass velocity.
std::shared_ptr< JointDataAbstractTpl< Scalar > > joint
Shared generalized-acceleration data, when available.
DataCollectorAbstract * shared
Shared action-model data collector.
pinocchio::DataTpl< Scalar > * pinocchio
Shared Pinocchio data.