contact1d.hpp
Go to the documentation of this file.
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2020-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_1D_HPP_
10 #define SOBEC_CONTACT_1D_HPP_
11 
12 #include <crocoddyl/core/utils/exception.hpp>
13 #include <crocoddyl/multibody/contact-base.hpp>
14 #include <crocoddyl/multibody/contacts/contact-1d.hpp>
15 #include <crocoddyl/multibody/fwd.hpp>
16 #include <pinocchio/algorithm/frames.hpp>
17 #include <pinocchio/algorithm/kinematics-derivatives.hpp>
18 #include <pinocchio/multibody/data.hpp>
19 #include <pinocchio/spatial/motion.hpp>
20 
21 #include "sobec/fwd.hpp"
22 
23 namespace sobec {
24 namespace newcontacts {
25 
26 enum Vector3MaskType { x = 0, y = 1, z = 2 };
27 
28 template <typename _Scalar>
29 class ContactModel1DTpl : public crocoddyl::ContactModel1DTpl<_Scalar> {
30  public:
31  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
32 
33  typedef _Scalar Scalar;
34  typedef crocoddyl::MathBaseTpl<Scalar> MathBase;
35  typedef crocoddyl::ContactModel1DTpl<Scalar> Base;
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  typedef typename MathBase::Matrix3s Matrix3s;
42  typedef typename MathBase::Matrix6s Matrix6s;
54  ContactModel1DTpl(boost::shared_ptr<StateMultibody> state,
55  const pinocchio::FrameIndex id, const Vector3s& xref,
56  const std::size_t nu,
57  const Vector2s& gains = Vector2s::Zero(),
58  const Vector3MaskType& mask = Vector3MaskType::z,
59  const pinocchio::ReferenceFrame ref = pinocchio::LOCAL);
60 
72  ContactModel1DTpl(boost::shared_ptr<StateMultibody> state,
73  const pinocchio::FrameIndex id, const Vector3s& xref,
74  const Vector2s& gains = Vector2s::Zero(),
75  const pinocchio::ReferenceFrame ref = pinocchio::LOCAL);
76 
77  virtual ~ContactModel1DTpl();
78 
86  virtual void calc(
87  const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
88  const Eigen::Ref<const VectorXs>& x);
89 
97  virtual void calcDiff(
98  const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
99  const Eigen::Ref<const VectorXs>& x);
100 
107  virtual void updateForce(
108  const boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>& data,
109  const VectorXs& force);
110 
114  virtual boost::shared_ptr<crocoddyl::ContactDataAbstractTpl<Scalar>>
115  createData(pinocchio::DataTpl<Scalar>* const data);
116 
120  const Vector3s& get_reference() const;
121 
125  const Vector2s& get_gains() const;
126 
130  void set_reference(const Vector3s& reference);
131 
135  void set_type(const pinocchio::ReferenceFrame type);
136 
140  const pinocchio::ReferenceFrame& get_type() const;
141 
145  void set_mask(const Vector3MaskType mask);
146 
150  const Vector3MaskType& get_mask() const;
151 
157  virtual void print(std::ostream& os) const;
158 
159  protected:
160  using Base::id_;
161  using Base::nc_;
162  using Base::nu_;
163  using Base::state_;
164 
165  private:
166  Vector3s xref_;
167  Vector2s gains_;
168  Vector3MaskType mask_;
169  pinocchio::ReferenceFrame type_;
170 };
171 
172 template <typename _Scalar>
173 struct ContactData1DTpl : public crocoddyl::ContactData1DTpl<_Scalar> {
174  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
175 
176  typedef _Scalar Scalar;
177  typedef crocoddyl::MathBaseTpl<Scalar> MathBase;
178  typedef crocoddyl::ContactData1DTpl<Scalar> Base;
179  typedef typename MathBase::Matrix2s Matrix2s;
180  typedef typename MathBase::Matrix3s Matrix3s;
181  typedef typename MathBase::Matrix6xs Matrix6xs;
182  typedef typename MathBase::Vector3s Vector3s;
183  typedef typename MathBase::MatrixXs MatrixXs;
184 
185  template <template <typename Scalar> class Model>
186  ContactData1DTpl(Model<Scalar>* const model,
187  pinocchio::DataTpl<Scalar>* const data)
188  : Base(model, data),
189  fJf(6, model->get_state()->get_nv()),
190  v_partial_dq(6, model->get_state()->get_nv()),
191  a_partial_dq(6, model->get_state()->get_nv()),
192  a_partial_dv(6, model->get_state()->get_nv()),
193  a_partial_da(6, model->get_state()->get_nv()),
194  fXjdv_dq(6, model->get_state()->get_nv()),
195  fXjda_dq(6, model->get_state()->get_nv()),
196  fXjda_dv(6, model->get_state()->get_nv()),
197  da0_dx_3d_(3, model->get_state()->get_ndx()),
198  drnea_skew_term_(model->get_state()->get_nv(),
199  model->get_state()->get_nv()) {
200  frame = model->get_id();
201  jMf = model->get_state()->get_pinocchio()->frames[frame].placement;
202  fXj = jMf.inverse().toActionMatrix();
203  fJf.setZero();
204  v_partial_dq.setZero();
205  a_partial_dq.setZero();
206  a_partial_dv.setZero();
207  a_partial_da.setZero();
208  fXjdv_dq.setZero();
209  fXjda_dq.setZero();
210  fXjda_dv.setZero();
211  vv.setZero();
212  vw.setZero();
213  vv_skew.setZero();
214  vw_skew.setZero();
215  oRf.setZero();
216  tmp_skew_.setZero();
217  type = model->get_type();
218  mask = model->get_mask();
219  a0_3d_.setZero();
220  da0_dx_3d_.setZero();
221  drnea_skew_term_.setZero();
222  }
223 
224  using Base::a0;
225  using Base::da0_dx;
226  using Base::df_du;
227  using Base::df_dx;
228  using Base::f;
229  using Base::frame;
230  using Base::fXj;
231  using Base::Jc;
232  using Base::jMf;
233  using Base::pinocchio;
234 
235  pinocchio::MotionTpl<Scalar> v;
236  pinocchio::MotionTpl<Scalar> a;
251  pinocchio::ReferenceFrame type;
256 };
257 
258 } // namespace newcontacts
259 } // namespace sobec
260 
261 /* --- Details -------------------------------------------------------------- */
262 /* --- Details -------------------------------------------------------------- */
263 /* --- Details -------------------------------------------------------------- */
265 
266 #endif // SOBEC_CONTACT_1D_HPP_
sobec::newcontacts::y
@ y
Definition: contact1d.hpp:26
sobec::newcontacts::ContactData1DTpl::v
pinocchio::MotionTpl< Scalar > v
Definition: contact1d.hpp:235
sobec::newcontacts::ContactData1DTpl::a_partial_da
Matrix6xs a_partial_da
Definition: contact1d.hpp:241
sobec::newcontacts::ContactModel1DTpl::Base
crocoddyl::ContactModel1DTpl< Scalar > Base
Definition: contact1d.hpp:35
sobec::newcontacts::ContactData1DTpl::fXjda_dq
Matrix6xs fXjda_dq
Definition: contact1d.hpp:243
sobec::newcontacts::ContactData1DTpl::oRf
Matrix3s oRf
Definition: contact1d.hpp:249
sobec::newcontacts::ContactData1DTpl::Matrix2s
MathBase::Matrix2s Matrix2s
Definition: contact1d.hpp:179
fwd.hpp
sobec::newcontacts::ContactModel1DTpl::ContactModel1DTpl
ContactModel1DTpl(boost::shared_ptr< StateMultibody > state, const pinocchio::FrameIndex id, const Vector3s &xref, const std::size_t nu, const Vector2s &gains=Vector2s::Zero(), const Vector3MaskType &mask=Vector3MaskType::z, const pinocchio::ReferenceFrame ref=pinocchio::LOCAL)
Initialize the 1d contact model.
Definition: contact1d.hxx:15
sobec::newcontacts::ContactData1DTpl::type
pinocchio::ReferenceFrame type
Definition: contact1d.hpp:251
sobec::newcontacts::ContactData1DTpl::v_partial_dq
Matrix6xs v_partial_dq
Definition: contact1d.hpp:238
sobec::newcontacts::ContactData1DTpl::fXjda_dv
Matrix6xs fXjda_dv
Definition: contact1d.hpp:244
sobec::newcontacts::ContactModel1DTpl::Vector2s
MathBase::Vector2s Vector2s
Definition: contact1d.hpp:38
sobec::newcontacts::ContactData1DTpl::Matrix3s
MathBase::Matrix3s Matrix3s
Definition: contact1d.hpp:180
sobec::newcontacts::ContactModel1DTpl::get_reference
const Vector3s & get_reference() const
Return the reference frame translation.
Definition: contact1d.hxx:187
sobec::newcontacts::ContactModel1DTpl::StateMultibody
crocoddyl::StateMultibodyTpl< Scalar > StateMultibody
Definition: contact1d.hpp:37
sobec::newcontacts::ContactModel1DTpl::Matrix3s
MathBase::Matrix3s Matrix3s
Definition: contact1d.hpp:41
sobec::newcontacts::ContactModel1DTpl::calcDiff
virtual void calcDiff(const boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar >> &data, const Eigen::Ref< const VectorXs > &x)
Compute the derivatives of the 1d contact holonomic constraint.
Definition: contact1d.hxx:75
sobec::newcontacts::ContactData1DTpl::da0_dx_3d_
MatrixXs da0_dx_3d_
Definition: contact1d.hpp:254
sobec::newcontacts::ContactData1DTpl::vw_skew
Matrix3s vw_skew
Definition: contact1d.hpp:248
sobec::newcontacts::ContactModel1DTpl::get_mask
const Vector3MaskType & get_mask() const
Get contact 1D mask.
Definition: contact1d.hxx:218
sobec::newcontacts::ContactData1DTpl
Definition: contact1d.hpp:173
sobec::newcontacts::ContactModel1DTpl::createData
virtual boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar > > createData(pinocchio::DataTpl< Scalar > *const data)
Create the 1d contact data.
Definition: contact1d.hxx:174
sobec::newcontacts::ContactData1DTpl::Scalar
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef _Scalar Scalar
Definition: contact1d.hpp:176
sobec::newcontacts::ContactData1DTpl::vw
Vector3s vw
Definition: contact1d.hpp:246
sobec::newcontacts::ContactModel1DTpl::set_type
void set_type(const pinocchio::ReferenceFrame type)
Modify pinocchio::ReferenceFrame.
Definition: contact1d.hxx:203
sobec::newcontacts::ContactData1DTpl::a_partial_dq
Matrix6xs a_partial_dq
Definition: contact1d.hpp:239
sobec::newcontacts::ContactModel1DTpl::Matrix6s
MathBase::Matrix6s Matrix6s
Definition: contact1d.hpp:42
sobec
Definition: activation-quad-ref.hpp:19
sobec::newcontacts::ContactData1DTpl::a0_3d_
Vector3s a0_3d_
Definition: contact1d.hpp:253
sobec::newcontacts::ContactModel1DTpl::print
virtual void print(std::ostream &os) const
Print relevant information of the 1d contact model.
Definition: contact1d.hxx:180
sobec::newcontacts::ContactData1DTpl::fXjdv_dq
Matrix6xs fXjdv_dq
Definition: contact1d.hpp:242
sobec::newcontacts::ContactModel1DTpl::Vector3s
MathBase::Vector3s Vector3s
Definition: contact1d.hpp:39
sobec::newcontacts::ContactModel1DTpl::Data
ContactData1DTpl< Scalar > Data
Definition: contact1d.hpp:36
sobec::newcontacts::ContactData1DTpl::mask
Vector3MaskType mask
Definition: contact1d.hpp:252
sobec::newcontacts::ContactModel1DTpl::get_type
const pinocchio::ReferenceFrame & get_type() const
Get pinocchio::ReferenceFrame.
Definition: contact1d.hxx:208
sobec::newcontacts::ContactData1DTpl::vv_skew
Matrix3s vv_skew
Definition: contact1d.hpp:247
sobec::newcontacts::z
@ z
Definition: contact1d.hpp:26
sobec::newcontacts::ContactData1DTpl::a
pinocchio::MotionTpl< Scalar > a
Definition: contact1d.hpp:236
sobec::newcontacts::ContactData1DTpl::drnea_skew_term_
MatrixXs drnea_skew_term_
Definition: contact1d.hpp:255
sobec::newcontacts::x
@ x
Definition: contact1d.hpp:26
sobec::newcontacts::ContactData1DTpl::Vector3s
MathBase::Vector3s Vector3s
Definition: contact1d.hpp:182
sobec::newcontacts::ContactData1DTpl::MathBase
crocoddyl::MathBaseTpl< Scalar > MathBase
Definition: contact1d.hpp:177
contact1d.hxx
sobec::newcontacts::ContactData1DTpl::Base
crocoddyl::ContactData1DTpl< Scalar > Base
Definition: contact1d.hpp:178
sobec::newcontacts::ContactModel1DTpl::calc
virtual void calc(const boost::shared_ptr< crocoddyl::ContactDataAbstractTpl< Scalar >> &data, const Eigen::Ref< const VectorXs > &x)
Compute the 1d contact Jacobian and drift.
Definition: contact1d.hxx:40
sobec::newcontacts::Vector3MaskType
Vector3MaskType
Definition: contact1d.hpp:26
sobec::newcontacts::ContactModel1DTpl::MathBase
crocoddyl::MathBaseTpl< Scalar > MathBase
Definition: contact1d.hpp:34
sobec::newcontacts::ContactModel1DTpl::set_mask
void set_mask(const Vector3MaskType mask)
Modify contact 1D mask.
Definition: contact1d.hxx:213
sobec::newcontacts::ContactModel1DTpl::set_reference
void set_reference(const Vector3s &reference)
Modify the reference frame translation.
Definition: contact1d.hxx:198
sobec::newcontacts::ContactData1DTpl::vv
Vector3s vv
Definition: contact1d.hpp:245
sobec::newcontacts::ContactModel1DTpl::get_gains
const Vector2s & get_gains() const
Create the 1d contact data.
Definition: contact1d.hxx:193
sobec::newcontacts::ContactData1DTpl::a_partial_dv
Matrix6xs a_partial_dv
Definition: contact1d.hpp:240
sobec::newcontacts::ContactModel1DTpl::~ContactModel1DTpl
virtual ~ContactModel1DTpl()
Definition: contact1d.hxx:37
sobec::newcontacts::ContactData1DTpl::MatrixXs
MathBase::MatrixXs MatrixXs
Definition: contact1d.hpp:183
sobec::newcontacts::ContactModel1DTpl::Scalar
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef _Scalar Scalar
Definition: contact1d.hpp:33
sobec::newcontacts::ContactData1DTpl::ContactData1DTpl
ContactData1DTpl(Model< Scalar > *const model, pinocchio::DataTpl< Scalar > *const data)
Definition: contact1d.hpp:186
sobec::newcontacts::ContactData1DTpl::fJf
Matrix6xs fJf
Definition: contact1d.hpp:237
sobec::newcontacts::ContactModel1DTpl::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: contact1d.hxx:149
sobec::newcontacts::ContactModel1DTpl::VectorXs
MathBase::VectorXs VectorXs
Definition: contact1d.hpp:40
sobec::newcontacts::ContactModel1DTpl
Definition: contact1d.hpp:29
sobec::newcontacts::ContactData1DTpl::tmp_skew_
Matrix3s tmp_skew_
Definition: contact1d.hpp:250
sobec::newcontacts::ContactData1DTpl::Matrix6xs
MathBase::Matrix6xs Matrix6xs
Definition: contact1d.hpp:181