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_ 67 bool single_dt,
const Eigen::VectorXd& x0,
StagePreprocessor::Ptr stage_preprocessor,
const std::vector<double>& dts,
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;
110 if (changed)
return true;
112 if (
_gain_to > 1e-2 && prev_gain_to <= 1e-2)
116 if (_gain_to <= 1e-2 && prev_gain_to > 1e-2)
124 if (_gain_quadratic <= 1e-2 && prev_gain_quad > 1e-2)
152 #ifdef MESSAGE_SUPPORT 153 bool fromMessage(
const messages::StageCost& message, std::stringstream* issues)
override 157 const messages::MinTimeQuadraticGainScheduled& msg = message.min_time_quad_form_gain_scheduled();
159 success = success &&
_min_time.fromMessage(msg.minimum_time(), issues);
160 success = success &&
_quad_cost.fromMessage(msg.quadratic_form(), issues);
167 void toMessage(messages::StageCost& message)
const override 169 messages::MinTimeQuadraticGainScheduled* msg = message.mutable_min_time_quad_form_gain_scheduled();
171 _min_time.toMessage(*msg->mutable_minimum_time());
172 _quad_cost.toMessage(*msg->mutable_quadratic_form());
224 bool single_dt,
const Eigen::VectorXd& x0,
StagePreprocessor::Ptr stage_preprocessor,
const std::vector<double>& dts,
228 if (_only_last_n > 0)
230 quad_k_min =
std::max(n - _only_last_n, 0);
233 bool changed =
false;
234 if (quad_k_min != _quad_k_min)
237 _quad_k_min = quad_k_min;
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;
253 assert(k >= _quad_k_min);
259 assert(k >= _quad_k_min);
266 assert(k >= _quad_k_min);
270 #ifdef MESSAGE_SUPPORT 271 bool fromMessage(
const messages::StageCost& message, std::stringstream* issues)
override 275 const messages::MinTimeQuadratic& msg = message.min_time_quad_form();
277 success = success &&
_min_time.fromMessage(msg.minimum_time(), issues);
278 success = success &&
_quad_cost.fromMessage(msg.quadratic_form(), issues);
280 _only_last_n = msg.only_last_n();
285 void toMessage(messages::StageCost& message)
const override 287 messages::MinTimeQuadratic* msg = message.mutable_min_time_quad_form();
289 _min_time.toMessage(*msg->mutable_minimum_time());
290 _quad_cost.toMessage(*msg->mutable_quadratic_form());
292 msg->set_only_last_n(_only_last_n);
300 int _only_last_n = 0;
313 _quad_control_cost.setWeightR(R);
314 _quad_control_cost.setIntegralForm(integral_form);
315 _quad_control_cost.setLsqForm(lsq_form);
325 bool hasIntegralTerms(
int k)
const override {
return _quad_control_cost.hasIntegralTerms(k); }
331 return _quad_control_cost.getIntegralStateControlTermDimension(k);
338 bool single_dt,
const Eigen::VectorXd& x0,
StagePreprocessor::Ptr stage_preprocessor,
const std::vector<double>& dts,
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;
355 _quad_control_cost.computeNonIntegralControlTerm(k, u_k, cost);
361 _quad_control_cost.computeIntegralStateControlTerm(k, x_k, u_k, cost);
364 #ifdef MESSAGE_SUPPORT 365 bool fromMessage(
const messages::StageCost& message, std::stringstream* issues)
override 369 const messages::MinTimeQuadraticControls& msg = message.min_time_quad_controls();
371 success = success &&
_min_time.fromMessage(msg.minimum_time(), issues);
372 success = success && _quad_control_cost.fromMessage(msg.quadratic_controls(), issues);
377 void toMessage(messages::StageCost& message)
const override 379 messages::MinTimeQuadraticControls* msg = message.mutable_min_time_quad_controls();
381 _min_time.toMessage(*msg->mutable_minimum_time());
382 _quad_control_cost.toMessage(*msg->mutable_quadratic_controls());
399 _quad_state_cost.setWeightQ(Q);
400 _quad_state_cost.setIntegralForm(integral_form);
401 _quad_state_cost.setLsqForm(lsq_form);
411 bool hasIntegralTerms(
int k)
const override {
return _quad_state_cost.hasIntegralTerms(k); }
417 return _quad_state_cost.getIntegralStateControlTermDimension(k);
424 bool single_dt,
const Eigen::VectorXd& x0,
StagePreprocessor::Ptr stage_preprocessor,
const std::vector<double>& dts,
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;
441 _quad_state_cost.computeNonIntegralStateTerm(k, x_k, cost);
447 _quad_state_cost.computeIntegralStateControlTerm(k, x_k, u_k, cost);
450 #ifdef MESSAGE_SUPPORT 451 bool fromMessage(
const messages::StageCost& message, std::stringstream* issues)
override 455 const messages::MinTimeQuadraticStates& msg = message.min_time_quad_states();
457 success = success &&
_min_time.fromMessage(msg.minimum_time(), issues);
458 success = success && _quad_state_cost.fromMessage(msg.quadratic_states(), issues);
463 void toMessage(messages::StageCost& message)
const override 465 messages::MinTimeQuadraticStates* msg = message.mutable_min_time_quad_states();
467 _min_time.toMessage(*msg->mutable_minimum_time());
468 _quad_state_cost.toMessage(*msg->mutable_quadratic_states());
480 #endif // SRC_OPTIMAL_CONTROL_INCLUDE_CORBO_OPTIMAL_CONTROL_FUNCTIONS_HYBRID_COST_H_ bool hasIntegralTerms(int k) const override
bool hasNonIntegralTerms(int k) const override
MinTimeQuadraticStates(const Eigen::Ref< const Eigen::MatrixXd > &Q, bool integral_form, bool lsq_form=false)
int getNonIntegralDtTermDimension(int k) const override
bool isLsqFormNonIntegralStateTerm(int k) const override
bool hasNonIntegralTerms(int k) 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
MinTimeQuadraticControls(const Eigen::Ref< const Eigen::MatrixXd > &R, bool integral_form, bool lsq_form=false)
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
bool isLsqFormNonIntegralControlTerm(int k) const override
StageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
QuadraticStateCost _quad_state_cost
int getNonIntegralStateTermDimension(int k) const override
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
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
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
EIGEN_DEVICE_FUNC const TanhReturnType tanh() const
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
void computeNonIntegralControlTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &u_k, Eigen::Ref< Eigen::VectorXd > cost) const override
StageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
StageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
void computeNonIntegralControlTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &u_k, Eigen::Ref< Eigen::VectorXd > cost) const override
virtual const OutputVector & getReferenceCached(int k) const =0
int getNonIntegralControlTermDimension(int k) const override
int getNonIntegralDtTermDimension(int k) const override
int getNonIntegralDtTermDimension(int k) const override
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
#define FACTORY_REGISTER_STAGE_COST(type)
int getNonIntegralDtTermDimension(int k) const override
int getNonIntegralStateTermDimension(int k) const override
void computeNonIntegralDtTerm(int k, double dt, Eigen::Ref< Eigen::VectorXd > cost) const override
bool hasNonIntegralTerms(int k) const override
bool hasNonIntegralTerms(int k) 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
void computeNonIntegralStateTerm(int k, const Eigen::Ref< const Eigen::VectorXd > &x_k, Eigen::Ref< Eigen::VectorXd > cost) const override
bool isLsqFormNonIntegralStateTerm(int k) const override
void setCustomWeight(double weight)
bool isLsqFormNonIntegralDtTerm(int k) 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
MinTimeQuadraticGainScheduled()=default
bool isLsqFormNonIntegralDtTerm(int k) const override
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
A matrix or vector expression mapping an existing expression.
bool hasIntegralTerms(int k) const override
QuadraticFormCost _quad_cost
int getNonIntegralControlTermDimension(int k) const override
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
Interface class for reference trajectories.
int getNonIntegralControlTermDimension(int k) const override
bool hasIntegralTerms(int k) const override
MinTimeQuadratic(const Eigen::Ref< const Eigen::MatrixXd > &Q, const Eigen::Ref< const Eigen::MatrixXd > &R, bool integral_form, bool lsq_form=false)
StageCost::Ptr getInstance() const override
Return a newly created shared instance of the implemented class.
std::shared_ptr< StagePreprocessor > Ptr
bool isLsqFormNonIntegralControlTerm(int k) const override
std::shared_ptr< StageCost > Ptr
int getNonIntegralStateTermDimension(int k) const override
void setLsqForm(bool lsq_form)
QuadraticFormCost _quad_cost
int getIntegralStateControlTermDimension(int k) const override
bool hasIntegralTerms(int k) const override
bool isLsqFormNonIntegralStateTerm(int k) const override
bool isLsqFormNonIntegralControlTerm(int k) const override
int getNonIntegralDtTermDimension(int k) const override
int getIntegralStateControlTermDimension(int k) const override
QuadraticControlCost _quad_control_cost
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
bool hasNonIntegralTerms(int k) const override
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
int getIntegralStateControlTermDimension(int k) const override
bool isLsqFormNonIntegralDtTerm(int k) 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
bool isLsqFormNonIntegralDtTerm(int k) const override