11 #include <type_traits>
18 #include <tasks/config.hh>
28 struct MultiBodyConfig;
37 using clock =
typename std::conditional<std::chrono::high_resolution_clock::is_steady,
38 std::chrono::high_resolution_clock,
39 std::chrono::steady_clock>::type;
59 bool solve(
const std::vector<rbd::MultiBody> & mbs, std::vector<rbd::MultiBodyConfig> & mbcs);
66 bool solveNoMbcUpdate(
const std::vector<rbd::MultiBody> & mbs,
const std::vector<rbd::MultiBodyConfig> & mbcs);
76 void nrVars(
const std::vector<rbd::MultiBody> & mbs,
77 std::vector<UnilateralContact> uni,
78 std::vector<BilateralContact> bi);
110 void addTask(
const std::vector<rbd::MultiBody> & mbs,
Task * task);
136 void preUpdate(
const std::vector<rbd::MultiBody> & mbs,
const std::vector<rbd::MultiBodyConfig> & mbcs);
137 void postUpdate(
const std::vector<rbd::MultiBody> & mbs, std::vector<rbd::MultiBodyConfig> & mbcs,
bool success);
140 std::vector<Constraint *> constr_;
141 std::vector<Equality *> eqConstr_;
142 std::vector<Inequality *> inEqConstr_;
143 std::vector<GenInequality *> genInEqConstr_;
144 std::vector<Bound *> boundConstr_;
146 std::vector<Task *> tasks_;
150 int maxEqLines_, maxInEqLines_, maxGenInEqLines_;
152 std::unique_ptr<GenQPSolver> solver_;
155 Duration solverAndBuildTime_{};
164 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
165 const std::vector<rbd::MultiBodyConfig> & mbcs,
169 template<
typename... Fun>
178 addToSolver_p(sol, (&Fun::addToSolver)...);
184 addToSolver_p(sol, (&Fun::addToSolver)...);
190 removeFromSolver_p(sol, (&Fun::removeFromSolver)...);
196 template<
typename F,
typename... NextFun>
197 void addToSolver_p(QPSolver & sol, F
function, NextFun... nFun)
199 (this->*
function)(sol);
200 addToSolver_p(sol, nFun...);
203 void removeFromSolver_p(QPSolver & ) {}
205 template<
typename F,
typename... NextFun>
206 void removeFromSolver_p(QPSolver & sol, F
function, NextFun... nFun)
208 (this->*
function)(sol);
209 removeFromSolver_p(sol, nFun...);
218 virtual int nrEq()
const {
return maxEq(); }
220 virtual const Eigen::MatrixXd &
AEq()
const = 0;
221 virtual const Eigen::VectorXd &
bEq()
const = 0;
224 virtual std::string
descEq(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
236 virtual int nrInEq()
const {
return maxInEq(); }
238 virtual const Eigen::MatrixXd &
AInEq()
const = 0;
239 virtual const Eigen::VectorXd &
bInEq()
const = 0;
242 virtual std::string
descInEq(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
256 virtual const Eigen::MatrixXd &
AGenInEq()
const = 0;
261 virtual std::string
descGenInEq(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
274 virtual const Eigen::VectorXd &
Lower()
const = 0;
275 virtual const Eigen::VectorXd &
Upper()
const = 0;
278 virtual std::string
descBound(
const std::vector<rbd::MultiBody> & mbs,
int i) = 0;
288 Task(
double weight) : weight_(weight) {}
291 virtual double weight()
const {
return weight_; }
293 virtual void weight(
double w) { weight_ = w; }
295 virtual std::pair<int, int>
begin()
const = 0;
298 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
299 const std::vector<rbd::MultiBodyConfig> & mbcs,
302 virtual const Eigen::MatrixXd &
Q()
const = 0;
303 virtual const Eigen::VectorXd &
C()
const = 0;
316 virtual void update(
const std::vector<rbd::MultiBody> & mbs,
317 const std::vector<rbd::MultiBodyConfig> & mbcs,
320 virtual const Eigen::MatrixXd &
jac()
const = 0;
321 virtual const Eigen::VectorXd &
eval()
const = 0;
322 virtual const Eigen::VectorXd &
speed()
const = 0;
340 static std::string
desc(
Equality * constr,
const std::vector<rbd::MultiBody> & mbs,
int i)
341 {
return constr->
descEq(mbs, i); }
353 static std::string
desc(
Inequality * constr,
const std::vector<rbd::MultiBody> & mbs,
int i)
354 {
return constr->
descInEq(mbs, i); }
Definition: QPSolver.h:269
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:280
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:271
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:282
Definition: QPSolver.h:171
void addToSolver(const std::vector< rbd::MultiBody > &mbs, QPSolver &sol)
Definition: QPSolver.h:181
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:187
virtual ~ConstraintFunction() override
Definition: QPSolver.h:173
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:175
Definition: QPSolver.h:159
virtual void updateNrVars(const std::vector< rbd::MultiBody > &msb, const SolverData &data)=0
virtual ~Constraint()
Definition: QPSolver.h:161
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data)=0
Definition: QPSolver.h:214
virtual int maxEq() const =0
virtual ~Equality()
Definition: QPSolver.h:216
virtual std::string descEq(const std::vector< rbd::MultiBody > &mbs, int i)=0
virtual int nrEq() const
Definition: QPSolver.h:218
virtual std::string nameEq() const =0
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:226
virtual const Eigen::VectorXd & bEq() const =0
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:228
virtual const Eigen::MatrixXd & AEq() const =0
Definition: QPSolver.h:250
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:265
virtual const Eigen::MatrixXd & AGenInEq() const =0
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:263
virtual int nrGenInEq() const
Definition: QPSolver.h:254
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:252
virtual int maxGenInEq() const =0
virtual const Eigen::VectorXd & LowerGenInEq() const =0
Definition: GenQPSolver.h:53
Definition: QPSolver.h:310
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:312
virtual const Eigen::MatrixXd & jac() const =0
virtual const Eigen::VectorXd & eval() const =0
Definition: QPSolver.h:232
virtual int nrInEq() const
Definition: QPSolver.h:236
void removeFromSolver(QPSolver &sol)
Definition: QPSolver.h:246
virtual const Eigen::MatrixXd & AInEq() const =0
virtual int maxInEq() const =0
virtual ~Inequality()
Definition: QPSolver.h:234
virtual const Eigen::VectorXd & bInEq() const =0
void addToSolver(QPSolver &sol)
Definition: QPSolver.h:244
virtual std::string nameInEq() const =0
virtual std::string descInEq(const std::vector< rbd::MultiBody > &mbs, int i)=0
Definition: QPSolver.h:50
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
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)
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)
Duration solveTime() const
Duration solveAndBuildTime() const
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)
clock::duration Duration
Definition: QPSolver.h:130
const SolverData & data() const
Definition: QPSolverData.h:28
Definition: QPSolver.h:286
virtual const Eigen::MatrixXd & Q() const =0
virtual void weight(double w)
Definition: QPSolver.h:293
Task(double weight)
Definition: QPSolver.h:288
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:291
virtual ~Task()
Definition: QPSolver.h:289
virtual void update(const std::vector< rbd::MultiBody > &mbs, const std::vector< rbd::MultiBodyConfig > &mbcs, const SolverData &data)=0
typename std::conditional< std::chrono::high_resolution_clock::is_steady, std::chrono::high_resolution_clock, std::chrono::steady_clock >::type clock
Definition: QPSolver.h:39
Definition: GenQPUtils.h:19
static std::string name(const Equality *constr)
Definition: QPSolver.h:338
static int maxLines(const Equality *constr)
Definition: QPSolver.h:334
static int nrLines(const Equality *constr)
Definition: QPSolver.h:336
static std::string desc(Equality *constr, const std::vector< rbd::MultiBody > &mbs, int i)
Definition: QPSolver.h:340
static std::string desc(GenInequality *constr, const std::vector< rbd::MultiBody > &mbs, int i)
Definition: QPSolver.h:366
static std::string name(const GenInequality *constr)
Definition: QPSolver.h:364
static int maxLines(const GenInequality *constr)
Definition: QPSolver.h:360
static int nrLines(const GenInequality *constr)
Definition: QPSolver.h:362
static int nrLines(const Inequality *constr)
Definition: QPSolver.h:349
static int maxLines(const Inequality *constr)
Definition: QPSolver.h:347
static std::string name(const Inequality *constr)
Definition: QPSolver.h:351
static std::string desc(Inequality *constr, const std::vector< rbd::MultiBody > &mbs, int i)
Definition: QPSolver.h:353
Definition: QPSolver.h:328