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 
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 
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:
106 
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
Definition: QPSolver.h:164
Definition: QPContactConstr.h:201
virtual std::string nameEq() const override
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data) override
Definition: QPContactConstr.h:31
std::set< ContactId > virtualContacts_
Definition: QPContactConstr.h:95
bool removeDofContact(const ContactId &contactId)
bool addVirtualContact(const ContactId &contactId)
void resetVirtualContacts()
Remove all virtual contact.
std::set< ContactCommon > contactCommonInContact(const std::vector< rbd::MultiBody > &mbs, const SolverData &data)
bool hasDoFContact(const ContactId &id) const
bool addDofContact(const ContactId &contactId, const Eigen::MatrixXd &dof)
const Eigen::MatrixXd & dofContact(const ContactId &contactId)
bool removeVirtualContact(const ContactId &contactId)
Remove a virtual contact.
std::map< ContactId, Eigen::MatrixXd > dofContacts_
Definition: QPContactConstr.h:96
Definition: QPContactConstr.h:103
virtual std::string descEq(const std::vector< rbd::MultiBody > &mbs, int line) override
virtual int nrEq() const override
virtual void updateNrVars(const std::vector< rbd::MultiBody > &mbs, const SolverData &data) override
virtual const Eigen::VectorXd & bEq() const override
std::vector< ContactData > cont_
Definition: QPContactConstr.h:181
virtual int maxEq() const override
virtual const Eigen::MatrixXd & AEq() const override
Eigen::MatrixXd dofJac_
Definition: QPContactConstr.h:183
Eigen::VectorXd b_
Definition: QPContactConstr.h:186
int nrEq_
Definition: QPContactConstr.h:188
Eigen::MatrixXd A_
Definition: QPContactConstr.h:185
double timeStep_
Definition: QPContactConstr.h:189
Definition: QPContactConstr.h:243
ContactPosConstr(double timeStep)
virtual std::string nameEq() const override
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data) override
Definition: QPContactConstr.h:219
virtual std::string nameEq() const override
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data) override
ContactSpeedConstr(double timeStep)
Definition: QPSolverData.h:28
Definition: GenQPUtils.h:19
Definition: QPContactConstr.h:82
sva::PTransformd X_b1_b2
Definition: QPContactConstr.h:85
sva::PTransformd X_b1_cf
Definition: QPContactConstr.h:84
bool operator==(const ContactCommon &cc) const
bool operator<(const ContactCommon &cc) const
ContactId cId
Definition: QPContactConstr.h:83
Definition: QPContactConstr.h:142
int b1Index
Definition: QPContactConstr.h:171
int r1Index
Definition: QPContactConstr.h:170
Eigen::MatrixXd dof
Definition: QPContactConstr.h:168
ContactId contactId
Definition: QPContactConstr.h:174
std::vector< ContactSideData > contacts
Definition: QPContactConstr.h:167
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
void update(const std::vector< rbd::MultiBodyConfig > &mbcs)
Eigen::MatrixXd revDof
Definition: QPContactConstr.h:169
sva::PTransformd X_b1_cf
Definition: QPContactConstr.h:173
sva::PTransformd X_b1_b2
Definition: QPContactConstr.h:172
Definition: QPContactConstr.h:129
int alphaDBegin
Definition: QPContactConstr.h:135
ContactSideData(int rI, int aDB, double s, const rbd::Jacobian &j, const sva::PTransformd &Xbp)
Definition: QPContactConstr.h:130
rbd::Jacobian jac
Definition: QPContactConstr.h:137
double sign
Definition: QPContactConstr.h:136
sva::PTransformd X_b_p
Definition: QPContactConstr.h:138
Definition: QPContacts.h:50