mc_rtc  2.13.0
TVMQPSolver.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-2022 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
7 #include <mc_solver/QPSolver.h>
8 
9 #include <mc_rtc/clock.h>
10 
11 #include <tvm/ControlProblem.h>
12 #include <tvm/LinearizedControlProblem.h>
13 #include <tvm/scheme/WeightedLeastSquares.h>
14 
15 namespace mc_solver
16 {
17 
23 struct MC_SOLVER_DLLAPI TVMQPSolver final : public QPSolver
24 {
25  TVMQPSolver(mc_rbdyn::RobotsPtr robots, double timeStep);
26 
27  TVMQPSolver(double timeStep);
28 
29  ~TVMQPSolver() final = default;
30 
31  void setContacts(ControllerToken, const std::vector<mc_rbdyn::Contact> & contacts) final;
32 
33  const sva::ForceVecd desiredContactForce(const mc_rbdyn::Contact & id) const final;
34 
35  double solveTime() final;
36 
37  double solveAndBuildTime() final;
38 
40  inline tvm::LinearizedControlProblem & problem() noexcept { return problem_; }
41 
43  inline const tvm::LinearizedControlProblem & problem() const noexcept { return problem_; }
44 
51  static inline TVMQPSolver & from_solver(QPSolver & solver) noexcept
52  {
53  assert(solver.backend() == QPSolver::Backend::TVM);
54  return static_cast<TVMQPSolver &>(solver);
55  }
56 
63  static inline const TVMQPSolver & from_solver(const QPSolver & solver) noexcept
64  {
65  assert(solver.backend() == QPSolver::Backend::TVM);
66  return static_cast<const TVMQPSolver &>(solver);
67  }
68 
69 private:
71  tvm::LinearizedControlProblem problem_;
73  tvm::scheme::WeightedLeastSquares solver_;
75  struct ContactData
76  {
78  tvm::TaskWithRequirementsPtr contactConstraint_;
80  tvm::VariableVector f1_;
82  std::vector<tvm::TaskWithRequirementsPtr> f1Constraints_;
84  tvm::VariableVector f2_;
86  std::vector<tvm::TaskWithRequirementsPtr> f2Constraints_;
87  };
89  std::vector<ContactData> contactsData_;
90 
92  mc_rtc::duration_ms solve_dt_{0};
93 
95  bool runCommon();
97  bool runOpenLoop();
99  bool runJointsFeedback(bool wVelocity);
100 
121  bool runClosedLoop(bool integrateControlState);
122 
124  void updateRobot(mc_rbdyn::Robot & robot);
125 
127  std::vector<std::vector<double>> prev_encoders_{};
128  std::vector<std::vector<double>> encoders_alpha_{};
129  std::vector<std::vector<std::vector<double>>> control_q_{};
130  std::vector<std::vector<std::vector<double>>> control_alpha_{};
131 
133  std::unordered_map<std::string, DynamicsConstraint *> dynamics_;
134 
135  bool run_impl(FeedbackType fType = FeedbackType::None) final;
136 
137  void addDynamicsConstraint(mc_solver::DynamicsConstraint * dynamics) final;
138 
139  void removeDynamicsConstraint(mc_solver::ConstraintSet * maybe_dynamics) final;
140  void removeDynamicsConstraint(mc_solver::DynamicsConstraint * dyn);
141 
142  size_t getContactIdx(const mc_rbdyn::Contact & contact);
143  void addContact(const mc_rbdyn::Contact & contact);
144  using ContactIterator = std::vector<mc_rbdyn::Contact>::iterator;
145  ContactIterator removeContact(size_t idx);
146  std::tuple<size_t, bool> addVirtualContactImpl(const mc_rbdyn::Contact & contact);
147  void addContactToDynamics(const std::string & robot,
148  const mc_rbdyn::RobotFrame & frame,
149  const std::vector<sva::PTransformd> & points,
150  tvm::VariableVector & forces,
151  std::vector<tvm::TaskWithRequirementsPtr> & constraints,
152  const Eigen::MatrixXd & frictionCone,
153  double dir);
154 };
155 
162 inline TVMQPSolver & tvm_solver(QPSolver & solver) noexcept
163 {
164  return TVMQPSolver::from_solver(solver);
165 }
166 
167 /* const version */
168 inline const TVMQPSolver & tvm_solver(const QPSolver & solver) noexcept
169 {
170  return TVMQPSolver::from_solver(solver);
171 }
172 
173 } // namespace mc_solver
#define MC_SOLVER_DLLAPI
Definition: api.h:50
mc_control::Contact Contact
Definition: Controller.h:22
Definition: generic_gripper.h:15
std::shared_ptr< Robots > RobotsPtr
Definition: fwd.h:17
std::chrono::duration< double, std::milli > duration_ms
Definition: clock.h:13
Definition: Contact.h:18
TVMQPSolver & tvm_solver(QPSolver &solver) noexcept
Definition: TVMQPSolver.h:162
Definition: Contact.h:67
Definition: Contact.h:49
Definition: RobotFrame.h:22
Definition: Robot.h:63
This class is a basis to wrap Constraint functions from Tasks. The aim of such wrappers should be two...
Definition: ConstraintSet.h:21
Definition: DynamicsConstraint.h:21
Definition: QPSolver.h:102
Definition: QPSolver.h:86
Definition: TVMQPSolver.h:24
TVMQPSolver(double timeStep)
const tvm::LinearizedControlProblem & problem() const noexcept
Definition: TVMQPSolver.h:43
~TVMQPSolver() final=default
static const TVMQPSolver & from_solver(const QPSolver &solver) noexcept
Definition: TVMQPSolver.h:63
static TVMQPSolver & from_solver(QPSolver &solver) noexcept
Definition: TVMQPSolver.h:51
TVMQPSolver(mc_rbdyn::RobotsPtr robots, double timeStep)