residual-vel-collision.hpp
Go to the documentation of this file.
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2021, LAAS-CNRS, University of Edinburgh, INRIA
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
8 
9 #ifndef SOBEC_RESIDUAL_VEL_COLLISION_HPP_
10 #define SOBEC_RESIDUAL_VEL_COLLISION_HPP_
11 
12 #ifdef PINOCCHIO_WITH_HPP_FCL
13 #include <crocoddyl/core/residual-base.hpp>
14 #include <crocoddyl/core/utils/exception.hpp>
15 #include <crocoddyl/multibody/data/multibody.hpp>
16 #include <crocoddyl/multibody/fwd.hpp>
17 #include <crocoddyl/multibody/states/multibody.hpp>
18 #include <pinocchio/algorithm/geometry.hpp>
19 #include <pinocchio/algorithm/jacobian.hpp>
20 #include <pinocchio/multibody/fcl.hpp>
21 #include <pinocchio/multibody/fwd.hpp>
22 #include <pinocchio/multibody/geometry.hpp>
23 #include <pinocchio/spatial/motion.hpp>
24 
25 #include "sobec/fwd.hpp"
26 
27 namespace sobec {
28 
29 using namespace crocoddyl;
30 
49 template <typename _Scalar>
50 class ResidualModelVelCollisionTpl : public ResidualModelAbstractTpl<_Scalar> {
51  public:
52  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
53 
54  typedef _Scalar Scalar;
55  typedef MathBaseTpl<Scalar> MathBase;
56  typedef ResidualModelAbstractTpl<Scalar> Base;
57  typedef ResidualDataVelCollisionTpl<Scalar> Data;
58  typedef ResidualDataAbstractTpl<Scalar> ResidualDataAbstract;
59  typedef StateMultibodyTpl<Scalar> StateMultibody;
60  typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
61  typedef pinocchio::GeometryModel GeometryModel;
62 
63  typedef typename MathBase::VectorXs VectorXs;
64  typedef typename MathBase::MatrixXs MatrixXs;
65 
77  ResidualModelVelCollisionTpl(boost::shared_ptr<StateMultibody> state,
78  const std::size_t nu,
79  boost::shared_ptr<GeometryModel> geom_model,
80  const pinocchio::PairIndex pair_id,
81  const pinocchio::FrameIndex frame_id,
82  const pinocchio::ReferenceFrame type,
83  const double beta);
84 
85  virtual ~ResidualModelVelCollisionTpl();
86 
94  virtual void calc(const boost::shared_ptr<ResidualDataAbstract> &data,
95  const Eigen::Ref<const VectorXs> &x,
96  const Eigen::Ref<const VectorXs> &u);
97 
105  virtual void calcDiff(const boost::shared_ptr<ResidualDataAbstract> &data,
106  const Eigen::Ref<const VectorXs> &x,
107  const Eigen::Ref<const VectorXs> &u);
108 
109  virtual boost::shared_ptr<ResidualDataAbstract> createData(
110  DataCollectorAbstract *const data);
111 
115  const pinocchio::GeometryModel &get_geometry() const;
116 
120  pinocchio::PairIndex get_pair_id() const;
121 
125  void set_pair_id(const pinocchio::PairIndex pair_id);
126 
127  protected:
128  using Base::nu_;
129  using Base::state_;
130  using Base::unone_;
131  using Base::v_dependent_;
132 
133  private:
134  boost::shared_ptr<typename StateMultibody::PinocchioModel>
135  pin_model_;
136  boost::shared_ptr<pinocchio::GeometryModel>
137  geom_model_;
138  pinocchio::PairIndex
139  pair_id_;
140  pinocchio::JointIndex joint_id_;
141  pinocchio::FrameIndex frame_id_;
143  pinocchio::ReferenceFrame type_;
144  double beta_;
145 };
146 
147 template <typename _Scalar>
148 struct ResidualDataVelCollisionTpl : public ResidualDataAbstractTpl<_Scalar> {
149  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
150 
151  typedef _Scalar Scalar;
152  typedef MathBaseTpl<Scalar> MathBase;
153  typedef ResidualDataAbstractTpl<Scalar> Base;
154  typedef StateMultibodyTpl<Scalar> StateMultibody;
155  typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
156 
157  typedef typename MathBase::Matrix6xs Matrix6xs;
158  typedef typename MathBase::Vector3s Vector3s;
159  typedef typename MathBase::Vector2s Vector2s;
160 
161  template <template <typename Scalar> class Model>
162  ResidualDataVelCollisionTpl(Model<Scalar> *const model,
163  DataCollectorAbstract *const data)
164  : Base(model, data),
165  geometry(pinocchio::GeometryData(model->get_geometry())),
166  J(Matrix6xs::Zero(6, model->get_state()->get_nv())),
167  Vx(Matrix6xs::Zero(6, 2 * model->get_state()->get_nv())) {
168  // Check that proper shared data has been passed
169  DataCollectorMultibodyTpl<Scalar> *d =
170  dynamic_cast<DataCollectorMultibodyTpl<Scalar> *>(shared);
171  if (d == NULL) {
172  throw_pretty(
173  "Invalid argument: the shared data should be derived from "
174  "DataCollectorActMultibodyTpl");
175  }
176  // Avoids data casting at runtime
177  pinocchio = d->pinocchio;
178  }
179  pinocchio::GeometryData geometry;
180  pinocchio::DataTpl<Scalar> *pinocchio;
181  Matrix6xs J;
182  Vector3s d;
183  Vector3s e;
184  Matrix6xs Vx;
185  Vector2s V;
186  double n;
187  using Base::r;
188  using Base::Ru;
189  using Base::Rx;
190  using Base::shared;
191 };
192 
193 } // namespace sobec
194 
195 /* --- Details -------------------------------------------------------------- */
196 /* --- Details -------------------------------------------------------------- */
197 /* --- Details -------------------------------------------------------------- */
199 
200 #endif // PINOCCHIO_WITH_HPP_FCL
201 
202 #endif // SOBEC_RESIDUAL_VEL_COLLISION_HPP_
fwd.hpp
sobec
Definition: activation-quad-ref.hpp:19
sobec::newcontacts::x
@ x
Definition: contact1d.hpp:26
residual-vel-collision.hxx