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;
72 void nrVars(
const std::vector<rbd::MultiBody> & mbs,
73 std::vector<UnilateralContact> uni,
74 std::vector<BilateralContact> bi);
106 void addTask(
const std::vector<rbd::MultiBody> & mbs,
Task * task);
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_;
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...);
211 virtual int nrEq()
const {
return maxEq(); }
213 virtual const Eigen::MatrixXd &
AEq()
const = 0;
214 virtual const Eigen::VectorXd &
bEq()
const = 0;
217 virtual std::string
descEq(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
229 virtual int nrInEq()
const {
return maxInEq(); }
231 virtual const Eigen::MatrixXd &
AInEq()
const = 0;
232 virtual const Eigen::VectorXd &
bInEq()
const = 0;
235 virtual std::string
descInEq(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
249 virtual const Eigen::MatrixXd &
AGenInEq()
const = 0;
254 virtual std::string
descGenInEq(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
267 virtual const Eigen::VectorXd &
Lower()
const = 0;
268 virtual const Eigen::VectorXd &
Upper()
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;
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;
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;
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)
Definition: QPSolver.h:262
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:273
virtual int beginVar() const =0
virtual std::string nameBound() const =0
virtual const Eigen::VectorXd & Upper() const =0
virtual std::string descBound(const std::vector< rbd::MultiBody > &mbs, int i)=0
virtual const Eigen::VectorXd & Lower() const =0
virtual ~Bound()
Definition: QPSolver.h:264
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:275
Definition: QPSolver.h:164
void addToSolver(const std::vector< rbd::MultiBody > &mbs, QPSolver &sol)
Definition: QPSolver.h:174
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:180
virtual ~ConstraintFunction() override
Definition: QPSolver.h:166
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:168
Definition: QPSolver.h:152
virtual void updateNrVars(const std::vector< rbd::MultiBody > &msb, const SolverData &data)=0
virtual ~Constraint()
Definition: QPSolver.h:154
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data)=0
Definition: QPSolver.h:207
virtual int maxEq() const =0
virtual ~Equality()
Definition: QPSolver.h:209
virtual std::string descEq(const std::vector< rbd::MultiBody > &mbs, int i)=0
virtual int nrEq() const
Definition: QPSolver.h:211
virtual std::string nameEq() const =0
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:219
virtual const Eigen::VectorXd & bEq() const =0
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:221
virtual const Eigen::MatrixXd & AEq() const =0
Definition: QPSolver.h:243
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:258
virtual const Eigen::MatrixXd & AGenInEq() const =0
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:256
virtual int nrGenInEq() const
Definition: QPSolver.h:247
virtual std::string descGenInEq(const std::vector< rbd::MultiBody > &mbs, int i)=0
virtual std::string nameGenInEq() const =0
virtual const Eigen::VectorXd & UpperGenInEq() const =0
virtual ~GenInequality()
Definition: QPSolver.h:245
virtual int maxGenInEq() const =0
virtual const Eigen::VectorXd & LowerGenInEq() const =0
Definition: QPSolver.h:303
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data)=0
virtual const Eigen::VectorXd & normalAcc() const =0
virtual const Eigen::VectorXd & speed() const =0
virtual ~HighLevelTask()
Definition: QPSolver.h:305
virtual const Eigen::MatrixXd & jac() const =0
virtual const Eigen::VectorXd & eval() const =0
Definition: QPSolver.h:225
virtual int nrInEq() const
Definition: QPSolver.h:229
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:239
virtual const Eigen::MatrixXd & AInEq() const =0
virtual int maxInEq() const =0
virtual ~Inequality()
Definition: QPSolver.h:227
virtual const Eigen::VectorXd & bInEq() const =0
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:237
virtual std::string nameInEq() const =0
virtual std::string descInEq(const std::vector< rbd::MultiBody > &mbs, int i)=0
Definition: QPSolver.h:46
void updateNrVars(const std::vector< rbd::MultiBody > &mbs) const
call updateNrVars on all tasks and constraints
int nrEqualityConstraints() const
const Eigen::VectorXd & result() const
void addConstraint(Constraint *co)
void removeConstraint(Constraint *co)
int nrConstraints() const
boost::timer::cpu_times solveAndBuildTime() const
void addEqualityConstraint(Equality *co)
void nrVars(const std::vector< rbd::MultiBody > &mbs, std::vector< UnilateralContact > uni, std::vector< BilateralContact > bi)
int nrInequalityConstraints() const
Eigen::VectorXd alphaDVec(int rIndex) const
void preUpdate(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs)
void updateTasksNrVars(const std::vector< rbd::MultiBody > &mbs) const
call updateNrVars on all tasks
Eigen::VectorXd alphaDVec() const
void postUpdate(const std::vector< rbd::MultiBody > &mbs, std::vector< rbd::MultiBodyConfig > &mbcs, bool success)
bool solveNoMbcUpdate(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs)
std::string solver() const
bool solve(const std::vector< rbd::MultiBody > &mbs, std::vector< rbd::MultiBodyConfig > &mbcs)
void removeEqualityConstraint(Equality *co)
void removeBoundConstraint(Bound *co)
Eigen::VectorXd lambdaVec(int cIndex) const
int nrGenInequalityConstraints() const
void solver(const std::string &name)
void addTask(const std::vector< rbd::MultiBody > &mbs, Task *task)
void removeGenInequalityConstraint(GenInequality *co)
boost::timer::cpu_times solveTime() const
void updateMbc(rbd::MultiBodyConfig &mbc, int robotIndex) const
fill mbc with the solution of the problem
int nrBoundConstraints() const
void updateConstrsNrVars(const std::vector< rbd::MultiBody > &mbs) const
call updateNrVars on all constraints
void removeTask(Task *task)
void addConstraint(const std::vector< rbd::MultiBody > &mbs, Constraint *co)
void addInequalityConstraint(Inequality *co)
void addBoundConstraint(Bound *co)
Eigen::VectorXd lambdaVec() const
int contactLambdaPosition(const ContactId &cId) const
void removeInequalityConstraint(Inequality *co)
void addGenInequalityConstraint(GenInequality *co)
const SolverData & data() const
Definition: QPSolverData.h:28
Definition: QPSolver.h:279
virtual const Eigen::MatrixXd & Q() const =0
virtual void weight(double w)
Definition: QPSolver.h:286
Task(double weight)
Definition: QPSolver.h:281
virtual std::pair< int, int > begin() const =0
virtual void updateNrVars(const std::vector< rbd::MultiBody > &mbs, const SolverData &data)=0
virtual const Eigen::VectorXd & C() const =0
virtual double weight() const
Definition: QPSolver.h:284
virtual ~Task()
Definition: QPSolver.h:282
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data)=0
Definition: GenQPSolver.h:21
Definition: GenQPUtils.h:19
static std::string name(const Equality *constr)
Definition: QPSolver.h:331
static int maxLines(const Equality *constr)
Definition: QPSolver.h:327
static int nrLines(const Equality *constr)
Definition: QPSolver.h:329
static std::string desc(Equality *constr, const std::vector< rbd::MultiBody > &mbs, int i)
Definition: QPSolver.h:333
static std::string desc(GenInequality *constr, const std::vector< rbd::MultiBody > &mbs, int i)
Definition: QPSolver.h:363
static std::string name(const GenInequality *constr)
Definition: QPSolver.h:361
static int maxLines(const GenInequality *constr)
Definition: QPSolver.h:357
static int nrLines(const GenInequality *constr)
Definition: QPSolver.h:359
static int nrLines(const Inequality *constr)
Definition: QPSolver.h:344
static int maxLines(const Inequality *constr)
Definition: QPSolver.h:342
static std::string name(const Inequality *constr)
Definition: QPSolver.h:346
static std::string desc(Inequality *constr, const std::vector< rbd::MultiBody > &mbs, int i)
Definition: QPSolver.h:348
Definition: QPSolver.h:321