Crocoddyl
Loading...
Searching...
No Matches
frame-placement.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_PLACEMENT_HPP_
10#define CROCODDYL_MULTIBODY_TASKS_FRAME_PLACEMENT_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
49template <typename _Scalar>
51 public:
52 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
53 CROCODDYL_DERIVED_CAST(TaskModelBase, TaskModelFramePlacementTpl)
54
55 typedef _Scalar Scalar;
56 typedef MathBaseTpl<Scalar> MathBase;
58 typedef TaskDataAbstractTpl<Scalar> TaskDataAbstract;
60 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
61 typedef StateMultibodyTpl<Scalar> StateMultibody;
62 typedef typename MathBase::Matrix3s Matrix3s;
63 typedef typename MathBase::Matrix6s Matrix6s;
64 typedef typename MathBase::VectorXs VectorXs;
65 typedef pinocchio::MotionTpl<Scalar> Motion;
66 typedef pinocchio::SE3Tpl<Scalar> SE3;
67
71 TaskModelFramePlacementTpl(std::shared_ptr<StateMultibody> state,
72 const pinocchio::FrameIndex id, const SE3& pref,
73 const std::size_t nu);
74
79 TaskModelFramePlacementTpl(std::shared_ptr<StateMultibody> state,
80 const pinocchio::FrameIndex id, const SE3& pref);
81
85 TaskModelFramePlacementTpl(std::shared_ptr<StateMultibody> state,
86 const pinocchio::FrameIndex id, const SE3& pref,
87 const pinocchio::ReferenceFrame type,
88 const std::size_t nu);
89
93 TaskModelFramePlacementTpl(std::shared_ptr<StateMultibody> state,
94 const pinocchio::FrameIndex id, const SE3& pref,
95 const pinocchio::ReferenceFrame type);
96
97 virtual ~TaskModelFramePlacementTpl() = default;
98
102 virtual void calc(const std::shared_ptr<TaskDataAbstract>& data,
103 const Eigen::Ref<const VectorXs>& x,
104 const Eigen::Ref<const VectorXs>& u) override;
105
109 virtual void calcDiff(const std::shared_ptr<TaskDataAbstract>& data,
110 const Eigen::Ref<const VectorXs>& x,
111 const Eigen::Ref<const VectorXs>& u) override;
112
116 virtual std::shared_ptr<TaskDataAbstract> createData(
117 DataCollectorAbstract* const data) override;
118
122 template <typename NewScalar>
124
126 pinocchio::FrameIndex get_id() const;
128 const SE3& get_reference() const;
130 pinocchio::ReferenceFrame get_type() const;
132 void set_id(const pinocchio::FrameIndex id);
134 void set_reference(const SE3& reference);
136 void set_type(const pinocchio::ReferenceFrame type);
137
139 virtual void print(std::ostream& os) const override;
140
141 protected:
142 using Base::nr_;
143 using Base::nu_;
144 using Base::q_dependent_;
145 using Base::state_;
146 using Base::u_dependent_;
147 using Base::v_dependent_;
148
149 private:
150 pinocchio::FrameIndex id_;
151 SE3 pref_;
152 SE3 oMf_inv_;
153 pinocchio::ReferenceFrame type_;
154 std::shared_ptr<typename StateMultibody::PinocchioModel> pin_model_;
155};
156
160template <typename _Scalar>
161struct TaskDataFramePlacementTpl : public TaskDataAbstractTpl<_Scalar> {
162 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
163
164 typedef _Scalar Scalar;
165 typedef MathBaseTpl<Scalar> MathBase;
166 typedef TaskDataAbstractTpl<Scalar> Base;
167 typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
168 typedef typename MathBase::Matrix6s Matrix6s;
169 typedef typename MathBase::Matrix6xs Matrix6xs;
170 typedef pinocchio::MotionTpl<Scalar> Motion;
171 typedef pinocchio::SE3Tpl<Scalar> SE3;
172
173 template <template <typename Scalar> class Model>
174 TaskDataFramePlacementTpl(Model<Scalar>* const model,
175 DataCollectorAbstract* const data)
176 : Base(model, data),
177 rMf(SE3::Identity()),
178 rJf(Matrix6s::Zero()),
179 y_local(Motion::Zero()),
180 vf(Motion::Zero()),
181 af(Motion::Zero()),
182 Yx_local(6, model->get_state()->get_nv()),
183 fJf(6, model->get_state()->get_nv()),
184 fVdq(6, model->get_state()->get_nv()),
185 fVdv(6, model->get_state()->get_nv()),
186 fAdq(6, model->get_state()->get_nv()),
187 fAdv(6, model->get_state()->get_nv()) {
188 Yx_local.setZero();
189 fJf.setZero();
190 fVdq.setZero();
191 fVdv.setZero();
192 fAdq.setZero();
193 fAdv.setZero();
194
197 if (d == nullptr) {
198 throw_pretty(
199 "Invalid argument: the shared data should be derived from "
200 "DataCollectorMultibody");
201 }
202
203 pinocchio = d->pinocchio;
206 if (j != nullptr) {
207 joint = j->joint;
208 }
209 }
210
211 virtual ~TaskDataFramePlacementTpl() = default;
212
213 pinocchio::DataTpl<Scalar>* pinocchio;
214 std::shared_ptr<JointDataAbstractTpl<Scalar>>
216 SE3 rMf;
217 Matrix6s rJf;
218 Motion y_local;
219 Motion vf;
220 Motion af;
221 Matrix6xs Yx_local;
222 Matrix6xs fJf;
223 Matrix6xs fVdq;
224 Matrix6xs fVdv;
225 Matrix6xs fAdq;
226 Matrix6xs fAdv;
227
228 using Base::shared;
229};
230
231} // namespace crocoddyl
232
233/* --- Details -------------------------------------------------------------- */
234#include "crocoddyl/multibody/tasks/frame-placement.hxx"
235
236CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(crocoddyl::TaskModelFramePlacementTpl)
237CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(crocoddyl::TaskDataFramePlacementTpl)
238
239#endif // CROCODDYL_MULTIBODY_TASKS_FRAME_PLACEMENT_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.
TaskModelFramePlacementTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const SE3 &pref, const std::size_t nu)
Construct a frame placement task.
TaskModelFramePlacementTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const SE3 &pref, const pinocchio::ReferenceFrame type)
Construct a frame placement task with an explicit reference frame.
TaskModelFramePlacementTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const SE3 &pref)
Construct a frame placement task using the default control dimension.
void set_id(const pinocchio::FrameIndex id)
Update the frame index.
TaskModelFramePlacementTpl< NewScalar > cast() const
Cast the task model to a different scalar type.
pinocchio::FrameIndex get_id() const
Return the frame index.
void set_type(const pinocchio::ReferenceFrame type)
Update the reference frame convention.
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.
const SE3 & get_reference() const
Return the reference placement.
void set_reference(const SE3 &reference)
Update the reference placement.
TaskModelFramePlacementTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const SE3 &pref, const pinocchio::ReferenceFrame type, const std::size_t nu)
Construct a frame placement task with an explicit 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-placement task.
Motion vf
Frame velocity in the selected reference frame.
Motion y_local
Local pose error used by LOCAL_WORLD_ALIGNED.
Matrix6s rJf
Jacobian of the SE(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 intermediate frame.
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.
Motion af
Frame acceleration in the selected reference frame.
Matrix6xs fVdq
Partial derivative of frame velocity with respect to q.
SE3 rMf
Pose-error composition for the selected convention.
Matrix6xs Yx_local
Jacobian of the local pose error.
pinocchio::DataTpl< Scalar > * pinocchio
Shared Pinocchio data.