Crocoddyl
multiple-contacts.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_CONTACTS_MULTIPLE_CONTACTS_HPP_
11 #define CROCODDYL_MULTIBODY_CONTACTS_MULTIPLE_CONTACTS_HPP_
12 
13 #include <map>
14 #include <set>
15 #include <string>
16 #include <utility>
17 
18 #include "crocoddyl/core/utils/exception.hpp"
19 #include "crocoddyl/multibody/contact-base.hpp"
20 #include "crocoddyl/multibody/fwd.hpp"
21 
22 namespace crocoddyl {
23 
24 template <typename _Scalar>
26  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
27 
28  typedef _Scalar Scalar;
30 
31  ContactItemTpl() {}
32  ContactItemTpl(const std::string& name,
33  std::shared_ptr<ContactModelAbstract> contact,
34  const bool active = true)
35  : name(name), contact(contact), active(active) {}
36 
40  friend std::ostream& operator<<(std::ostream& os,
41  const ContactItemTpl<Scalar>& model) {
42  os << "{" << *model.contact << "}";
43  return os;
44  }
45 
46  std::string name;
47  std::shared_ptr<ContactModelAbstract> contact;
48  bool active;
49 };
50 
59 template <typename _Scalar>
61  public:
62  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
63 
64  typedef _Scalar Scalar;
70 
72 
73  typedef typename MathBase::Vector2s Vector2s;
74  typedef typename MathBase::Vector3s Vector3s;
75  typedef typename MathBase::VectorXs VectorXs;
76  typedef typename MathBase::MatrixXs MatrixXs;
77 
78  typedef std::map<std::string, std::shared_ptr<ContactItem> >
79  ContactModelContainer;
80  typedef std::map<std::string, std::shared_ptr<ContactDataAbstract> >
81  ContactDataContainer;
82  typedef typename pinocchio::container::aligned_vector<
83  pinocchio::ForceTpl<Scalar> >::iterator ForceIterator;
84 
91  ContactModelMultipleTpl(std::shared_ptr<StateMultibody> state,
92  const std::size_t nu);
93 
99  ContactModelMultipleTpl(std::shared_ptr<StateMultibody> state);
101 
111  void addContact(const std::string& name,
112  std::shared_ptr<ContactModelAbstract> contact,
113  const bool active = true);
114 
120  void removeContact(const std::string& name);
121 
128  void changeContactStatus(const std::string& name, const bool active);
129 
136  void calc(const std::shared_ptr<ContactDataMultiple>& data,
137  const Eigen::Ref<const VectorXs>& x);
138 
145  void calcDiff(const std::shared_ptr<ContactDataMultiple>& data,
146  const Eigen::Ref<const VectorXs>& x);
147 
155  void updateAcceleration(const std::shared_ptr<ContactDataMultiple>& data,
156  const VectorXs& dv) const;
157 
165  void updateForce(const std::shared_ptr<ContactDataMultiple>& data,
166  const VectorXs& force);
167 
177  void updateAccelerationDiff(const std::shared_ptr<ContactDataMultiple>& data,
178  const MatrixXs& ddv_dx) const;
179 
191  void updateForceDiff(const std::shared_ptr<ContactDataMultiple>& data,
192  const MatrixXs& df_dx, const MatrixXs& df_du) const;
193 
204  void updateRneaDiff(const std::shared_ptr<ContactDataMultiple>& data,
205  pinocchio::DataTpl<Scalar>& pinocchio) const;
206 
213  std::shared_ptr<ContactDataMultiple> createData(
214  pinocchio::DataTpl<Scalar>* const data);
215 
219  const std::shared_ptr<StateMultibody>& get_state() const;
220 
224  const ContactModelContainer& get_contacts() const;
225 
229  std::size_t get_nc() const;
230 
234  std::size_t get_nc_total() const;
235 
239  std::size_t get_nu() const;
240 
244  const std::set<std::string>& get_active_set() const;
245 
249  const std::set<std::string>& get_inactive_set() const;
250 
254  bool getContactStatus(const std::string& name) const;
255 
261  bool getComputeAllContacts() const;
262 
269  void setComputeAllContacts(const bool status);
270 
274  template <class Scalar>
275  friend std::ostream& operator<<(std::ostream& os,
276  const ContactModelMultipleTpl<Scalar>& model);
277 
278  private:
279  std::shared_ptr<StateMultibody> state_;
280  ContactModelContainer contacts_;
281  std::size_t nc_;
282  std::size_t nc_total_;
283  std::size_t nu_;
284  std::set<std::string> active_set_;
285  std::set<std::string> inactive_set_;
286  bool compute_all_contacts_;
287 };
288 
294 template <typename _Scalar>
296  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
297 
298  typedef _Scalar Scalar;
302  typedef typename MathBase::VectorXs VectorXs;
303  typedef typename MathBase::MatrixXs MatrixXs;
304 
311  template <template <typename Scalar> class Model>
312  ContactDataMultipleTpl(Model<Scalar>* const model,
313  pinocchio::DataTpl<Scalar>* const data)
314  : Jc(model->get_nc_total(), model->get_state()->get_nv()),
315  a0(model->get_nc_total()),
316  da0_dx(model->get_nc_total(), model->get_state()->get_ndx()),
317  dv(model->get_state()->get_nv()),
318  ddv_dx(model->get_state()->get_nv(), model->get_state()->get_ndx()),
319  fext(model->get_state()->get_pinocchio()->njoints,
320  pinocchio::ForceTpl<Scalar>::Zero()) {
321  Jc.setZero();
322  a0.setZero();
323  da0_dx.setZero();
324  dv.setZero();
325  ddv_dx.setZero();
326  for (typename ContactModelMultiple::ContactModelContainer::const_iterator
327  it = model->get_contacts().begin();
328  it != model->get_contacts().end(); ++it) {
329  const std::shared_ptr<ContactItem>& item = it->second;
330  contacts.insert(
331  std::make_pair(item->name, item->contact->createData(data)));
332  }
333  }
334 
335  MatrixXs Jc;
338  VectorXs a0;
341  MatrixXs
346  VectorXs dv;
348  MatrixXs
353  typename ContactModelMultiple::ContactDataContainer
355  pinocchio::container::aligned_vector<pinocchio::ForceTpl<Scalar> >
357 };
358 
359 } // namespace crocoddyl
360 
361 /* --- Details -------------------------------------------------------------- */
362 /* --- Details -------------------------------------------------------------- */
363 /* --- Details -------------------------------------------------------------- */
364 #include "crocoddyl/multibody/contacts/multiple-contacts.hxx"
365 
366 #endif // CROCODDYL_MULTIBODY_CONTACTS_MULTIPLE_CONTACTS_HPP_
Define a stack of contact models.
const std::shared_ptr< StateMultibody > & get_state() const
Return the multibody state.
void updateRneaDiff(const std::shared_ptr< ContactDataMultiple > &data, pinocchio::DataTpl< Scalar > &pinocchio) const
Update the RNEA derivatives dtau_dq by adding the skew term (necessary for contacts expressed in LOCA...
std::size_t get_nc() const
Return the dimension of active contacts.
void updateAcceleration(const std::shared_ptr< ContactDataMultiple > &data, const VectorXs &dv) const
Update the constrained system acceleration.
void setComputeAllContacts(const bool status)
Set the tyoe of contact computation: all or active contacts.
bool getComputeAllContacts() const
Return the type of contact computation.
void calc(const std::shared_ptr< ContactDataMultiple > &data, const Eigen::Ref< const VectorXs > &x)
Compute the contact Jacobian and contact acceleration.
ContactModelMultipleTpl(std::shared_ptr< StateMultibody > state, const std::size_t nu)
Initialize the multi-contact model.
void updateAccelerationDiff(const std::shared_ptr< ContactDataMultiple > &data, const MatrixXs &ddv_dx) const
Update the Jacobian of the constrained system acceleration.
void addContact(const std::string &name, std::shared_ptr< ContactModelAbstract > contact, const bool active=true)
Add contact item.
void updateForceDiff(const std::shared_ptr< ContactDataMultiple > &data, const MatrixXs &df_dx, const MatrixXs &df_du) const
Update the Jacobian of the spatial force defined in frame coordinate.
std::shared_ptr< ContactDataMultiple > createData(pinocchio::DataTpl< Scalar > *const data)
Create the multi-contact data.
void changeContactStatus(const std::string &name, const bool active)
Change the contact status.
const std::set< std::string > & get_inactive_set() const
Return the names of the set of inactive contacts.
void removeContact(const std::string &name)
Remove contact item.
bool getContactStatus(const std::string &name) const
Return the status of a given contact name.
std::size_t get_nc_total() const
Return the dimension of all contacts.
const std::set< std::string > & get_active_set() const
Return the names of the set of active contacts.
friend std::ostream & operator<<(std::ostream &os, const ContactModelMultipleTpl< Scalar > &model)
Print information on the contact models.
void updateForce(const std::shared_ptr< ContactDataMultiple > &data, const VectorXs &force)
Update the spatial force defined in frame coordinate.
void calcDiff(const std::shared_ptr< ContactDataMultiple > &data, const Eigen::Ref< const VectorXs > &x)
Compute the derivatives of the contact holonomic constraint.
ContactModelMultipleTpl(std::shared_ptr< StateMultibody > state)
Initialize the multi-contact model.
const ContactModelContainer & get_contacts() const
Return the contact models.
std::size_t get_nu() const
Return the dimension of control vector.
State multibody representation.
Definition: multibody.hpp:35
Define the multi-contact data.
ContactModelMultiple::ContactDataContainer contacts
Stack of contact data.
ContactDataMultipleTpl(Model< Scalar > *const model, pinocchio::DataTpl< Scalar > *const data)
Initialized a multi-contact data.
pinocchio::container::aligned_vector< pinocchio::ForceTpl< Scalar > > fext
External spatial forces in body coordinates.
friend std::ostream & operator<<(std::ostream &os, const ContactItemTpl< Scalar > &model)
Print information on the contact item.