QPContactConstr.h
Go to the documentation of this file.
1 /*
2  * Copyright 2012-2019 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
7 // includes
8 // std
9 #include <map>
10 #include <set>
11 
12 // Eigen
13 #include <Eigen/Core>
14 
15 // RBDyn
16 #include <RBDyn/Jacobian.h>
17 
18 // Tasks
19 #include "QPSolver.h"
20 
21 namespace tasks
22 {
23 
24 namespace qp
25 {
26 
30 class TASKS_DLLAPI ContactConstrCommon
31 {
32 public:
38  bool addVirtualContact(const ContactId & contactId);
39 
41  bool removeVirtualContact(const ContactId & contactId);
42 
44  void resetVirtualContacts();
45 
55  bool addDofContact(const ContactId & contactId, const Eigen::MatrixXd & dof);
56 
61  bool removeDofContact(const ContactId & contactId);
62 
66  bool hasDoFContact(const ContactId & id) const;
67 
72  const Eigen::MatrixXd & dofContact(const ContactId & contactId);
73 
78  void resetDofContacts();
79 
80 protected:
82  {
84  sva::PTransformd X_b1_cf;
85  sva::PTransformd X_b1_b2;
86 
87  bool operator==(const ContactCommon & cc) const;
88  bool operator<(const ContactCommon & cc) const;
89  };
90 
91 protected:
92  std::set<ContactCommon> contactCommonInContact(const std::vector<rbd::MultiBody> & mbs, const SolverData & data);
93 
94 protected:
95  std::set<ContactId> virtualContacts_;
96  std::map<ContactId, Eigen::MatrixXd> dofContacts_;
97 };
98 
102 class TASKS_DLLAPI ContactConstr : public ConstraintFunction<Equality>, public ContactConstrCommon
103 {
104 public:
105  ContactConstr();
106 
113  void updateDofContacts();
114 
115  // Constraint
116  virtual void updateNrVars(const std::vector<rbd::MultiBody> & mbs, const SolverData & data) override;
117 
118  virtual std::string descEq(const std::vector<rbd::MultiBody> & mbs, int line) override;
119 
120  // Inequality Constraint
121  virtual int nrEq() const override;
122  virtual int maxEq() const override;
123 
124  virtual const Eigen::MatrixXd & AEq() const override;
125  virtual const Eigen::VectorXd & bEq() const override;
126 
127 protected:
129  {
130  ContactSideData(int rI, int aDB, double s, const rbd::Jacobian & j, const sva::PTransformd & Xbp)
131  : robotIndex(rI), alphaDBegin(aDB), bodyIndex(j.jointsPath().back()), sign(s), jac(j), X_b_p(Xbp)
132  {
133  }
134 
135  int robotIndex, alphaDBegin, bodyIndex;
136  double sign;
137  rbd::Jacobian jac;
138  sva::PTransformd X_b_p;
139  };
140 
141  struct ContactData
142  {
143  ContactData(std::vector<ContactSideData> csds,
144  const Eigen::MatrixXd & d,
145  int r1,
146  int r2,
147  int b1,
148  int b2,
149  const sva::PTransformd & X_bb,
150  const sva::PTransformd & X_bcf,
151  const ContactId & cId)
152  : contacts(std::move(csds)), dof(d), r1Index(r1), r2Index(r2), b1Index(b1), b2Index(b2), X_b1_b2(X_bb),
153  X_b1_cf(X_bcf), contactId(cId)
154  {
155  revDof = Eigen::Matrix6d::Zero();
156  // Find which dofs are selected and reverse that selection
157  for(int j = 0; j < 6; ++j)
158  {
159  bool dof_j_active = false;
160  for(int r = 0; r < dof.rows(); ++r) { dof_j_active = dof_j_active || dof(r, j) == 1; }
161  if(!dof_j_active) { revDof(j, j) = 1; }
162  }
163  }
164 
165  void update(const std::vector<rbd::MultiBodyConfig> & mbcs);
166 
167  std::vector<ContactSideData> contacts;
168  Eigen::MatrixXd dof;
169  Eigen::MatrixXd revDof;
170  int r1Index, r2Index;
171  int b1Index, b2Index;
172  sva::PTransformd X_b1_b2;
173  sva::PTransformd X_b1_cf;
175  };
176 
177 protected:
178  void updateNrEq();
179 
180 protected:
181  std::vector<ContactData> cont_;
182 
183  Eigen::MatrixXd fullJac_, dofJac_;
184 
185  Eigen::MatrixXd A_;
186  Eigen::VectorXd b_;
187 
188  int nrEq_, totalAlphaD_;
189  double timeStep_;
190 };
191 
200 class TASKS_DLLAPI ContactAccConstr : public ContactConstr
201 {
202 public:
204 
205  virtual void update(const std::vector<rbd::MultiBody> & mbs,
206  const std::vector<rbd::MultiBodyConfig> & mbcs,
207  const SolverData & data) override;
208 
209  virtual std::string nameEq() const override;
210 };
211 
218 class TASKS_DLLAPI ContactSpeedConstr : public ContactConstr
219 {
220 public:
222  ContactSpeedConstr(double timeStep);
223 
224  virtual void update(const std::vector<rbd::MultiBody> & mbs,
225  const std::vector<rbd::MultiBodyConfig> & mbcs,
226  const SolverData & data) override;
227 
228  virtual std::string nameEq() const override;
229 
230 private:
231  double timeStep_;
232 };
233 
242 class TASKS_DLLAPI ContactPosConstr : public ContactConstr
243 {
244 public:
246  ContactPosConstr(double timeStep);
247 
248  virtual void update(const std::vector<rbd::MultiBody> & mbs,
249  const std::vector<rbd::MultiBodyConfig> & mbcs,
250  const SolverData & data) override;
251 
252  virtual std::string nameEq() const override;
253 
254 private:
255  double timeStep_;
256 };
257 
258 } // namespace qp
259 
260 } // namespace tasks
tasks::qp::ContactId
Definition: QPContacts.h:49
tasks::qp::ContactConstr::ContactData::ContactData
ContactData(std::vector< ContactSideData > csds, const Eigen::MatrixXd &d, int r1, int r2, int b1, int b2, const sva::PTransformd &X_bb, const sva::PTransformd &X_bcf, const ContactId &cId)
Definition: QPContactConstr.h:143
tasks::qp::ContactConstrCommon::ContactCommon
Definition: QPContactConstr.h:81
tasks::qp::ContactConstr
Definition: QPContactConstr.h:102
tasks::qp::ContactConstr::ContactData::contacts
std::vector< ContactSideData > contacts
Definition: QPContactConstr.h:167
tasks::qp::ContactConstr::timeStep_
double timeStep_
Definition: QPContactConstr.h:189
tasks::qp::ContactConstr::ContactData::dof
Eigen::MatrixXd dof
Definition: QPContactConstr.h:168
tasks::qp::ContactConstr::ContactData::r2Index
int r2Index
Definition: QPContactConstr.h:170
tasks::qp::ContactConstrCommon::virtualContacts_
std::set< ContactId > virtualContacts_
Definition: QPContactConstr.h:95
tasks::qp::SolverData
Definition: QPSolverData.h:27
tasks::qp::ContactConstr::ContactSideData
Definition: QPContactConstr.h:128
tasks::qp::ContactConstr::ContactData::X_b1_b2
sva::PTransformd X_b1_b2
Definition: QPContactConstr.h:172
tasks::qp::ContactAccConstr
Definition: QPContactConstr.h:200
tasks::qp::ContactConstr::ContactData::X_b1_cf
sva::PTransformd X_b1_cf
Definition: QPContactConstr.h:173
tasks::qp::ContactConstrCommon::ContactCommon::X_b1_cf
sva::PTransformd X_b1_cf
Definition: QPContactConstr.h:84
tasks::qp::ContactConstr::cont_
std::vector< ContactData > cont_
Definition: QPContactConstr.h:181
tasks::qp::ContactConstr::b_
Eigen::VectorXd b_
Definition: QPContactConstr.h:186
tasks::qp::ContactConstr::ContactData::revDof
Eigen::MatrixXd revDof
Definition: QPContactConstr.h:169
tasks::qp::ContactPosConstr
Definition: QPContactConstr.h:242
tasks::qp::ContactConstrCommon::ContactCommon::X_b1_b2
sva::PTransformd X_b1_b2
Definition: QPContactConstr.h:85
tasks::qp::ContactConstr::ContactSideData::jac
rbd::Jacobian jac
Definition: QPContactConstr.h:137
tasks::qp::ContactConstr::ContactData
Definition: QPContactConstr.h:141
tasks::qp::ContactConstr::ContactSideData::ContactSideData
ContactSideData(int rI, int aDB, double s, const rbd::Jacobian &j, const sva::PTransformd &Xbp)
Definition: QPContactConstr.h:130
tasks::qp::ContactConstr::ContactData::b2Index
int b2Index
Definition: QPContactConstr.h:171
tasks::qp::ContactConstrCommon
Definition: QPContactConstr.h:30
tasks::qp::ContactConstr::ContactData::contactId
ContactId contactId
Definition: QPContactConstr.h:174
tasks::qp::ContactConstr::fullJac_
Eigen::MatrixXd fullJac_
Definition: QPContactConstr.h:183
tasks::qp::ContactConstr::ContactSideData::X_b_p
sva::PTransformd X_b_p
Definition: QPContactConstr.h:138
tasks::qp::ContactConstr::totalAlphaD_
int totalAlphaD_
Definition: QPContactConstr.h:188
tasks::qp::ContactConstrCommon::dofContacts_
std::map< ContactId, Eigen::MatrixXd > dofContacts_
Definition: QPContactConstr.h:96
tasks::qp::ContactSpeedConstr
Definition: QPContactConstr.h:218
tasks::qp::ContactConstr::A_
Eigen::MatrixXd A_
Definition: QPContactConstr.h:185
tasks::qp::ContactConstr::ContactSideData::robotIndex
int robotIndex
Definition: QPContactConstr.h:135
tasks::qp::ContactConstr::ContactSideData::sign
double sign
Definition: QPContactConstr.h:136
tasks::qp::ContactConstrCommon::ContactCommon::cId
ContactId cId
Definition: QPContactConstr.h:83
tasks
Definition: GenQPUtils.h:18
tasks::qp::ConstraintFunction
Definition: QPSolver.h:163
QPSolver.h