Contact.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-2019 CNRS-UM LIRMM, CNRS-AIST JRL
3  *
4  * This file is inspired by Stephane's Caron original implementation as part of
5  * lipm_walking_controller <https://github.com/stephane-caron/lipm_walking_controller>
6  */
7 
8 #pragma once
9 
10 #include <mc_rbdyn/Robot.h>
11 #include <mc_rtc/Configuration.h>
12 #include <mc_rtc/logging.h>
13 #include <mc_tasks/api.h>
14 
15 #include <SpaceVecAlg/SpaceVecAlg>
16 
17 #include <Eigen/StdVector>
18 
19 #include <cmath>
20 
21 namespace mc_tasks
22 {
23 namespace lipm_stabilizer
24 {
25 
26 using HrepXd = std::pair<Eigen::MatrixXd, Eigen::VectorXd>;
27 
31 enum class MC_TASKS_DLLAPI ContactState
32 {
34  Right
35 };
36 
37 namespace internal
38 {
39 
44 {
45  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
46 
47  Contact() = default;
48 
61  Contact(const mc_rbdyn::Robot & robot, const std::string & surfaceName, double friction);
62 
69  Contact(const mc_rbdyn::Robot & robot,
70  const std::string & surfaceName,
71  const sva::PTransformd & surfacePose,
72  double friction);
73 
79  HrepXd hrep(const Eigen::Vector3d & vertical) const;
80 
89  const Eigen::Matrix<double, 16, 6> & wrenchFaceMatrix() const { return wrenchFaceMatrix_; }
90 
94  Eigen::Vector3d sagittal() const { return surfacePose_.rotation().row(0); }
95 
99  Eigen::Vector3d lateral() const { return surfacePose_.rotation().row(1); }
100 
104  Eigen::Vector3d normal() const { return surfacePose_.rotation().row(2); }
108  const Eigen::Vector3d & position() const { return surfacePose_.translation(); }
109 
110  double halfWidth() const { return halfWidth_; }
111 
112  double halfLength() const { return halfLength_; }
113 
114  double friction() const { return friction_; }
115 
120  const sva::PTransformd & anklePose() const { return anklePose_; }
121 
122  Eigen::Vector3d sagital() { return surfacePose_.rotation().row(0); }
123 
124  Eigen::Vector3d lateral() { return surfacePose_.rotation().row(1); }
125 
126  Eigen::Vector3d vertical() { return surfacePose_.rotation().row(2); }
127 
128  const std::string & surfaceName() const { return surfaceName_; }
129 
130  const sva::PTransformd & surfacePose() const { return surfacePose_; }
131 
136  const std::vector<Eigen::Vector3d> & polygon() const { return contactPolygon_; }
137 
142  double xmin() const { return xyMin_.x(); }
143 
148  double xmax() const { return xyMax_.x(); }
149 
154  double ymin() const { return xyMin_.y(); }
155 
160  double ymax() const { return xyMax_.y(); }
161 
162 private:
167  void findSurfaceBoundaries(const mc_rbdyn::Surface & surface);
168 
169 private:
170  std::string surfaceName_;
171  sva::PTransformd anklePose_;
172  sva::PTransformd surfacePose_;
174  double halfLength_ = 0.;
175  double halfWidth_ = 0.;
176  double friction_ = 0.7;
178  Eigen::Matrix<double, 16, 6> wrenchFaceMatrix_;
179  Eigen::Matrix<double, 12, 6>
180  wrenchFaceMatrixCoPFree_;
182  std::vector<Eigen::Vector3d>
183  contactPolygon_;
185  Eigen::Vector2d xyMin_ = Eigen::Vector2d::Zero();
186  Eigen::Vector2d xyMax_ = Eigen::Vector2d::Zero();
187 };
188 
189 } // namespace internal
190 
192 {
193  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
194 
195  ContactState first;
197 };
198 
199 using ContactDescriptionVector = std::vector<ContactDescription, Eigen::aligned_allocator<ContactDescription>>;
200 
201 } // namespace lipm_stabilizer
202 } // namespace mc_tasks
203 
204 namespace mc_rtc
205 {
206 
207 template<>
208 struct ConfigurationLoader<mc_tasks::lipm_stabilizer::ContactState>
209 {
210  static mc_tasks::lipm_stabilizer::ContactState load(const mc_rtc::Configuration & config)
211  {
212  using ContactState = mc_tasks::lipm_stabilizer::ContactState;
213  const std::string & s = config;
214  if(s == "Left") { return ContactState::Left; }
215  else if(s == "Right") { return ContactState::Right; }
216  else { mc_rtc::log::error_and_throw("ContactState should be one of [Left, Right], {} requested.", s); }
217  }
218 
219  static mc_rtc::Configuration save(const mc_tasks::lipm_stabilizer::ContactState & contact)
220  {
221  using ContactState = mc_tasks::lipm_stabilizer::ContactState;
222  mc_rtc::Configuration config;
223  switch(contact)
224  {
225  case ContactState::Left:
226  config = "Left";
227  break;
228  case ContactState::Right:
229  config = "Right";
230  break;
231  }
232  return config;
233  }
234 };
235 
236 } // namespace mc_rtc
mc_rtc::Configuration
Simplify access to values hold within a JSON file.
Definition: Configuration.h:165
mc_tasks::lipm_stabilizer::internal::Contact::sagittal
Eigen::Vector3d sagittal() const
Definition: Contact.h:94
mc_tasks::lipm_stabilizer::internal::Contact::sagital
Eigen::Vector3d sagital()
Definition: Contact.h:122
mc_tasks::lipm_stabilizer::ContactDescriptionVector
std::vector< ContactDescription, Eigen::aligned_allocator< ContactDescription > > ContactDescriptionVector
Definition: Contact.h:199
mc_rtc::constants::vertical
const Eigen::Vector3d vertical
Definition: constants.h:17
mc_tasks::lipm_stabilizer::internal::Contact::lateral
Eigen::Vector3d lateral() const
Definition: Contact.h:99
api.h
mc_tasks::lipm_stabilizer::ContactDescription::first
EIGEN_MAKE_ALIGNED_OPERATOR_NEW ContactState first
Definition: Contact.h:195
mc_tasks::lipm_stabilizer::internal::Contact::xmax
double xmax() const
World coordinates of the point furthest front in the surface's sagital direction.
Definition: Contact.h:148
MC_TASKS_DLLAPI
#define MC_TASKS_DLLAPI
Definition: api.h:50
mc_tasks::lipm_stabilizer::internal::Contact::surfacePose
const sva::PTransformd & surfacePose() const
Definition: Contact.h:130
mc_tasks::lipm_stabilizer::internal::Contact::wrenchFaceMatrix
const Eigen::Matrix< double, 16, 6 > & wrenchFaceMatrix() const
Definition: Contact.h:89
mc_rbdyn::Robot
Definition: Robot.h:62
mc_tasks::lipm_stabilizer::internal::Contact
This class wraps information about contact surfaces used by the stabilizer.
Definition: Contact.h:43
mc_tasks::lipm_stabilizer::internal::Contact::anklePose
const sva::PTransformd & anklePose() const
Definition: Contact.h:120
mc_tasks::lipm_stabilizer::internal::Contact::position
const Eigen::Vector3d & position() const
Definition: Contact.h:108
mc_tasks::lipm_stabilizer::HrepXd
std::pair< Eigen::MatrixXd, Eigen::VectorXd > HrepXd
Definition: Contact.h:26
mc_tasks::lipm_stabilizer::internal::Contact::halfWidth
double halfWidth() const
Definition: Contact.h:110
mc_rtc::ConfigurationLoader< mc_tasks::lipm_stabilizer::ContactState >::save
static mc_rtc::Configuration save(const mc_tasks::lipm_stabilizer::ContactState &contact)
Definition: Contact.h:219
mc_rtc::ConfigurationLoader< mc_tasks::lipm_stabilizer::ContactState >::load
static mc_tasks::lipm_stabilizer::ContactState load(const mc_rtc::Configuration &config)
Definition: Contact.h:210
Left
Left
Definition: Contact.h:33
mc_tasks::lipm_stabilizer::internal::Contact::ymax
double ymax() const
World coordinates of the point furthest left in the surface's lateral direction.
Definition: Contact.h:160
mc_tasks::lipm_stabilizer::internal::Contact::vertical
Eigen::Vector3d vertical()
Definition: Contact.h:126
mc_tasks::lipm_stabilizer::internal::Contact::polygon
const std::vector< Eigen::Vector3d > & polygon() const
Returns the contact polygon defined by the 4 vertices of the min/max coordinates along the surface's ...
Definition: Contact.h:136
mc_rtc::log::error_and_throw
void error_and_throw(Args &&... args)
Definition: logging.h:47
Robot.h
mc_rbdyn::Surface
Definition: Surface.h:24
mc_tasks::lipm_stabilizer::internal::Contact::normal
Eigen::Vector3d normal() const
Definition: Contact.h:104
mc_tasks::lipm_stabilizer::internal::Contact::ymin
double ymin() const
World coordinates of the point furthest right in the surface's lateral direction.
Definition: Contact.h:154
mc_tasks::lipm_stabilizer::internal::Contact::friction
double friction() const
Definition: Contact.h:114
mc_tasks::lipm_stabilizer::internal::Contact::xmin
double xmin() const
World coordinates of the point furthest back in the surface's sagital direction.
Definition: Contact.h:142
Configuration.h
mc_tasks::lipm_stabilizer::ContactDescription::second
internal::Contact second
Definition: Contact.h:196
logging.h
mc_control::fsm::Contact
mc_control::Contact Contact
Definition: Controller.h:22
mc_tasks::lipm_stabilizer::internal::Contact::lateral
Eigen::Vector3d lateral()
Definition: Contact.h:124
mc_tasks::lipm_stabilizer::ContactDescription
Definition: Contact.h:191
mc_rtc::ConfigurationLoader
Definition: Configuration.h:55
mc_tasks
Definition: StabilizerStandingState.h:11
mc_tasks::lipm_stabilizer::internal::Contact::halfLength
double halfLength() const
Definition: Contact.h:112
mc_rtc
Definition: Contact.h:87
mc_tasks::lipm_stabilizer::internal::Contact::surfaceName
const std::string & surfaceName() const
Definition: Contact.h:128