QPMotionConstr.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 
11 // Eigen
12 #include <Eigen/Core>
13 
14 // RBDyn
15 #include <RBDyn/FD.h>
16 #include <RBDyn/Jacobian.h>
17 
18 // Tasks
19 #include "QPSolver.h"
20 
21 namespace tasks
22 {
23 struct TorqueBound;
24 struct TorqueDBound;
25 struct PolyTorqueBound;
26 
27 namespace qp
28 {
29 
30 class TASKS_DLLAPI PositiveLambda : public ConstraintFunction<Bound>
31 {
32 public:
34 
35  // Constraint
36  virtual void updateNrVars(const std::vector<rbd::MultiBody> & mbs, const SolverData & data) override;
37  virtual void update(const std::vector<rbd::MultiBody> & mbs,
38  const std::vector<rbd::MultiBodyConfig> & mbc,
39  const SolverData & data) override;
40 
41  // Description
42  virtual std::string nameBound() const override;
43  virtual std::string descBound(const std::vector<rbd::MultiBody> & mbs, int line) override;
44 
45  // Bound Constraint
46  virtual int beginVar() const override;
47 
48  virtual const Eigen::VectorXd & Lower() const override;
49  virtual const Eigen::VectorXd & Upper() const override;
50 
51 private:
52  struct ContactData
53  {
54  ContactId cId;
55  int lambdaBegin, nrLambda; // lambda index in x
56  };
57 
58 private:
59  int lambdaBegin_;
60  Eigen::VectorXd XL_, XU_;
61 
62  std::vector<ContactData> cont_; // only usefull for descBound
63 };
64 
65 class TASKS_DLLAPI MotionConstrCommon : public ConstraintFunction<GenInequality>
66 {
67 public:
68  MotionConstrCommon(const std::vector<rbd::MultiBody> & mbs, int robotIndex);
69 
70  void computeTorque(const Eigen::VectorXd & alphaD, const Eigen::VectorXd & lambda);
71  const Eigen::VectorXd & torque() const;
72  void torque(const std::vector<rbd::MultiBody> & mbs, std::vector<rbd::MultiBodyConfig> & mbcs) const;
73 
74  // Constraint
75  virtual void updateNrVars(const std::vector<rbd::MultiBody> & mbs, const SolverData & data) override;
76 
77  void computeMatrix(const std::vector<rbd::MultiBody> & mb, const std::vector<rbd::MultiBodyConfig> & mbcs);
78 
79  // Description
80  virtual std::string nameGenInEq() const override;
81  virtual std::string descGenInEq(const std::vector<rbd::MultiBody> & mbs, int line) override;
82 
83  // Inequality Constraint
84  virtual int maxGenInEq() const override;
85 
86  virtual const Eigen::MatrixXd & AGenInEq() const override;
87  virtual const Eigen::VectorXd & LowerGenInEq() const override;
88  virtual const Eigen::VectorXd & UpperGenInEq() const override;
89 
90 protected:
91  struct ContactData
92  {
94  ContactData(const rbd::MultiBody & mb,
95  const std::string & bodyName,
96  int lambdaBegin,
97  std::vector<Eigen::Vector3d> points,
98  const std::vector<FrictionCone> & cones);
99 
102  rbd::Jacobian jac;
103  std::vector<Eigen::Vector3d> points;
104  // BEWARE generator are minus to avoid one multiplication by -1 in the
105  // update method
106  std::vector<Eigen::Matrix<double, 3, Eigen::Dynamic>> minusGenerators;
107  };
108 
109 protected:
110  int robotIndex_, alphaDBegin_, nrDof_, lambdaBegin_;
111  rbd::ForwardDynamics fd_;
112  Eigen::MatrixXd fullJacLambda_, jacTrans_, jacLambda_;
113  std::vector<ContactData> cont_;
114 
115  Eigen::VectorXd curTorque_;
116 
117  Eigen::MatrixXd A_;
118  Eigen::VectorXd AL_, AU_;
119  size_t updateIter_ = 0;
120 };
121 
122 class TASKS_DLLAPI MotionConstr : public MotionConstrCommon
123 {
124 public:
125  MotionConstr(const std::vector<rbd::MultiBody> & mbs, int robotIndex, const TorqueBound & tb);
126 
127  MotionConstr(const std::vector<rbd::MultiBody> & mbs,
128  int robotIndex,
129  const TorqueBound & tb,
130  const TorqueDBound & tdb,
131  double dt);
132 
133  // Constraint
134  virtual void update(const std::vector<rbd::MultiBody> & mbs,
135  const std::vector<rbd::MultiBodyConfig> & mbcs,
136  const SolverData & data) override;
137  // Matrix
138  const Eigen::MatrixXd matrix() const { return A_; }
139  // Contact torque
140  Eigen::MatrixXd contactMatrix() const;
141  // Access fd...
142  const rbd::ForwardDynamics fd() const;
143 
144 protected:
145  Eigen::VectorXd torqueL_, torqueU_;
146  Eigen::VectorXd torqueDtL_, torqueDtU_;
147  Eigen::VectorXd tmpL_, tmpU_;
148 };
149 
151 {
153  SpringJoint(const std::string & jName, double K, double C, double O) : jointName(jName), K(K), C(C), O(O) {}
154 
155  std::string jointName;
156  double K, C, O;
157 };
158 
159 class TASKS_DLLAPI MotionSpringConstr : public MotionConstr
160 {
161 public:
162  MotionSpringConstr(const std::vector<rbd::MultiBody> & mbs,
163  int robotIndex,
164  const TorqueBound & tb,
165  const std::vector<SpringJoint> & springs);
166 
167  MotionSpringConstr(const std::vector<rbd::MultiBody> & mbs,
168  int robotIndex,
169  const TorqueBound & tb,
170  const TorqueDBound & tdb,
171  double dt,
172  const std::vector<SpringJoint> & springs);
173 
174  // Constraint
175  virtual void update(const std::vector<rbd::MultiBody> & mbs,
176  const std::vector<rbd::MultiBodyConfig> & mbc,
177  const SolverData & data) override;
178 
179 protected:
181  {
182  int index;
183  int posInDof;
184  double K;
185  double C;
186  double O;
187  };
188 
189 protected:
190  std::vector<SpringJointData> springs_;
191 };
192 
197 class TASKS_DLLAPI MotionPolyConstr : public MotionConstrCommon
198 {
199 public:
200  MotionPolyConstr(const std::vector<rbd::MultiBody> & mbs, int robotIndex, const PolyTorqueBound & ptb);
201 
202  // Constraint
203  virtual void update(const std::vector<rbd::MultiBody> & mbs,
204  const std::vector<rbd::MultiBodyConfig> & mbcs,
205  const SolverData & data) override;
206 
207 protected:
208  std::vector<Eigen::VectorXd> torqueL_, torqueU_;
209  std::vector<int> jointIndex_;
210 };
211 
212 } // namespace qp
213 
214 } // namespace tasks
tasks::qp::ContactId
Definition: QPContacts.h:49
tasks::qp::MotionSpringConstr::SpringJointData::O
double O
Definition: QPMotionConstr.h:186
tasks::qp::MotionConstrCommon::jacTrans_
Eigen::MatrixXd jacTrans_
Definition: QPMotionConstr.h:112
tasks::qp::MotionConstr::matrix
const Eigen::MatrixXd matrix() const
Definition: QPMotionConstr.h:138
tasks::qp::SpringJoint::O
double O
Definition: QPMotionConstr.h:156
tasks::qp::MotionConstr::tmpU_
Eigen::VectorXd tmpU_
Definition: QPMotionConstr.h:147
tasks::qp::MotionConstrCommon::ContactData
Definition: QPMotionConstr.h:91
tasks::qp::MotionConstrCommon::fd_
rbd::ForwardDynamics fd_
Definition: QPMotionConstr.h:111
tasks::qp::SolverData
Definition: QPSolverData.h:27
tasks::qp::SpringJoint::jointName
std::string jointName
Definition: QPMotionConstr.h:155
tasks::qp::MotionConstrCommon::ContactData::minusGenerators
std::vector< Eigen::Matrix< double, 3, Eigen::Dynamic > > minusGenerators
Definition: QPMotionConstr.h:106
tasks::qp::MotionPolyConstr::torqueU_
std::vector< Eigen::VectorXd > torqueU_
Definition: QPMotionConstr.h:208
tasks::qp::MotionSpringConstr
Definition: QPMotionConstr.h:159
tasks::qp::MotionConstrCommon::robotIndex_
int robotIndex_
Definition: QPMotionConstr.h:110
tasks::qp::MotionConstr
Definition: QPMotionConstr.h:122
tasks::qp::MotionConstrCommon
Definition: QPMotionConstr.h:65
tasks::qp::SpringJoint::SpringJoint
SpringJoint(const std::string &jName, double K, double C, double O)
Definition: QPMotionConstr.h:153
tasks::TorqueDBound
Definition: Bounds.h:112
tasks::qp::MotionSpringConstr::SpringJointData::posInDof
int posInDof
Definition: QPMotionConstr.h:183
tasks::qp::SpringJoint
Definition: QPMotionConstr.h:150
tasks::qp::MotionSpringConstr::springs_
std::vector< SpringJointData > springs_
Definition: QPMotionConstr.h:190
tasks::qp::MotionSpringConstr::SpringJointData::index
int index
Definition: QPMotionConstr.h:182
tasks::qp::MotionConstrCommon::cont_
std::vector< ContactData > cont_
Definition: QPMotionConstr.h:113
tasks::qp::SpringJoint::C
double C
Definition: QPMotionConstr.h:156
tasks::TorqueBound
Definition: Bounds.h:94
tasks::qp::MotionPolyConstr
Use polynome in function of q to compute torque limits. BEWARE: Only work with 1 dof/param joint.
Definition: QPMotionConstr.h:197
tasks::qp::SpringJoint::SpringJoint
SpringJoint()
Definition: QPMotionConstr.h:152
tasks::qp::MotionConstrCommon::ContactData::jac
rbd::Jacobian jac
Definition: QPMotionConstr.h:102
tasks::qp::MotionConstr::torqueU_
Eigen::VectorXd torqueU_
Definition: QPMotionConstr.h:145
tasks::qp::MotionConstrCommon::A_
Eigen::MatrixXd A_
Definition: QPMotionConstr.h:117
tasks::qp::PositiveLambda
Definition: QPMotionConstr.h:30
tasks::qp::MotionSpringConstr::SpringJointData
Definition: QPMotionConstr.h:180
tasks::qp::MotionConstrCommon::AU_
Eigen::VectorXd AU_
Definition: QPMotionConstr.h:118
tasks::qp::SpringJoint::K
double K
Definition: QPMotionConstr.h:156
tasks::qp::MotionConstrCommon::ContactData::lambdaBegin
int lambdaBegin
Definition: QPMotionConstr.h:101
tasks::qp::MotionConstrCommon::curTorque_
Eigen::VectorXd curTorque_
Definition: QPMotionConstr.h:115
tasks::PolyTorqueBound
Definition: Bounds.h:132
tasks::qp::MotionConstrCommon::ContactData::bodyIndex
int bodyIndex
Definition: QPMotionConstr.h:100
tasks::qp::MotionSpringConstr::SpringJointData::K
double K
Definition: QPMotionConstr.h:184
tasks::qp::MotionConstrCommon::ContactData::points
std::vector< Eigen::Vector3d > points
Definition: QPMotionConstr.h:103
tasks::qp::MotionSpringConstr::SpringJointData::C
double C
Definition: QPMotionConstr.h:185
tasks::qp::MotionConstr::torqueDtU_
Eigen::VectorXd torqueDtU_
Definition: QPMotionConstr.h:146
tasks::qp::MotionConstrCommon::ContactData::ContactData
ContactData()
Definition: QPMotionConstr.h:93
tasks::qp::MotionPolyConstr::jointIndex_
std::vector< int > jointIndex_
Definition: QPMotionConstr.h:209
tasks
Definition: GenQPUtils.h:18
tasks::qp::ConstraintFunction
Definition: QPSolver.h:163
QPSolver.h