48template <
typename Scalar>
68 OCP(
int num_states,
int num_inputs, std::chrono::duration<Scalar>
dt,
88 transcription_method} {}
107 OCP(
int num_states,
int num_inputs, std::chrono::duration<Scalar>
dt,
117 : m_num_steps{num_steps},
118 m_dynamics{
std::move(dynamics)},
119 m_dynamics_type{dynamics_type} {
125 for (
int i = 0; i < num_steps + 1; ++i) {
126 m_DT(0, i) =
dt.count();
134 for (
int i = 0; i < num_steps + 1; ++i) {
135 m_DT(0, i) = single_dt;
139 for (
int i = 0; i < num_steps + 1; ++i) {
140 m_DT(0, i).set_value(
dt.count());
146 constrain_direct_transcription();
147 }
else if (transcription_method ==
150 constrain_direct_collocation();
155 constrain_single_shooting();
162 template <
typename T>
171 template <
typename T>
186 for (
int i = 0; i < m_num_steps + 1; ++i) {
206 for (
int i = 0; i < m_num_steps + 1; ++i) {
209 auto dt = this->dt()(0, i);
210 callback(time, x, u,
dt);
220 template <
typename T>
223 for (
int i = 0; i < m_num_steps + 1; ++i) {
232 template <
typename T>
235 for (
int i = 0; i < m_num_steps + 1; ++i) {
310 template <
typename F,
typename State,
typename Input,
typename Time>
311 State rk4(F&& f, State x, Input u, Time t0, Time dt) {
312 auto halfdt = dt * Scalar(0.5);
313 State k1 = f(t0, x, u, dt);
314 State k2 = f(t0 + halfdt, x + k1 * halfdt, u, dt);
315 State k3 = f(t0 + halfdt, x + k2 * halfdt, u, dt);
316 State k4 = f(t0 + dt, x + k3 * dt, u, dt);
318 return x + (k1 + k2 * Scalar(2) + k3 * Scalar(2) + k4) * (dt / Scalar(6));
322 void constrain_direct_collocation() {
325 Variable<Scalar> time{0};
328 for (
int i = 0; i < m_num_steps; ++i) {
331 auto& f = m_dynamics;
334 auto t_end = t_begin + h;
336 auto x_begin = X().col(i);
337 auto x_end = X().col(i + 1);
339 auto u_begin = U().col(i);
340 auto u_end = U().col(i + 1);
342 auto xdot_begin = f(t_begin, x_begin, u_begin, h);
343 auto xdot_end = f(t_end, x_end, u_end, h);
344 auto xdot_c = Scalar(-3) / (Scalar(2) * h) * (x_begin - x_end) -
345 Scalar(0.25) * (xdot_begin + xdot_end);
347 auto t_c = t_begin + Scalar(0.5) * h;
348 auto x_c = Scalar(0.5) * (x_begin + x_end) +
349 h / Scalar(8) * (xdot_begin - xdot_end);
350 auto u_c = Scalar(0.5) * (u_begin + u_end);
352 this->subject_to(xdot_c == f(t_c, x_c, u_c, h));
359 void constrain_direct_transcription() {
362 for (
int i = 0; i < m_num_steps; ++i) {
363 auto x_begin = X().col(i);
364 auto x_end = X().col(i + 1);
372 m_dynamics, x_begin, u, time, dt));
374 this->subject_to(x_end == m_dynamics(time, x_begin, u, dt));
382 void constrain_single_shooting() {
385 for (
int i = 0; i < m_num_steps; ++i) {
386 auto x_begin = X().col(i);
387 auto x_end = X().col(i + 1);
394 m_dynamics, x_begin, u, time, dt);
396 x_end = m_dynamics(time, x_begin, u, dt);
#define EXPORT_TEMPLATE_DECLARE(export)
Definition SymbolExports.hpp:94
#define slp_assert(condition)
Abort in C++.
Definition assert.hpp:25
This class allows the user to pose and solve a constrained optimal control problem (OCP) in a variety...
Definition ocp.hpp:49
void constrain_initial_state(const T &initial_state)
Utility function to constrain the initial state.
Definition ocp.hpp:164
void constrain_final_state(const T &final_state)
Utility function to constrain the final state.
Definition ocp.hpp:173
VariableMatrix< Scalar > & U()
Get the input variables.
Definition ocp.hpp:269
VariableMatrix< Scalar > initial_state()
Convenience function to get the initial state in the trajectory.
Definition ocp.hpp:283
void set_min_timestep(std::chrono::duration< Scalar > min_timestep)
Convenience function to set a lower bound on the timestep.
Definition ocp.hpp:243
VariableMatrix< Scalar > & X()
Get the state variables.
Definition ocp.hpp:260
void set_upper_input_bound(const T &upper_bound)
Convenience function to set an upper bound on the input.
Definition ocp.hpp:234
OCP(int num_states, int num_inputs, std::chrono::duration< Scalar > dt, int num_steps, function_ref< VariableMatrix< Scalar >(const Variable< Scalar > &t, const VariableMatrix< Scalar > &x, const VariableMatrix< Scalar > &u, const Variable< Scalar > &dt)> dynamics, DynamicsType dynamics_type=DynamicsType::EXPLICIT_ODE, TimestepMethod timestep_method=TimestepMethod::FIXED, TranscriptionMethod transcription_method=TranscriptionMethod::DIRECT_TRANSCRIPTION)
Build an optimization problem using a system evolution function (explicit ODE or discrete state trans...
Definition ocp.hpp:107
void set_lower_input_bound(const T &lower_bound)
Convenience function to set a lower bound on the input.
Definition ocp.hpp:222
void for_each_step(const function_ref< void(const VariableMatrix< Scalar > &x, const VariableMatrix< Scalar > &u)> callback)
Set the constraint evaluation function.
Definition ocp.hpp:183
void set_max_timestep(std::chrono::duration< Scalar > max_timestep)
Convenience function to set an upper bound on the timestep.
Definition ocp.hpp:250
OCP(int num_states, int num_inputs, std::chrono::duration< Scalar > dt, int num_steps, function_ref< VariableMatrix< Scalar >(const VariableMatrix< Scalar > &x, const VariableMatrix< Scalar > &u)> dynamics, DynamicsType dynamics_type=DynamicsType::EXPLICIT_ODE, TimestepMethod timestep_method=TimestepMethod::FIXED, TranscriptionMethod transcription_method=TranscriptionMethod::DIRECT_TRANSCRIPTION)
Build an optimization problem using a system evolution function (explicit ODE or discrete state trans...
Definition ocp.hpp:68
VariableMatrix< Scalar > final_state()
Convenience function to get the final state in the trajectory.
Definition ocp.hpp:288
VariableMatrix< Scalar > & dt()
Get the timestep variables.
Definition ocp.hpp:278
void for_each_step(const function_ref< void(const Variable< Scalar > &t, const VariableMatrix< Scalar > &x, const VariableMatrix< Scalar > &u, const Variable< Scalar > &dt)> callback)
Set the constraint evaluation function.
Definition ocp.hpp:199
Problem() noexcept=default
Construct the optimization problem.
void subject_to(const EqualityConstraints< Scalar > &constraint)
Tells the solver to solve the problem while satisfying the given equality constraint.
Definition problem.hpp:182
Variable< Scalar > decision_variable()
Create a decision variable in the optimization problem.
Definition problem.hpp:76
An autodiff variable pointing to an expression node.
Definition variable.hpp:47
void set_value(Scalar value)
Sets Variable's internal value.
Definition variable.hpp:117
A matrix of autodiff variables.
Definition variable_matrix.hpp:33
VariableBlock< VariableMatrix > col(int col)
Returns a column slice of the variable matrix.
Definition variable_matrix.hpp:482
Definition function_ref.hpp:13
Definition concepts.hpp:18
Definition concepts.hpp:24
Definition expression_graph.hpp:11
TimestepMethod
Enum describing the type of system timestep.
Definition timestep_method.hpp:10
@ VARIABLE_SINGLE
The timesteps are equal length but allowed to vary as a single decision variable.
Definition timestep_method.hpp:17
@ FIXED
The timestep is a fixed constant.
Definition timestep_method.hpp:12
@ VARIABLE
The timesteps are allowed to vary as independent decision variables.
Definition timestep_method.hpp:14
DynamicsType
Enum describing a type of system dynamics constraints.
Definition dynamics_type.hpp:10
@ DISCRETE
The dynamics are a function in the form xₖ₊₁ = f(t, xₖ, uₖ).
Definition dynamics_type.hpp:14
@ EXPLICIT_ODE
The dynamics are a function in the form dx/dt = f(t, x, u).
Definition dynamics_type.hpp:12
function_ref(R(*)(Args...)) -> function_ref< R(Args...)>
TranscriptionMethod
Enum describing an OCP transcription method.
Definition transcription_method.hpp:10
@ DIRECT_COLLOCATION
The trajectory is modeled as a series of cubic polynomials where the centerpoint slope is constrained...
Definition transcription_method.hpp:16
@ SINGLE_SHOOTING
States depend explicitly as a function of all previous states and all previous inputs.
Definition transcription_method.hpp:19
@ DIRECT_TRANSCRIPTION
Each state is a decision variable constrained to the integrated dynamics of the previous state.
Definition transcription_method.hpp:13
Definition StringMap.hpp:773
#define SLEIPNIR_DLLEXPORT
Definition symbol_exports.hpp:34