Sleipnir C++ API
Loading...
Searching...
No Matches
slp::OCP Class Reference

#include <sleipnir/control/ocp.hpp>

Inheritance diagram for slp::OCP:
slp::Problem

Public Member Functions

 OCP (int num_states, int num_inputs, std::chrono::duration< double > dt, int num_steps, function_ref< VariableMatrix(const VariableMatrix &x, const VariableMatrix &u)> dynamics, DynamicsType dynamics_type=DynamicsType::EXPLICIT_ODE, TimestepMethod timestep_method=TimestepMethod::FIXED, TranscriptionMethod method=TranscriptionMethod::DIRECT_TRANSCRIPTION)
 
 OCP (int num_states, int num_inputs, std::chrono::duration< double > dt, int num_steps, function_ref< VariableMatrix(const Variable &t, const VariableMatrix &x, const VariableMatrix &u, const Variable &dt)> dynamics, DynamicsType dynamics_type=DynamicsType::EXPLICIT_ODE, TimestepMethod timestep_method=TimestepMethod::FIXED, TranscriptionMethod method=TranscriptionMethod::DIRECT_TRANSCRIPTION)
 
template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void constrain_initial_state (const T &initial_state)
 
template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void constrain_final_state (const T &final_state)
 
void for_each_step (const function_ref< void(const VariableMatrix &x, const VariableMatrix &u)> callback)
 
void ForEachStep (const function_ref< void(const Variable &t, const VariableMatrix &x, const VariableMatrix &u, const Variable &dt)> callback)
 
template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void set_lower_input_bound (const T &lower_bound)
 
template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void set_upper_input_bound (const T &upper_bound)
 
void SetMinTimestep (std::chrono::duration< double > min_timestep)
 
void SetMaxTimestep (std::chrono::duration< double > max_timestep)
 
VariableMatrixX ()
 
VariableMatrixU ()
 
VariableMatrixdt ()
 
VariableMatrix initial_state ()
 
VariableMatrix final_state ()
 
- Public Member Functions inherited from slp::Problem
 Problem () noexcept=default
 
Variable decision_variable ()
 
VariableMatrix decision_variable (int rows, int cols=1)
 
VariableMatrix symmetric_decision_variable (int rows)
 
void minimize (const Variable &cost)
 
void minimize (Variable &&cost)
 
void maximize (const Variable &objective)
 
void maximize (Variable &&objective)
 
void subject_to (const EqualityConstraints &constraint)
 
void subject_to (EqualityConstraints &&constraint)
 
void subject_to (const InequalityConstraints &constraint)
 
void subject_to (InequalityConstraints &&constraint)
 
ExpressionType cost_function_type () const
 
ExpressionType equality_constraint_type () const
 
ExpressionType inequality_constraint_type () const
 
ExitStatus solve (const Options &options=Options{})
 
template<typename F >
requires requires(F callback, const IterationInfo& info) { { callback(info) } -> std::same_as<void>; }
void add_callback (F &&callback)
 
template<typename F >
requires requires(F callback, const IterationInfo& info) { { callback(info) } -> std::same_as<bool>; }
void add_callback (F &&callback)
 
void clear_callbacks ()
 

Detailed Description

This class allows the user to pose and solve a constrained optimal control problem (OCP) in a variety of ways.

The system is transcripted by one of three methods (direct transcription, direct collocation, or single-shooting) and additional constraints can be added.

In direct transcription, each state is a decision variable constrained to the integrated dynamics of the previous state. In direct collocation, the trajectory is modeled as a series of cubic polynomials where the centerpoint slope is constrained. In single-shooting, states depend explicitly as a function of all previous states and all previous inputs.

Explicit ODEs are integrated using RK4.

For explicit ODEs, the function must be in the form dx/dt = f(t, x, u). For discrete state transition functions, the function must be in the form xₖ₊₁ = f(t, xₖ, uₖ).

Direct collocation requires an explicit ODE. Direct transcription and single-shooting can use either an ODE or state transition function.

https://underactuated.mit.edu/trajopt.html goes into more detail on each transcription method.

Constructor & Destructor Documentation

◆ OCP() [1/2]

slp::OCP::OCP ( int  num_states,
int  num_inputs,
std::chrono::duration< double >  dt,
int  num_steps,
function_ref< VariableMatrix(const VariableMatrix &x, const VariableMatrix &u)>  dynamics,
DynamicsType  dynamics_type = DynamicsType::EXPLICIT_ODE,
TimestepMethod  timestep_method = TimestepMethod::FIXED,
TranscriptionMethod  method = TranscriptionMethod::DIRECT_TRANSCRIPTION 
)
inline

Build an optimization problem using a system evolution function (explicit ODE or discrete state transition function).

Parameters
num_statesThe number of system states.
num_inputsThe number of system inputs.
dtThe timestep for fixed-step integration.
num_stepsThe number of control points.
dynamicsFunction representing an explicit or implicit ODE, or a discrete state transition function.
  • Explicit: dx/dt = f(x, u, *)
  • Implicit: f([x dx/dt]', u, *) = 0
  • State transition: xₖ₊₁ = f(xₖ, uₖ)
dynamics_typeThe type of system evolution function.
timestep_methodThe timestep method.
methodThe transcription method.

◆ OCP() [2/2]

slp::OCP::OCP ( int  num_states,
int  num_inputs,
std::chrono::duration< double >  dt,
int  num_steps,
function_ref< VariableMatrix(const Variable &t, const VariableMatrix &x, const VariableMatrix &u, const Variable &dt)>  dynamics,
DynamicsType  dynamics_type = DynamicsType::EXPLICIT_ODE,
TimestepMethod  timestep_method = TimestepMethod::FIXED,
TranscriptionMethod  method = TranscriptionMethod::DIRECT_TRANSCRIPTION 
)
inline

Build an optimization problem using a system evolution function (explicit ODE or discrete state transition function).

Parameters
num_statesThe number of system states.
num_inputsThe number of system inputs.
dtThe timestep for fixed-step integration.
num_stepsThe number of control points.
dynamicsFunction representing an explicit or implicit ODE, or a discrete state transition function.
  • Explicit: dx/dt = f(t, x, u, *)
  • Implicit: f(t, [x dx/dt]', u, *) = 0
  • State transition: xₖ₊₁ = f(t, xₖ, uₖ, dt)
dynamics_typeThe type of system evolution function.
timestep_methodThe timestep method.
methodThe transcription method.

Member Function Documentation

◆ constrain_final_state()

template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void slp::OCP::constrain_final_state ( const T &  final_state)
inline

Utility function to constrain the final state.

Parameters
final_statethe final state to constrain to.

◆ constrain_initial_state()

template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void slp::OCP::constrain_initial_state ( const T &  initial_state)
inline

Utility function to constrain the initial state.

Parameters
initial_statethe initial state to constrain to.

◆ dt()

VariableMatrix & slp::OCP::dt ( )
inline

Get the timestep variables. After the problem is solved, this will contain the timesteps corresponding to the optimized trajectory.

Shaped 1x(num_steps+1), although the last timestep is unused in the trajectory.

Returns
The timestep variable matrix.

◆ final_state()

VariableMatrix slp::OCP::final_state ( )
inline

Convenience function to get the final state in the trajectory.

Returns
The final state of the trajectory.

◆ for_each_step()

void slp::OCP::for_each_step ( const function_ref< void(const VariableMatrix &x, const VariableMatrix &u)>  callback)
inline

Set the constraint evaluation function. This function is called num_steps+1 times, with the corresponding state and input VariableMatrices.

Parameters
callbackThe callback f(x, u) where x is the state and u is the input vector.

◆ ForEachStep()

void slp::OCP::ForEachStep ( const function_ref< void(const Variable &t, const VariableMatrix &x, const VariableMatrix &u, const Variable &dt)>  callback)
inline

Set the constraint evaluation function. This function is called num_steps+1 times, with the corresponding state and input VariableMatrices.

Parameters
callbackThe callback f(t, x, u, dt) where t is time, x is the state vector, u is the input vector, and dt is the timestep duration.

◆ initial_state()

VariableMatrix slp::OCP::initial_state ( )
inline

Convenience function to get the initial state in the trajectory.

Returns
The initial state of the trajectory.

◆ set_lower_input_bound()

template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void slp::OCP::set_lower_input_bound ( const T &  lower_bound)
inline

Convenience function to set a lower bound on the input.

Parameters
lower_boundThe lower bound that inputs must always be above. Must be shaped (num_inputs)x1.

◆ set_upper_input_bound()

template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void slp::OCP::set_upper_input_bound ( const T &  upper_bound)
inline

Convenience function to set an upper bound on the input.

Parameters
upper_boundThe upper bound that inputs must always be below. Must be shaped (num_inputs)x1.

◆ SetMaxTimestep()

void slp::OCP::SetMaxTimestep ( std::chrono::duration< double >  max_timestep)
inline

Convenience function to set an upper bound on the timestep.

Parameters
max_timestepThe maximum timestep.

◆ SetMinTimestep()

void slp::OCP::SetMinTimestep ( std::chrono::duration< double >  min_timestep)
inline

Convenience function to set a lower bound on the timestep.

Parameters
min_timestepThe minimum timestep.

◆ U()

VariableMatrix & slp::OCP::U ( )
inline

Get the input variables. After the problem is solved, this will contain the inputs corresponding to the optimized trajectory.

Shaped (num_inputs)x(num_steps+1), although the last input step is unused in the trajectory.

Returns
The input variable matrix.

◆ X()

VariableMatrix & slp::OCP::X ( )
inline

Get the state variables. After the problem is solved, this will contain the optimized trajectory.

Shaped (num_states)x(num_steps+1).

Returns
The state variable matrix.

The documentation for this class was generated from the following file: