58 PRINT_ERROR(
"StructuredOptimalControlProblem::initialize(): no hyper-graph optimization problem strategy specified.");
63 PRINT_ERROR(
"StructuredOptimalControlProblem::initialize(): no solver specified or solver initialization failed.");
83 PRINT_ERROR(
"StructuredOptimalControlProblem::compute(): no discretization grid specified.");
89 PRINT_ERROR(
"StructuredOptimalControlProblem::compute(): no system dynamics model specified.");
94 PRINT_ERROR(
"StructuredOptimalControlProblem::compute(): no hyper-graph optimization strategy specified.");
99 PRINT_ERROR(
"StructuredOptimalControlProblem::compute(): no solver specified.");
104 PRINT_WARNING(
"StructuredOptimalControlProblem::compute(): no cost function specified.");
107 bool success =
false;
119 _grid->update(x, xref, uref,
_functions, *
_edges,
_dynamics, new_run, t, sref, &
_u_prev,
_u_prev_dt, xinit, uinit);
125 if (grid_udpate_result.
updated())
130 assert(
_optim_prob->getGraph().checkGraphConsistency());
139 PRINT_WARNING(
"infeasible solution found. Increasing n for next ocp iteration.");
158 if (!
_grid)
return false;
159 if (
_grid->getFirstControlInput(u0))
166 const Eigen::VectorXd& u_ub)
196 _grid->getStateAndControlTimeSeries(x_sequence, u_sequence);
213 #ifdef MESSAGE_SUPPORT 214 void StructuredOptimalControlProblem::toMessage(corbo::messages::OptimalControlProblem& message)
const 216 messages::StructuredOptimalControlProblem* msg = message.mutable_structured_optimal_control_problem();
221 if (
_grid)
_grid->toMessage(*msg->mutable_discretization_grid());
242 void StructuredOptimalControlProblem::fromMessage(
const corbo::messages::OptimalControlProblem& message, std::stringstream* issues)
252 const messages::StructuredOptimalControlProblem& msg = message.structured_optimal_control_problem();
255 if (!msg.has_system_model())
257 if (issues) *issues <<
"StructuredOptimalControlProblem: no system model specified.\n";
262 util::get_oneof_field_type_expand_isolated(msg.system_model(),
"system_dynamics", type,
false, 1);
267 dynamics->fromMessage(msg.system_model(), issues);
272 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown system model specified.\n";
275 int dim_x = dynamics->getStateDimension();
276 int dim_u = dynamics->getInputDimension();
279 if (!msg.has_discretization_grid())
281 if (issues) *issues <<
"StructuredOptimalControlProblem: no discretization grid specified.\n";
285 util::get_oneof_field_type(msg.discretization_grid(),
"discretization_grid", type,
false);
290 grid->fromMessage(msg.discretization_grid(), issues);
295 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown discretization grid specified.\n";
300 if (msg.has_stage_cost() && !msg.stage_cost().has_no_function())
303 util::get_oneof_field_type_expand_isolated(msg.stage_cost(),
"stage_cost", type,
false, 1);
308 if (!stage_cost->fromMessage(msg.stage_cost(), issues))
return;
309 if (!stage_cost->checkParameters(
_dynamics->getStateDimension(),
_dynamics->getInputDimension(), issues))
return;
314 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown stage_cost specified.\n";
322 if (msg.has_final_stage_cost() && !msg.final_stage_cost().has_no_function())
325 util::get_oneof_field_type_expand_isolated(msg.final_stage_cost(),
"final_stage_cost", type,
false, 1);
328 if (final_stage_cost)
330 if (!final_stage_cost->fromMessage(msg.final_stage_cost(), issues))
return;
331 if (!final_stage_cost->checkParameters(
_dynamics->getStateDimension(),
_dynamics->getInputDimension(), issues))
return;
336 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown final_stage_cost specified.\n";
344 if (msg.has_stage_equalities() && !msg.stage_equalities().has_no_function())
347 util::get_oneof_field_type_expand_isolated(msg.stage_equalities(),
"stage_equalities", type,
false, 1);
350 if (stage_equalities)
352 if (!stage_equalities->fromMessage(msg.stage_equalities(), issues))
return;
353 if (!stage_equalities->checkParameters(
_dynamics->getStateDimension(),
_dynamics->getInputDimension(), issues))
return;
359 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown stage_equalities specified.\n";
367 if (msg.has_stage_inequalities() && !msg.stage_inequalities().has_no_function())
370 util::get_oneof_field_type_expand_isolated(msg.stage_inequalities(),
"stage_inequalities", type,
false, 1);
373 if (stage_inequalities)
375 if (!stage_inequalities->fromMessage(msg.stage_inequalities(), issues))
return;
376 if (!stage_inequalities->checkParameters(
_dynamics->getStateDimension(),
_dynamics->getInputDimension(), issues))
return;
382 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown stage_inequalities specified.\n";
390 if (msg.has_final_stage_constraints() && !msg.final_stage_constraints().has_no_function())
393 util::get_oneof_field_type_expand_isolated(msg.final_stage_constraints(),
"final_stage_constraints", type,
false, 1);
396 if (final_stage_constraint)
398 if (!final_stage_constraint->fromMessage(msg.final_stage_constraints(), issues))
return;
406 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown final_stage_constraints specified.\n";
414 if (msg.has_stage_preprocessors() && !msg.stage_preprocessors().has_no_function())
417 util::get_oneof_field_type_expand_isolated(msg.stage_preprocessors(),
"stage_preprocessors", type,
false, 1);
421 if (stage_preprocessor)
423 if (!stage_preprocessor->fromMessage(msg.stage_preprocessors(), issues))
return;
428 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown stage_processors specified.\n";
437 Eigen::VectorXd x_lb, x_ub, u_lb, u_ub;
438 if (msg.x_min_size() > 0 && msg.x_min_size() != dim_x && issues)
440 *issues <<
"StructuredOptimalControlProblem: x_min size does not match dimension of the system dynamics object" << dim_x <<
".\n";
447 if (msg.x_max_size() > 0 && msg.x_max_size() != dim_x && issues)
449 *issues <<
"StructuredOptimalControlProblem: x_max size does not match dimension of the system dynamics object " << dim_x <<
".\n";
456 if (msg.u_min_size() > 0 && msg.u_min_size() != dim_u && issues)
458 *issues <<
"StructuredOptimalControlProblem: u_min size does not match dimension of the system dynamics object" << dim_u <<
".\n";
465 if (msg.u_max_size() > 0 && msg.u_max_size() != dim_u && issues)
467 *issues <<
"StructuredOptimalControlProblem: u_max size does not match dimension of the system dynamics object " << dim_u <<
".\n";
476 if (!msg.has_hyper_graph_strategy())
478 if (issues) *issues <<
"StructuredOptimalControlProblem: no hyper_graph_strategy specified.\n";
482 util::get_oneof_field_type(msg.hyper_graph_strategy(),
"hyper_graph_optimization_problem", type,
false);
487 optim_prob->fromMessage(msg.hyper_graph_strategy(), issues);
492 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown hyper_graph_strategy specified.\n";
497 if (!msg.has_nlp_solver())
499 if (issues) *issues <<
"StructuredOptimalControlProblem: no solver specified.\n";
503 util::get_oneof_field_type(msg.nlp_solver(),
"solver", type,
false);
508 solver->fromMessage(msg.nlp_solver(), issues);
513 if (issues) *issues <<
"StructuredOptimalControlProblem: unknown solver specified.\n";
#define PRINT_ERROR_NAMED(msg)
NlpSolverInterface::Ptr _solver
void setSystemDynamics(SystemDynamicsInterface::Ptr dynamics)
#define PRINT_WARNING(msg)
Print msg-stream.
static Time now()
Retrieve current system time.
OptimalControlProblemStatistics::Ptr _statistics
A matrix or vector expression mapping an existing array of data.
std::shared_ptr< BaseHyperGraphOptimizationProblem > Ptr
FinalStageConstraint::Ptr final_stage_constraints
void setHyperGraphOptimizationProblem(BaseHyperGraphOptimizationProblem::Ptr optim_prob)
Eigen::VectorXd ControlVector
StageCost::Ptr stage_cost
DiscretizationGridInterface::Ptr _grid
bool providesFutureStates() const override
Interface class for signal targets.
Representation of time stamps.
void setStageInequalityConstraint(StageInequalityConstraint::Ptr stage_ineq)
std::shared_ptr< StageEqualityConstraint > Ptr
std::shared_ptr< StageInequalityConstraint > Ptr
void getTimeSeries(TimeSeries::Ptr x_sequence, TimeSeries::Ptr u_sequence, double t_max=CORBO_INF_DBL) override
TimeSeries::Ptr _ts_x_cache
bool initialize() override
SystemDynamicsInterface::Ptr _dynamics
std::shared_ptr< FinalStageConstraint > Ptr
void setFinalStageConstraint(FinalStageConstraint::Ptr final_stage_constraint)
TimeSeries::Ptr _ts_u_cache
void setSolver(NlpSolverInterface::Ptr solver)
void setStageCost(StageCost::Ptr stage_cost)
void setBounds(const Eigen::VectorXd &x_lb, const Eigen::VectorXd &x_ub, const Eigen::VectorXd &u_lb, const Eigen::VectorXd &u_ub)
bool getFirstControlInput(ControlVector &u0) const override
FinalStageCost::Ptr final_stage_cost
void setDiscretizationGrid(DiscretizationGridInterface::Ptr grid)
static Factory & instance()
< Retrieve static instance of the factory
bool compute(const StateVector &x, ReferenceTrajectoryInterface &xref, ReferenceTrajectoryInterface &uref, ReferenceTrajectoryInterface *sref, const Time &t, bool new_run, SignalTargetInterface *signal_target=nullptr, ReferenceTrajectoryInterface *xinit=nullptr, ReferenceTrajectoryInterface *uinit=nullptr, const std::string &ns="") override
void setStageEqualityConstraint(StageEqualityConstraint::Ptr stage_eq)
bool providesFutureControls() const override
BaseHyperGraphOptimizationProblem::Ptr _optim_prob
bool _increase_n_if_infeas
void setStateBounds(const Eigen::VectorXd &x_lb, const Eigen::VectorXd &x_ub)
Interface class for reference trajectories.
std::shared_ptr< DiscretizationGridInterface > Ptr
Eigen::VectorXd StateVector
void setStagePreprocessor(StagePreprocessor::Ptr stage_preprocessor)
std::shared_ptr< NlpSolverInterface > Ptr
StructuredOptimalControlProblem()
std::shared_ptr< StagePreprocessor > Ptr
std::shared_ptr< StageCost > Ptr
OptimizationEdgeSet::Ptr _edges
StageInequalityConstraint::Ptr stage_inequalities
std::shared_ptr< TimeSeries > Ptr
std::shared_ptr< FinalStageCost > Ptr
std::shared_ptr< Derived > create(const std::string &name, bool print_error=true) const
Create a shared instance of the desired object.
StageEqualityConstraint::Ptr stage_equalities
StagePreprocessor::Ptr stage_preprocessor
void setControlBounds(const Eigen::VectorXd &u_lb, const Eigen::VectorXd &u_ub)
std::shared_ptr< SystemDynamicsInterface > Ptr
void setFinalStageCost(FinalStageCost::Ptr final_stage_cost)
#define PRINT_ERROR(msg)
Print msg-stream as error msg.