residual-cop.hpp
Go to the documentation of this file.
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2022, LAAS-CNRS
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
8 
9 #ifndef SOBEC_RESIDUAL_COP_HPP_
10 #define SOBEC_RESIDUAL_COP_HPP_
11 
12 #include <crocoddyl/core/residual-base.hpp>
13 #include <crocoddyl/core/utils/exception.hpp>
14 #include <crocoddyl/multibody/data/multibody.hpp>
15 #include <crocoddyl/multibody/fwd.hpp>
16 #include <crocoddyl/multibody/states/multibody.hpp>
17 #include <pinocchio/algorithm/jacobian.hpp>
18 #include <pinocchio/multibody/fwd.hpp>
19 #include <pinocchio/spatial/motion.hpp>
20 
21 #include "crocoddyl/multibody/contacts/contact-6d.hpp"
22 #include "crocoddyl/multibody/contacts/multiple-contacts.hpp"
23 #include "crocoddyl/multibody/data/contacts.hpp"
24 #include "sobec/fwd.hpp"
25 
26 namespace sobec {
27 
28 using namespace crocoddyl;
29 
40 template <typename _Scalar>
42  : public ResidualModelAbstractTpl<_Scalar> {
43  public:
44  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
45 
46  typedef _Scalar Scalar;
47  typedef MathBaseTpl<Scalar> MathBase;
48  typedef ResidualModelAbstractTpl<Scalar> Base;
50  typedef ResidualDataAbstractTpl<Scalar> ResidualDataAbstract;
51  typedef StateMultibodyTpl<Scalar> StateMultibody;
52  typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
53 
54  typedef typename MathBase::VectorXs VectorXs;
55  typedef typename MathBase::Vector3s Vector3s;
56  typedef typename MathBase::MatrixXs MatrixXs;
57  typedef typename pinocchio::ForceTpl<Scalar> Force;
58 
70  ResidualModelCenterOfPressureTpl(boost::shared_ptr<StateMultibody> state,
71  const pinocchio::FrameIndex contact_id,
72  const std::size_t nu);
73 
75 
83  virtual void calc(const boost::shared_ptr<ResidualDataAbstract> &data,
84  const Eigen::Ref<const VectorXs> &x,
85  const Eigen::Ref<const VectorXs> &u);
86 
94  virtual void calcDiff(const boost::shared_ptr<ResidualDataAbstract> &data,
95  const Eigen::Ref<const VectorXs> &x,
96  const Eigen::Ref<const VectorXs> &u);
97 
98  virtual boost::shared_ptr<ResidualDataAbstract> createData(
99  DataCollectorAbstract *const data);
100 
104  pinocchio::FrameIndex get_contact_id() const { return contact_id_; }
106  void set_contact_id(const pinocchio::FrameIndex id) { contact_id_ = id; }
107 
108  protected:
109  using Base::nu_;
110  using Base::state_;
111  using Base::unone_;
112 
113  private:
114  pinocchio::FrameIndex contact_id_;
115 };
116 
117 template <typename _Scalar>
119  : public ResidualDataAbstractTpl<_Scalar> {
120  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
121 
122  typedef _Scalar Scalar;
123  typedef MathBaseTpl<Scalar> MathBase;
124  typedef ResidualDataAbstractTpl<Scalar> Base;
125  typedef StateMultibodyTpl<Scalar> StateMultibody;
126  typedef DataCollectorAbstractTpl<Scalar> DataCollectorAbstract;
127 
128  typedef typename MathBase::Matrix6xs Matrix6xs;
129 
130  template <template <typename Scalar> class Model>
131  ResidualDataCenterOfPressureTpl(Model<Scalar> *const model,
132  DataCollectorAbstract *const data)
133  : Base(model, data) {
134  // Check that proper shared data has been passed
135  DataCollectorContactTpl<Scalar> *d =
136  dynamic_cast<DataCollectorContactTpl<Scalar> *>(this->shared);
137  if (d == NULL) {
138  throw_pretty(
139  "Invalid argument: the shared data should be derived from "
140  "DataCollectorContact");
141  }
142  const pinocchio::FrameIndex id = model->get_contact_id();
143  const boost::shared_ptr<StateMultibody> &state =
144  boost::static_pointer_cast<StateMultibody>(model->get_state());
145  std::string frame_name = state->get_pinocchio()->frames[id].name;
146  bool found_contact = false;
147  for (auto &it : d->contacts->contacts) {
148  if (it.second->frame == id) {
149  ContactData6DTpl<Scalar> *d6d =
150  dynamic_cast<ContactData6DTpl<Scalar> *>(it.second.get());
151  if (d6d != NULL) {
152  found_contact = true;
153  this->contact = it.second;
154  break;
155  }
156  throw_pretty(
157  "Domain error: there isn't defined at least a 6d contact for " +
158  frame_name);
159  }
160  }
161  if (!found_contact) {
162  throw_pretty("Domain error: there isn't defined contact data for " +
163  frame_name);
164  }
165  }
166  boost::shared_ptr<ForceDataAbstractTpl<Scalar> > contact;
167  using Base::r;
168  using Base::Ru;
169  using Base::Rx;
170  using Base::shared;
171 };
172 
173 } // namespace sobec
174 
175 /* --- Details -------------------------------------------------------------- */
176 /* --- Details -------------------------------------------------------------- */
177 /* --- Details -------------------------------------------------------------- */
179 
180 #endif // SOBEC_RESIDUAL_COP_HPP_
residual-cop.hxx
sobec::ResidualDataCenterOfPressureTpl::ResidualDataCenterOfPressureTpl
ResidualDataCenterOfPressureTpl(Model< Scalar > *const model, DataCollectorAbstract *const data)
Definition: residual-cop.hpp:131
sobec::ResidualDataCenterOfPressureTpl
Definition: residual-cop.hpp:118
sobec::ResidualModelCenterOfPressureTpl::MathBase
MathBaseTpl< Scalar > MathBase
Definition: residual-cop.hpp:47
sobec::ResidualModelCenterOfPressureTpl::Force
pinocchio::ForceTpl< Scalar > Force
Definition: residual-cop.hpp:57
sobec::ResidualModelCenterOfPressureTpl
COP residual.
Definition: residual-cop.hpp:41
sobec::ResidualDataCenterOfPressureTpl::Base
ResidualDataAbstractTpl< Scalar > Base
Definition: residual-cop.hpp:124
fwd.hpp
sobec::ResidualModelCenterOfPressureTpl::Scalar
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef _Scalar Scalar
Definition: residual-cop.hpp:46
sobec::ResidualModelCenterOfPressureTpl::get_contact_id
pinocchio::FrameIndex get_contact_id() const
Return the reference contact id.
Definition: residual-cop.hpp:104
sobec::ResidualModelCenterOfPressureTpl::set_contact_id
void set_contact_id(const pinocchio::FrameIndex id)
Set the reference contact id.
Definition: residual-cop.hpp:106
sobec::ResidualModelCenterOfPressureTpl::ResidualDataAbstract
ResidualDataAbstractTpl< Scalar > ResidualDataAbstract
Definition: residual-cop.hpp:50
sobec::ResidualDataCenterOfPressureTpl::Scalar
EIGEN_MAKE_ALIGNED_OPERATOR_NEW typedef _Scalar Scalar
Definition: residual-cop.hpp:122
sobec::ResidualDataCenterOfPressureTpl::MathBase
MathBaseTpl< Scalar > MathBase
Definition: residual-cop.hpp:123
sobec::ResidualModelCenterOfPressureTpl::Data
ResidualDataCenterOfPressureTpl< Scalar > Data
Definition: residual-cop.hpp:49
sobec
Definition: activation-quad-ref.hpp:19
sobec::newcontacts::x
@ x
Definition: contact1d.hpp:26
sobec::ResidualModelCenterOfPressureTpl::Base
ResidualModelAbstractTpl< Scalar > Base
Definition: residual-cop.hpp:48
sobec::ResidualModelCenterOfPressureTpl::DataCollectorAbstract
DataCollectorAbstractTpl< Scalar > DataCollectorAbstract
Definition: residual-cop.hpp:52
sobec::ResidualModelCenterOfPressureTpl::Vector3s
MathBase::Vector3s Vector3s
Definition: residual-cop.hpp:55
sobec::ResidualDataCenterOfPressureTpl::StateMultibody
StateMultibodyTpl< Scalar > StateMultibody
Definition: residual-cop.hpp:125
sobec::ResidualModelCenterOfPressureTpl::MatrixXs
MathBase::MatrixXs MatrixXs
Definition: residual-cop.hpp:56
sobec::ResidualDataCenterOfPressureTpl::Matrix6xs
MathBase::Matrix6xs Matrix6xs
Definition: residual-cop.hpp:128
sobec::ResidualModelCenterOfPressureTpl::StateMultibody
StateMultibodyTpl< Scalar > StateMultibody
Definition: residual-cop.hpp:51
sobec::ResidualDataCenterOfPressureTpl::contact
boost::shared_ptr< ForceDataAbstractTpl< Scalar > > contact
Definition: residual-cop.hpp:166
sobec::ResidualDataCenterOfPressureTpl::DataCollectorAbstract
DataCollectorAbstractTpl< Scalar > DataCollectorAbstract
Definition: residual-cop.hpp:126
sobec::ResidualModelCenterOfPressureTpl::VectorXs
MathBase::VectorXs VectorXs
Definition: residual-cop.hpp:54