hybrid_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_HYBRID_COST_H_
26 #define SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_FUNCTIONS_HYBRID_COST_H_
27 
32 
33 #include <algorithm>
34 #include <cmath>
35 #include <memory>
36 
37 namespace corbo {
38 
40 {
41  public:
43 
44  StageCost::Ptr getInstance() const override { return std::make_shared<MinTimeQuadraticGainScheduled>(); }
45 
46  bool hasNonIntegralTerms(int k) const override
47  {
49  }
50  bool hasIntegralTerms(int k) const override { return _gain_quadratic > 1e-2 && _quad_cost.hasIntegralTerms(k); }
51 
52  int getNonIntegralDtTermDimension(int k) const override { return _gain_to > 1e-2 ? _min_time.getNonIntegralDtTermDimension(k) : 0; }
54  int getNonIntegralControlTermDimension(int k) const override
55  {
57  }
58  int getIntegralStateControlTermDimension(int k) const override
59  {
61  }
62 
65 
67  bool single_dt, const Eigen::VectorXd& x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector<double>& dts,
68  const DiscretizationGridInterface* grid) override
69  {
70  double prev_gain_quad = _gain_quadratic;
71  double prev_gain_to = _gain_to;
72 
73  if (_gain_quadratic > 1e-2)
74  {
75  // revert scaling to reset default weights
76  // TODO(roesmann) maybe better backup the default matrices
79  }
80 
81  bool changed = false;
82 
83  if (_min_time.update(n, t, xref, uref, sref, single_dt, x0, stage_preprocessor, dts, grid)) changed = true;
84  if (_quad_cost.update(n, t, xref, uref, sref, single_dt, x0, stage_preprocessor, dts, grid)) changed = true;
85 
86  // compute distance to goal
87  Eigen::VectorXd xd = xref.getReferenceCached(n) - x0;
88  double dist = xd.transpose() * _quad_cost.getWeightQ() * xd; // TODO(roesmann): use qf?
89 
90  // calculate the tan hyperbolica to approximate a sigmoid function
91  // shift the tanh by "3" in order to align it approx. at the origin, such that f(0)=0;
92  double aux = 0.5 * std::tanh(_gamma * dist - 3);
93 
94  _gain_to = aux + 0.5; // normalize to [0,1]
95  _gain_quadratic = -aux + 0.5; // normalize to [0,1]
96 
97  if (_gain_quadratic > 1e-2)
98  {
99  // consider as active
102  }
103 
104  // update time-optimal weight
105  if (single_dt)
106  _min_time.setCustomWeight((double)(n - 1) * _gain_to);
107  else
108  _min_time.setCustomWeight(_gain_to); // default weight is 1
109 
110  if (changed) return true;
111 
112  if (_gain_to > 1e-2 && prev_gain_to <= 1e-2)
113  {
114  return true;
115  }
116  if (_gain_to <= 1e-2 && prev_gain_to > 1e-2)
117  {
118  return true;
119  }
120  if (_gain_quadratic > 1e-2 && prev_gain_quad <= 1e-2)
121  {
122  return true;
123  }
124  if (_gain_quadratic <= 1e-2 && prev_gain_quad > 1e-2)
125  {
126  return true;
127  }
128  return false;
129  }
130 
131  void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref<Eigen::VectorXd> cost) const override
132  {
133  _min_time.computeNonIntegralDtTerm(k, dt, cost);
134  }
135 
137  {
139  }
140 
142  {
144  }
145 
147  Eigen::Ref<Eigen::VectorXd> cost) const override
148  {
149  _quad_cost.computeIntegralStateControlTerm(k, x_k, u_k, cost);
150  }
151 
152 #ifdef MESSAGE_SUPPORT
153  bool fromMessage(const messages::StageCost& message, std::stringstream* issues) override
154  {
155  bool success = true;
156 
157  const messages::MinTimeQuadraticGainScheduled& msg = message.min_time_quad_form_gain_scheduled();
158 
159  success = success && _min_time.fromMessage(msg.minimum_time(), issues);
160  success = success && _quad_cost.fromMessage(msg.quadratic_form(), issues);
161 
162  _gamma = msg.scale();
163 
164  return success;
165  }
166 
167  void toMessage(messages::StageCost& message) const override
168  {
169  messages::MinTimeQuadraticGainScheduled* msg = message.mutable_min_time_quad_form_gain_scheduled();
170 
171  _min_time.toMessage(*msg->mutable_minimum_time());
172  _quad_cost.toMessage(*msg->mutable_quadratic_form());
173 
174  msg->set_scale(_gamma);
175  }
176 #endif
177 
178  protected:
181 
182  double _gamma = 0.1;
183 
184  double _gain_to = 1;
185  double _gain_quadratic = 0;
186 };
188 
190 {
191  public:
192  MinTimeQuadratic() = default;
193 
194  MinTimeQuadratic(const Eigen::Ref<const Eigen::MatrixXd>& Q, const Eigen::Ref<const Eigen::MatrixXd>& R, bool integral_form, bool lsq_form = false)
195  {
198  _quad_cost.setIntegralForm(integral_form);
199  _quad_cost.setLsqForm(lsq_form);
200  _min_time.setLsqForm(lsq_form);
201  }
202 
203  StageCost::Ptr getInstance() const override { return std::make_shared<MinTimeQuadratic>(); }
204 
205  bool hasNonIntegralTerms(int k) const override
206  {
207  return (k >= _quad_k_min && _quad_cost.hasNonIntegralTerms(k)) || _min_time.hasNonIntegralTerms(k);
208  }
209  bool hasIntegralTerms(int k) const override { return k >= _quad_k_min && _quad_cost.hasIntegralTerms(k); }
210 
212  int getNonIntegralStateTermDimension(int k) const override { return k >= _quad_k_min ? _quad_cost.getNonIntegralStateTermDimension(k) : 0; }
213  int getNonIntegralControlTermDimension(int k) const override { return k >= _quad_k_min ? _quad_cost.getNonIntegralControlTermDimension(k) : 0; }
214  int getIntegralStateControlTermDimension(int k) const override
215  {
216  return k >= _quad_k_min ? _quad_cost.getIntegralStateControlTermDimension(k) : 0;
217  }
218 
219  bool isLsqFormNonIntegralDtTerm(int k) const override { return _min_time.isLsqFormNonIntegralDtTerm(k); }
222 
224  bool single_dt, const Eigen::VectorXd& x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector<double>& dts,
225  const DiscretizationGridInterface* grid) override
226  {
227  int quad_k_min = 0;
228  if (_only_last_n > 0)
229  {
230  quad_k_min = std::max(n - _only_last_n, 0); // TODO(roesmann) or plus 1
231  }
232 
233  bool changed = false;
234  if (quad_k_min != _quad_k_min)
235  {
236  changed = true;
237  _quad_k_min = quad_k_min;
238  }
239 
240  if (_min_time.update(n, t, xref, uref, sref, single_dt, x0, stage_preprocessor, dts, grid)) changed = true;
241  if (_quad_cost.update(n, t, xref, uref, sref, single_dt, x0, stage_preprocessor, dts, grid)) changed = true;
242 
243  return changed;
244  }
245 
246  void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref<Eigen::VectorXd> cost) const override
247  {
248  _min_time.computeNonIntegralDtTerm(k, dt, cost);
249  }
250 
252  {
253  assert(k >= _quad_k_min);
255  }
256 
258  {
259  assert(k >= _quad_k_min);
261  }
262 
264  Eigen::Ref<Eigen::VectorXd> cost) const override
265  {
266  assert(k >= _quad_k_min);
267  _quad_cost.computeIntegralStateControlTerm(k, x_k, u_k, cost);
268  }
269 
270 #ifdef MESSAGE_SUPPORT
271  bool fromMessage(const messages::StageCost& message, std::stringstream* issues) override
272  {
273  bool success = true;
274 
275  const messages::MinTimeQuadratic& msg = message.min_time_quad_form();
276 
277  success = success && _min_time.fromMessage(msg.minimum_time(), issues);
278  success = success && _quad_cost.fromMessage(msg.quadratic_form(), issues);
279 
280  _only_last_n = msg.only_last_n();
281 
282  return success;
283  }
284 
285  void toMessage(messages::StageCost& message) const override
286  {
287  messages::MinTimeQuadratic* msg = message.mutable_min_time_quad_form();
288 
289  _min_time.toMessage(*msg->mutable_minimum_time());
290  _quad_cost.toMessage(*msg->mutable_quadratic_form());
291 
292  msg->set_only_last_n(_only_last_n);
293  }
294 #endif
295 
296  protected:
299 
300  int _only_last_n = 0;
301 
302  int _quad_k_min = 0;
303 };
305 
307 {
308  public:
309  MinTimeQuadraticControls() = default;
310 
311  MinTimeQuadraticControls(const Eigen::Ref<const Eigen::MatrixXd>& R, bool integral_form, bool lsq_form = false)
312  {
313  _quad_control_cost.setWeightR(R);
314  _quad_control_cost.setIntegralForm(integral_form);
315  _quad_control_cost.setLsqForm(lsq_form);
316  _min_time.setLsqForm(lsq_form);
317  }
318 
319  StageCost::Ptr getInstance() const override { return std::make_shared<MinTimeQuadraticControls>(); }
320 
321  bool hasNonIntegralTerms(int k) const override
322  {
323  return _quad_control_cost.hasNonIntegralTerms(k) || _min_time.hasNonIntegralTerms(k);
324  }
325  bool hasIntegralTerms(int k) const override { return _quad_control_cost.hasIntegralTerms(k); }
326 
328  int getNonIntegralControlTermDimension(int k) const override { return _quad_control_cost.getNonIntegralControlTermDimension(k); }
329  int getIntegralStateControlTermDimension(int k) const override
330  {
331  return _quad_control_cost.getIntegralStateControlTermDimension(k);
332  }
333 
334  bool isLsqFormNonIntegralDtTerm(int k) const override { return _min_time.isLsqFormNonIntegralDtTerm(k); }
335  bool isLsqFormNonIntegralControlTerm(int k) const override { return _quad_control_cost.isLsqFormNonIntegralControlTerm(k); }
336 
338  bool single_dt, const Eigen::VectorXd& x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector<double>& dts,
339  const DiscretizationGridInterface* grid) override
340  {
341  bool changed = false;
342  if (_min_time.update(n, t, xref, uref, sref, single_dt, x0, stage_preprocessor, dts, grid)) changed = true;
343  if (_quad_control_cost.update(n, t, xref, uref, sref, single_dt, x0, stage_preprocessor, dts, grid)) changed = true;
344 
345  return changed;
346  }
347 
348  void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref<Eigen::VectorXd> cost) const override
349  {
350  _min_time.computeNonIntegralDtTerm(k, dt, cost);
351  }
352 
354  {
355  _quad_control_cost.computeNonIntegralControlTerm(k, u_k, cost);
356  }
357 
359  Eigen::Ref<Eigen::VectorXd> cost) const override
360  {
361  _quad_control_cost.computeIntegralStateControlTerm(k, x_k, u_k, cost);
362  }
363 
364 #ifdef MESSAGE_SUPPORT
365  bool fromMessage(const messages::StageCost& message, std::stringstream* issues) override
366  {
367  bool success = true;
368 
369  const messages::MinTimeQuadraticControls& msg = message.min_time_quad_controls();
370 
371  success = success && _min_time.fromMessage(msg.minimum_time(), issues);
372  success = success && _quad_control_cost.fromMessage(msg.quadratic_controls(), issues);
373 
374  return success;
375  }
376 
377  void toMessage(messages::StageCost& message) const override
378  {
379  messages::MinTimeQuadraticControls* msg = message.mutable_min_time_quad_controls();
380 
381  _min_time.toMessage(*msg->mutable_minimum_time());
382  _quad_control_cost.toMessage(*msg->mutable_quadratic_controls());
383  }
384 #endif
385 
386  protected:
389 };
391 
393 {
394  public:
395  MinTimeQuadraticStates() = default;
396 
397  MinTimeQuadraticStates(const Eigen::Ref<const Eigen::MatrixXd>& Q, bool integral_form, bool lsq_form = false)
398  {
399  _quad_state_cost.setWeightQ(Q);
400  _quad_state_cost.setIntegralForm(integral_form);
401  _quad_state_cost.setLsqForm(lsq_form);
402  _min_time.setLsqForm(lsq_form);
403  }
404 
405  StageCost::Ptr getInstance() const override { return std::make_shared<MinTimeQuadraticStates>(); }
406 
407  bool hasNonIntegralTerms(int k) const override
408  {
409  return _quad_state_cost.hasNonIntegralTerms(k) || _min_time.hasNonIntegralTerms(k);
410  }
411  bool hasIntegralTerms(int k) const override { return _quad_state_cost.hasIntegralTerms(k); }
412 
414  int getNonIntegralStateTermDimension(int k) const override { return _quad_state_cost.getNonIntegralStateTermDimension(k); }
415  int getIntegralStateControlTermDimension(int k) const override
416  {
417  return _quad_state_cost.getIntegralStateControlTermDimension(k);
418  }
419 
420  bool isLsqFormNonIntegralDtTerm(int k) const override { return _min_time.isLsqFormNonIntegralDtTerm(k); }
421  bool isLsqFormNonIntegralStateTerm(int k) const override { return _quad_state_cost.isLsqFormNonIntegralStateTerm(k); }
422 
424  bool single_dt, const Eigen::VectorXd& x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector<double>& dts,
425  const DiscretizationGridInterface* grid) override
426  {
427  bool changed = false;
428  if (_min_time.update(n, t, xref, uref, sref, single_dt, x0, stage_preprocessor, dts, grid)) changed = true;
429  if (_quad_state_cost.update(n, t, xref, uref, sref, single_dt, x0, stage_preprocessor, dts, grid)) changed = true;
430 
431  return changed;
432  }
433 
434  void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref<Eigen::VectorXd> cost) const override
435  {
436  _min_time.computeNonIntegralDtTerm(k, dt, cost);
437  }
438 
440  {
441  _quad_state_cost.computeNonIntegralStateTerm(k, x_k, cost);
442  }
443 
445  Eigen::Ref<Eigen::VectorXd> cost) const override
446  {
447  _quad_state_cost.computeIntegralStateControlTerm(k, x_k, u_k, cost);
448  }
449 
450 #ifdef MESSAGE_SUPPORT
451  bool fromMessage(const messages::StageCost& message, std::stringstream* issues) override
452  {
453  bool success = true;
454 
455  const messages::MinTimeQuadraticStates& msg = message.min_time_quad_states();
456 
457  success = success && _min_time.fromMessage(msg.minimum_time(), issues);
458  success = success && _quad_state_cost.fromMessage(msg.quadratic_states(), issues);
459 
460  return success;
461  }
462 
463  void toMessage(messages::StageCost& message) const override
464  {
465  messages::MinTimeQuadraticStates* msg = message.mutable_min_time_quad_states();
466 
467  _min_time.toMessage(*msg->mutable_minimum_time());
468  _quad_state_cost.toMessage(*msg->mutable_quadratic_states());
469  }
470 #endif
471 
472  protected:
475 };
477 
478 } // namespace corbo
479 
480 #endif // SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_FUNCTIONS_HYBRID_COST_H_
bool hasIntegralTerms(int k) const override
Definition: hybrid_cost.h:411
bool hasNonIntegralTerms(int k) const override
Definition: hybrid_cost.h:46
MinTimeQuadraticStates(const Eigen::Ref< const Eigen::MatrixXd > &Q, bool integral_form, bool lsq_form=false)
Definition: hybrid_cost.h:397
int getNonIntegralDtTermDimension(int k) const override
Definition: hybrid_cost.h:327
bool isLsqFormNonIntegralStateTerm(int k) const override
Definition: hybrid_cost.h:421
bool hasNonIntegralTerms(int k) const override
Definition: hybrid_cost.h:321
#define max(a, b)
Definition: datatypes.h:20
void computeNonIntegralControlTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &u_k, Eigen::Ref< Eigen::VectorXd > cost) const override
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: hybrid_cost.h:66
MinTimeQuadraticControls(const Eigen::Ref< const Eigen::MatrixXd > &R, bool integral_form, bool lsq_form=false)
Definition: hybrid_cost.h:311
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: hybrid_cost.h:444
bool hasNonIntegralTerms(int k) const override
bool isLsqFormNonIntegralControlTerm(int k) const override
Definition: hybrid_cost.h:335
StageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
Definition: hybrid_cost.h:405
QuadraticStateCost _quad_state_cost
Definition: hybrid_cost.h:474
int getNonIntegralStateTermDimension(int k) const override
Definition: hybrid_cost.h:53
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
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:434
Generic interface class for discretization grids.
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: hybrid_cost.h:263
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:439
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:131
EIGEN_DEVICE_FUNC const TanhReturnType tanh() const
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:246
void computeNonIntegralControlTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &u_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:141
StageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
Definition: hybrid_cost.h:44
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:348
bool setWeightR(const Eigen::Ref< const Eigen::MatrixXd > &R)
const Eigen::MatrixXd & getWeightQ() const
int getNonIntegralControlTermDimension(int k) const override
StageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
Definition: hybrid_cost.h:319
void computeNonIntegralControlTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &u_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:257
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
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
virtual const OutputVector & getReferenceCached(int k) const =0
int getNonIntegralControlTermDimension(int k) const override
Definition: hybrid_cost.h:54
int getNonIntegralDtTermDimension(int k) const override
Definition: minimum_time.h:49
bool hasIntegralTerms(int k) const override
int getNonIntegralDtTermDimension(int k) const override
Definition: hybrid_cost.h:413
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:251
#define FACTORY_REGISTER_STAGE_COST(type)
int getNonIntegralDtTermDimension(int k) const override
Definition: hybrid_cost.h:52
int getNonIntegralStateTermDimension(int k) const override
Definition: hybrid_cost.h:414
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: minimum_time.h:70
bool hasNonIntegralTerms(int k) const override
Definition: hybrid_cost.h:407
bool hasNonIntegralTerms(int k) const override
Definition: minimum_time.h:46
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: hybrid_cost.h:337
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:136
bool isLsqFormNonIntegralStateTerm(int k) const override
Definition: hybrid_cost.h:220
void setCustomWeight(double weight)
Definition: minimum_time.h:80
bool isLsqFormNonIntegralDtTerm(int k) const override
Definition: minimum_time.h:50
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: hybrid_cost.h:423
bool isLsqFormNonIntegralDtTerm(int k) const override
Definition: hybrid_cost.h:334
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: hybrid_cost.h:146
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:192
bool hasIntegralTerms(int k) const override
Definition: hybrid_cost.h:325
int getNonIntegralControlTermDimension(int k) const override
Definition: hybrid_cost.h:328
bool update(int n, double, ReferenceTrajectoryInterface &, ReferenceTrajectoryInterface &, ReferenceTrajectoryInterface *, bool single_dt, const Eigen::VectorXd &x0, StagePreprocessor::Ptr stage_preprocessor, const std::vector< double > &dts, const DiscretizationGridInterface *) override
Definition: minimum_time.h:52
int getNonIntegralStateTermDimension(int k) const override
Interface class for reference trajectories.
bool setWeightQ(const Eigen::Ref< const Eigen::MatrixXd > &Q)
bool isLsqFormNonIntegralControlTerm(int k) const override
int getNonIntegralControlTermDimension(int k) const override
Definition: hybrid_cost.h:213
bool hasIntegralTerms(int k) const override
Definition: hybrid_cost.h:50
MinTimeQuadratic(const Eigen::Ref< const Eigen::MatrixXd > &Q, const Eigen::Ref< const Eigen::MatrixXd > &R, bool integral_form, bool lsq_form=false)
Definition: hybrid_cost.h:194
StageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
Definition: hybrid_cost.h:203
std::shared_ptr< StagePreprocessor > Ptr
bool isLsqFormNonIntegralControlTerm(int k) const override
Definition: hybrid_cost.h:221
std::shared_ptr< StageCost > Ptr
int getNonIntegralStateTermDimension(int k) const override
Definition: hybrid_cost.h:212
void setLsqForm(bool lsq_form)
Definition: minimum_time.h:87
QuadraticFormCost _quad_cost
Definition: hybrid_cost.h:298
int getIntegralStateControlTermDimension(int k) const override
Definition: hybrid_cost.h:415
bool hasIntegralTerms(int k) const override
Definition: hybrid_cost.h:209
bool isLsqFormNonIntegralStateTerm(int k) const override
Definition: hybrid_cost.h:63
bool isLsqFormNonIntegralControlTerm(int k) const override
Definition: hybrid_cost.h:64
int getNonIntegralDtTermDimension(int k) const override
Definition: hybrid_cost.h:211
void scaleCurrentWeightQ(double scale)
PlainMatrixType mat * n
Definition: eigenvalues.cpp:41
void setIntegralForm(bool integral_form)
int getIntegralStateControlTermDimension(int k) const override
Definition: hybrid_cost.h:329
QuadraticControlCost _quad_control_cost
Definition: hybrid_cost.h:388
bool isLsqFormNonIntegralStateTerm(int k) const override
int getIntegralStateControlTermDimension(int k) const override
Definition: hybrid_cost.h:214
void setLsqForm(bool lsq_form)
void scaleCurrentWeightR(double scale)
int getIntegralStateControlTermDimension(int k) const override
void computeNonIntegralControlTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &u_k, Eigen::Ref< Eigen::VectorXd > cost) const override
Definition: hybrid_cost.h:353
bool hasNonIntegralTerms(int k) const override
Definition: hybrid_cost.h:205
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: hybrid_cost.h:358
int getIntegralStateControlTermDimension(int k) const override
Definition: hybrid_cost.h:58
bool isLsqFormNonIntegralDtTerm(int k) const override
Definition: hybrid_cost.h:219
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: hybrid_cost.h:223
bool isLsqFormNonIntegralDtTerm(int k) const override
Definition: hybrid_cost.h:420


control_box_rst
Author(s): Christoph Rösmann
autogenerated on Mon Feb 28 2022 22:06:54