contact6d.hpp
Go to the documentation of this file.
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2021, LAAS-CNRS, University of Edinburgh
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
8 
9 #ifndef SOBEC_CONTACT_6D_HPP_
10 #define SOBEC_CONTACT_6D_HPP_
11 
12 #include <crocoddyl/core/utils/deprecate.hpp>
13 #include <crocoddyl/core/utils/exception.hpp>
14 #include <crocoddyl/multibody/contact-base.hpp>
15 #include <crocoddyl/multibody/contacts/contact-6d.hpp>
16 #include <crocoddyl/multibody/fwd.hpp>
17 #include <pinocchio/algorithm/frames.hpp>
18 #include <pinocchio/algorithm/kinematics-derivatives.hpp>
19 #include <pinocchio/multibody/data.hpp>
20 #include <pinocchio/spatial/motion.hpp>
21 
22 #include "sobec/fwd.hpp"
23 
24 namespace sobec {
25 namespace newcontacts {
26 
27 template <typename _Scalar>
28 class ContactModel6DTpl : public crocoddyl::ContactModel6DTpl<_Scalar> {
29  public:
30  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
31 
32  typedef _Scalar Scalar;
33  typedef crocoddyl::MathBaseTpl<Scalar> MathBase;
34  typedef crocoddyl::ContactModel6DTpl<Scalar> Base;
36  typedef pinocchio::SE3Tpl<Scalar> SE3;
37  typedef crocoddyl::StateMultibodyTpl<Scalar> StateMultibody;
38  typedef typename MathBase::Vector2s Vector2s;
39  typedef typename MathBase::Vector3s Vector3s;
40  typedef typename MathBase::VectorXs VectorXs;
41 
51  ContactModel6DTpl(boost::shared_ptr<StateMultibody> state,
52  const pinocchio::FrameIndex id, const SE3& xref,
53  const std::size_t nu,
54  const Vector2s& gains = Vector2s::Zero(),
55  const pinocchio::ReferenceFrame type = pinocchio::LOCAL);
56 
67  ContactModel6DTpl(boost::shared_ptr<StateMultibody> state,
68  const pinocchio::FrameIndex id, const SE3& xref,
69  const Vector2s& gains = Vector2s::Zero(),
70  const pinocchio::ReferenceFrame type = pinocchio::LOCAL);
71 
72  virtual ~ContactModel6DTpl();
73 
81  virtual void calc(
82  const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
83  const Eigen::Ref<const VectorXs>& x);
84 
92  virtual void calcDiff(
93  const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
94  const Eigen::Ref<const VectorXs>& x);
95 
102  virtual void updateForce(
103  const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
104  const VectorXs& force);
105 
109  virtual boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>
110  createData(pinocchio::DataTpl<Scalar>* const data);
111 
115  const SE3& get_reference() const;
116 
120  const Vector2s& get_gains() const;
121 
125  void set_reference(const SE3& reference);
126 
130  void set_type(const pinocchio::ReferenceFrame type);
131 
135  const pinocchio::ReferenceFrame& get_type() const;
136 
142  virtual void print(std::ostream& os) const;
143 
144  protected:
145  using Base::id_;
146  using Base::nc_;
147  using Base::nu_;
148  using Base::state_;
149 
150  private:
151  SE3 xref_;
152  Vector2s gains_;
153  pinocchio::ReferenceFrame type_;
154 };
155 
156 template <typename _Scalar>
157 struct ContactData6DTpl : public crocoddyl::ContactData6DTpl<_Scalar> {
158  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
159 
160  typedef _Scalar Scalar;
161  typedef crocoddyl::MathBaseTpl<Scalar> MathBase;
162  typedef crocoddyl::ContactData6DTpl<Scalar> Base;
163  typedef typename MathBase::Matrix3s Matrix3s;
164  typedef typename MathBase::Matrix6s Matrix6s;
165  typedef typename MathBase::Vector3s Vector3s;
166  typedef typename MathBase::Vector6s Vector6s;
167  typedef typename MathBase::MatrixXs MatrixXs;
168 
169  template <template <typename Scalar> class Model>
170  ContactData6DTpl(Model<Scalar>* const model,
171  pinocchio::DataTpl<Scalar>* const data)
172  : Base(model, data),
173  fJf(6, model->get_state()->get_nv()),
174  rMf(pinocchio::SE3Tpl<Scalar>::Identity()),
175  lwaMl(pinocchio::SE3Tpl<Scalar>::Identity()),
176  v_partial_dq(6, model->get_state()->get_nv()),
177  a_partial_dq(6, model->get_state()->get_nv()),
178  a_partial_dv(6, model->get_state()->get_nv()),
179  a_partial_da(6, model->get_state()->get_nv()),
180  da0_dx_temp_(6, model->get_state()->get_ndx()),
181  tmp_skew_(6, model->get_state()->get_nv()),
182  drnea_skew_term_(model->get_state()->get_nv(),
183  model->get_state()->get_nv()) {
184  frame = model->get_id();
185  jMf = model->get_state()->get_pinocchio()->frames[frame].placement;
186  fXj = jMf.inverse().toActionMatrix();
187  fJf.setZero();
188  v_partial_dq.setZero();
189  a_partial_dq.setZero();
190  a_partial_dv.setZero();
191  a_partial_da.setZero();
192  tmp_skew_ang_.setZero();
193  tmp_skew_lin_.setZero();
194  tmp_skew_.setZero();
195  rMf_Jlog6.setZero();
196  type = model->get_type();
197  drnea_skew_term_.setZero();
198  a0_temp_.setZero();
199  da0_dx_temp_.setZero();
200  oRf.setZero();
201  }
202 
203  using Base::a0;
204  using Base::da0_dx;
205  using Base::df_du;
206  using Base::df_dx;
207  using Base::f;
208  using Base::frame;
209  using Base::fXj;
210  using Base::Jc;
211  using Base::jMf;
212  using Base::pinocchio;
213 
214  pinocchio::MotionTpl<Scalar> v;
215  pinocchio::MotionTpl<Scalar> a;
221  pinocchio::SE3Tpl<Scalar> rMf;
222  pinocchio::SE3Tpl<Scalar> lwaMl;
227  pinocchio::ReferenceFrame type;
232 };
233 
234 } // namespace newcontacts
235 } // namespace sobec
236 
237 /* --- Details -------------------------------------------------------------- */
238 /* --- Details -------------------------------------------------------------- */
239 /* --- Details -------------------------------------------------------------- */
241 
242 #endif // SOBEC_CONTACT_6D_HPP_
sobec::newcontacts::ContactData6DTpl::Vector3s
MathBase::Vector3s Vector3s
Definition: contact6d.hpp:165
sobec::newcontacts::ContactData6DTpl::a0_temp_
Vector6s a0_temp_
Definition: contact6d.hpp:229
sobec::newcontacts::ContactData6DTpl::a_partial_da
MatrixXs a_partial_da
Definition: contact6d.hpp:220
sobec::newcontacts::ContactData6DTpl::rMf_Jlog6
Matrix6s rMf_Jlog6
Definition: contact6d.hpp:223
sobec::newcontacts::ContactData6DTpl
Definition: contact6d.hpp:157
sobec::newcontacts::ContactData6DTpl::a_partial_dq
MatrixXs a_partial_dq
Definition: contact6d.hpp:218
sobec::newcontacts::ContactModel6DTpl::print
virtual void print(std::ostream &os) const
Print relevant information of the 6d contact model.
Definition: contact6d.hxx:162
sobec::newcontacts::ContactModel6DTpl::Scalar
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef _Scalar Scalar
Definition: contact6d.hpp:32
sobec::newcontacts::ContactModel6DTpl::SE3
pinocchio::SE3Tpl< Scalar > SE3
Definition: contact6d.hpp:36
sobec::newcontacts::ContactData6DTpl::a_partial_dv
MatrixXs a_partial_dv
Definition: contact6d.hpp:219
sobec::newcontacts::ContactData6DTpl::lwaMl
pinocchio::SE3Tpl< Scalar > lwaMl
Definition: contact6d.hpp:222
fwd.hpp
sobec::newcontacts::ContactModel6DTpl::get_type
const pinocchio::ReferenceFrame & get_type() const
Get pinocchio::ReferenceFrame.
Definition: contact6d.hxx:190
sobec::newcontacts::ContactModel6DTpl::set_reference
void set_reference(const SE3 &reference)
Modify the reference frame translation.
Definition: contact6d.hxx:180
sobec::newcontacts::ContactData6DTpl::tmp_skew_lin_
Matrix3s tmp_skew_lin_
Definition: contact6d.hpp:226
sobec::newcontacts::ContactModel6DTpl::MathBase
crocoddyl::MathBaseTpl< Scalar > MathBase
Definition: contact6d.hpp:33
sobec::newcontacts::ContactModel6DTpl::get_reference
const SE3 & get_reference() const
Return the reference frame translation.
Definition: contact6d.hxx:168
sobec::newcontacts::ContactModel6DTpl::~ContactModel6DTpl
virtual ~ContactModel6DTpl()
Definition: contact6d.hxx:35
sobec::newcontacts::ContactModel6DTpl::set_type
void set_type(const pinocchio::ReferenceFrame type)
Modify pinocchio::ReferenceFrame.
Definition: contact6d.hxx:185
sobec::newcontacts::ContactData6DTpl::tmp_skew_ang_
Matrix3s tmp_skew_ang_
Definition: contact6d.hpp:225
sobec::newcontacts::ContactData6DTpl::type
pinocchio::ReferenceFrame type
Definition: contact6d.hpp:227
sobec::newcontacts::ContactModel6DTpl::calcDiff
virtual void calcDiff(const boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar >> &data, const Eigen::Ref< const VectorXs > &x)
Compute the derivatives of the 6d contact holonomic constraint.
Definition: contact6d.hxx:70
sobec::newcontacts::ContactData6DTpl::drnea_skew_term_
MatrixXs drnea_skew_term_
Definition: contact6d.hpp:230
sobec::newcontacts::ContactData6DTpl::Scalar
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef _Scalar Scalar
Definition: contact6d.hpp:160
sobec::newcontacts::ContactData6DTpl::fJf
MatrixXs fJf
Definition: contact6d.hpp:216
sobec::newcontacts::ContactData6DTpl::v
pinocchio::MotionTpl< Scalar > v
Definition: contact6d.hpp:214
sobec::newcontacts::ContactData6DTpl::ContactData6DTpl
ContactData6DTpl(Model< Scalar > *const model, pinocchio::DataTpl< Scalar > *const data)
Definition: contact6d.hpp:170
sobec::newcontacts::ContactModel6DTpl::Vector3s
MathBase::Vector3s Vector3s
Definition: contact6d.hpp:39
sobec::newcontacts::ContactModel6DTpl::calc
virtual void calc(const boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar >> &data, const Eigen::Ref< const VectorXs > &x)
Compute the 6d contact Jacobian and drift.
Definition: contact6d.hxx:38
sobec::newcontacts::ContactModel6DTpl::updateForce
virtual void updateForce(const boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar >> &data, const VectorXs &force)
Convert the force into a stack of spatial forces.
Definition: contact6d.hxx:130
sobec::newcontacts::ContactData6DTpl::v_partial_dq
MatrixXs v_partial_dq
Definition: contact6d.hpp:217
sobec::newcontacts::ContactData6DTpl::rMf
pinocchio::SE3Tpl< Scalar > rMf
Definition: contact6d.hpp:221
sobec::newcontacts::ContactModel6DTpl::Data
ContactData6DTpl< Scalar > Data
Definition: contact6d.hpp:35
sobec::newcontacts::ContactData6DTpl::tmp_skew_
MatrixXs tmp_skew_
Definition: contact6d.hpp:224
sobec
Definition: activation-quad-ref.hpp:19
sobec::newcontacts::ContactData6DTpl::da0_dx_temp_
MatrixXs da0_dx_temp_
Definition: contact6d.hpp:228
sobec::newcontacts::x
@ x
Definition: contact1d.hpp:26
sobec::newcontacts::ContactModel6DTpl::VectorXs
MathBase::VectorXs VectorXs
Definition: contact6d.hpp:40
sobec::newcontacts::ContactModel6DTpl::Vector2s
MathBase::Vector2s Vector2s
Definition: contact6d.hpp:38
sobec::newcontacts::ContactModel6DTpl::createData
virtual boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar > > createData(pinocchio::DataTpl< Scalar > *const data)
Create the 6d contact data.
Definition: contact6d.hxx:156
sobec::newcontacts::ContactData6DTpl::Matrix3s
MathBase::Matrix3s Matrix3s
Definition: contact6d.hpp:163
contact6d.hxx
sobec::newcontacts::ContactModel6DTpl::Base
crocoddyl::ContactModel6DTpl< Scalar > Base
Definition: contact6d.hpp:34
sobec::newcontacts::ContactModel6DTpl::ContactModel6DTpl
ContactModel6DTpl(boost::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const SE3 &xref, const std::size_t nu, const Vector2s &gains=Vector2s::Zero(), const pinocchio::ReferenceFrame type=pinocchio::LOCAL)
Initialize the 6d contact model.
Definition: contact6d.hxx:15
sobec::newcontacts::ContactData6DTpl::oRf
Matrix3s oRf
Definition: contact6d.hpp:231
sobec::newcontacts::ContactData6DTpl::MathBase
crocoddyl::MathBaseTpl< Scalar > MathBase
Definition: contact6d.hpp:161
sobec::newcontacts::ContactModel6DTpl::get_gains
const Vector2s & get_gains() const
Return the Baumgarte stabilization gains.
Definition: contact6d.hxx:175
sobec::newcontacts::ContactData6DTpl::MatrixXs
MathBase::MatrixXs MatrixXs
Definition: contact6d.hpp:167
sobec::newcontacts::ContactData6DTpl::Matrix6s
MathBase::Matrix6s Matrix6s
Definition: contact6d.hpp:164
sobec::newcontacts::ContactModel6DTpl
Definition: contact6d.hpp:28
sobec::newcontacts::ContactData6DTpl::Vector6s
MathBase::Vector6s Vector6s
Definition: contact6d.hpp:166
sobec::newcontacts::ContactData6DTpl::Base
crocoddyl::ContactData6DTpl< Scalar > Base
Definition: contact6d.hpp:162
sobec::newcontacts::ContactData6DTpl::a
pinocchio::MotionTpl< Scalar > a
Definition: contact6d.hpp:215
sobec::newcontacts::ContactModel6DTpl::StateMultibody
crocoddyl::StateMultibodyTpl< Scalar > StateMultibody
Definition: contact6d.hpp:37