contact6d.hpp
Go to the documentation of this file.
1 
10 #ifndef DYNACOM_CONTACT_6D
11 #define DYNACOM_CONTACT_6D
12 
13 // clang-format off
14 #include <Eigen/Dense>
15 #include "pinocchio/spatial/se3.hpp"
16 #include <memory>
17 // clang-format on
18 
19 namespace dynacom {
20 
22  public:
23  double mu, gu;
25  Eigen::Matrix<double, 6, 1> weights;
26  std::string frame_name;
27 
28  std::string to_string() {
29  std::ostringstream out;
30  out << "Contact6D "
31  << ":\n";
32  out << " mu: " << this->mu << "\n";
33  out << " gu: " << this->gu << "\n";
34  out << " weights: " << this->weights.transpose() << "\n";
35  out << " Surface half_length: " << this->half_length << "\n";
36  out << " Surface half_width: " << this->half_width << std::endl;
37 
38  return out.str();
39  }
40 
41  std::ostream &operator<<(std::ostream &out) {
42  out << this->to_string();
43  return out;
44  }
45 
46  bool operator!=(const Contact6DSettings &rhs) { return !(*this == rhs); }
47 
48  bool operator==(const Contact6DSettings &rhs) {
49  bool test = true;
50  test &= this->frame_name == rhs.frame_name;
51  test &= this->mu == rhs.mu;
52  test &= this->gu == rhs.gu;
53  test &= this->half_length == rhs.half_length;
54  test &= this->half_width == rhs.half_width;
55  test &= this->weights == rhs.weights;
56  return test;
57  }
58 };
59 
60 class Contact6D {
61  private:
62  Contact6DSettings settings_;
63  pinocchio::SE3 oMs_, cMo_;
64 
65  // matrices
66  Eigen::Matrix<double, 5, 6> unilaterality_A_;
67  Eigen::Matrix<double, 5, 1> unilaterality_b_;
68  Eigen::Matrix<double, 6, 6> friction_A_;
69  Eigen::Matrix<double, 6, 1> friction_b_;
70  Eigen::Matrix<double, 6, 1> regularization_A_;
71  Eigen::Matrix<double, 6, 1> regularization_b_;
72  Eigen::Matrix<double, 6, 6> newton_euler_A_;
73  Eigen::Matrix<double, 6, 1> contactForce_;
74  size_t frameID_;
75 
76  public:
77  Contact6D();
78  Contact6D(const Contact6DSettings &settings);
79  void initialize(const Contact6DSettings &settings);
80 
81  // ~Contact6D();
82 
83  // setters
84  void setMu(const double &mu);
85  void setGu(const double &gu);
86  void setForceWeights(const Eigen::Vector3d &force_weights);
87  void setTorqueWeights(const Eigen::Vector3d &torque_weights);
88  void setSurfaceHalfWidth(const double &half_width);
89  void setSurfaceHalfLength(const double &half_length);
90  void updateNewtonEuler(const Eigen::Vector3d &CoM, const pinocchio::SE3 &oMf);
91  void setFrameID(const size_t frameID) { frameID_ = frameID; }
92  void applyForce(const Eigen::Matrix<double, 6, 1> &force) {
93  contactForce_ << force;
94  }
95  void setPose(pinocchio::SE3 &pose) { oMs_ = pose; }
96  void deactivate() { contactForce_.setZero(); }
97 
98  // getters
99  const Contact6DSettings &getSettings() { return settings_; }
100  const Eigen::Matrix<double, 6, 6> toWorldForces() {
101  return oMs_.toActionMatrixInverse().transpose();
102  }
103  const Eigen::Matrix<double, 6, 6> toCoMForces() {
104  return cMo_.act(oMs_).toActionMatrixInverse().transpose();
105  }
106  size_t uni_rows() const { return unilaterality_A_.rows(); }
107  size_t fri_rows() const { return friction_A_.rows(); }
108  size_t cols() const { return newton_euler_A_.cols(); }
109  size_t getFrameID() const { return frameID_; }
110  const pinocchio::SE3 &getPose() const { return oMs_; }
111 
112  const Eigen::Matrix<double, 5, 6> &uni_A() { return unilaterality_A_; }
113  const Eigen::Matrix<double, 5, 1> &uni_b() { return unilaterality_b_; }
114  const Eigen::Matrix<double, 6, 6> &fri_A() { return friction_A_; }
115  const Eigen::Matrix<double, 6, 1> &fri_b() { return friction_b_; }
116  const Eigen::Matrix<double, 6, 1> &reg_A() { return regularization_A_; }
117  const Eigen::Matrix<double, 6, 1> &reg_b() { return regularization_b_; }
118  const Eigen::Matrix<double, 6, 6> &NE_A() { return newton_euler_A_; }
119 
120  const Eigen::Matrix<double, 6, 1> &appliedForce() { return contactForce_; }
121 };
122 
124 
129  public:
130  double mu;
131  Eigen::Matrix<double, 3, 1> weights;
132  std::string frame_name;
133 
134  std::string to_string() {
135  std::ostringstream out;
136  out << "Contact6D "
137  << ":\n";
138  out << " mu: " << this->mu << "\n";
139  out << " weights: " << this->weights.transpose() << std::endl;
140 
141  return out.str();
142  }
143 
144  std::ostream &operator<<(std::ostream &out) {
145  out << this->to_string();
146  return out;
147  }
148 
149  bool operator==(const ContactPointSettings &rhs) {
150  bool test = true;
151  test &= this->frame_name == rhs.frame_name;
152  test &= this->mu == rhs.mu;
153  test &= this->weights == rhs.weights;
154  return test;
155  }
156 
157  bool operator!=(const ContactPointSettings &rhs) { return !(*this == rhs); }
158 };
159 
161  private:
162  ContactPointSettings settings_;
163  pinocchio::SE3 oMs_, cMo_;
164 
165  // matrices
166  Eigen::Matrix<double, 1, 3> unilaterality_A_;
167  Eigen::Matrix<double, 1, 1> unilaterality_b_;
168  Eigen::Matrix<double, 4, 3> friction_A_;
169  Eigen::Matrix<double, 4, 1> friction_b_;
170  Eigen::Matrix<double, 3, 1> regularization_A_;
171  Eigen::Matrix<double, 3, 1> regularization_b_;
172  Eigen::Matrix<double, 6, 3> newton_euler_A_;
173  size_t frameID_;
174  Eigen::Matrix<double, 3, 1> contactForce_;
175 
176  public:
177  ContactPoint();
178  ContactPoint(const ContactPointSettings &settings);
179  void initialize(const ContactPointSettings &settings);
180 
181  // ~ContactPoint();
182 
183  // setters
184  void setMu(const double &mu);
185  void setForceWeights(const Eigen::Vector3d &force_weights);
186  void updateNewtonEuler(const Eigen::Vector3d &CoM, const pinocchio::SE3 &oMf);
187  void setFrameID(const size_t frameID) { frameID_ = frameID; }
188  void applyForce(const Eigen::Matrix<double, 3, 1> &force) {
189  contactForce_ << force;
190  }
191 
192  // getters
193  const ContactPointSettings &getSettings() { return settings_; }
194  const Eigen::Matrix<double, 6, 3> toWorldForces() {
195  return oMs_.toActionMatrixInverse().transpose().block<6, 3>(0, 0);
196  }
197  const Eigen::Matrix<double, 6, 3> toCoMForces() {
198  return oMs_.act(cMo_).toActionMatrixInverse().transpose().block<6, 3>(0, 0);
199  }
200  size_t uni_rows() const { return unilaterality_A_.rows(); }
201  size_t fri_rows() const { return friction_A_.rows(); }
202  size_t cols() const { return newton_euler_A_.cols(); }
203  size_t getFrameID() const { return frameID_; }
204 
205  const Eigen::Matrix<double, 1, 3> &uni_A() { return unilaterality_A_; }
206  const Eigen::Matrix<double, 1, 1> &uni_b() { return unilaterality_b_; }
207  const Eigen::Matrix<double, 4, 3> &fri_A() { return friction_A_; }
208  const Eigen::Matrix<double, 4, 1> &fri_b() { return friction_b_; }
209  const Eigen::Matrix<double, 3, 1> &reg_A() { return regularization_A_; }
210  const Eigen::Matrix<double, 3, 1> &reg_b() { return regularization_b_; }
211  const Eigen::Matrix<double, 6, 3> &NE_A() { return newton_euler_A_; }
212 
213  const Eigen::Matrix<double, 3, 1> &appliedForce() { return contactForce_; }
214 };
215 
216 } // namespace dynacom
217 
218 #endif // DYNACOM_CONTACT_6D
dynacom::Contact6DSettings::weights
Eigen::Matrix< double, 6, 1 > weights
Definition: contact6d.hpp:25
dynacom::Contact6D::setSurfaceHalfWidth
void setSurfaceHalfWidth(const double &half_width)
Definition: contac6d.cpp:58
dynacom::ContactPointSettings::frame_name
std::string frame_name
Definition: contact6d.hpp:132
dynacom::ContactPointSettings::mu
double mu
Definition: contact6d.hpp:130
dynacom::ContactPoint::setMu
void setMu(const double &mu)
dynacom::ContactPoint::updateNewtonEuler
void updateNewtonEuler(const Eigen::Vector3d &CoM, const pinocchio::SE3 &oMf)
dynacom::Contact6D::fri_A
const Eigen::Matrix< double, 6, 6 > & fri_A()
Definition: contact6d.hpp:114
dynacom::Contact6D::setPose
void setPose(pinocchio::SE3 &pose)
Definition: contact6d.hpp:95
dynacom::Contact6DSettings::half_width
double half_width
Definition: contact6d.hpp:24
dynacom::ContactPoint::toCoMForces
const Eigen::Matrix< double, 6, 3 > toCoMForces()
Definition: contact6d.hpp:197
dynacom::Contact6D::getSettings
const Contact6DSettings & getSettings()
Definition: contact6d.hpp:99
dynacom::ContactPoint::reg_b
const Eigen::Matrix< double, 3, 1 > & reg_b()
Definition: contact6d.hpp:210
dynacom::Contact6DSettings::mu
double mu
Definition: contact6d.hpp:23
dynacom::Contact6D::getFrameID
size_t getFrameID() const
Definition: contact6d.hpp:109
dynacom::Contact6D::updateNewtonEuler
void updateNewtonEuler(const Eigen::Vector3d &CoM, const pinocchio::SE3 &oMf)
Definition: contac6d.cpp:80
dynacom::ContactPoint::applyForce
void applyForce(const Eigen::Matrix< double, 3, 1 > &force)
Definition: contact6d.hpp:188
dynacom::Contact6D::reg_A
const Eigen::Matrix< double, 6, 1 > & reg_A()
Definition: contact6d.hpp:116
dynacom::ContactPoint::uni_A
const Eigen::Matrix< double, 1, 3 > & uni_A()
Definition: contact6d.hpp:205
dynacom::Contact6D::getPose
const pinocchio::SE3 & getPose() const
Definition: contact6d.hpp:110
dynacom::ContactPoint::initialize
void initialize(const ContactPointSettings &settings)
dynacom::ContactPointSettings::operator<<
std::ostream & operator<<(std::ostream &out)
Definition: contact6d.hpp:144
dynacom::ContactPoint::ContactPoint
ContactPoint()
dynacom::ContactPointSettings::weights
Eigen::Matrix< double, 3, 1 > weights
Definition: contact6d.hpp:131
dynacom::Contact6DSettings::operator<<
std::ostream & operator<<(std::ostream &out)
Definition: contact6d.hpp:41
dynacom
Definition: contact6d.hpp:19
dynacom::Contact6D::appliedForce
const Eigen::Matrix< double, 6, 1 > & appliedForce()
Definition: contact6d.hpp:120
dynacom::Contact6D::setFrameID
void setFrameID(const size_t frameID)
Definition: contact6d.hpp:91
dynacom::ContactPoint::toWorldForces
const Eigen::Matrix< double, 6, 3 > toWorldForces()
Definition: contact6d.hpp:194
dynacom::Contact6D
Definition: contact6d.hpp:60
dynacom::Contact6D::applyForce
void applyForce(const Eigen::Matrix< double, 6, 1 > &force)
Definition: contact6d.hpp:92
dynacom::Contact6D::setSurfaceHalfLength
void setSurfaceHalfLength(const double &half_length)
Definition: contac6d.cpp:64
dynacom::Contact6D::toWorldForces
const Eigen::Matrix< double, 6, 6 > toWorldForces()
Definition: contact6d.hpp:100
dynacom::Contact6DSettings
Definition: contact6d.hpp:21
dynacom::ContactPoint::fri_A
const Eigen::Matrix< double, 4, 3 > & fri_A()
Definition: contact6d.hpp:207
dynacom::Contact6D::uni_A
const Eigen::Matrix< double, 5, 6 > & uni_A()
Definition: contact6d.hpp:112
dynacom::ContactPoint::fri_b
const Eigen::Matrix< double, 4, 1 > & fri_b()
Definition: contact6d.hpp:208
dynacom::ContactPoint::fri_rows
size_t fri_rows() const
Definition: contact6d.hpp:201
dynacom::ContactPoint::setForceWeights
void setForceWeights(const Eigen::Vector3d &force_weights)
dynacom::Contact6DSettings::operator==
bool operator==(const Contact6DSettings &rhs)
Definition: contact6d.hpp:48
dynacom::Contact6D::setGu
void setGu(const double &gu)
Definition: contac6d.cpp:75
dynacom::ContactPointSettings::operator!=
bool operator!=(const ContactPointSettings &rhs)
Definition: contact6d.hpp:157
dynacom::Contact6D::NE_A
const Eigen::Matrix< double, 6, 6 > & NE_A()
Definition: contact6d.hpp:118
dynacom::ContactPoint
Definition: contact6d.hpp:160
dynacom::ContactPoint::setFrameID
void setFrameID(const size_t frameID)
Definition: contact6d.hpp:187
dynacom::ContactPointSettings
Definition: contact6d.hpp:128
dynacom::Contact6D::fri_rows
size_t fri_rows() const
Definition: contact6d.hpp:107
dynacom::ContactPoint::uni_b
const Eigen::Matrix< double, 1, 1 > & uni_b()
Definition: contact6d.hpp:206
dynacom::ContactPoint::getSettings
const ContactPointSettings & getSettings()
Definition: contact6d.hpp:193
dynacom::ContactPoint::uni_rows
size_t uni_rows() const
Definition: contact6d.hpp:200
dynacom::ContactPoint::appliedForce
const Eigen::Matrix< double, 3, 1 > & appliedForce()
Definition: contact6d.hpp:213
dynacom::Contact6DSettings::frame_name
std::string frame_name
Definition: contact6d.hpp:26
dynacom::ContactPoint::getFrameID
size_t getFrameID() const
Definition: contact6d.hpp:203
dynacom::ContactPointSettings::to_string
std::string to_string()
Definition: contact6d.hpp:134
dynacom::Contact6D::cols
size_t cols() const
Definition: contact6d.hpp:108
dynacom::Contact6DSettings::to_string
std::string to_string()
Definition: contact6d.hpp:28
dynacom::Contact6D::uni_rows
size_t uni_rows() const
Definition: contact6d.hpp:106
dynacom::Contact6DSettings::half_length
double half_length
Definition: contact6d.hpp:24
dynacom::Contact6D::Contact6D
Contact6D()
Definition: contac6d.cpp:12
dynacom::Contact6D::setMu
void setMu(const double &mu)
Definition: contac6d.cpp:70
dynacom::Contact6D::setTorqueWeights
void setTorqueWeights(const Eigen::Vector3d &torque_weights)
Definition: contac6d.cpp:53
dynacom::ContactPointSettings::operator==
bool operator==(const ContactPointSettings &rhs)
Definition: contact6d.hpp:149
dynacom::Contact6DSettings::operator!=
bool operator!=(const Contact6DSettings &rhs)
Definition: contact6d.hpp:46
dynacom::Contact6D::toCoMForces
const Eigen::Matrix< double, 6, 6 > toCoMForces()
Definition: contact6d.hpp:103
dynacom::ContactPoint::cols
size_t cols() const
Definition: contact6d.hpp:202
dynacom::Contact6D::deactivate
void deactivate()
Definition: contact6d.hpp:96
dynacom::Contact6D::fri_b
const Eigen::Matrix< double, 6, 1 > & fri_b()
Definition: contact6d.hpp:115
dynacom::ContactPoint::NE_A
const Eigen::Matrix< double, 6, 3 > & NE_A()
Definition: contact6d.hpp:211
dynacom::ContactPoint::reg_A
const Eigen::Matrix< double, 3, 1 > & reg_A()
Definition: contact6d.hpp:209
dynacom::Contact6D::setForceWeights
void setForceWeights(const Eigen::Vector3d &force_weights)
Definition: contac6d.cpp:48
dynacom::Contact6D::reg_b
const Eigen::Matrix< double, 6, 1 > & reg_b()
Definition: contact6d.hpp:117
dynacom::Contact6D::initialize
void initialize(const Contact6DSettings &settings)
Definition: contac6d.cpp:16
dynacom::Contact6DSettings::gu
double gu
Definition: contact6d.hpp:23
dynacom::Contact6D::uni_b
const Eigen::Matrix< double, 5, 1 > & uni_b()
Definition: contact6d.hpp:113