GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/crocoddyl/multibody/contacts/contact-1d.hpp Lines: 35 37 94.6 %
Date: 2024-02-13 11:12:33 Branches: 45 90 50.0 %

Line Branch Exec Source
1
///////////////////////////////////////////////////////////////////////////////
2
// BSD 3-Clause License
3
//
4
// Copyright (C) 2020-2023, LAAS-CNRS, University of Edinburgh,
5
//                          Heriot-Watt University
6
// Copyright note valid unless otherwise stated in individual files.
7
// All rights reserved.
8
///////////////////////////////////////////////////////////////////////////////
9
10
#ifndef CROCODDYL_MULTIBODY_CONTACTS_CONTACT_1D_HPP_
11
#define CROCODDYL_MULTIBODY_CONTACTS_CONTACT_1D_HPP_
12
13
#include <pinocchio/algorithm/frames.hpp>
14
#include <pinocchio/algorithm/kinematics-derivatives.hpp>
15
#include <pinocchio/multibody/data.hpp>
16
#include <pinocchio/spatial/motion.hpp>
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>
25
class ContactModel1DTpl : public ContactModelAbstractTpl<_Scalar> {
26
 public:
27
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
28
29
  typedef _Scalar Scalar;
30
  typedef MathBaseTpl<Scalar> MathBase;
31
  typedef ContactModelAbstractTpl<Scalar> Base;
32
  typedef ContactData1DTpl<Scalar> Data;
33
  typedef StateMultibodyTpl<Scalar> StateMultibody;
34
  typedef ContactDataAbstractTpl<Scalar> ContactDataAbstract;
35
  typedef typename MathBase::Vector2s Vector2s;
36
  typedef typename MathBase::Vector3s Vector3s;
37
  typedef typename MathBase::VectorXs VectorXs;
38
  typedef typename MathBase::Matrix3s Matrix3s;
39
40
  /**
41
   * @brief Initialize the 1d contact model
42
   *
43
   * To learn more about the computation of the contact derivatives in different
44
   * frames see
45
   *  S. Kleff et. al, On the Derivation of the Contact Dynamics in Arbitrary
46
   *  Frames: Application to Polishing with Talos, ICHR 2022
47
   *
48
   * @param[in] state     State of the multibody system
49
   * @param[in] id        Reference frame id of the contact
50
   * @param[in] xref      Contact position used for the Baumgarte stabilization
51
   * @param[in] type      Type of contact
52
   * @param[in] rotation  Rotation of the reference frame's z-axis
53
   * @param[in] nu        Dimension of the control vector
54
   * @param[in] gains     Baumgarte stabilization gains
55
   */
56
  ContactModel1DTpl(boost::shared_ptr<StateMultibody> state,
57
                    const pinocchio::FrameIndex id, const Scalar xref,
58
                    const pinocchio::ReferenceFrame type,
59
                    const Matrix3s& rotation, const std::size_t nu,
60
                    const Vector2s& gains = Vector2s::Zero());
61
62
  /**
63
   * @brief Initialize the 1d contact model
64
   *
65
   * The default `nu` is obtained from `StateAbstractTpl::get_nv()`. To learn
66
   * more about the computation of the contact derivatives in different frames
67
   * see
68
   *  S. Kleff et. al, On the Derivation of the Contact Dynamics in Arbitrary
69
   *  Frames: Application to Polishing with Talos, ICHR 2022
70
   *
71
   * @param[in] state     State of the multibody system
72
   * @param[in] id        Reference frame id of the contact
73
   * @param[in] xref      Contact position used for the Baumgarte stabilization
74
   * @param[in] type      Type of contact
75
   * @param[in] gains     Baumgarte stabilization gains
76
   */
77
  ContactModel1DTpl(boost::shared_ptr<StateMultibody> state,
78
                    const pinocchio::FrameIndex id, const Scalar xref,
79
                    const pinocchio::ReferenceFrame type,
80
                    const Vector2s& gains = Vector2s::Zero());
81
82
  DEPRECATED(
83
      "Use constructor that passes the type type of contact, this assumes is "
84
      "pinocchio::LOCAL",
85
      ContactModel1DTpl(boost::shared_ptr<StateMultibody> state,
86
                        const pinocchio::FrameIndex id, const Scalar xref,
87
                        const std::size_t nu,
88
                        const Vector2s& gains = Vector2s::Zero());)
89
  DEPRECATED(
90
      "Use constructor that passes the type type of contact, this assumes is "
91
      "pinocchio::LOCAL",
92
      ContactModel1DTpl(boost::shared_ptr<StateMultibody> state,
93
                        const pinocchio::FrameIndex id, const Scalar xref,
94
                        const Vector2s& gains = Vector2s::Zero());)
95
  virtual ~ContactModel1DTpl();
96
97
  /**
98
   * @brief Compute the 1d contact Jacobian and drift
99
   *
100
   * @param[in] data  1d contact data
101
   * @param[in] x     State point \f$\mathbf{x}\in\mathbb{R}^{ndx}\f$
102
   * @param[in] u     Control input \f$\mathbf{u}\in\mathbb{R}^{nu}\f$
103
   */
104
  virtual void calc(const boost::shared_ptr<ContactDataAbstract>& data,
105
                    const Eigen::Ref<const VectorXs>& x);
106
107
  /**
108
   * @brief Compute the derivatives of the 1d contact holonomic constraint
109
   *
110
   * @param[in] data  1d contact data
111
   * @param[in] x     State point \f$\mathbf{x}\in\mathbb{R}^{ndx}\f$
112
   * @param[in] u     Control input \f$\mathbf{u}\in\mathbb{R}^{nu}\f$
113
   */
114
  virtual void calcDiff(const boost::shared_ptr<ContactDataAbstract>& data,
115
                        const Eigen::Ref<const VectorXs>& x);
116
117
  /**
118
   * @brief Convert the force into a stack of spatial forces
119
   *
120
   * @param[in] data   1d contact data
121
   * @param[in] force  1d force
122
   */
123
  virtual void updateForce(const boost::shared_ptr<ContactDataAbstract>& data,
124
                           const VectorXs& force);
125
126
  /**
127
   * @brief Create the 1d contact data
128
   */
129
  virtual boost::shared_ptr<ContactDataAbstract> createData(
130
      pinocchio::DataTpl<Scalar>* const data);
131
132
  /**
133
   * @brief Return the reference frame translation
134
   */
135
  const Scalar get_reference() const;
136
137
  /**
138
   * @brief Create the 1d contact data
139
   */
140
  const Vector2s& get_gains() const;
141
142
  /**
143
   * @brief Return the rotation of the reference frames's z axis
144
   */
145
  const Matrix3s& get_axis_rotation() const;
146
147
  /**
148
   * @brief Modify the reference frame translation
149
   */
150
  void set_reference(const Scalar reference);
151
152
  /**
153
   * @brief Modify the rotation of the reference frames's z axis
154
   */
155
  void set_axis_rotation(const Matrix3s& rotation);
156
157
  /**
158
   * @brief Print relevant information of the 1d contact model
159
   *
160
   * @param[out] os  Output stream object
161
   */
162
  virtual void print(std::ostream& os) const;
163
164
 protected:
165
  using Base::id_;
166
  using Base::nc_;
167
  using Base::nu_;
168
  using Base::state_;
169
  using Base::type_;
170
171
 private:
172
  Scalar xref_;     //!< Contact position used for the Baumgarte stabilization
173
  Matrix3s Raxis_;  //!< Rotation of the reference frame's z-axis
174
  Vector2s gains_;  //!< Baumgarte stabilization gains
175
};
176
177
template <typename _Scalar>
178
struct ContactData1DTpl : public ContactDataAbstractTpl<_Scalar> {
179
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
180
181
  typedef _Scalar Scalar;
182
  typedef MathBaseTpl<Scalar> MathBase;
183
  typedef ContactDataAbstractTpl<Scalar> Base;
184
  typedef typename MathBase::Matrix2s Matrix2s;
185
  typedef typename MathBase::Matrix3s Matrix3s;
186
  typedef typename MathBase::Matrix3xs Matrix3xs;
187
  typedef typename MathBase::Matrix6xs Matrix6xs;
188
  typedef typename MathBase::Vector3s Vector3s;
189
  typedef typename pinocchio::MotionTpl<Scalar> Motion;
190
  typedef typename pinocchio::ForceTpl<Scalar> Force;
191
192
  template <template <typename Scalar> class Model>
193
735
  ContactData1DTpl(Model<Scalar>* const model,
194
                   pinocchio::DataTpl<Scalar>* const data)
195
      : Base(model, data),
196
        v(Motion::Zero()),
197
        f_local(Force::Zero()),
198
735
        da0_local_dx(3, model->get_state()->get_ndx()),
199
735
        fJf(6, model->get_state()->get_nv()),
200
735
        v_partial_dq(6, model->get_state()->get_nv()),
201
735
        a_partial_dq(6, model->get_state()->get_nv()),
202
735
        a_partial_dv(6, model->get_state()->get_nv()),
203
735
        a_partial_da(6, model->get_state()->get_nv()),
204
735
        fXjdv_dq(6, model->get_state()->get_nv()),
205
735
        fXjda_dq(6, model->get_state()->get_nv()),
206
735
        fXjda_dv(6, model->get_state()->get_nv()),
207











7350
        fJf_df(3, model->get_state()->get_nv()) {
208
735
    frame = model->get_id();
209
735
    jMf = model->get_state()->get_pinocchio()->frames[frame].placement;
210

735
    fXj = jMf.inverse().toActionMatrix();
211
735
    a0_local.setZero();
212
735
    dp.setZero();
213
735
    dp_local.setZero();
214
735
    da0_local_dx.setZero();
215
735
    fJf.setZero();
216
735
    v_partial_dq.setZero();
217
735
    a_partial_dq.setZero();
218
735
    a_partial_dv.setZero();
219
735
    a_partial_da.setZero();
220
735
    vv_skew.setZero();
221
735
    vw_skew.setZero();
222
735
    a0_skew.setZero();
223
735
    a0_world_skew.setZero();
224
735
    dp_skew.setZero();
225
735
    f_skew.setZero();
226
735
    fXjdv_dq.setZero();
227
735
    fXjda_dq.setZero();
228
735
    fXjda_dv.setZero();
229
735
    oRf.setZero();
230
735
    fJf_df.setZero();
231
735
  }
232
233
  using Base::a0;
234
  using Base::da0_dx;
235
  using Base::df_du;
236
  using Base::df_dx;
237
  using Base::f;
238
  using Base::frame;
239
  using Base::fXj;
240
  using Base::Jc;
241
  using Base::jMf;
242
  using Base::pinocchio;
243
244
  Motion v;
245
  Vector3s a0_local;
246
  Vector3s dp;
247
  Vector3s dp_local;
248
  Force f_local;
249
  Matrix3xs da0_local_dx;
250
  Matrix6xs fJf;
251
  Matrix6xs v_partial_dq;
252
  Matrix6xs a_partial_dq;
253
  Matrix6xs a_partial_dv;
254
  Matrix6xs a_partial_da;
255
  Matrix3s vv_skew;
256
  Matrix3s vw_skew;
257
  Matrix3s a0_skew;
258
  Matrix3s a0_world_skew;
259
  Matrix3s dp_skew;
260
  Matrix3s f_skew;
261
  Matrix6xs fXjdv_dq;
262
  Matrix6xs fXjda_dq;
263
  Matrix6xs fXjda_dv;
264
  Matrix2s oRf;
265
  Matrix3xs fJf_df;
266
};
267
268
}  // namespace crocoddyl
269
270
/* --- Details -------------------------------------------------------------- */
271
/* --- Details -------------------------------------------------------------- */
272
/* --- Details -------------------------------------------------------------- */
273
#include "crocoddyl/multibody/contacts/contact-1d.hxx"
274
275
#endif  // CROCODDYL_MULTIBODY_CONTACTS_CONTACT_1D_HPP_