Crocoddyl
contact-base.hpp
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2023, 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_CONTACT_BASE_HPP_
11 #define CROCODDYL_MULTIBODY_CONTACT_BASE_HPP_
12 
13 #include <pinocchio/multibody/fwd.hpp>
14 
15 #include "crocoddyl/core/mathbase.hpp"
16 #include "crocoddyl/core/utils/deprecate.hpp"
17 #include "crocoddyl/multibody/force-base.hpp"
18 #include "crocoddyl/multibody/fwd.hpp"
19 #include "crocoddyl/multibody/states/multibody.hpp"
20 
21 namespace crocoddyl {
22 
23 template <typename _Scalar>
25  public:
26  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
27 
28  typedef _Scalar Scalar;
32  typedef typename MathBase::VectorXs VectorXs;
33  typedef typename MathBase::MatrixXs MatrixXs;
34 
43  ContactModelAbstractTpl(std::shared_ptr<StateMultibody> state,
44  const pinocchio::ReferenceFrame type,
45  const std::size_t nc, const std::size_t nu);
46  ContactModelAbstractTpl(std::shared_ptr<StateMultibody> state,
47  const pinocchio::ReferenceFrame type,
48  const std::size_t nc);
49 
50  DEPRECATED(
51  "Use constructor that passes the type type of contact, this assumes is "
52  "pinocchio::LOCAL",
53  ContactModelAbstractTpl(std::shared_ptr<StateMultibody> state,
54  const std::size_t nc, const std::size_t nu);)
55  DEPRECATED(
56  "Use constructor that passes the type type of contact, this assumes is "
57  "pinocchio::LOCAL",
58  ContactModelAbstractTpl(std::shared_ptr<StateMultibody> state,
59  const std::size_t nc);)
60  virtual ~ContactModelAbstractTpl();
61 
69  virtual void calc(const std::shared_ptr<ContactDataAbstract>& data,
70  const Eigen::Ref<const VectorXs>& x) = 0;
71 
79  virtual void calcDiff(const std::shared_ptr<ContactDataAbstract>& data,
80  const Eigen::Ref<const VectorXs>& x) = 0;
81 
88  virtual void updateForce(const std::shared_ptr<ContactDataAbstract>& data,
89  const VectorXs& force) = 0;
90 
97  void updateForceDiff(const std::shared_ptr<ContactDataAbstract>& data,
98  const MatrixXs& df_dx, const MatrixXs& df_du) const;
99 
105  void setZeroForce(const std::shared_ptr<ContactDataAbstract>& data) const;
106 
112  void setZeroForceDiff(const std::shared_ptr<ContactDataAbstract>& data) const;
113 
117  virtual std::shared_ptr<ContactDataAbstract> createData(
118  pinocchio::DataTpl<Scalar>* const data);
119 
123  const std::shared_ptr<StateMultibody>& get_state() const;
124 
128  std::size_t get_nc() const;
129 
133  std::size_t get_nu() const;
134 
138  pinocchio::FrameIndex get_id() const;
139 
143  void set_id(const pinocchio::FrameIndex id);
144 
148  void set_type(const pinocchio::ReferenceFrame type);
149 
153  pinocchio::ReferenceFrame get_type() const;
154 
158  template <class Scalar>
159  friend std::ostream& operator<<(std::ostream& os,
160  const ContactModelAbstractTpl<Scalar>& model);
161 
167  virtual void print(std::ostream& os) const;
168 
169  protected:
170  std::shared_ptr<StateMultibody> state_;
171  std::size_t nc_;
172  std::size_t nu_;
173  pinocchio::FrameIndex id_;
174  pinocchio::ReferenceFrame type_;
175 };
176 
177 template <typename _Scalar>
179  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
180 
181  typedef _Scalar Scalar;
184  typedef typename MathBase::VectorXs VectorXs;
185  typedef typename MathBase::MatrixXs MatrixXs;
186  typedef typename pinocchio::SE3Tpl<Scalar> SE3;
187 
188  template <template <typename Scalar> class Model>
189  ContactDataAbstractTpl(Model<Scalar>* const model,
190  pinocchio::DataTpl<Scalar>* const data)
191  : Base(model, data),
192  fXj(jMf.inverse().toActionMatrix()),
193  a0(model->get_nc()),
194  da0_dx(model->get_nc(), model->get_state()->get_ndx()),
195  dtau_dq(model->get_state()->get_nv(), model->get_state()->get_nv()) {
196  a0.setZero();
197  da0_dx.setZero();
198  dtau_dq.setZero();
199  }
200  virtual ~ContactDataAbstractTpl() {}
201 
202  using Base::df_du;
203  using Base::df_dx;
204  using Base::f;
205  using Base::frame;
206  using Base::Jc;
207  using Base::jMf;
208  using Base::pinocchio;
209 
210  typename SE3::ActionMatrixType fXj;
211  VectorXs a0;
212  MatrixXs da0_dx;
213  MatrixXs dtau_dq;
214 };
215 
216 } // namespace crocoddyl
217 
218 /* --- Details -------------------------------------------------------------- */
219 /* --- Details -------------------------------------------------------------- */
220 /* --- Details -------------------------------------------------------------- */
221 #include "crocoddyl/multibody/contact-base.hxx"
222 
223 #endif // CROCODDYL_MULTIBODY_CONTACT_BASE_HPP_
virtual std::shared_ptr< ContactDataAbstract > createData(pinocchio::DataTpl< Scalar > *const data)
Create the contact data.
const std::shared_ptr< StateMultibody > & get_state() const
Return the state.
virtual void calc(const std::shared_ptr< ContactDataAbstract > &data, const Eigen::Ref< const VectorXs > &x)=0
Compute the contact Jacobian and acceleration drift.
std::size_t get_nc() const
Return the dimension of the contact.
virtual void print(std::ostream &os) const
Print relevant information of the contact model.
virtual void updateForce(const std::shared_ptr< ContactDataAbstract > &data, const VectorXs &force)=0
Convert the force into a stack of spatial forces.
void set_id(const pinocchio::FrameIndex id)
Modify the reference frame id.
pinocchio::ReferenceFrame type_
Type of contact.
void setZeroForceDiff(const std::shared_ptr< ContactDataAbstract > &data) const
Set the stack of spatial forces Jacobians to zero.
virtual void calcDiff(const std::shared_ptr< ContactDataAbstract > &data, const Eigen::Ref< const VectorXs > &x)=0
Compute the derivatives of the acceleration-based contact.
pinocchio::FrameIndex get_id() const
Return the reference frame id.
void set_type(const pinocchio::ReferenceFrame type)
Modify the type of contact.
pinocchio::ReferenceFrame get_type() const
Return the type of contact.
void updateForceDiff(const std::shared_ptr< ContactDataAbstract > &data, const MatrixXs &df_dx, const MatrixXs &df_du) const
Convert the force into a stack of spatial forces.
void setZeroForce(const std::shared_ptr< ContactDataAbstract > &data) const
Set the stack of spatial forces to zero.
pinocchio::FrameIndex id_
Reference frame id of the contact.
friend std::ostream & operator<<(std::ostream &os, const ContactModelAbstractTpl< Scalar > &model)
Print information on the contact model.
std::size_t get_nu() const
Return the dimension of the control vector.
ContactModelAbstractTpl(std::shared_ptr< StateMultibody > state, const pinocchio::ReferenceFrame type, const std::size_t nc, const std::size_t nu)
Initialize the contact abstraction.
State multibody representation.
Definition: multibody.hpp:35
SE3 jMf
Local frame placement of the contact frame.
Definition: force-base.hpp:52
PinocchioData * pinocchio
Pinocchio data.
Definition: force-base.hpp:49
pinocchio::FrameIndex frame
Frame index of the contact frame.
Definition: force-base.hpp:50
SE3 jMf
Local frame placement of the contact frame.
Definition: force-base.hpp:52
MatrixXs Jc
Contact Jacobian.
Definition: force-base.hpp:53
Force f
Contact force expressed in the coordinate defined by type.
Definition: force-base.hpp:54