Crocoddyl
Loading...
Searching...
No Matches
frame-rotation.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_FRAME_ROTATION_HPP_
10#define CROCODDYL_MULTIBODY_TASKS_FRAME_ROTATION_HPP_
11
12#include "crocoddyl/core/task-base.hpp"
13#include "crocoddyl/core/utils/conversions.hpp"
14#include "crocoddyl/multibody/data/multibody.hpp"
15#include "crocoddyl/multibody/fwd.hpp"
16#include "crocoddyl/multibody/states/multibody.hpp"
17
18namespace crocoddyl {
19
36template <typename _Scalar>
38 public:
39 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
40 CROCODDYL_DERIVED_CAST(TaskModelBase, TaskModelFrameRotationTpl)
41
42 typedef _Scalar Scalar;
43 typedef MathBaseTpl<Scalar> MathBase;
45 typedef TaskDataAbstractTpl<Scalar> TaskDataAbstract;
47 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
48 typedef StateMultibodyTpl<Scalar> StateMultibody;
49 typedef typename MathBase::Matrix3s Matrix3s;
50 typedef typename MathBase::Matrix6xs Matrix6xs;
51 typedef typename MathBase::Vector3s Vector3s;
52 typedef typename MathBase::VectorXs VectorXs;
53 typedef pinocchio::MotionTpl<Scalar> Motion;
54
61 TaskModelFrameRotationTpl(std::shared_ptr<StateMultibody> state,
62 const pinocchio::FrameIndex id,
63 const Matrix3s& Rref, const std::size_t nu);
64
68 TaskModelFrameRotationTpl(std::shared_ptr<StateMultibody> state,
69 const pinocchio::FrameIndex id,
70 const Matrix3s& Rref);
71
75 TaskModelFrameRotationTpl(std::shared_ptr<StateMultibody> state,
76 const pinocchio::FrameIndex id,
77 const Matrix3s& Rref,
78 const pinocchio::ReferenceFrame type,
79 const std::size_t nu);
80
81 virtual ~TaskModelFrameRotationTpl() = default;
82
86 virtual void calc(const std::shared_ptr<TaskDataAbstract>& data,
87 const Eigen::Ref<const VectorXs>& x,
88 const Eigen::Ref<const VectorXs>& u) override;
89
93 virtual void calcDiff(const std::shared_ptr<TaskDataAbstract>& data,
94 const Eigen::Ref<const VectorXs>& x,
95 const Eigen::Ref<const VectorXs>& u) override;
96
100 virtual std::shared_ptr<TaskDataAbstract> createData(
101 DataCollectorAbstract* const data) override;
102
106 template <typename NewScalar>
108
110 pinocchio::FrameIndex get_id() const;
112 const Matrix3s& get_reference() const;
114 pinocchio::ReferenceFrame get_type() const;
116 void set_id(const pinocchio::FrameIndex id);
118 void set_reference(const Matrix3s& reference);
120 void set_type(const pinocchio::ReferenceFrame type);
121
123 virtual void print(std::ostream& os) const override;
124
125 protected:
126 using Base::nr_;
127 using Base::nu_;
128 using Base::q_dependent_;
129 using Base::state_;
130 using Base::u_dependent_;
131 using Base::v_dependent_;
132
133 private:
134 pinocchio::FrameIndex id_;
135 Matrix3s Rref_;
136 Matrix3s oRf_inv_;
137 pinocchio::ReferenceFrame type_;
138 std::shared_ptr<typename StateMultibody::PinocchioModel> pin_model_;
139};
140
144template <typename _Scalar>
145struct TaskDataFrameRotationTpl : public TaskDataAbstractTpl<_Scalar> {
146 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
147
148 typedef _Scalar Scalar;
149 typedef MathBaseTpl<Scalar> MathBase;
150 typedef TaskDataAbstractTpl<Scalar> Base;
151 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
152 typedef typename MathBase::Matrix3s Matrix3s;
153 typedef typename MathBase::Matrix3xs Matrix3xs;
154 typedef typename MathBase::Matrix6xs Matrix6xs;
155 typedef pinocchio::MotionTpl<Scalar> Motion;
156
157 template <template <typename Scalar> class Model>
158 TaskDataFrameRotationTpl(Model<Scalar>* const model,
159 DataCollectorAbstract* const data)
160 : Base(model, data),
161 rRf(Matrix3s::Identity()),
162 rJf(Matrix3s::Zero()),
163 vf(Motion::Zero()),
164 af(Motion::Zero()),
165 Hlogf(Matrix3s::Zero()),
166 dJ_v(Matrix3s::Zero()),
167 dJ_a(Matrix3s::Zero()),
168 a_partial_da(3, model->get_state()->get_nv()),
169 fJf(6, model->get_state()->get_nv()),
170 fVdq(6, model->get_state()->get_nv()),
171 fVdv(6, model->get_state()->get_nv()),
172 fAdq(6, model->get_state()->get_nv()),
173 fAdv(6, model->get_state()->get_nv()) {
174 a_partial_da.setZero();
175 fJf.setZero();
176 fVdq.setZero();
177 fVdv.setZero();
178 fAdq.setZero();
179 fAdv.setZero();
180
183 if (d == nullptr) {
184 throw_pretty(
185 "Invalid argument: the shared data should be derived from "
186 "DataCollectorMultibody");
187 }
188
189 pinocchio = d->pinocchio;
192 if (j != nullptr) {
193 joint = j->joint;
194 }
195 }
196
197 virtual ~TaskDataFrameRotationTpl() = default;
198
199 pinocchio::DataTpl<Scalar>* pinocchio;
200 std::shared_ptr<JointDataAbstractTpl<Scalar>>
202 Matrix3s rRf;
203 Matrix3s rJf;
204 Motion vf;
205 Motion af;
206 Matrix3s Hlogf;
207 Matrix3s dJ_v;
208 Matrix3s dJ_a;
209 Matrix3xs a_partial_da;
210 Matrix6xs fJf;
211 Matrix6xs fVdq;
212 Matrix6xs fVdv;
213 Matrix6xs fAdq;
214 Matrix6xs fAdv;
215
216 using Base::shared;
217};
218
219} // namespace crocoddyl
220
221/* --- Details -------------------------------------------------------------- */
222#include "crocoddyl/multibody/tasks/frame-rotation.hxx"
223
224CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(crocoddyl::TaskModelFrameRotationTpl)
225CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(crocoddyl::TaskDataFrameRotationTpl)
226
227#endif // CROCODDYL_MULTIBODY_TASKS_FRAME_ROTATION_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.
TaskModelFrameRotationTpl< NewScalar > cast() const
Cast the task model to a different scalar type.
const Matrix3s & get_reference() const
Return the reference rotation.
void set_reference(const Matrix3s &reference)
Update the reference rotation.
void set_id(const pinocchio::FrameIndex id)
Update the frame index.
pinocchio::FrameIndex get_id() const
Return the frame index.
void set_type(const pinocchio::ReferenceFrame type)
Update the reference frame convention.
TaskModelFrameRotationTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const Matrix3s &Rref)
Construct a frame rotation task with LOCAL reference frame.
virtual std::shared_ptr< TaskDataAbstract > createData(DataCollectorAbstract *const data) override
Allocate task data.
pinocchio::ReferenceFrame get_type() const
Return the reference frame convention.
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.
TaskModelFrameRotationTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const Matrix3s &Rref, const pinocchio::ReferenceFrame type, const std::size_t nu)
Construct a frame rotation task with an explicit reference frame.
TaskModelFrameRotationTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const Matrix3s &Rref, const std::size_t nu)
Construct a frame rotation task with LOCAL reference frame.
virtual void print(std::ostream &os) const override
Print relevant information.
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 frame-rotation task.
Motion vf
Frame velocity in the selected reference frame.
Matrix3s rRf
Rotation-error composition in the selected convention.
Matrix3s Hlogf
Hessian of the SO(3) logarithm.
Matrix3s rJf
Jacobian of the SO(3) logarithm.
Matrix6xs fAdq
Partial derivative of frame acceleration w.r.t. q.
Matrix6xs fAdv
Partial derivative of frame acceleration w.r.t. v.
Matrix6xs fJf
Frame Jacobian in the selected reference frame.
Matrix3s dJ_a
Derivative of rJf contracted with frame acceleration.
Matrix6xs fVdv
Partial derivative of frame velocity with respect to v.
std::shared_ptr< JointDataAbstractTpl< Scalar > > joint
Shared generalized-acceleration data, when available.
DataCollectorAbstract * shared
Shared action-model data collector.
Matrix3xs a_partial_da
Derivative of task acceleration w.r.t. ddq.
Motion af
Frame acceleration in the selected reference frame.
Matrix6xs fVdq
Partial derivative of frame velocity with respect to q.
Matrix3s dJ_v
Derivative of rJf contracted with frame velocity.
pinocchio::DataTpl< Scalar > * pinocchio
Shared Pinocchio data.