WPILibC++ 2027.0.0-alpha-2
Loading...
Searching...
No Matches
slp::OCP Class Reference

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

#include </home/runner/work/allwpilib/allwpilib/wpimath/src/main/native/thirdparty/sleipnir/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)
 Build an optimization problem using a system evolution function (explicit ODE or discrete state transition function).
 
 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)
 Build an optimization problem using a system evolution function (explicit ODE or discrete state transition function).
 
template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void constrain_initial_state (const T &initial_state)
 Utility function to constrain the initial state.
 
template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void constrain_final_state (const T &final_state)
 Utility function to constrain the final state.
 
void for_each_step (const function_ref< void(const VariableMatrix &x, const VariableMatrix &u)> callback)
 Set the constraint evaluation function.
 
void for_each_step (const function_ref< void(const Variable &t, const VariableMatrix &x, const VariableMatrix &u, const Variable &dt)> callback)
 Set the constraint evaluation function.
 
template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void set_lower_input_bound (const T &lower_bound)
 Convenience function to set a lower bound on the input.
 
template<typename T >
requires ScalarLike<T> || MatrixLike<T>
void set_upper_input_bound (const T &upper_bound)
 Convenience function to set an upper bound on the input.
 
void set_min_timestep (std::chrono::duration< double > min_timestep)
 Convenience function to set a lower bound on the timestep.
 
void set_max_timestep (std::chrono::duration< double > max_timestep)
 Convenience function to set an upper bound on the timestep.
 
VariableMatrixX ()
 Get the state variables.
 
VariableMatrixU ()
 Get the input variables.
 
VariableMatrixdt ()
 Get the timestep variables.
 
VariableMatrix initial_state ()
 Convenience function to get the initial state in the trajectory.
 
VariableMatrix final_state ()
 Convenience function to get the final state in the trajectory.
 
- Public Member Functions inherited from slp::Problem
 Problem () noexcept=default
 Construct the optimization problem.
 
Variable decision_variable ()
 Create a decision variable in the optimization problem.
 
VariableMatrix decision_variable (int rows, int cols=1)
 Create a matrix of decision variables in the optimization problem.
 
VariableMatrix symmetric_decision_variable (int rows)
 Create a symmetric matrix of decision variables in the optimization problem.
 
void minimize (const Variable &cost)
 Tells the solver to minimize the output of the given cost function.
 
void minimize (Variable &&cost)
 Tells the solver to minimize the output of the given cost function.
 
void maximize (const Variable &objective)
 Tells the solver to maximize the output of the given objective function.
 
void maximize (Variable &&objective)
 Tells the solver to maximize the output of the given objective function.
 
void subject_to (const EqualityConstraints &constraint)
 Tells the solver to solve the problem while satisfying the given equality constraint.
 
void subject_to (EqualityConstraints &&constraint)
 Tells the solver to solve the problem while satisfying the given equality constraint.
 
void subject_to (const InequalityConstraints &constraint)
 Tells the solver to solve the problem while satisfying the given inequality constraint.
 
void subject_to (InequalityConstraints &&constraint)
 Tells the solver to solve the problem while satisfying the given inequality constraint.
 
ExpressionType cost_function_type () const
 Returns the cost function's type.
 
ExpressionType equality_constraint_type () const
 Returns the type of the highest order equality constraint.
 
ExpressionType inequality_constraint_type () const
 Returns the type of the highest order inequality constraint.
 
ExitStatus solve (const Options &options=Options{}, bool spy=false)
 Solve the optimization problem.
 
template<typename F >
requires requires(F callback, const IterationInfo& info) { { callback(info) } -> std::same_as<void>; }
void add_callback (F &&callback)
 Adds a callback to be called at the beginning of each solver iteration.
 
template<typename F >
requires requires(F callback, const IterationInfo& info) { { callback(info) } -> std::same_as<bool>; }
void add_callback (F &&callback)
 Adds a callback to be called at the beginning of each solver iteration.
 
void clear_callbacks ()
 Clears the registered 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() [1/2]

void slp::OCP::for_each_step ( 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.

◆ for_each_step() [2/2]

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.

◆ 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_max_timestep()

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

Convenience function to set an upper bound on the timestep.

Parameters
max_timestepThe maximum timestep.

◆ set_min_timestep()

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

Convenience function to set a lower bound on the timestep.

Parameters
min_timestepThe minimum timestep.

◆ 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.

◆ 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: