9 #ifndef CROCODDYL_MULTIBODY_CONTACTS_MULTIPLE_CONTACTS_HPP_ 10 #define CROCODDYL_MULTIBODY_CONTACTS_MULTIPLE_CONTACTS_HPP_ 16 #include "crocoddyl/multibody/fwd.hpp" 17 #include "crocoddyl/core/utils/exception.hpp" 18 #include "crocoddyl/multibody/contact-base.hpp" 22 template <
typename _Scalar>
24 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
26 typedef _Scalar Scalar;
30 ContactItemTpl(
const std::string& name, boost::shared_ptr<ContactModelAbstract> contact,
const bool active =
true)
31 : name(name), contact(contact), active(active) {}
36 friend std::ostream& operator<<(std::ostream& os, const ContactItemTpl<Scalar>& model) {
37 os <<
"{" << *model.contact <<
"}";
42 boost::shared_ptr<ContactModelAbstract> contact;
53 template <
typename _Scalar>
56 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
58 typedef _Scalar Scalar;
67 typedef typename MathBase::Vector2s Vector2s;
68 typedef typename MathBase::Vector3s Vector3s;
69 typedef typename MathBase::VectorXs VectorXs;
70 typedef typename MathBase::MatrixXs MatrixXs;
72 typedef std::map<std::string, boost::shared_ptr<ContactItem> > ContactModelContainer;
73 typedef std::map<std::string, boost::shared_ptr<ContactDataAbstract> > ContactDataContainer;
74 typedef typename pinocchio::container::aligned_vector<pinocchio::ForceTpl<Scalar> >::iterator ForceIterator;
101 void addContact(
const std::string& name, boost::shared_ptr<ContactModelAbstract> contact,
const bool active =
true);
108 void removeContact(
const std::string& name);
116 void changeContactStatus(
const std::string& name,
const bool active);
124 void calc(
const boost::shared_ptr<ContactDataMultiple>& data,
const Eigen::Ref<const VectorXs>& x);
132 void calcDiff(
const boost::shared_ptr<ContactDataMultiple>& data,
const Eigen::Ref<const VectorXs>& x);
140 void updateAcceleration(
const boost::shared_ptr<ContactDataMultiple>& data,
const VectorXs& dv)
const;
149 void updateForce(
const boost::shared_ptr<ContactDataMultiple>& data,
const VectorXs& force);
158 void updateAccelerationDiff(
const boost::shared_ptr<ContactDataMultiple>& data,
const MatrixXs& ddv_dx)
const;
169 void updateForceDiff(
const boost::shared_ptr<ContactDataMultiple>& data,
const MatrixXs& df_dx,
170 const MatrixXs& df_du)
const;
178 boost::shared_ptr<ContactDataMultiple> createData(pinocchio::DataTpl<Scalar>*
const data);
183 const boost::shared_ptr<StateMultibody>& get_state()
const;
188 const ContactModelContainer& get_contacts()
const;
193 std::size_t get_nc()
const;
198 std::size_t get_nc_total()
const;
203 std::size_t get_nu()
const;
208 const std::vector<std::string>& get_active()
const;
213 const std::vector<std::string>& get_inactive()
const;
218 bool getContactStatus(
const std::string& name)
const;
223 template <
class Scalar>
224 friend std::ostream& operator<<(std::ostream& os, const ContactModelMultipleTpl<Scalar>& model);
227 boost::shared_ptr<StateMultibody> state_;
228 ContactModelContainer contacts_;
230 std::size_t nc_total_;
232 std::vector<std::string> active_;
233 std::vector<std::string> inactive_;
241 template <
typename _Scalar>
243 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
245 typedef _Scalar Scalar;
249 typedef typename MathBase::VectorXs VectorXs;
250 typedef typename MathBase::MatrixXs MatrixXs;
258 template <
template <
typename Scalar>
class Model>
260 : Jc(model->get_nc_total(), model->get_state()->get_nv()),
261 a0(model->get_nc_total()),
262 da0_dx(model->get_nc_total(), model->get_state()->get_ndx()),
263 dv(model->get_state()->get_nv()),
264 ddv_dx(model->get_state()->get_nv(), model->get_state()->get_ndx()),
265 fext(model->get_state()->get_pinocchio()->njoints, pinocchio::ForceTpl<Scalar>::Zero()) {
271 for (
typename ContactModelMultiple::ContactModelContainer::const_iterator it = model->get_contacts().begin();
272 it != model->get_contacts().end(); ++it) {
273 const boost::shared_ptr<ContactItem>& item = it->second;
274 contacts.insert(std::make_pair(item->name, item->contact->createData(data)));
290 typename ContactModelMultiple::ContactDataContainer contacts;
292 pinocchio::container::aligned_vector<pinocchio::ForceTpl<Scalar> >
301 #include "crocoddyl/multibody/contacts/multiple-contacts.hxx" 303 #endif // CROCODDYL_MULTIBODY_CONTACTS_MULTIPLE_CONTACTS_HPP_
State multibody representation.