final_state_cost.h
Go to the documentation of this file.
1 /*********************************************************************
2  *
3  * Software License Agreement
4  *
5  * Copyright (c) 2020,
6  * TU Dortmund - Institute of Control Theory and Systems Engineering.
7  * All rights reserved.
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <https://www.gnu.org/licenses/>.
21  *
22  * Authors: Christoph Rösmann
23  *********************************************************************/
24 
25 #ifndef SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_FUNCTIONS_FINAL_STATE_COST_H_
26 #define SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_FUNCTIONS_FINAL_STATE_COST_H_
27 
29 
33 
34 #include <memory>
35 
36 namespace corbo {
37 
38 class BaseQuadraticFinalStateCost : public FinalStageCost
39 {
40  public:
41  using Ptr = std::shared_ptr<BaseQuadraticFinalStateCost>;
42  using ConstPtr = std::shared_ptr<const BaseQuadraticFinalStateCost>;
43 
44  virtual const Eigen::MatrixXd& getWeightQf() const = 0;
45 };
46 
47 class QuadraticFinalStateCost : public BaseQuadraticFinalStateCost
48 {
49  public:
50  using Ptr = std::shared_ptr<QuadraticFinalStateCost>;
51 
52  QuadraticFinalStateCost() { _Qf_sqrt = Eigen::MatrixXd::Constant(1, 1, 1); }
53 
54  QuadraticFinalStateCost(const Eigen::Ref<const Eigen::MatrixXd>& Qf, bool lsq_form) : _lsq_form(lsq_form) { setWeightQf(Qf); }
55 
56  FinalStageCost::Ptr getInstance() const override { return std::make_shared<QuadraticFinalStateCost>(); }
57 
58  int getNonIntegralStateTermDimension(int k) const override { return _lsq_form ? _Qf.rows() : 1; }
59  bool isLsqFormNonIntegralStateTerm(int k) const override { return _lsq_form; }
60 
63 
64  const Eigen::MatrixXd& getWeightQf() const override { return _Qf; }
65 
66  void setLsqForm(bool lsq_form) { _lsq_form = lsq_form; }
67 
69 
71  bool single_dt, const Eigen::VectorXd& x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector<double>& dts,
72  const DiscretizationGridInterface* grid) override
73  {
74  bool dimension_modified = BaseQuadraticFinalStateCost::update(n, t, xref, uref, sref, single_dt, x0, stage_preprocessor, dts, grid);
75 
76  _x_ref = &xref;
78 
79  return dimension_modified;
80  }
81 
82  bool checkParameters(int state_dim, int control_dim, std::stringstream* issues) const override;
83 
84 #ifdef MESSAGE_SUPPORT
85  bool fromMessage(const messages::FinalStageCost& message, std::stringstream* issues) override;
86  void toMessage(messages::FinalStageCost& message) const override;
87 #endif
88 
89  protected:
90  Eigen::MatrixXd _Qf_sqrt;
91  Eigen::MatrixXd _Qf;
93  Eigen::DiagonalMatrix<double, -1> _Qf_diag;
94  bool _diagonal_mode = false;
95  bool _diagonal_mode_intentionally = false;
96  bool _lsq_form = true;
97 
98  const ReferenceTrajectoryInterface* _x_ref = nullptr;
99  bool _zero_x_ref = false;
100 };
102 
104 {
105  public:
106  QuadraticFinalStateCostRiccati() { _Qf_sqrt = Eigen::MatrixXd::Constant(1, 1, 1); }
107 
110  {
111  setSystemDynamics(dynamics);
114  }
115 
116  FinalStageCost::Ptr getInstance() const override { return std::make_shared<QuadraticFinalStateCostRiccati>(); }
117 
118  int getNonIntegralStateTermDimension(int k) const override { return 1; }
119 
121  {
122  _are_solved_before = false;
123  _dynamics = dynamics;
124  }
125 
130 
131  void setLsqForm(bool lsq_form) { _lsq_form = lsq_form; }
132 
133  const Eigen::MatrixXd& getWeightQf() const override { return _Qf; }
134 
136 
137  bool update(int n, double t, ReferenceTrajectoryInterface& xref, ReferenceTrajectoryInterface& uref, ReferenceTrajectoryInterface* sref,
138  bool single_dt, const Eigen::VectorXd& x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector<double>& dts,
139  const DiscretizationGridInterface* /*grid*/) override;
140 
141  bool checkParameters(int state_dim, int control_dim, std::stringstream* issues) const override;
142 
143 #ifdef MESSAGE_SUPPORT
144  bool fromMessage(const messages::FinalStageCost& message, std::stringstream* issues) override;
145  void toMessage(messages::FinalStageCost& message) const override;
146 #endif
147 
148  protected:
149  bool computeWeightQfSqrt();
150 
151  Eigen::MatrixXd _Q;
152  Eigen::MatrixXd _R;
154  bool _R_diagonal_mode_intentionally = false;
155 
156  Eigen::MatrixXd _Qf_sqrt;
157  Eigen::MatrixXd _Qf;
159  Eigen::VectorXd _steady_state_x;
160  Eigen::VectorXd _steady_state_u;
161  bool _lsq_form = true;
162  bool _are_solved_before = false; // algebraic riccati equation solved before (e.g., for linear systems solving once is sufficient)
163 
164  const ReferenceTrajectoryInterface* _x_ref = nullptr;
165  bool _zero_x_ref = false;
166 };
168 
169 } // namespace corbo
170 
171 #endif // SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_FUNCTIONS_FINAL_STATE_COST_H_
corbo::QuadraticFinalStateCostRiccati::_Qf_sqrt
Eigen::MatrixXd _Qf_sqrt
Definition: final_state_cost.h:178
corbo::QuadraticFinalStateCost::Ptr
std::shared_ptr< QuadraticFinalStateCost > Ptr
Definition: final_state_cost.h:72
corbo::QuadraticFinalStateCostRiccati::_R_diagonal_mode_intentionally
bool _R_diagonal_mode_intentionally
Definition: final_state_cost.h:176
Eigen::DiagonalMatrix< double, -1 >
corbo::QuadraticFinalStateCostRiccati::getNonIntegralStateTermDimension
int getNonIntegralStateTermDimension(int k) const override
Definition: final_state_cost.h:140
corbo::BaseQuadraticFinalStateCost::Ptr
std::shared_ptr< BaseQuadraticFinalStateCost > Ptr
Definition: final_state_cost.h:85
corbo::StagePreprocessor::Ptr
std::shared_ptr< StagePreprocessor > Ptr
Definition: stage_preprocessor.h:66
corbo::QuadraticFinalStateCost::getInstance
FinalStageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
Definition: final_state_cost.h:78
system_dynamics_interface.h
corbo::QuadraticFinalStateCostRiccati::_steady_state_x
Eigen::VectorXd _steady_state_x
Definition: final_state_cost.h:181
corbo::ReferenceTrajectoryInterface
Interface class for reference trajectories.
Definition: reference_trajectory.h:82
corbo::QuadraticFinalStateCost::computeNonIntegralStateTerm
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: final_state_cost.cpp:94
corbo
Definition: communication/include/corbo-communication/utilities.h:37
FACTORY_REGISTER_FINAL_STAGE_COST
#define FACTORY_REGISTER_FINAL_STAGE_COST(type)
Definition: stage_functions.h:222
corbo::QuadraticFinalStateCostRiccati::computeNonIntegralStateTerm
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: final_state_cost.cpp:354
corbo::QuadraticFinalStateCostRiccati::_steady_state_u
Eigen::VectorXd _steady_state_u
Definition: final_state_cost.h:182
corbo::QuadraticFinalStateCost::_Qf_diag
Eigen::DiagonalMatrix< double, -1 > _Qf_diag
Definition: final_state_cost.h:115
corbo::QuadraticFinalStateCost::setWeightQf
bool setWeightQf(const Eigen::Ref< const Eigen::MatrixXd > &Qf)
Definition: final_state_cost.cpp:61
corbo::QuadraticFinalStateCostRiccati::computeWeightQfSqrt
bool computeWeightQfSqrt()
Definition: final_state_cost.cpp:341
corbo::QuadraticFinalStateCostRiccati::checkParameters
bool checkParameters(int state_dim, int control_dim, std::stringstream *issues) const override
Definition: final_state_cost.cpp:370
corbo::BaseQuadraticFinalStateCost::getWeightQf
virtual const Eigen::MatrixXd & getWeightQf() const =0
corbo::ReferenceTrajectoryInterface::isZero
virtual bool isZero() const
Definition: reference_trajectory.h:118
corbo::QuadraticFinalStateCostRiccati::_dynamics
SystemDynamicsInterface::Ptr _dynamics
Definition: final_state_cost.h:180
corbo::QuadraticFinalStateCostRiccati::_are_solved_before
bool _are_solved_before
Definition: final_state_cost.h:184
corbo::QuadraticFinalStateCost::_lsq_form
bool _lsq_form
Definition: final_state_cost.h:118
corbo::QuadraticFinalStateCostRiccati::_Q
Eigen::MatrixXd _Q
Definition: final_state_cost.h:173
corbo::QuadraticFinalStateCost::getWeightQf
const Eigen::MatrixXd & getWeightQf() const override
Definition: final_state_cost.h:86
corbo::QuadraticFinalStateCost::getNonIntegralStateTermDimension
int getNonIntegralStateTermDimension(int k) const override
Definition: final_state_cost.h:80
corbo::QuadraticFinalStateCost::_diagonal_mode_intentionally
bool _diagonal_mode_intentionally
Definition: final_state_cost.h:117
corbo::StageFunction::update
virtual bool update(int n, double t, ReferenceTrajectoryInterface &xref, ReferenceTrajectoryInterface &uref, ReferenceTrajectoryInterface *sref, bool single_dt, const Eigen::VectorXd &x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector< double > &dts, const DiscretizationGridInterface *grid)
Definition: stage_functions.h:101
corbo::QuadraticFinalStateCostRiccati::_lsq_form
bool _lsq_form
Definition: final_state_cost.h:183
corbo::QuadraticFinalStateCost::_diagonal_mode
bool _diagonal_mode
Definition: final_state_cost.h:116
corbo::QuadraticFinalStateCost
Definition: final_state_cost.h:69
corbo::QuadraticFinalStateCost::_Qf_sqrt
Eigen::MatrixXd _Qf_sqrt
Definition: final_state_cost.h:112
corbo::QuadraticFinalStateCost::_x_ref
const ReferenceTrajectoryInterface * _x_ref
Definition: final_state_cost.h:120
corbo::QuadraticFinalStateCostRiccati::_R
Eigen::MatrixXd _R
Definition: final_state_cost.h:174
stage_functions.h
corbo::QuadraticFinalStateCost::_Qf_diag_sqrt
Eigen::DiagonalMatrix< double, -1 > _Qf_diag_sqrt
Definition: final_state_cost.h:114
corbo::QuadraticFinalStateCost::_zero_x_ref
bool _zero_x_ref
Definition: final_state_cost.h:121
corbo::SystemDynamicsInterface::Ptr
std::shared_ptr< SystemDynamicsInterface > Ptr
Definition: system_dynamics_interface.h:91
corbo::QuadraticFinalStateCostRiccati::getWeightQf
const Eigen::MatrixXd & getWeightQf() const override
Definition: final_state_cost.h:155
corbo::QuadraticFinalStateCost::checkParameters
bool checkParameters(int state_dim, int control_dim, std::stringstream *issues) const override
Definition: final_state_cost.cpp:136
corbo::QuadraticFinalStateCost::setLsqForm
void setLsqForm(bool lsq_form)
Definition: final_state_cost.h:88
Eigen::Ref
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:192
corbo::QuadraticFinalStateCostRiccati::_zero_x_ref
bool _zero_x_ref
Definition: final_state_cost.h:187
corbo::QuadraticFinalStateCost::update
bool update(int n, double t, ReferenceTrajectoryInterface &xref, ReferenceTrajectoryInterface &uref, ReferenceTrajectoryInterface *sref, bool single_dt, const Eigen::VectorXd &x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector< double > &dts, const DiscretizationGridInterface *grid) override
Definition: final_state_cost.h:92
corbo::QuadraticFinalStateCostRiccati::setWeightQ
bool setWeightQ(const Eigen::Ref< const Eigen::MatrixXd > &Q)
Definition: final_state_cost.cpp:230
corbo::QuadraticFinalStateCostRiccati::_x_ref
const ReferenceTrajectoryInterface * _x_ref
Definition: final_state_cost.h:186
corbo::QuadraticFinalStateCostRiccati::_Q_diagonal_mode_intentionally
bool _Q_diagonal_mode_intentionally
Definition: final_state_cost.h:175
corbo::QuadraticFinalStateCostRiccati::QuadraticFinalStateCostRiccati
QuadraticFinalStateCostRiccati()
Definition: final_state_cost.h:128
corbo::QuadraticFinalStateCost::_Qf
Eigen::MatrixXd _Qf
Definition: final_state_cost.h:113
corbo::QuadraticFinalStateCostRiccati::setLsqForm
void setLsqForm(bool lsq_form)
Definition: final_state_cost.h:153
corbo::BaseQuadraticFinalStateCost::ConstPtr
std::shared_ptr< const BaseQuadraticFinalStateCost > ConstPtr
Definition: final_state_cost.h:86
quadratic_state_cost.h
corbo::FinalStageCost::Ptr
std::shared_ptr< FinalStageCost > Ptr
Definition: stage_functions.h:175
corbo::BaseQuadraticFinalStateCost
Definition: final_state_cost.h:60
n
PlainMatrixType mat * n
Definition: eigenvalues.cpp:41
reference_trajectory.h
corbo::QuadraticFinalStateCostRiccati::update
bool update(int n, double t, ReferenceTrajectoryInterface &xref, ReferenceTrajectoryInterface &uref, ReferenceTrajectoryInterface *sref, bool single_dt, const Eigen::VectorXd &x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector< double > &dts, const DiscretizationGridInterface *) override
Definition: final_state_cost.cpp:268
corbo::QuadraticFinalStateCost::isLsqFormNonIntegralStateTerm
bool isLsqFormNonIntegralStateTerm(int k) const override
Definition: final_state_cost.h:81
corbo::QuadraticFinalStateCostRiccati::getInstance
FinalStageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
Definition: final_state_cost.h:138
corbo::QuadraticFinalStateCostRiccati
Definition: final_state_cost.h:125
corbo::QuadraticFinalStateCostRiccati::setSystemDynamics
void setSystemDynamics(SystemDynamicsInterface::Ptr dynamics)
Definition: final_state_cost.h:142
corbo::QuadraticFinalStateCostRiccati::setWeightR
bool setWeightR(const Eigen::Ref< const Eigen::MatrixXd > &R)
Definition: final_state_cost.cpp:249
corbo::QuadraticFinalStateCostRiccati::_Qf
Eigen::MatrixXd _Qf
Definition: final_state_cost.h:179
corbo::QuadraticFinalStateCost::QuadraticFinalStateCost
QuadraticFinalStateCost()
Definition: final_state_cost.h:74
corbo::DiscretizationGridInterface
Generic interface class for discretization grids.
Definition: discretization_grid_interface.h:104


control_box_rst
Author(s): Christoph Rösmann
autogenerated on Wed Mar 2 2022 00:05:45