quadratic_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_QUADRATIC_COST_H_
26 #define SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_FUNCTIONS_QUADRATIC_COST_H_
27 
30 
31 #include <memory>
32 
33 namespace corbo {
34 
35 class QuadraticFormCost : public StageCost
36 {
37  public:
38  using Ptr = std::shared_ptr<QuadraticFormCost>;
39 
41  {
42  _Q_sqrt = Eigen::MatrixXd::Constant(1, 1, 1);
43  _R_sqrt = Eigen::MatrixXd::Constant(1, 1, 1);
44  }
45 
46  QuadraticFormCost(const Eigen::Ref<const Eigen::MatrixXd>& Q, const Eigen::Ref<const Eigen::MatrixXd>& R, bool integral_form = false,
47  bool lsq_form = false)
48  : _integral_form(integral_form), _lsq_form(lsq_form)
49  {
50  setWeightQ(Q);
51  setWeightR(R);
52  }
53 
54  StageCost::Ptr getInstance() const override { return std::make_shared<QuadraticFormCost>(); }
55 
56  bool hasNonIntegralTerms(int k) const override { return !_integral_form; }
57  bool hasIntegralTerms(int k) const override { return _integral_form; }
58 
59  int getNonIntegralStateTermDimension(int k) const override { return !_integral_form ? (_lsq_form ? _Q.rows() : 1) : 0; }
60  int getNonIntegralControlTermDimension(int k) const override { return !_integral_form ? (_lsq_form ? _R.rows() : 1) : 0; }
61  int getIntegralStateControlTermDimension(int k) const override { return _integral_form ? 1 : 0; }
62 
63  bool isLsqFormNonIntegralStateTerm(int k) const override { return !_integral_form && _lsq_form; }
64  bool isLsqFormNonIntegralControlTerm(int k) const override { return !_integral_form && _lsq_form; }
65 
70 
71  void setLsqForm(bool lsq_form) { _lsq_form = lsq_form; }
72  void setIntegralForm(bool integral_form) { _integral_form = integral_form; }
73 
75 
77 
79  Eigen::Ref<Eigen::VectorXd> cost) const override;
80 
81  bool update(int n, double t, ReferenceTrajectoryInterface& xref, ReferenceTrajectoryInterface& uref, ReferenceTrajectoryInterface* sref,
82  bool single_dt, const Eigen::VectorXd& x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector<double>& dts,
83  const DiscretizationGridInterface* /*grid*/) override
84  {
85  _x_ref = &xref;
86  _u_ref = &uref;
87 
90 
91  return false;
92  }
93 
94  bool checkParameters(int state_dim, int control_dim, std::stringstream* issues) const override;
95 
96  void scaleCurrentWeightQ(double scale);
97  void scaleCurrentWeightR(double scale);
98 
99  const Eigen::MatrixXd& getWeightQ() const { return _Q; }
100  const Eigen::MatrixXd& getWeightR() const { return _R; }
101 
102 #ifdef MESSAGE_SUPPORT
103  virtual bool fromMessage(const messages::QuadraticFormCost& message, std::stringstream* issues);
104  virtual void toMessage(messages::QuadraticFormCost& message) const;
105 
106  bool fromMessage(const messages::StageCost& message, std::stringstream* issues) override
107  {
108  return fromMessage(message.quadratic_form_cost(), issues);
109  }
110  void toMessage(messages::StageCost& message) const override { toMessage(*message.mutable_quadratic_form_cost()); }
111 #endif
112 
113  protected:
114  Eigen::MatrixXd _Q_sqrt;
115  Eigen::MatrixXd _R_sqrt;
116  Eigen::MatrixXd _Q;
117  Eigen::MatrixXd _R;
120  Eigen::DiagonalMatrix<double, -1> _Q_diag;
121  Eigen::DiagonalMatrix<double, -1> _R_diag;
122  bool _Q_diagonal_mode = false;
123  bool _Q_diagonal_mode_intentionally = false;
124  bool _R_diagonal_mode = false;
126 
127  bool _lsq_form = true;
128  bool _integral_form = false;
129 
130  const ReferenceTrajectoryInterface* _x_ref = nullptr;
131  const ReferenceTrajectoryInterface* _u_ref = nullptr;
132  bool _zero_x_ref = false;
133  bool _zero_u_ref = false;
134 };
136 
137 } // namespace corbo
138 
139 #endif // SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_FUNCTIONS_QUADRATIC_COST_H_
corbo::QuadraticFormCost
Definition: quadratic_cost.h:57
corbo::QuadraticFormCost::_R_diag_sqrt
Eigen::DiagonalMatrix< double, -1 > _R_diag_sqrt
Definition: quadratic_cost.h:163
Eigen::DiagonalMatrix< double, -1 >
corbo::StagePreprocessor::Ptr
std::shared_ptr< StagePreprocessor > Ptr
Definition: stage_preprocessor.h:66
corbo::QuadraticFormCost::computeNonIntegralStateTerm
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: quadratic_cost.cpp:122
corbo::ReferenceTrajectoryInterface
Interface class for reference trajectories.
Definition: reference_trajectory.h:82
corbo
Definition: communication/include/corbo-communication/utilities.h:37
corbo::QuadraticFormCost::_R_sqrt
Eigen::MatrixXd _R_sqrt
Definition: quadratic_cost.h:159
corbo::QuadraticFormCost::getNonIntegralControlTermDimension
int getNonIntegralControlTermDimension(int k) const override
Definition: quadratic_cost.h:104
corbo::QuadraticFormCost::getNonIntegralStateTermDimension
int getNonIntegralStateTermDimension(int k) const override
Definition: quadratic_cost.h:103
corbo::QuadraticFormCost::scaleCurrentWeightR
void scaleCurrentWeightR(double scale)
Definition: quadratic_cost.cpp:308
corbo::QuadraticFormCost::QuadraticFormCost
QuadraticFormCost()
Definition: quadratic_cost.h:84
corbo::QuadraticFormCost::_R_diag
Eigen::DiagonalMatrix< double, -1 > _R_diag
Definition: quadratic_cost.h:165
corbo::QuadraticFormCost::Ptr
std::shared_ptr< QuadraticFormCost > Ptr
Definition: quadratic_cost.h:82
corbo::QuadraticFormCost::setWeightQ
bool setWeightQ(const Eigen::Ref< const Eigen::MatrixXd > &Q)
Definition: quadratic_cost.cpp:55
corbo::QuadraticFormCost::scaleCurrentWeightQ
void scaleCurrentWeightQ(double scale)
Definition: quadratic_cost.cpp:300
corbo::ReferenceTrajectoryInterface::isZero
virtual bool isZero() const
Definition: reference_trajectory.h:118
corbo::StageCost::Ptr
std::shared_ptr< StageCost > Ptr
Definition: stage_functions.h:155
corbo::QuadraticFormCost::computeIntegralStateControlTerm
void computeIntegralStateControlTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, const Eigen::Ref< const Eigen::VectorXd > &u_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: quadratic_cost.cpp:208
corbo::QuadraticFormCost::_Q
Eigen::MatrixXd _Q
Definition: quadratic_cost.h:160
corbo::QuadraticFormCost::setWeightR
bool setWeightR(const Eigen::Ref< const Eigen::MatrixXd > &R)
Definition: quadratic_cost.cpp:89
corbo::QuadraticFormCost::hasNonIntegralTerms
bool hasNonIntegralTerms(int k) const override
Definition: quadratic_cost.h:100
corbo::QuadraticFormCost::_integral_form
bool _integral_form
Definition: quadratic_cost.h:172
corbo::QuadraticFormCost::_R
Eigen::MatrixXd _R
Definition: quadratic_cost.h:161
corbo::QuadraticFormCost::computeNonIntegralControlTerm
void computeNonIntegralControlTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &u_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: quadratic_cost.cpp:165
corbo::QuadraticFormCost::_Q_diagonal_mode_intentionally
bool _Q_diagonal_mode_intentionally
Definition: quadratic_cost.h:167
corbo::QuadraticFormCost::setIntegralForm
void setIntegralForm(bool integral_form)
Definition: quadratic_cost.h:116
stage_functions.h
corbo::QuadraticFormCost::_R_diagonal_mode
bool _R_diagonal_mode
Definition: quadratic_cost.h:168
corbo::QuadraticFormCost::isLsqFormNonIntegralStateTerm
bool isLsqFormNonIntegralStateTerm(int k) const override
Definition: quadratic_cost.h:107
FACTORY_REGISTER_STAGE_COST
#define FACTORY_REGISTER_STAGE_COST(type)
Definition: stage_functions.h:170
corbo::QuadraticFormCost::_u_ref
const ReferenceTrajectoryInterface * _u_ref
Definition: quadratic_cost.h:175
corbo::QuadraticFormCost::_Q_diag
Eigen::DiagonalMatrix< double, -1 > _Q_diag
Definition: quadratic_cost.h:164
Eigen::Ref
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:192
corbo::QuadraticFormCost::getInstance
StageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
Definition: quadratic_cost.h:98
corbo::QuadraticFormCost::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: quadratic_cost.h:125
corbo::QuadraticFormCost::checkParameters
bool checkParameters(int state_dim, int control_dim, std::stringstream *issues) const override
Definition: quadratic_cost.cpp:248
corbo::QuadraticFormCost::_Q_diag_sqrt
Eigen::DiagonalMatrix< double, -1 > _Q_diag_sqrt
Definition: quadratic_cost.h:162
corbo::QuadraticFormCost::_lsq_form
bool _lsq_form
Definition: quadratic_cost.h:171
corbo::QuadraticFormCost::getIntegralStateControlTermDimension
int getIntegralStateControlTermDimension(int k) const override
Definition: quadratic_cost.h:105
corbo::QuadraticFormCost::hasIntegralTerms
bool hasIntegralTerms(int k) const override
Definition: quadratic_cost.h:101
corbo::QuadraticFormCost::_x_ref
const ReferenceTrajectoryInterface * _x_ref
Definition: quadratic_cost.h:174
corbo::QuadraticFormCost::_Q_diagonal_mode
bool _Q_diagonal_mode
Definition: quadratic_cost.h:166
n
PlainMatrixType mat * n
Definition: eigenvalues.cpp:41
reference_trajectory.h
corbo::QuadraticFormCost::getWeightQ
const Eigen::MatrixXd & getWeightQ() const
Definition: quadratic_cost.h:143
corbo::QuadraticFormCost::_Q_sqrt
Eigen::MatrixXd _Q_sqrt
Definition: quadratic_cost.h:158
corbo::QuadraticFormCost::getWeightR
const Eigen::MatrixXd & getWeightR() const
Definition: quadratic_cost.h:144
corbo::QuadraticFormCost::isLsqFormNonIntegralControlTerm
bool isLsqFormNonIntegralControlTerm(int k) const override
Definition: quadratic_cost.h:108
corbo::QuadraticFormCost::_R_diagonal_mode_intentionally
bool _R_diagonal_mode_intentionally
Definition: quadratic_cost.h:169
corbo::QuadraticFormCost::_zero_u_ref
bool _zero_u_ref
Definition: quadratic_cost.h:177
corbo::QuadraticFormCost::setLsqForm
void setLsqForm(bool lsq_form)
Definition: quadratic_cost.h:115
corbo::QuadraticFormCost::_zero_x_ref
bool _zero_x_ref
Definition: quadratic_cost.h:176
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:06:08