full_discretization_grid_base_se2.h
Go to the documentation of this file.
1 /*********************************************************************
2  *
3  * Software License Agreement
4  *
5  * Copyright (c) 2020, Christoph Rösmann, All rights reserved.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <https://www.gnu.org/licenses/>.
19  *
20  * Authors: Christoph Rösmann
21  *********************************************************************/
22 
23 #ifndef FULL_DISCRETIZATION_GRID_BASE_H_
24 #define FULL_DISCRETIZATION_GRID_BASE_H_
25 
27 
31 
33 
35 
36 #include <memory>
37 
38 namespace mpc_local_planner {
39 
64 class FullDiscretizationGridBaseSE2 : public corbo::DiscretizationGridInterface
65 {
66  public:
67  using Ptr = std::shared_ptr<FullDiscretizationGridBaseSE2>;
68  using UPtr = std::unique_ptr<FullDiscretizationGridBaseSE2>;
78 
80 
82  virtual ~FullDiscretizationGridBaseSE2() = default;
83 
86 
87  // implements interface method
89  NlpFunctions& nlp_fun, OptimizationEdgeSet& edges, SystemDynamicsInterface::Ptr dynamics, bool new_run,
90  const corbo::Time& t, ReferenceTrajectoryInterface* sref = nullptr, const Eigen::VectorXd* prev_u = nullptr,
91  double prev_u_dt = 0, ReferenceTrajectoryInterface* xinit = nullptr,
92  ReferenceTrajectoryInterface* uinit = nullptr) override;
93 
94  // implements interface method
95  double getFirstDt() const override { return getDt(); }
96  // implements interface method
97  double getFinalTime() const override { return double(getN() - 1) * getDt(); }
98 
99  // implements interface method
100  bool hasConstantControls() const override { return true; }
101  // implements interface method
102  bool hasSingleDt() const override { return true; }
103  // implements interface method
104  bool isTimeVariableGrid() const override { return !isDtFixedIntended(); }
105  // implements interface method
106  bool isUniformGrid() const override { return true; }
107  // implements interface method
108  bool providesStateTrajectory() const override { return true; }
109  // implements interface method
110  bool getFirstControlInput(Eigen::VectorXd& u0) override;
111 
113  const Eigen::VectorXd& getState(int k) const
114  {
115  assert(k <= getN());
116  if (k == _x_seq.size()) return _xf.values();
117  return _x_seq[k].values();
118  }
119 
120  // implements interface method
121  void getStateAndControlTimeSeries(TimeSeries::Ptr x_sequence, TimeSeries::Ptr u_sequence, double t_max = corbo::CORBO_INF_DBL) const override;
122 
123  // implements interface method
124  void clear() override;
125 
126  // implements interface method
127  bool isEmpty() const override { return _x_seq.empty() || _u_seq.empty(); }
128  // implements interface method
129  virtual bool isValid() const { return (_x_seq.size() == _u_seq.size()); }
130 
131  // implements interface method
132  void setN(int n, bool try_resample = true) override;
133  // implements interface method
134  void setInitialDt(double dt) override { setDtRef(dt); }
135  // implements interface method
136  double getInitialDt() const override { return getDtRef(); }
137  // implements interface method
138  int getInitialN() const override { return getNRef(); }
139 
141  int getNRef() const { return _n_ref; }
143  int getN() const override { return _x_seq.size() + 1; }
145  void setNRef(int n);
147  void setDtRef(double dt) { _dt_ref = dt; }
149  double getDtRef() const { return _dt_ref; }
151  double getDt() const { return _dt.value(); }
153  void setWarmStart(bool active) { _warm_start = active; }
155  void setXfFixed(const Eigen::Matrix<bool, -1, 1>& xf_fixed)
156  {
157  _xf_fixed = xf_fixed;
158  setModified(true);
159  }
160 
164  void setCostIntegrationRule(CostIntegrationRule integration) { _cost_integration = integration; }
165 
175  int findClosestPose(double x_ref, double y_ref, int start_idx = 0, double* distance = nullptr) const;
176 
177  // implements interface method
178  std::vector<VertexInterface*>& getActiveVertices() override { return _active_vertices; }
179  // implements interface method
180  void getVertices(std::vector<VertexInterface*>& vertices) override;
181 
182  protected:
183  virtual void initializeSequences(const Eigen::VectorXd& x0, const Eigen::VectorXd& xf, ReferenceTrajectoryInterface& uref, NlpFunctions& nlp_fun);
184  virtual void initializeSequences(const Eigen::VectorXd& x0, const Eigen::VectorXd& xf, ReferenceTrajectoryInterface& xref,
186  virtual void warmStartShifting(const Eigen::VectorXd& x0);
187 
188  virtual bool adaptGrid(bool new_run, NlpFunctions& nlp_fun) { return false; } // A subclass might add a grid adaptation, returns true if adapted
189 
190  int findNearestState(const Eigen::VectorXd& x0);
191 
192  void updateBounds(const NlpFunctions& nlp_fun);
193 
194  virtual void resampleTrajectory(int n_new);
195 
196  bool checkAndInitializeXfFixedFlags(int dim_x);
197 
198  virtual void createEdges(NlpFunctions& nlp_fun, OptimizationEdgeSet& edges, SystemDynamicsInterface::Ptr dynamics) = 0;
199 
200  virtual bool isDtFixedIntended() const { return true; }
201  virtual bool isMovingHorizonWarmStartActive() const { return _warm_start; }
202  virtual bool isGridAdaptActive() const { return false; }
203 
204  void computeActiveVertices() override;
205 
206  corbo::FiniteDifferencesCollocationInterface::Ptr _fd_eval = std::make_shared<corbo::CrankNicolsonDiffCollocation>();
207 
208  std::vector<VectorVertexSE2> _x_seq;
209  std::vector<VectorVertex> _u_seq;
211  std::vector<VertexInterface*> _active_vertices;
212 
213  const NlpFunctions* _nlp_fun = nullptr; // cache -> for bounds
214 
215  int _n_ref = 11;
216  int _n_adapt = 0; // if adaption is on and warmstart off, we might use this n instead of n_ref (only if n_adapt > 0)
217  double _dt_ref = 0.1;
218  ScalarVertex _dt; // we need a ScalarVertex to use the helper methods in stage_functions.cpp
219  bool _warm_start = false;
220  bool _first_run = true;
221 
222  // might be required if the last dt should be fixed or if dt is not fixed
223  Eigen::Matrix<bool, -1, 1> _xf_fixed;
224  double _dt_lb = 0;
225  double _dt_ub = corbo::CORBO_INF_DBL;
226 
228 };
229 
230 } // namespace mpc_local_planner
231 
232 #endif // FULL_DISCRETIZATION_GRID_BASE_H_
mpc_local_planner::FullDiscretizationGridBaseSE2::UPtr
std::unique_ptr< FullDiscretizationGridBaseSE2 > UPtr
Definition: full_discretization_grid_base_se2.h:108
mpc_local_planner::FullDiscretizationGridBaseSE2::getDtRef
double getDtRef() const
get current reference temporal resolution
Definition: full_discretization_grid_base_se2.h:189
mpc_local_planner::FullDiscretizationGridBaseSE2::updateBounds
void updateBounds(const NlpFunctions &nlp_fun)
Definition: full_discretization_grid_base_se2.cpp:425
mpc_local_planner::FullDiscretizationGridBaseSE2::resampleTrajectory
virtual void resampleTrajectory(int n_new)
Definition: full_discretization_grid_base_se2.cpp:460
mpc_local_planner::FullDiscretizationGridBaseSE2::getInstance
corbo::DiscretizationGridInterface::Ptr getInstance() const override=0
Return a newly created shared instance of the implemented class.
corbo::SystemDynamicsInterface
mpc_local_planner::FullDiscretizationGridBaseSE2::getNRef
int getNRef() const
get reference horizon length
Definition: full_discretization_grid_base_se2.h:181
mpc_local_planner::FullDiscretizationGridBaseSE2::getFinalTime
double getFinalTime() const override
Definition: full_discretization_grid_base_se2.h:137
vector_vertex_se2.h
corbo::ReferenceTrajectoryInterface
mpc_local_planner::FullDiscretizationGridBaseSE2::getFirstControlInput
bool getFirstControlInput(Eigen::VectorXd &u0) override
Definition: full_discretization_grid_base_se2.cpp:361
mpc_local_planner::FullDiscretizationGridBaseSE2::setWarmStart
void setWarmStart(bool active)
activate or deactive warmstart
Definition: full_discretization_grid_base_se2.h:193
mpc_local_planner::FullDiscretizationGridBaseSE2::findClosestPose
int findClosestPose(double x_ref, double y_ref, int start_idx=0, double *distance=nullptr) const
Find the closest pose (first part of the state vector) on the grid w.r.t. to a provided reference poi...
Definition: full_discretization_grid_base_se2.cpp:384
mpc_local_planner::FullDiscretizationGridBaseSE2::createEdges
virtual void createEdges(NlpFunctions &nlp_fun, OptimizationEdgeSet &edges, SystemDynamicsInterface::Ptr dynamics)=0
mpc_local_planner::FullDiscretizationGridBaseSE2::OptimizationEdgeSet
corbo::OptimizationEdgeSet OptimizationEdgeSet
Definition: full_discretization_grid_base_se2.h:112
corbo::NlpFunctions
mpc_local_planner::FullDiscretizationGridBaseSE2::getInitialN
int getInitialN() const override
Definition: full_discretization_grid_base_se2.h:178
vector_vertex.h
mpc_local_planner::FullDiscretizationGridBaseSE2::_u_seq
std::vector< VectorVertex > _u_seq
Definition: full_discretization_grid_base_se2.h:249
mpc_local_planner::FullDiscretizationGridBaseSE2::isEmpty
bool isEmpty() const override
Definition: full_discretization_grid_base_se2.h:167
mpc_local_planner::FullDiscretizationGridBaseSE2::_dt_lb
double _dt_lb
Definition: full_discretization_grid_base_se2.h:264
mpc_local_planner::FullDiscretizationGridBaseSE2::isTimeVariableGrid
bool isTimeVariableGrid() const override
Definition: full_discretization_grid_base_se2.h:144
mpc_local_planner::FullDiscretizationGridBaseSE2::NlpFunctions
corbo::NlpFunctions NlpFunctions
Definition: full_discretization_grid_base_se2.h:111
corbo::GridUpdateResult
discretization_grid_interface.h
mpc_local_planner::FullDiscretizationGridBaseSE2::CostIntegrationRule::TrapezoidalRule
@ TrapezoidalRule
mpc_local_planner::FullDiscretizationGridBaseSE2::hasConstantControls
bool hasConstantControls() const override
Definition: full_discretization_grid_base_se2.h:140
corbo::CORBO_INF_DBL
constexpr const double CORBO_INF_DBL
mpc_local_planner::FullDiscretizationGridBaseSE2::_active_vertices
std::vector< VertexInterface * > _active_vertices
Definition: full_discretization_grid_base_se2.h:251
mpc_local_planner::FullDiscretizationGridBaseSE2::clear
void clear() override
Definition: full_discretization_grid_base_se2.cpp:546
mpc_local_planner::FullDiscretizationGridBaseSE2::_dt_ub
double _dt_ub
Definition: full_discretization_grid_base_se2.h:265
mpc_local_planner::FullDiscretizationGridBaseSE2::findNearestState
int findNearestState(const Eigen::VectorXd &x0)
Definition: full_discretization_grid_base_se2.cpp:324
corbo::VertexInterface
mpc_local_planner
Definition: controller.h:44
mpc_local_planner::FullDiscretizationGridBaseSE2::~FullDiscretizationGridBaseSE2
virtual ~FullDiscretizationGridBaseSE2()=default
mpc_local_planner::FullDiscretizationGridBaseSE2::adaptGrid
virtual bool adaptGrid(bool new_run, NlpFunctions &nlp_fun)
Definition: full_discretization_grid_base_se2.h:228
mpc_local_planner::FullDiscretizationGridBaseSE2::FullDiscretizationGridBaseSE2
FullDiscretizationGridBaseSE2()=default
corbo::DiscretizationGridInterface::Ptr
std::shared_ptr< DiscretizationGridInterface > Ptr
corbo::VectorVertex::values
Eigen::VectorXd & values()
mpc_local_planner::FullDiscretizationGridBaseSE2::VertexInterface
corbo::VertexInterface VertexInterface
Definition: full_discretization_grid_base_se2.h:113
finite_differences_collocation.h
mpc_local_planner::FullDiscretizationGridBaseSE2::_xf
PartiallyFixedVectorVertexSE2 _xf
Definition: full_discretization_grid_base_se2.h:250
mpc_local_planner::FullDiscretizationGridBaseSE2::_dt
ScalarVertex _dt
Definition: full_discretization_grid_base_se2.h:258
mpc_local_planner::FullDiscretizationGridBaseSE2::isUniformGrid
bool isUniformGrid() const override
Definition: full_discretization_grid_base_se2.h:146
mpc_local_planner::FullDiscretizationGridBaseSE2::providesStateTrajectory
bool providesStateTrajectory() const override
Definition: full_discretization_grid_base_se2.h:148
mpc_local_planner::FullDiscretizationGridBaseSE2::setDtRef
void setDtRef(double dt)
set reference temporal resolution
Definition: full_discretization_grid_base_se2.h:187
mpc_local_planner::FullDiscretizationGridBaseSE2::_cost_integration
CostIntegrationRule _cost_integration
Definition: full_discretization_grid_base_se2.h:267
mpc_local_planner::FullDiscretizationGridBaseSE2::isGridAdaptActive
virtual bool isGridAdaptActive() const
Definition: full_discretization_grid_base_se2.h:242
mpc_local_planner::FullDiscretizationGridBaseSE2::ScalarVertex
corbo::ScalarVertex ScalarVertex
Definition: full_discretization_grid_base_se2.h:114
mpc_local_planner::FullDiscretizationGridBaseSE2::checkAndInitializeXfFixedFlags
bool checkAndInitializeXfFixedFlags(int dim_x)
Definition: full_discretization_grid_base_se2.cpp:410
mpc_local_planner::FullDiscretizationGridBaseSE2::PartiallyFixedVectorVertex
corbo::PartiallyFixedVectorVertex PartiallyFixedVectorVertex
Definition: full_discretization_grid_base_se2.h:116
mpc_local_planner::FullDiscretizationGridBaseSE2::setNRef
void setNRef(int n)
set reference horizon length
Definition: full_discretization_grid_base_se2.cpp:370
mpc_local_planner::FullDiscretizationGridBaseSE2::TimeSeries
corbo::TimeSeries TimeSeries
Definition: full_discretization_grid_base_se2.h:117
mpc_local_planner::FullDiscretizationGridBaseSE2::_n_adapt
int _n_adapt
Definition: full_discretization_grid_base_se2.h:256
mpc_local_planner::FullDiscretizationGridBaseSE2::ReferenceTrajectoryInterface
corbo::ReferenceTrajectoryInterface ReferenceTrajectoryInterface
Definition: full_discretization_grid_base_se2.h:109
mpc_local_planner::FullDiscretizationGridBaseSE2::setN
void setN(int n, bool try_resample=true) override
Definition: full_discretization_grid_base_se2.cpp:558
mpc_local_planner::FullDiscretizationGridBaseSE2::_dt_ref
double _dt_ref
Definition: full_discretization_grid_base_se2.h:257
pose_se2.h
mpc_local_planner::PartiallyFixedVectorVertexSE2
VectorVertexSE2 with support for partially fixed components.
Definition: vector_vertex_se2.h:158
corbo::OptimizationEdgeSet
corbo::SystemDynamicsInterface::Ptr
std::shared_ptr< SystemDynamicsInterface > Ptr
mpc_local_planner::FullDiscretizationGridBaseSE2::update
corbo::GridUpdateResult update(const Eigen::VectorXd &x0, ReferenceTrajectoryInterface &xref, ReferenceTrajectoryInterface &uref, NlpFunctions &nlp_fun, OptimizationEdgeSet &edges, SystemDynamicsInterface::Ptr dynamics, bool new_run, const corbo::Time &t, ReferenceTrajectoryInterface *sref=nullptr, const Eigen::VectorXd *prev_u=nullptr, double prev_u_dt=0, ReferenceTrajectoryInterface *xinit=nullptr, ReferenceTrajectoryInterface *uinit=nullptr) override
Definition: full_discretization_grid_base_se2.cpp:58
mpc_local_planner::FullDiscretizationGridBaseSE2::_xf_fixed
Eigen::Matrix< bool, -1, 1 > _xf_fixed
Definition: full_discretization_grid_base_se2.h:263
mpc_local_planner::FullDiscretizationGridBaseSE2::_first_run
bool _first_run
Definition: full_discretization_grid_base_se2.h:260
mpc_local_planner::FullDiscretizationGridBaseSE2::_nlp_fun
const NlpFunctions * _nlp_fun
Definition: full_discretization_grid_base_se2.h:253
mpc_local_planner::FullDiscretizationGridBaseSE2::getState
const Eigen::VectorXd & getState(int k) const
Return state at time stamp k.
Definition: full_discretization_grid_base_se2.h:153
corbo::FiniteDifferencesCollocationInterface::Ptr
std::shared_ptr< FiniteDifferencesCollocationInterface > Ptr
mpc_local_planner::FullDiscretizationGridBaseSE2::getInitialDt
double getInitialDt() const override
Definition: full_discretization_grid_base_se2.h:176
corbo::TimeSeries
mpc_local_planner::FullDiscretizationGridBaseSE2::warmStartShifting
virtual void warmStartShifting(const Eigen::VectorXd &x0)
Definition: full_discretization_grid_base_se2.cpp:261
mpc_local_planner::FullDiscretizationGridBaseSE2::_warm_start
bool _warm_start
Definition: full_discretization_grid_base_se2.h:259
mpc_local_planner::FullDiscretizationGridBaseSE2::initializeSequences
virtual void initializeSequences(const Eigen::VectorXd &x0, const Eigen::VectorXd &xf, ReferenceTrajectoryInterface &uref, NlpFunctions &nlp_fun)
Definition: full_discretization_grid_base_se2.cpp:156
mpc_local_planner::FullDiscretizationGridBaseSE2::_fd_eval
corbo::FiniteDifferencesCollocationInterface::Ptr _fd_eval
Definition: full_discretization_grid_base_se2.h:246
mpc_local_planner::FullDiscretizationGridBaseSE2::VectorVertex
corbo::VectorVertex VectorVertex
Definition: full_discretization_grid_base_se2.h:115
mpc_local_planner::FullDiscretizationGridBaseSE2::getVertices
void getVertices(std::vector< VertexInterface * > &vertices) override
Definition: full_discretization_grid_base_se2.cpp:571
mpc_local_planner::FullDiscretizationGridBaseSE2::getFirstDt
double getFirstDt() const override
Definition: full_discretization_grid_base_se2.h:135
mpc_local_planner::FullDiscretizationGridBaseSE2::getN
int getN() const override
get current horizon length
Definition: full_discretization_grid_base_se2.h:183
corbo::Time
mpc_local_planner::FullDiscretizationGridBaseSE2::setCostIntegrationRule
void setCostIntegrationRule(CostIntegrationRule integration)
Set cost integration rule.
Definition: full_discretization_grid_base_se2.h:204
mpc_local_planner::FullDiscretizationGridBaseSE2::SystemDynamicsInterface
corbo::SystemDynamicsInterface SystemDynamicsInterface
Definition: full_discretization_grid_base_se2.h:110
mpc_local_planner::FullDiscretizationGridBaseSE2::_x_seq
std::vector< VectorVertexSE2 > _x_seq
Definition: full_discretization_grid_base_se2.h:248
mpc_local_planner::FullDiscretizationGridBaseSE2::getStateAndControlTimeSeries
void getStateAndControlTimeSeries(TimeSeries::Ptr x_sequence, TimeSeries::Ptr u_sequence, double t_max=corbo::CORBO_INF_DBL) const override
Definition: full_discretization_grid_base_se2.cpp:599
corbo::ScalarVertex
mpc_local_planner::FullDiscretizationGridBaseSE2::isDtFixedIntended
virtual bool isDtFixedIntended() const
Definition: full_discretization_grid_base_se2.h:240
mpc_local_planner::FullDiscretizationGridBaseSE2::_n_ref
int _n_ref
Definition: full_discretization_grid_base_se2.h:255
mpc_local_planner::FullDiscretizationGridBaseSE2::isMovingHorizonWarmStartActive
virtual bool isMovingHorizonWarmStartActive() const
Definition: full_discretization_grid_base_se2.h:241
mpc_local_planner::FullDiscretizationGridBaseSE2::Ptr
std::shared_ptr< FullDiscretizationGridBaseSE2 > Ptr
Definition: full_discretization_grid_base_se2.h:107
Eigen::Matrix< bool, -1, 1 >
mpc_local_planner::FullDiscretizationGridBaseSE2::getActiveVertices
std::vector< VertexInterface * > & getActiveVertices() override
Definition: full_discretization_grid_base_se2.h:218
mpc_local_planner::FullDiscretizationGridBaseSE2::CostIntegrationRule::LeftSum
@ LeftSum
mpc_local_planner::FullDiscretizationGridBaseSE2::computeActiveVertices
void computeActiveVertices() override
Definition: full_discretization_grid_base_se2.cpp:584
scalar_vertex.h
corbo::VectorVertex
mpc_local_planner::FullDiscretizationGridBaseSE2::setXfFixed
void setXfFixed(const Eigen::Matrix< bool, -1, 1 > &xf_fixed)
Set individual components of the final state to fixed or unfixed.
Definition: full_discretization_grid_base_se2.h:195
corbo::TimeSeries::Ptr
std::shared_ptr< TimeSeries > Ptr
mpc_local_planner::FullDiscretizationGridBaseSE2::getDt
double getDt() const
get current temporal resolution
Definition: full_discretization_grid_base_se2.h:191
mpc_local_planner::FullDiscretizationGridBaseSE2::hasSingleDt
bool hasSingleDt() const override
Definition: full_discretization_grid_base_se2.h:142
mpc_local_planner::FullDiscretizationGridBaseSE2::CostIntegrationRule
CostIntegrationRule
Definition: full_discretization_grid_base_se2.h:119
mpc_local_planner::FullDiscretizationGridBaseSE2::isValid
virtual bool isValid() const
Definition: full_discretization_grid_base_se2.h:169
mpc_local_planner::FullDiscretizationGridBaseSE2::setFiniteDifferencesCollocationMethod
void setFiniteDifferencesCollocationMethod(corbo::FiniteDifferencesCollocationInterface::Ptr fd_eval)
Set finite differences collocation method.
Definition: full_discretization_grid_base_se2.h:202
corbo::VertexSetInterface::setModified
void setModified(bool modified)
mpc_local_planner::FullDiscretizationGridBaseSE2::setInitialDt
void setInitialDt(double dt) override
Definition: full_discretization_grid_base_se2.h:174
corbo::PartiallyFixedVectorVertex
corbo::ScalarVertex::value
double & value()
corbo::DiscretizationGridInterface


mpc_local_planner
Author(s): Christoph Rösmann
autogenerated on Wed Mar 2 2022 00:35:06