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