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
Definition: QPSolver.h:164
Definition: QPMotionConstr.h:66
void computeTorque(const Eigen::VectorXd &alphaD, const Eigen::VectorXd &lambda)
Eigen::MatrixXd A_
Definition: QPMotionConstr.h:117
virtual void updateNrVars(const std::vector< rbd::MultiBody > &mbs, const SolverData &data) override
virtual int maxGenInEq() const override
void torque(const std::vector< rbd::MultiBody > &mbs, std::vector< rbd::MultiBodyConfig > &mbcs) const
virtual std::string nameGenInEq() const override
void computeMatrix(const std::vector< rbd::MultiBody > &mb, const std::vector< rbd::MultiBodyConfig > &mbcs)
virtual std::string descGenInEq(const std::vector< rbd::MultiBody > &mbs, int line) override
Eigen::VectorXd AL_
Definition: QPMotionConstr.h:118
virtual const Eigen::MatrixXd & AGenInEq() const override
std::vector< ContactData > cont_
Definition: QPMotionConstr.h:113
rbd::ForwardDynamics fd_
Definition: QPMotionConstr.h:111
const Eigen::VectorXd & torque() const
int alphaDBegin_
Definition: QPMotionConstr.h:110
virtual const Eigen::VectorXd & LowerGenInEq() const override
virtual const Eigen::VectorXd & UpperGenInEq() const override
Eigen::MatrixXd fullJacLambda_
Definition: QPMotionConstr.h:112
MotionConstrCommon(const std::vector< rbd::MultiBody > &mbs, int robotIndex)
Eigen::VectorXd curTorque_
Definition: QPMotionConstr.h:115
Definition: QPMotionConstr.h:123
MotionConstr(const std::vector< rbd::MultiBody > &mbs, int robotIndex, const TorqueBound &tb, const TorqueDBound &tdb, double dt)
Eigen::VectorXd torqueL_
Definition: QPMotionConstr.h:145
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data) override
Eigen::VectorXd tmpL_
Definition: QPMotionConstr.h:147
MotionConstr(const std::vector< rbd::MultiBody > &mbs, int robotIndex, const TorqueBound &tb)
const rbd::ForwardDynamics fd() const
Eigen::VectorXd torqueDtL_
Definition: QPMotionConstr.h:146
Eigen::MatrixXd contactMatrix() const
const Eigen::MatrixXd matrix() const
Definition: QPMotionConstr.h:138
Use polynome in function of q to compute torque limits. BEWARE: Only work with 1 dof/param joint.
Definition: QPMotionConstr.h:198
std::vector< Eigen::VectorXd > torqueL_
Definition: QPMotionConstr.h:208
std::vector< int > jointIndex_
Definition: QPMotionConstr.h:209
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data) override
MotionPolyConstr(const std::vector< rbd::MultiBody > &mbs, int robotIndex, const PolyTorqueBound &ptb)
Definition: QPMotionConstr.h:160
std::vector< SpringJointData > springs_
Definition: QPMotionConstr.h:190
MotionSpringConstr(const std::vector< rbd::MultiBody > &mbs, int robotIndex, const TorqueBound &tb, const std::vector< SpringJoint > &springs)
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbc, const SolverData &data) override
MotionSpringConstr(const std::vector< rbd::MultiBody > &mbs, int robotIndex, const TorqueBound &tb, const TorqueDBound &tdb, double dt, const std::vector< SpringJoint > &springs)
Definition: QPMotionConstr.h:31
virtual int beginVar() const override
virtual std::string descBound(const std::vector< rbd::MultiBody > &mbs, int line) override
virtual const Eigen::VectorXd & Lower() const override
virtual const Eigen::VectorXd & Upper() const override
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbc, const SolverData &data) override
virtual std::string nameBound() const override
virtual void updateNrVars(const std::vector< rbd::MultiBody > &mbs, const SolverData &data) override
Definition: QPSolverData.h:28
Definition: GenQPUtils.h:19
Definition: Bounds.h:133
Definition: Bounds.h:95
Definition: Bounds.h:113
Definition: QPContacts.h:50
Definition: QPMotionConstr.h:92
int lambdaBegin
Definition: QPMotionConstr.h:101
std::vector< Eigen::Vector3d > points
Definition: QPMotionConstr.h:103
std::vector< Eigen::Matrix< double, 3, Eigen::Dynamic > > minusGenerators
Definition: QPMotionConstr.h:106
int bodyIndex
Definition: QPMotionConstr.h:100
ContactData(const rbd::MultiBody &mb, const std::string &bodyName, int lambdaBegin, std::vector< Eigen::Vector3d > points, const std::vector< FrictionCone > &cones)
rbd::Jacobian jac
Definition: QPMotionConstr.h:102
ContactData()
Definition: QPMotionConstr.h:93
Definition: QPMotionConstr.h:181
double C
Definition: QPMotionConstr.h:185
double O
Definition: QPMotionConstr.h:186
int posInDof
Definition: QPMotionConstr.h:183
int index
Definition: QPMotionConstr.h:182
double K
Definition: QPMotionConstr.h:184
Definition: QPMotionConstr.h:151
std::string jointName
Definition: QPMotionConstr.h:155
double C
Definition: QPMotionConstr.h:156
double K
Definition: QPMotionConstr.h:156
double O
Definition: QPMotionConstr.h:156
SpringJoint(const std::string &jName, double K, double C, double O)
Definition: QPMotionConstr.h:153
SpringJoint()
Definition: QPMotionConstr.h:152