Crocoddyl
contact-6d.hpp
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2025, 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_CONTACTS_CONTACT_6D_HPP_
11 #define CROCODDYL_MULTIBODY_CONTACTS_CONTACT_6D_HPP_
12 
13 #include "crocoddyl/core/utils/deprecate.hpp"
14 #include "crocoddyl/multibody/contact-base.hpp"
15 #include "crocoddyl/multibody/fwd.hpp"
16 
17 namespace crocoddyl {
18 
19 template <typename _Scalar>
20 class ContactModel6DTpl : public ContactModelAbstractTpl<_Scalar> {
21  public:
22  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
23  CROCODDYL_DERIVED_CAST(ContactModelBase, ContactModel6DTpl)
24 
25  typedef _Scalar Scalar;
31  typedef pinocchio::SE3Tpl<Scalar> SE3;
32  typedef typename MathBase::Vector2s Vector2s;
33  typedef typename MathBase::Vector3s Vector3s;
34  typedef typename MathBase::VectorXs VectorXs;
35  typedef typename MathBase::Matrix3s Matrix3s;
36 
52  ContactModel6DTpl(std::shared_ptr<StateMultibody> state,
53  const pinocchio::FrameIndex id, const SE3& pref,
54  const pinocchio::ReferenceFrame type, const std::size_t nu,
55  const Vector2s& gains = Vector2s::Zero());
56 
72  ContactModel6DTpl(std::shared_ptr<StateMultibody> state,
73  const pinocchio::FrameIndex id, const SE3& pref,
74  const pinocchio::ReferenceFrame type,
75  const Vector2s& gains = Vector2s::Zero());
76 
77  DEPRECATED(
78  "Use constructor that passes the type type of contact, this assumes is "
79  "pinocchio::LOCAL",
80  ContactModel6DTpl(std::shared_ptr<StateMultibody> state,
81  const pinocchio::FrameIndex id, const SE3& pref,
82  const std::size_t nu,
83  const Vector2s& gains = Vector2s::Zero());)
84  DEPRECATED(
85  "Use constructor that passes the type type of contact, this assumes is "
86  "pinocchio::LOCAL",
87  ContactModel6DTpl(std::shared_ptr<StateMultibody> state,
88  const pinocchio::FrameIndex id, const SE3& pref,
89  const Vector2s& gains = Vector2s::Zero());)
90  virtual ~ContactModel6DTpl() = default;
91 
99  virtual void calc(const std::shared_ptr<ContactDataAbstract>& data,
100  const Eigen::Ref<const VectorXs>& x) override;
101 
109  virtual void calcDiff(const std::shared_ptr<ContactDataAbstract>& data,
110  const Eigen::Ref<const VectorXs>& x) override;
111 
118  virtual void updateForce(const std::shared_ptr<ContactDataAbstract>& data,
119  const VectorXs& force) override;
120 
124  virtual std::shared_ptr<ContactDataAbstract> createData(
125  pinocchio::DataTpl<Scalar>* const data) override;
126 
136  template <typename NewScalar>
138 
142  const SE3& get_reference() const;
143 
147  const Vector2s& get_gains() const;
148 
152  void set_reference(const SE3& reference);
153 
159  virtual void print(std::ostream& os) const override;
160 
161  protected:
162  using Base::id_;
163  using Base::nc_;
164  using Base::nu_;
165  using Base::state_;
166  using Base::type_;
167 
168  private:
169  SE3 pref_;
170  Vector2s gains_;
171 };
172 
173 template <typename _Scalar>
174 struct ContactData6DTpl : public ContactDataAbstractTpl<_Scalar> {
175  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
176 
177  typedef _Scalar Scalar;
180  typedef typename MathBase::Matrix3s Matrix3s;
181  typedef typename MathBase::Matrix6xs Matrix6xs;
182  typedef typename MathBase::Matrix6s Matrix6s;
183  typedef typename MathBase::MatrixXs MatrixXs;
184  typedef typename pinocchio::SE3Tpl<Scalar> SE3;
185  typedef typename pinocchio::MotionTpl<Scalar> Motion;
186  typedef typename pinocchio::ForceTpl<Scalar> Force;
187 
188  template <template <typename Scalar> class Model>
189  ContactData6DTpl(Model<Scalar>* const model,
190  pinocchio::DataTpl<Scalar>* const data)
191  : Base(model, data),
192  rMf(SE3::Identity()),
193  lwaMl(SE3::Identity()),
194  v(Motion::Zero()),
195  a0_local(Motion::Zero()),
196  f_local(Force::Zero()),
197  da0_local_dx(6, model->get_state()->get_ndx()),
198  fJf(6, model->get_state()->get_nv()),
199  v_partial_dq(6, model->get_state()->get_nv()),
200  a_partial_dq(6, model->get_state()->get_nv()),
201  a_partial_dv(6, model->get_state()->get_nv()),
202  a_partial_da(6, model->get_state()->get_nv()),
203  fJf_df(6, model->get_state()->get_nv()) {
204  frame = model->get_id();
205  jMf = model->get_state()->get_pinocchio()->frames[frame].placement;
206  fXj = jMf.inverse().toActionMatrix();
207  da0_local_dx.setZero();
208  fJf.setZero();
209  v_partial_dq.setZero();
210  a_partial_dq.setZero();
211  a_partial_dv.setZero();
212  a_partial_da.setZero();
213  av_world_skew.setZero();
214  aw_world_skew.setZero();
215  av_skew.setZero();
216  aw_skew.setZero();
217  fv_skew.setZero();
218  fw_skew.setZero();
219  rMf_Jlog6.setZero();
220  fJf_df.setZero();
221  }
222  virtual ~ContactData6DTpl() = default;
223 
224  using Base::a0;
225  using Base::da0_dx;
226  using Base::df_du;
227  using Base::df_dx;
228  using Base::f;
229  using Base::frame;
230  using Base::fXj;
231  using Base::Jc;
232  using Base::jMf;
233  using Base::pinocchio;
234 
235  SE3 rMf;
236  SE3 lwaMl;
237  Motion v;
238  Motion a0_local;
239  Force f_local;
240  Matrix6xs da0_local_dx;
241  MatrixXs fJf;
242  Matrix6xs v_partial_dq;
243  Matrix6xs a_partial_dq;
244  Matrix6xs a_partial_dv;
245  Matrix6xs a_partial_da;
246  Matrix3s av_world_skew;
247  Matrix3s aw_world_skew;
248  Matrix3s av_skew;
249  Matrix3s aw_skew;
250  Matrix3s fv_skew;
251  Matrix3s fw_skew;
252  Matrix6s rMf_Jlog6;
253  MatrixXs fJf_df;
254 };
255 
256 } // namespace crocoddyl
257 /* --- Details -------------------------------------------------------------- */
258 /* --- Details -------------------------------------------------------------- */
259 /* --- Details -------------------------------------------------------------- */
260 #include "crocoddyl/multibody/contacts/contact-6d.hxx"
261 
262 CROCODDYL_DECLARE_EXTERN_TEMPLATE_CLASS(crocoddyl::ContactModel6DTpl)
263 CROCODDYL_DECLARE_EXTERN_TEMPLATE_STRUCT(crocoddyl::ContactData6DTpl)
264 
265 #endif // CROCODDYL_MULTIBODY_CONTACTS_CONTACT_6D_HPP_
virtual void calc(const std::shared_ptr< ContactDataAbstract > &data, const Eigen::Ref< const VectorXs > &x) override
Compute the 3d contact Jacobian and drift.
const SE3 & get_reference() const
Return the reference frame placement.
virtual std::shared_ptr< ContactDataAbstract > createData(pinocchio::DataTpl< Scalar > *const data) override
Create the 6d contact data.
ContactModel6DTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const SE3 &pref, const pinocchio::ReferenceFrame type, const std::size_t nu, const Vector2s &gains=Vector2s::Zero())
Initialize the 6d contact model.
ContactModel6DTpl< NewScalar > cast() const
Cast the contact-6d model to a different scalar type.
const Vector2s & get_gains() const
Return the Baumgarte stabilization gains.
void set_reference(const SE3 &reference)
Modify the reference frame placement.
ContactModel6DTpl(std::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const SE3 &pref, const pinocchio::ReferenceFrame type, const Vector2s &gains=Vector2s::Zero())
Initialize the 6d contact model.
virtual void calcDiff(const std::shared_ptr< ContactDataAbstract > &data, const Eigen::Ref< const VectorXs > &x) override
Compute the derivatives of the 6d contact holonomic constraint.
virtual void updateForce(const std::shared_ptr< ContactDataAbstract > &data, const VectorXs &force) override
Convert the force into a stack of spatial forces.
virtual void print(std::ostream &os) const override
Print relevant information of the 6d contact model.
pinocchio::ReferenceFrame type_
Type of contact.
pinocchio::FrameIndex id_
Reference frame id of the contact.
State multibody representation.
Definition: multibody.hpp:34
pinocchio::FrameIndex frame
Frame index of the contact frame.
Definition: force-base.hpp:46
SE3 jMf
Local frame placement of the contact frame.
Definition: force-base.hpp:48
PinocchioData * pinocchio
Pinocchio data.
Definition: force-base.hpp:45
pinocchio::FrameIndex frame
Frame index of the contact frame.
Definition: force-base.hpp:46
SE3 jMf
Local frame placement of the contact frame.
Definition: force-base.hpp:48
Force f
Contact force expressed in the coordinate defined by type.
Definition: force-base.hpp:50