contact-force.hxx
Go to the documentation of this file.
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2022, LAAS-CNRS, University of Edinburgh
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
8 
9 #include "contact-force.hpp"
10 
11 namespace sobec {
12 namespace newcontacts {
13 
14 template <typename Scalar>
16  boost::shared_ptr<StateMultibody> state, const pinocchio::FrameIndex id,
17  const Force& fref, const std::size_t nc, const std::size_t nu)
18  : Base(state, id, fref, nc, nu) {}
19 
20 template <typename Scalar>
22  boost::shared_ptr<StateMultibody> state, const pinocchio::FrameIndex id,
23  const Force& fref, const std::size_t nc)
24  : Base(state, id, fref, nc) {}
25 
26 template <typename Scalar>
28 
29 template <typename Scalar>
31  const boost::shared_ptr<ResidualDataAbstract>& data,
32  const Eigen::Ref<const VectorXs>&, const Eigen::Ref<const VectorXs>&) {
33  Data* d = static_cast<Data*>(data.get());
34 
35  // We transform the force to the contact frame
36  switch (d->contact_type) {
37  case Contact1D: {
39  static_cast<ContactData1DTpl<Scalar>*>(d->contact.get());
40  if (d1d->type == pinocchio::LOCAL) {
41  data->r = d->contact->jMf.rotation().transpose().row(d1d->mask) *
42  d->contact->f.linear() -
43  this->get_reference().linear().row(d1d->mask);
44  } else if (d1d->type == pinocchio::WORLD ||
45  d1d->type == pinocchio::LOCAL_WORLD_ALIGNED) {
46  data->r =
47  (d1d->oRf * d->contact->jMf.rotation().transpose()).row(d1d->mask) *
48  d->contact->f.linear() -
49  this->get_reference().linear().row(d1d->mask);
50  }
51  break;
52  }
53  case Contact3D: {
55  static_cast<ContactData3DTpl<Scalar>*>(d->contact.get());
56  if (d3d->type == pinocchio::LOCAL) {
57  data->r = (d->contact->jMf.actInv(d->contact->f).linear() -
58  this->get_reference().linear());
59  } else if (d3d->type == pinocchio::WORLD ||
60  d3d->type == pinocchio::LOCAL_WORLD_ALIGNED) {
61  data->r = (d3d->oRf * d->contact->jMf.actInv(d->contact->f).linear() -
62  this->get_reference().linear());
63  }
64  break;
65  }
66  case Contact6D: {
68  static_cast<ContactData6DTpl<Scalar>*>(d->contact.get());
69  if (d6d->type == pinocchio::LOCAL) {
70  data->r =
71  (d->contact->jMf.actInv(d->contact->f) - this->get_reference())
72  .toVector();
73  } else if (d6d->type == pinocchio::WORLD ||
74  d6d->type == pinocchio::LOCAL_WORLD_ALIGNED) {
75  data->r = (d6d->lwaMl.act(d->contact->jMf.actInv(d->contact->f)) -
76  this->get_reference())
77  .toVector();
78  }
79  break;
80  }
81  default:
82  break;
83  }
84 }
85 
86 template <typename Scalar>
88  const boost::shared_ptr<ResidualDataAbstract>& data,
89  const Eigen::Ref<const VectorXs>&, const Eigen::Ref<const VectorXs>&) {
90  Data* d = static_cast<Data*>(data.get());
91 
92  const MatrixXs& df_dx = d->contact->df_dx;
93  const MatrixXs& df_du = d->contact->df_du;
94 
95  switch (d->contact_type) {
96  case Contact1D: {
97  data->Rx = df_dx.template topRows<1>();
98  data->Ru = df_du.template topRows<1>();
99  break;
100  }
101  case Contact3D: {
102  data->Rx = df_dx.template topRows<3>();
103  data->Ru = df_du.template topRows<3>();
104  break;
105  }
106  case Contact6D:
107  data->Rx = df_dx;
108  data->Ru = df_du;
109  break;
110  default:
111  break;
112  }
113 }
114 
115 } // namespace newcontacts
116 } // namespace sobec
contact-force.hpp
sobec::newcontacts::ResidualModelContactForceTpl::~ResidualModelContactForceTpl
virtual ~ResidualModelContactForceTpl()
Definition: contact-force.hxx:27
sobec::newcontacts::ResidualModelContactForceTpl::Force
pinocchio::ForceTpl< Scalar > Force
Definition: contact-force.hpp:65
sobec::newcontacts::ContactData3DTpl::type
pinocchio::ReferenceFrame type
Definition: contact3d.hpp:231
sobec::newcontacts::ContactData6DTpl
Definition: contact6d.hpp:157
sobec::newcontacts::ResidualModelContactForceTpl::ResidualModelContactForceTpl
ResidualModelContactForceTpl(boost::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const Force &fref, const std::size_t nc, const std::size_t nu)
Initialize the contact force residual model.
Definition: contact-force.hxx:15
sobec::newcontacts::ContactData1DTpl::oRf
Matrix3s oRf
Definition: contact1d.hpp:249
sobec::newcontacts::ContactData6DTpl::lwaMl
pinocchio::SE3Tpl< Scalar > lwaMl
Definition: contact6d.hpp:222
sobec::newcontacts::ContactData1DTpl::type
pinocchio::ReferenceFrame type
Definition: contact1d.hpp:251
sobec::newcontacts::ResidualModelContactForceTpl::calcDiff
virtual void calcDiff(const boost::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)
Compute the derivatives of the contact force residual.
Definition: contact-force.hxx:87
sobec::newcontacts::ContactData6DTpl::type
pinocchio::ReferenceFrame type
Definition: contact6d.hpp:227
sobec::newcontacts::ContactData1DTpl
Definition: contact1d.hpp:173
sobec
Definition: activation-quad-ref.hpp:19
sobec::newcontacts::ContactData1DTpl::mask
Vector3MaskType mask
Definition: contact1d.hpp:252
sobec::newcontacts::ContactData3DTpl
Definition: contact3d.hpp:155
sobec::newcontacts::ResidualModelContactForceTpl::calc
virtual void calc(const boost::shared_ptr< ResidualDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)
Compute the contact force residual.
Definition: contact-force.hxx:30
sobec::newcontacts::ContactData3DTpl::oRf
Matrix3s oRf
Definition: contact3d.hpp:229
sobec::newcontacts::ResidualModelContactForceTpl::Data
crocoddyl::ResidualDataContactForceTpl< Scalar > Data
Definition: contact-force.hpp:62
sobec::newcontacts::ResidualModelContactForceTpl::Base
crocoddyl::ResidualModelContactForceTpl< Scalar > Base
Definition: contact-force.hpp:61
sobec::newcontacts::ResidualModelContactForceTpl::MatrixXs
MathBase::MatrixXs MatrixXs
Definition: contact-force.hpp:67