13 #include <boost/timer/timer.hpp>
19 #include <tasks/config.hh>
29 struct MultiBodyConfig;
55 bool solve(
const std::vector<rbd::MultiBody> & mbs, std::vector<rbd::MultiBodyConfig> & mbcs);
62 bool solveNoMbcUpdate(
const std::vector<rbd::MultiBody> & mbs,
const std::vector<rbd::MultiBodyConfig> & mbcs);
68 void updateMbc(rbd::MultiBodyConfig & mbc,
int robotIndex)
const;
70 void updateConstrSize();
72 void nrVars(
const std::vector<rbd::MultiBody> & mbs,
73 std::vector<UnilateralContact> uni,
74 std::vector<BilateralContact> bi);
78 void updateTasksNrVars(
const std::vector<rbd::MultiBody> & mbs)
const;
80 void updateConstrsNrVars(
const std::vector<rbd::MultiBody> & mbs)
const;
82 void updateNrVars(
const std::vector<rbd::MultiBody> & mbs)
const;
84 void addEqualityConstraint(
Equality * co);
85 void removeEqualityConstraint(
Equality * co);
86 int nrEqualityConstraints()
const;
89 void removeInequalityConstraint(
Inequality * co);
90 int nrInequalityConstraints()
const;
94 int nrGenInequalityConstraints()
const;
96 void addBoundConstraint(
Bound * co);
97 void removeBoundConstraint(
Bound * co);
98 int nrBoundConstraints()
const;
101 void addConstraint(
const std::vector<rbd::MultiBody> & mbs,
Constraint * co);
103 int nrConstraints()
const;
105 void addTask(
Task * task);
106 void addTask(
const std::vector<rbd::MultiBody> & mbs,
Task * task);
107 void removeTask(
Task * task);
111 void solver(
const std::string & name);
112 std::string solver()
const;
117 const Eigen::VectorXd & result()
const;
118 Eigen::VectorXd alphaDVec()
const;
119 Eigen::VectorXd alphaDVec(
int rIndex)
const;
121 Eigen::VectorXd lambdaVec()
const;
122 Eigen::VectorXd lambdaVec(
int cIndex)
const;
124 int contactLambdaPosition(
const ContactId & cId)
const;
126 boost::timer::cpu_times solveTime()
const;
127 boost::timer::cpu_times solveAndBuildTime()
const;
130 void preUpdate(
const std::vector<rbd::MultiBody> & mbs,
const std::vector<rbd::MultiBodyConfig> & mbcs);
131 void postUpdate(
const std::vector<rbd::MultiBody> & mbs, std::vector<rbd::MultiBodyConfig> & mbcs,
bool success);
134 std::vector<Constraint *> constr_;
135 std::vector<Equality *> eqConstr_;
136 std::vector<Inequality *> inEqConstr_;
137 std::vector<GenInequality *> genInEqConstr_;
138 std::vector<Bound *> boundConstr_;
140 std::vector<Task *> tasks_;
144 int maxEqLines_, maxInEqLines_, maxGenInEqLines_;
146 std::unique_ptr<GenQPSolver> solver_;
148 boost::timer::cpu_timer solverTimer_, solverAndBuildTimer_;
155 virtual void updateNrVars(
const std::vector<rbd::MultiBody> & msb,
const SolverData & data) = 0;
157 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
158 const std::vector<rbd::MultiBodyConfig> & mbcs,
162 template<
typename... Fun>
171 addToSolver_p(sol, (&Fun::addToSolver)...);
177 addToSolver_p(sol, (&Fun::addToSolver)...);
183 removeFromSolver_p(sol, (&Fun::removeFromSolver)...);
189 template<
typename F,
typename... NextFun>
190 void addToSolver_p(QPSolver & sol, F
function, NextFun... nFun)
192 (this->*
function)(sol);
193 addToSolver_p(sol, nFun...);
196 void removeFromSolver_p(QPSolver & ) {}
198 template<
typename F,
typename... NextFun>
199 void removeFromSolver_p(QPSolver & sol, F
function, NextFun... nFun)
201 (this->*
function)(sol);
202 removeFromSolver_p(sol, nFun...);
210 virtual int maxEq()
const = 0;
211 virtual int nrEq()
const {
return maxEq(); }
213 virtual const Eigen::MatrixXd & AEq()
const = 0;
214 virtual const Eigen::VectorXd & bEq()
const = 0;
216 virtual std::string nameEq()
const = 0;
217 virtual std::string descEq(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
228 virtual int maxInEq()
const = 0;
229 virtual int nrInEq()
const {
return maxInEq(); }
231 virtual const Eigen::MatrixXd & AInEq()
const = 0;
232 virtual const Eigen::VectorXd & bInEq()
const = 0;
234 virtual std::string nameInEq()
const = 0;
235 virtual std::string descInEq(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
246 virtual int maxGenInEq()
const = 0;
249 virtual const Eigen::MatrixXd & AGenInEq()
const = 0;
250 virtual const Eigen::VectorXd & LowerGenInEq()
const = 0;
251 virtual const Eigen::VectorXd & UpperGenInEq()
const = 0;
253 virtual std::string nameGenInEq()
const = 0;
254 virtual std::string descGenInEq(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
265 virtual int beginVar()
const = 0;
267 virtual const Eigen::VectorXd & Lower()
const = 0;
268 virtual const Eigen::VectorXd & Upper()
const = 0;
270 virtual std::string nameBound()
const = 0;
271 virtual std::string descBound(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
281 Task(
double weight) : weight_(weight) {}
284 virtual double weight()
const {
return weight_; }
286 virtual void weight(
double w) { weight_ = w; }
288 virtual std::pair<int, int> begin()
const = 0;
290 virtual void updateNrVars(
const std::vector<rbd::MultiBody> & mbs,
const SolverData & data) = 0;
291 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
292 const std::vector<rbd::MultiBodyConfig> & mbcs,
295 virtual const Eigen::MatrixXd & Q()
const = 0;
296 virtual const Eigen::VectorXd & C()
const = 0;
307 virtual int dim() = 0;
309 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
310 const std::vector<rbd::MultiBodyConfig> & mbcs,
313 virtual const Eigen::MatrixXd & jac()
const = 0;
314 virtual const Eigen::VectorXd & eval()
const = 0;
315 virtual const Eigen::VectorXd & speed()
const = 0;
316 virtual const Eigen::VectorXd & normalAcc()
const = 0;
333 static std::string
desc(
Equality * constr,
const std::vector<rbd::MultiBody> & mbs,
int i)
335 return constr->
descEq(mbs, i);
348 static std::string
desc(
Inequality * constr,
const std::vector<rbd::MultiBody> & mbs,
int i)