Crocoddyl
lqr.hpp
1 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2021, LAAS-CNRS, University of Edinburgh
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
8 
9 #ifndef CROCODDYL_CORE_ACTIONS_LQR_HPP_
10 #define CROCODDYL_CORE_ACTIONS_LQR_HPP_
11 
12 #include <stdexcept>
13 
14 #include "crocoddyl/core/action-base.hpp"
15 #include "crocoddyl/core/fwd.hpp"
16 #include "crocoddyl/core/states/euclidean.hpp"
17 
18 namespace crocoddyl {
19 
20 template <typename _Scalar>
21 class ActionModelLQRTpl : public ActionModelAbstractTpl<_Scalar> {
22  public:
23  typedef _Scalar Scalar;
29  typedef typename MathBase::VectorXs VectorXs;
30  typedef typename MathBase::MatrixXs MatrixXs;
31 
32  ActionModelLQRTpl(const std::size_t nx, const std::size_t nu,
33  const bool drift_free = true);
34  virtual ~ActionModelLQRTpl();
35 
36  virtual void calc(const boost::shared_ptr<ActionDataAbstract>& data,
37  const Eigen::Ref<const VectorXs>& x,
38  const Eigen::Ref<const VectorXs>& u);
39  virtual void calc(const boost::shared_ptr<ActionDataAbstract>& data,
40  const Eigen::Ref<const VectorXs>& x);
41  virtual void calcDiff(const boost::shared_ptr<ActionDataAbstract>& data,
42  const Eigen::Ref<const VectorXs>& x,
43  const Eigen::Ref<const VectorXs>& u);
44  virtual void calcDiff(const boost::shared_ptr<ActionDataAbstract>& data,
45  const Eigen::Ref<const VectorXs>& x);
46  virtual boost::shared_ptr<ActionDataAbstract> createData();
47  virtual bool checkData(const boost::shared_ptr<ActionDataAbstract>& data);
48 
49  const MatrixXs& get_Fx() const;
50  const MatrixXs& get_Fu() const;
51  const VectorXs& get_f0() const;
52  const VectorXs& get_lx() const;
53  const VectorXs& get_lu() const;
54  const MatrixXs& get_Lxx() const;
55  const MatrixXs& get_Lxu() const;
56  const MatrixXs& get_Luu() const;
57 
58  void set_Fx(const MatrixXs& Fx);
59  void set_Fu(const MatrixXs& Fu);
60  void set_f0(const VectorXs& f0);
61  void set_lx(const VectorXs& lx);
62  void set_lu(const VectorXs& lu);
63  void set_Lxx(const MatrixXs& Lxx);
64  void set_Lxu(const MatrixXs& Lxu);
65  void set_Luu(const MatrixXs& Luu);
66 
72  virtual void print(std::ostream& os) const;
73 
74  protected:
75  using Base::nu_;
76  using Base::state_;
77 
78  private:
79  bool drift_free_;
80  MatrixXs Fx_;
81  MatrixXs Fu_;
82  VectorXs f0_;
83  MatrixXs Lxx_;
84  MatrixXs Lxu_;
85  MatrixXs Luu_;
86  VectorXs lx_;
87  VectorXs lu_;
88 };
89 
90 template <typename _Scalar>
91 struct ActionDataLQRTpl : public ActionDataAbstractTpl<_Scalar> {
92  typedef _Scalar Scalar;
95  typedef typename MathBase::VectorXs VectorXs;
96 
97  template <template <typename Scalar> class Model>
98  explicit ActionDataLQRTpl(Model<Scalar>* const model)
99  : Base(model),
100  Luu_u_tmp(VectorXs::Zero(static_cast<Eigen::Index>(model->get_nu()))),
101  Lxx_x_tmp(VectorXs::Zero(
102  static_cast<Eigen::Index>(model->get_state()->get_ndx()))) {
103  // Setting the linear model and quadratic cost here because they are
104  // constant
105  Fx = model->get_Fx();
106  Fu = model->get_Fu();
107  Lxx = model->get_Lxx();
108  Luu = model->get_Luu();
109  Lxu = model->get_Lxu();
110  }
111 
112  using Base::cost;
113  using Base::Fu;
114  using Base::Fx;
115  using Base::Lu;
116  using Base::Luu;
117  using Base::Lx;
118  using Base::Lxu;
119  using Base::Lxx;
120  using Base::r;
121  using Base::xnext;
122  VectorXs Luu_u_tmp; // Temporary variable for storing Hessian-vector product
123  // (size: nu)
124  VectorXs Lxx_x_tmp; // Temporary variable for storing Hessian-vector product
125  // (size: nx)
126 };
127 
128 } // namespace crocoddyl
129 
130 /* --- Details -------------------------------------------------------------- */
131 /* --- Details -------------------------------------------------------------- */
132 /* --- Details -------------------------------------------------------------- */
133 #include "crocoddyl/core/actions/lqr.hxx"
134 
135 #endif // CROCODDYL_CORE_ACTIONS_LQR_HPP_
Abstract class for action model.
Definition: action-base.hpp:95
boost::shared_ptr< StateAbstract > state_
Model of the state.
std::size_t nu_
Control dimension.
virtual void print(std::ostream &os) const
Print relevant information of the LQR model.
virtual void calc(const boost::shared_ptr< ActionDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)
Compute the next state and cost value.
virtual void calcDiff(const boost::shared_ptr< ActionDataAbstract > &data, const Eigen::Ref< const VectorXs > &x, const Eigen::Ref< const VectorXs > &u)
Compute the derivatives of the dynamics and cost functions.
virtual bool checkData(const boost::shared_ptr< ActionDataAbstract > &data)
Checks that a specific data belongs to this model.
virtual void calc(const boost::shared_ptr< ActionDataAbstract > &data, const Eigen::Ref< const VectorXs > &x)
Compute the total cost value for nodes that depends only on the state.
virtual void calcDiff(const boost::shared_ptr< ActionDataAbstract > &data, const Eigen::Ref< const VectorXs > &x)
Compute the derivatives of the cost functions with respect to the state only.
virtual boost::shared_ptr< ActionDataAbstract > createData()
Create the action data.
VectorXs xnext
evolution state
MatrixXs Fx
Jacobian of the dynamics w.r.t. the state .
MatrixXs Fu
Jacobian of the dynamics w.r.t. the control .
MatrixXs Luu
Hessian of the cost w.r.t. the control .
VectorXs Lx
Jacobian of the cost w.r.t. the state .
MatrixXs Lxx
Hessian of the cost w.r.t. the state .
VectorXs Lu
Jacobian of the cost w.r.t. the control .
VectorXs r
Cost residual.
MatrixXs Fx
Jacobian of the dynamics w.r.t. the state .
MatrixXs Fu
Jacobian of the dynamics w.r.t. the control .
MatrixXs Luu
Hessian of the cost w.r.t. the control .
MatrixXs Lxx
Hessian of the cost w.r.t. the state .