- 3.0.2 rigid body dynamics module.
InfiniteHorizonLQRwithInverseDynamics.h
Go to the documentation of this file.
1 /**********************************************************************************************************************
2 This file is part of the Control Toolbox (https://github.com/ethz-adrl/control-toolbox), copyright by ETH Zurich.
3 Licensed under the BSD-2 license (see LICENSE file in main directory)
4 **********************************************************************************************************************/
5 
6 #pragma once
7 
9 
10 namespace ct {
11 namespace rbd {
12 
13 template <class RBDDynamics>
14 class InfiniteHorizonLQRwithInverseDynamics : public ct::core::Controller<RBDDynamics::NSTATE, RBDDynamics::NJOINTS>
15 {
16 public:
17  typedef typename RBDDynamics::SCALAR SCALAR;
18  typedef typename RBDDynamics::control_vector_t control_vector_t;
19  typedef typename RBDDynamics::state_vector_t state_vector_t;
20  typedef typename RBDDynamics::JointAcceleration_t JointAcceleration_t;
21 
26 
27 
30  std::shared_ptr<ct::core::LinearSystem<2 * (RBDDynamics::NJOINTS), RBDDynamics::NJOINTS>> linearSystem)
31  : fdSystem_(system),
32  linearSystem_(linearSystem),
33  infiniteHorizonLQR_(),
34  stateSetpoint_(state_vector_t::Zero()),
35  id_torques_(control_vector_t::Zero()),
36  K_(feedback_matrix_t::Zero())
37  {
38  }
39 
41  : fdSystem_(arg.fdSystem_->clone()),
42  linearSystem_(arg.linearSystem_->clone()),
43  infiniteHorizonLQR_(),
44  stateSetpoint_(arg.stateSetpoint_),
45  id_torques_(arg.id_torques_),
46  K_(arg.K_)
47  {
48  }
49 
50 
52  virtual InfiniteHorizonLQRwithInverseDynamics* clone() const override
53  {
55  }
56 
57 
59  const ct::core::Time& t,
61  {
62  controlAction = id_torques_ - K_ * (state - stateSetpoint_);
63  }
64 
65 
66  const feedback_matrix_t& getK() { return K_; }
67  bool designInfiniteHorizonLQR(const state_vector_t& stateSetpoint,
68  const state_matrix_t& Q_stab,
69  const control_matrix_t& R_stab,
70  feedback_matrix_t& K)
71  {
72  computeIDTorques(id_torques_, stateSetpoint);
73 
74  // local linearizations
75  state_matrix_t A_setpoint = linearSystem_->getDerivativeState(stateSetpoint, id_torques_);
76  state_control_matrix_t B_setpoint = linearSystem_->getDerivativeControl(stateSetpoint, id_torques_);
77 
78  bool success = infiniteHorizonLQR_.compute(Q_stab, R_stab, A_setpoint, B_setpoint, K, false, true);
79 
80  // save to local class members
81  stateSetpoint_ = stateSetpoint;
82  K_ = K;
83 
84  return success;
85  }
86 
87 
88  /*
89  * call this design method if you don't want to get the feedback gain matrix explicitly
90  */
91  bool designInfiniteHorizonLQR(const state_vector_t& stateSetpoint,
92  const state_matrix_t& Q_stab,
93  const control_matrix_t& R_stab)
94  {
95  feedback_matrix_t K_temp = feedback_matrix_t::Zero();
96 
97  return designInfiniteHorizonLQR(stateSetpoint, Q_stab, R_stab, K_temp);
98  }
99 
100 
101  const control_vector_t& getIDTorques() const { return id_torques_; }
102  const state_vector_t& getStateSetpoint() const { return stateSetpoint_; }
103  void setNonlinearSystem(std::shared_ptr<ct::rbd::FixBaseFDSystem<RBDDynamics>> system) { fdSystem_ = system; }
105  std::shared_ptr<ct::core::LinearSystem<2 * (RBDDynamics::NJOINTS), RBDDynamics::NJOINTS>> system)
106  {
107  linearSystem_ = system;
108  }
109 
110 private:
111  /*
112  * compute desired joint torques through inverse dynamics
113  */
114  void computeIDTorques(control_vector_t& id_torques,
115  const state_vector_t& stateSetpoint,
116  const JointAcceleration_t& qdd = JointAcceleration_t::Zero())
117  {
118  typename RBDDynamics::ExtLinkForces_t extlinkforce(Eigen::Matrix<SCALAR, 6, 1>::Zero());
119 
120  fdSystem_->dynamics().FixBaseID(stateSetpoint, qdd, extlinkforce, id_torques);
121  }
122 
123 
124  std::shared_ptr<ct::rbd::FixBaseFDSystem<RBDDynamics>> fdSystem_;
125  std::shared_ptr<ct::core::LinearSystem<2 * (RBDDynamics::NJOINTS), RBDDynamics::NJOINTS>> linearSystem_;
126 
128 
129  state_vector_t stateSetpoint_;
130  control_vector_t id_torques_;
131  feedback_matrix_t K_;
132 };
133 }
134 }
virtual ~InfiniteHorizonLQRwithInverseDynamics()
Definition: InfiniteHorizonLQRwithInverseDynamics.h:51
RBDDynamics::state_vector_t state_vector_t
Definition: InfiniteHorizonLQRwithInverseDynamics.h:19
A fix base rigid body system that uses forward dynamics.
Definition: FixBaseFDSystem.h:30
InfiniteHorizonLQRwithInverseDynamics(std::shared_ptr< ct::rbd::FixBaseFDSystem< RBDDynamics >> system, std::shared_ptr< ct::core::LinearSystem< 2 *(RBDDynamics::NJOINTS), RBDDynamics::NJOINTS >> linearSystem)
Definition: InfiniteHorizonLQRwithInverseDynamics.h:29
core::StateMatrix< RBDDynamics::NSTATE, SCALAR > state_matrix_t
Definition: InfiniteHorizonLQRwithInverseDynamics.h:22
bool designInfiniteHorizonLQR(const state_vector_t &stateSetpoint, const state_matrix_t &Q_stab, const control_matrix_t &R_stab, feedback_matrix_t &K)
Definition: InfiniteHorizonLQRwithInverseDynamics.h:67
InfiniteHorizonLQRwithInverseDynamics()
Definition: InfiniteHorizonLQRwithInverseDynamics.h:28
const state_vector_t & getStateSetpoint() const
Definition: InfiniteHorizonLQRwithInverseDynamics.h:102
RBDDynamics::JointAcceleration_t JointAcceleration_t
Definition: InfiniteHorizonLQRwithInverseDynamics.h:20
RBDDynamics::SCALAR SCALAR
Definition: InfiniteHorizonLQRwithInverseDynamics.h:17
bool designInfiniteHorizonLQR(const state_vector_t &stateSetpoint, const state_matrix_t &Q_stab, const control_matrix_t &R_stab)
Definition: InfiniteHorizonLQRwithInverseDynamics.h:91
const feedback_matrix_t & getK()
Definition: InfiniteHorizonLQRwithInverseDynamics.h:66
core::FeedbackMatrix< RBDDynamics::NSTATE, RBDDynamics::NJOINTS, SCALAR > feedback_matrix_t
Definition: InfiniteHorizonLQRwithInverseDynamics.h:25
InfiniteHorizonLQRwithInverseDynamics(const InfiniteHorizonLQRwithInverseDynamics &arg)
Definition: InfiniteHorizonLQRwithInverseDynamics.h:40
bool compute(const state_matrix_t &Q, const control_matrix_t &R, const state_matrix_t &A, const control_gain_matrix_t &B, control_feedback_t &K, bool RisDiagonal=false, bool solveRiccatiIteratively=false)
RBDDynamics::control_vector_t control_vector_t
Definition: InfiniteHorizonLQRwithInverseDynamics.h:18
void setLinearSystem(std::shared_ptr< ct::core::LinearSystem< 2 *(RBDDynamics::NJOINTS), RBDDynamics::NJOINTS >> system)
Definition: InfiniteHorizonLQRwithInverseDynamics.h:104
virtual InfiniteHorizonLQRwithInverseDynamics * clone() const override
Definition: InfiniteHorizonLQRwithInverseDynamics.h:52
core::StateMatrix< RBDDynamics::NJOINTS, SCALAR > control_matrix_t
Definition: InfiniteHorizonLQRwithInverseDynamics.h:23
Definition: InfiniteHorizonLQRwithInverseDynamics.h:14
const control_vector_t & getIDTorques() const
Definition: InfiniteHorizonLQRwithInverseDynamics.h:101
virtual void computeControl(const ct::core::StateVector< RBDDynamics::NSTATE, SCALAR > &state, const ct::core::Time &t, ct::core::ControlVector< RBDDynamics::NJOINTS, SCALAR > &controlAction) override
Definition: InfiniteHorizonLQRwithInverseDynamics.h:58
void setNonlinearSystem(std::shared_ptr< ct::rbd::FixBaseFDSystem< RBDDynamics >> system)
Definition: InfiniteHorizonLQRwithInverseDynamics.h:103
double Time
core::StateControlMatrix< RBDDynamics::NSTATE, RBDDynamics::NJOINTS, SCALAR > state_control_matrix_t
Definition: InfiniteHorizonLQRwithInverseDynamics.h:24