non_uniform_shooting_grid_base.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_STRUCTURED_OCP_DISCRETIZATION_GRIDS_NON_UNIFORM_SHOOTING_GRID_BASE_H_
26 #define SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_STRUCTURED_OCP_DISCRETIZATION_GRIDS_NON_UNIFORM_SHOOTING_GRID_BASE_H_
27 
29 
32 
34 
35 #include <memory>
36 
37 namespace corbo {
38 
39 class NonUniformShootingGridBase : public DiscretizationGridInterface
40 {
41  public:
42  using Ptr = std::shared_ptr<NonUniformShootingGridBase>;
43  using UPtr = std::unique_ptr<NonUniformShootingGridBase>;
44 
45  struct ShootingInterval
46  {
47  VectorVertex s;
48  std::vector<VectorVertex> u_seq;
49  std::vector<ScalarVertex> dt_seq;
50 
51  double getIntervalLength() const
52  {
53  assert(u_seq.size() == dt_seq.size());
54  double t = 0;
55  for (const ScalarVertex& dt : dt_seq) t += dt.value();
56  return t;
57  }
58 
60  };
61 
62  NonUniformShootingGridBase() = default;
63  virtual ~NonUniformShootingGridBase() = default;
64 
66  DiscretizationGridInterface::Ptr getInstance() const override = 0;
67 
68  GridUpdateResult update(const Eigen::VectorXd& x0, ReferenceTrajectoryInterface& xref, ReferenceTrajectoryInterface& uref, NlpFunctions& nlp_fun,
69  OptimizationEdgeSet& edges, SystemDynamicsInterface::Ptr dynamics, bool new_run, const Time& t,
70  ReferenceTrajectoryInterface* sref = nullptr, const Eigen::VectorXd* prev_u = nullptr, double prev_u_dt = 0,
71  ReferenceTrajectoryInterface* xinit = nullptr, ReferenceTrajectoryInterface* uinit = nullptr) override;
72 
73  double getFirstDt() const override { return !_intervals.empty() ? _intervals.front().dt_seq.front().value() : 0; }
74  double getFinalTime() const override;
75 
76  bool hasConstantControls() const override { return true; }
77  bool hasSingleDt() const override { return false; }
78  bool isTimeVariableGrid() const override { return !isDtFixedIntended(); }
79  bool isUniformGrid() const override { return false; }
80  bool providesStateTrajectory() const override { return true; }
81 
82  bool getFirstControlInput(Eigen::VectorXd& u0) override;
83 
84  void getStateAndControlTimeSeries(TimeSeries::Ptr x_sequence, TimeSeries::Ptr u_sequence, double t_max = CORBO_INF_DBL) const override;
85 
86  void clear() override;
87 
88  bool isEmpty() const override { return _intervals.empty(); }
89  bool isValid() const { return !_intervals.empty() && !_intervals.front().u_seq.empty(); }
90 
91  void setN(int n, bool try_resample = true) override
92  {
93  clear(); // resampling not yet implemented
94  setNRef(n);
95  }
96  void setInitialDt(double dt) override { setDtRef(dt); }
97  double getInitialDt() const override { return getDtRef(); }
98  int getInitialN() const override { return getNRef(); }
99 
100  int getNRef() const { return _n_ref; }
101  int getN() const override;
102  void setNumControlsPerShootingInterval(int num_u_per_interv) { _num_u_per_interv_ref = num_u_per_interv; }
103  void setNumControlsPerShootingInterval(int num_u_per_interv, bool intermediate_x_constraints)
104  {
105  setNumControlsPerShootingInterval(num_u_per_interv);
106  _intermediate_x_constraints = intermediate_x_constraints;
107  }
108  void setNRef(int n);
109  void setDtRef(double dt) { _dt_ref = dt; }
110  double getDtRef() const { return _dt_ref; }
111  void getDts(std::vector<double>& dts) const;
112  void setWarmStart(bool active) { _warm_start = active; }
114 
116 
118  {
119  _xf_fixed = xf_fixed;
120  setModified(true);
121  }
122 
123  // VertexSet methods
124  std::vector<VertexInterface*>& getActiveVertices() override { return _active_vertices; }
125  void getVertices(std::vector<VertexInterface*>& vertices) override;
126 
127 #ifdef MESSAGE_SUPPORT
128  void fromMessage(const messages::DiscretizationGrid& message, std::stringstream* issues) override {}
129  void toMessage(messages::DiscretizationGrid& message) const override {}
130 #endif
131 
132  protected:
133  void initializeSequences(const Eigen::VectorXd& x0, const Eigen::VectorXd& xf, ReferenceTrajectoryInterface& uref, NlpFunctions& nlp_fun);
134  void initializeSequences(const Eigen::VectorXd& x0, const Eigen::VectorXd& xf, ReferenceTrajectoryInterface& xref,
136  void warmStartShifting(const Eigen::VectorXd& x0);
137 
138  virtual bool adaptGrid(bool new_run, NlpFunctions& nlp_fun) { return false; } // A subclass might add a grid adaptation, returns true if adapted
139 
140  int findNearestShootingInterval(const Eigen::VectorXd& x0);
141 
142  void updateBounds(const NlpFunctions& nlp_fun);
143 
145 
146  virtual void createEdges(NlpFunctions& nlp_fun, OptimizationEdgeSet& edges, SystemDynamicsInterface::Ptr dynamics) = 0;
147 
148  virtual bool isDtFixedIntended() const { return true; }
149  virtual bool isMovingHorizonWarmStartActive() const { return _warm_start; }
150  virtual bool isGridAdaptActive() const { return false; }
151 
152  void computeActiveVertices() override;
153 
154  protected:
155  virtual bool isXfShootingNode() const { return true; }
156 
158 
159  std::vector<ShootingInterval> _intervals;
161  std::vector<VertexInterface*> _active_vertices;
162 
163  int _num_u_per_interv_ref = 1; // 1 -> full discretization
164  int _n_ref = 11;
165  int _n_adapt = 0; // if adaption is on and warmstart of, we might use this n instead of n_ref (only if n_adapt > 0)
166  double _dt_ref = 0.1;
167 
168  bool _warm_start = false;
169  bool _first_run = true;
170 
171  // might be required if the last dt should be fixed or if dt is not fixed
172  Eigen::Matrix<bool, -1, 1> _xf_fixed;
173  double _dt_lb = 0;
174  double _dt_ub = CORBO_INF_DBL;
175 
176  bool _full_discretization = true;
177  bool _intermediate_x_constraints = false;
178 };
179 
180 } // namespace corbo
181 
182 #endif // SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_STRUCTURED_OCP_DISCRETIZATION_GRIDS_NON_UNIFORM_SHOOTING_GRID_BASE_H_
corbo::NonUniformShootingGridBase::ShootingInterval::getIntervalLength
double getIntervalLength() const
Definition: non_uniform_shooting_grid_base.h:95
corbo::NonUniformShootingGridBase::_xf
PartiallyFixedVectorVertex _xf
Definition: non_uniform_shooting_grid_base.h:204
corbo::NonUniformShootingGridBase::_n_ref
int _n_ref
Definition: non_uniform_shooting_grid_base.h:208
corbo::NonUniformShootingGridBase::_dt_ref
double _dt_ref
Definition: non_uniform_shooting_grid_base.h:210
corbo::NonUniformShootingGridBase::isMovingHorizonWarmStartActive
virtual bool isMovingHorizonWarmStartActive() const
Definition: non_uniform_shooting_grid_base.h:193
corbo::NonUniformShootingGridBase::setXfFixed
void setXfFixed(const Eigen::Matrix< bool, -1, 1 > &xf_fixed)
Definition: non_uniform_shooting_grid_base.h:161
corbo::NonUniformShootingGridBase::isXfShootingNode
virtual bool isXfShootingNode() const
Definition: non_uniform_shooting_grid_base.h:199
corbo::NonUniformShootingGridBase::setDtRef
void setDtRef(double dt)
Definition: non_uniform_shooting_grid_base.h:153
corbo::NonUniformShootingGridBase::checkAndInitializeXfFixedFlags
bool checkAndInitializeXfFixedFlags(int dim_x)
Definition: non_uniform_shooting_grid_base.cpp:479
corbo::NonUniformShootingGridBase::setNumControlsPerShootingInterval
void setNumControlsPerShootingInterval(int num_u_per_interv)
Definition: non_uniform_shooting_grid_base.h:146
corbo::NonUniformShootingGridBase::update
GridUpdateResult update(const Eigen::VectorXd &x0, ReferenceTrajectoryInterface &xref, ReferenceTrajectoryInterface &uref, NlpFunctions &nlp_fun, OptimizationEdgeSet &edges, SystemDynamicsInterface::Ptr dynamics, bool new_run, const Time &t, ReferenceTrajectoryInterface *sref=nullptr, const Eigen::VectorXd *prev_u=nullptr, double prev_u_dt=0, ReferenceTrajectoryInterface *xinit=nullptr, ReferenceTrajectoryInterface *uinit=nullptr) override
Definition: non_uniform_shooting_grid_base.cpp:59
corbo::ReferenceTrajectoryInterface
Interface class for reference trajectories.
Definition: reference_trajectory.h:82
corbo::NonUniformShootingGridBase::isValid
bool isValid() const
Definition: non_uniform_shooting_grid_base.h:133
corbo::NonUniformShootingGridBase::warmStartShifting
void warmStartShifting(const Eigen::VectorXd &x0)
Definition: non_uniform_shooting_grid_base.cpp:324
integrator_interface.h
corbo
Definition: communication/include/corbo-communication/utilities.h:37
corbo::NumericalIntegratorExplicitInterface::Ptr
std::shared_ptr< NumericalIntegratorExplicitInterface > Ptr
Definition: integrator_interface.h:205
corbo::NonUniformShootingGridBase::getDts
void getDts(std::vector< double > &dts) const
Definition: non_uniform_shooting_grid_base.cpp:470
corbo::NonUniformShootingGridBase::setInitialDt
void setInitialDt(double dt) override
Definition: non_uniform_shooting_grid_base.h:140
corbo::NonUniformShootingGridBase::_intermediate_x_constraints
bool _intermediate_x_constraints
Definition: non_uniform_shooting_grid_base.h:221
corbo::NonUniformShootingGridBase::initializeSequences
void initializeSequences(const Eigen::VectorXd &x0, const Eigen::VectorXd &xf, ReferenceTrajectoryInterface &uref, NlpFunctions &nlp_fun)
Definition: non_uniform_shooting_grid_base.cpp:168
corbo::NlpFunctions
Definition: nlp_functions.h:58
corbo::NonUniformShootingGridBase::createEdges
virtual void createEdges(NlpFunctions &nlp_fun, OptimizationEdgeSet &edges, SystemDynamicsInterface::Ptr dynamics)=0
scalar_vertex.h
corbo::NonUniformShootingGridBase::ShootingInterval::s
VectorVertex s
Definition: non_uniform_shooting_grid_base.h:91
corbo::NonUniformShootingGridBase::setConsiderIntermediateStateConstraints
void setConsiderIntermediateStateConstraints(bool active)
Definition: non_uniform_shooting_grid_base.h:157
corbo::GridUpdateResult
Definition: discretization_grid_interface.h:74
corbo::NonUniformShootingGridBase::setN
void setN(int n, bool try_resample=true) override
Return dimension of the control input dimension in the grid.
Definition: non_uniform_shooting_grid_base.h:135
discretization_grid_interface.h
corbo::NonUniformShootingGridBase::getVertices
void getVertices(std::vector< VertexInterface * > &vertices) override
Definition: non_uniform_shooting_grid_base.cpp:540
corbo::CORBO_INF_DBL
constexpr const double CORBO_INF_DBL
Representation for infinity (double version)
Definition: core/include/corbo-core/types.h:75
vector_vertex.h
corbo::NonUniformShootingGridBase::getNRef
int getNRef() const
Definition: non_uniform_shooting_grid_base.h:144
corbo::NonUniformShootingGridBase::findNearestShootingInterval
int findNearestShootingInterval(const Eigen::VectorXd &x0)
Definition: non_uniform_shooting_grid_base.cpp:390
corbo::NonUniformShootingGridBase::_dt_lb
double _dt_lb
Definition: non_uniform_shooting_grid_base.h:217
corbo::NonUniformShootingGridBase::updateBounds
void updateBounds(const NlpFunctions &nlp_fun)
Definition: non_uniform_shooting_grid_base.cpp:494
corbo::NonUniformShootingGridBase::ShootingInterval::u_seq
std::vector< VectorVertex > u_seq
Definition: non_uniform_shooting_grid_base.h:92
corbo::NonUniformShootingGridBase::clear
void clear() override
Definition: non_uniform_shooting_grid_base.cpp:530
corbo::NonUniformShootingGridBase::Ptr
std::shared_ptr< NonUniformShootingGridBase > Ptr
Definition: non_uniform_shooting_grid_base.h:86
corbo::NonUniformShootingGridBase::getDtRef
double getDtRef() const
Definition: non_uniform_shooting_grid_base.h:154
corbo::NonUniformShootingGridBase::getStateAndControlTimeSeries
void getStateAndControlTimeSeries(TimeSeries::Ptr x_sequence, TimeSeries::Ptr u_sequence, double t_max=CORBO_INF_DBL) const override
Return state and control trajectory as time series object (shared instance)
Definition: non_uniform_shooting_grid_base.cpp:578
corbo::NonUniformShootingGridBase::isUniformGrid
bool isUniformGrid() const override
Definition: non_uniform_shooting_grid_base.h:123
corbo::NonUniformShootingGridBase::NonUniformShootingGridBase
NonUniformShootingGridBase()=default
corbo::NonUniformShootingGridBase::UPtr
std::unique_ptr< NonUniformShootingGridBase > UPtr
Definition: non_uniform_shooting_grid_base.h:87
corbo::DiscretizationGridInterface::Ptr
std::shared_ptr< DiscretizationGridInterface > Ptr
Definition: discretization_grid_interface.h:107
corbo::NonUniformShootingGridBase::setNumericalIntegrator
void setNumericalIntegrator(NumericalIntegratorExplicitInterface::Ptr integrator)
Definition: non_uniform_shooting_grid_base.h:159
corbo::NonUniformShootingGridBase::hasSingleDt
bool hasSingleDt() const override
Definition: non_uniform_shooting_grid_base.h:121
corbo::NonUniformShootingGridBase::ShootingInterval::dt_seq
std::vector< ScalarVertex > dt_seq
Definition: non_uniform_shooting_grid_base.h:93
corbo::NonUniformShootingGridBase::_active_vertices
std::vector< VertexInterface * > _active_vertices
Definition: non_uniform_shooting_grid_base.h:205
corbo::NonUniformShootingGridBase::_intervals
std::vector< ShootingInterval > _intervals
Definition: non_uniform_shooting_grid_base.h:203
corbo::NonUniformShootingGridBase::_xf_fixed
Eigen::Matrix< bool, -1, 1 > _xf_fixed
Definition: non_uniform_shooting_grid_base.h:216
corbo::NonUniformShootingGridBase::isGridAdaptActive
virtual bool isGridAdaptActive() const
Definition: non_uniform_shooting_grid_base.h:194
corbo::NonUniformShootingGridBase::getFirstDt
double getFirstDt() const override
Definition: non_uniform_shooting_grid_base.h:117
corbo::NonUniformShootingGridBase::isDtFixedIntended
virtual bool isDtFixedIntended() const
Definition: non_uniform_shooting_grid_base.h:192
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Definition: Memory.h:690
corbo::OptimizationEdgeSet
Definition: edge_set.h:96
corbo::SystemDynamicsInterface::Ptr
std::shared_ptr< SystemDynamicsInterface > Ptr
Definition: system_dynamics_interface.h:91
corbo::NonUniformShootingGridBase::_n_adapt
int _n_adapt
Definition: non_uniform_shooting_grid_base.h:209
corbo::NonUniformShootingGridBase::getActiveVertices
std::vector< VertexInterface * > & getActiveVertices() override
Definition: non_uniform_shooting_grid_base.h:168
corbo::NonUniformShootingGridBase::getInitialN
int getInitialN() const override
Definition: non_uniform_shooting_grid_base.h:142
corbo::NonUniformShootingGridBase::_warm_start
bool _warm_start
Definition: non_uniform_shooting_grid_base.h:212
corbo::NonUniformShootingGridBase::computeActiveVertices
void computeActiveVertices() override
Definition: non_uniform_shooting_grid_base.cpp:560
corbo::NonUniformShootingGridBase::setNRef
void setNRef(int n)
Definition: non_uniform_shooting_grid_base.cpp:456
corbo::NonUniformShootingGridBase::isEmpty
bool isEmpty() const override
Definition: non_uniform_shooting_grid_base.h:132
corbo::Time
Representation of time stamps.
Definition: time.h:273
corbo::NonUniformShootingGridBase::_first_run
bool _first_run
Definition: non_uniform_shooting_grid_base.h:213
corbo::NonUniformShootingGridBase::getFinalTime
double getFinalTime() const override
Definition: non_uniform_shooting_grid_base.cpp:427
corbo::NonUniformShootingGridBase::getN
int getN() const override
Definition: non_uniform_shooting_grid_base.cpp:445
corbo::NonUniformShootingGridBase::getInitialDt
double getInitialDt() const override
Definition: non_uniform_shooting_grid_base.h:141
Eigen::Matrix< bool, -1, 1 >
corbo::NonUniformShootingGridBase::_full_discretization
bool _full_discretization
Definition: non_uniform_shooting_grid_base.h:220
corbo::NonUniformShootingGridBase::getFirstControlInput
bool getFirstControlInput(Eigen::VectorXd &u0) override
Definition: non_uniform_shooting_grid_base.cpp:437
n
PlainMatrixType mat * n
Definition: eigenvalues.cpp:41
corbo::NonUniformShootingGridBase::_num_u_per_interv_ref
int _num_u_per_interv_ref
Definition: non_uniform_shooting_grid_base.h:207
corbo::NonUniformShootingGridBase::~NonUniformShootingGridBase
virtual ~NonUniformShootingGridBase()=default
corbo::TimeSeries::Ptr
std::shared_ptr< TimeSeries > Ptr
Definition: time_series.h:108
corbo::NonUniformShootingGridBase::_dt_ub
double _dt_ub
Definition: non_uniform_shooting_grid_base.h:218
corbo::NonUniformShootingGridBase::isTimeVariableGrid
bool isTimeVariableGrid() const override
Definition: non_uniform_shooting_grid_base.h:122
corbo::NonUniformShootingGridBase::adaptGrid
virtual bool adaptGrid(bool new_run, NlpFunctions &nlp_fun)
Definition: non_uniform_shooting_grid_base.h:182
corbo::NonUniformShootingGridBase::providesStateTrajectory
bool providesStateTrajectory() const override
Definition: non_uniform_shooting_grid_base.h:124
corbo::NonUniformShootingGridBase::setWarmStart
void setWarmStart(bool active)
Definition: non_uniform_shooting_grid_base.h:156
corbo::VertexSetInterface::setModified
void setModified(bool modified)
Definition: vertex_set.h:126
corbo::NonUniformShootingGridBase::hasConstantControls
bool hasConstantControls() const override
Definition: non_uniform_shooting_grid_base.h:120
corbo::NonUniformShootingGridBase::getInstance
DiscretizationGridInterface::Ptr getInstance() const override=0
Return a newly created shared instance of the implemented class.
corbo::PartiallyFixedVectorVertex
Vector based vertex with support for partially fixed components.
Definition: vector_vertex.h:298
corbo::NonUniformShootingGridBase::_integrator
NumericalIntegratorExplicitInterface::Ptr _integrator
Definition: non_uniform_shooting_grid_base.h:201


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