78 TranscriptionMethod::DIRECT_TRANSCRIPTION)
118 TranscriptionMethod::DIRECT_TRANSCRIPTION)
123 m_U = this->decision_variable(
num_inputs, m_num_steps + 1);
128 m_DT[0,
i] = dt.count();
140 m_DT = this->decision_variable(1, m_num_steps + 1);
142 m_DT[0,
i].set_value(dt.count());
147 m_X = this->decision_variable(
num_states, m_num_steps + 1);
148 constrain_direct_transcription();
150 TranscriptionMethod::DIRECT_COLLOCATION) {
151 m_X = this->decision_variable(
num_states, m_num_steps + 1);
152 constrain_direct_collocation();
157 constrain_single_shooting();
166 template <
typename T>
169 this->subject_to(this->initial_state() == initial_state);
177 template <
typename T>
180 this->subject_to(this->final_state() == final_state);
194 for (
int i = 0;
i < m_num_steps + 1; ++
i) {
216 for (
int i = 0;
i < m_num_steps + 1; ++
i) {
219 auto dt = this->dt()[0,
i];
232 template <
typename T>
235 for (
int i = 0;
i < m_num_steps + 1; ++
i) {
246 template <
typename T>
249 for (
int i = 0;
i < m_num_steps + 1; ++
i) {
325 DynamicsType m_dynamics_type;
340 template <
typename F,
typename State,
typename Input,
typename Time>
342 auto halfdt = dt * Scalar(0.5);
348 return x + (
k1 +
k2 * Scalar(2) +
k3 * Scalar(2) +
k4) * (dt / Scalar(6));
354 void constrain_direct_collocation() {
355 slp_assert(m_dynamics_type == DynamicsType::EXPLICIT_ODE);
357 Variable<Scalar> time{0};
360 for (
int i = 0; i < m_num_steps; ++i) {
361 Variable h = dt()[0, i];
363 auto& f = m_dynamics;
366 auto t_end = t_begin + h;
368 auto x_begin = X().col(i);
369 auto x_end = X().col(i + 1);
371 auto u_begin = U().col(i);
372 auto u_end = U().col(i + 1);
374 auto xdot_begin = f(t_begin, x_begin, u_begin, h);
375 auto xdot_end = f(t_end, x_end, u_end, h);
376 auto xdot_c = Scalar(-3) / (Scalar(2) * h) * (x_begin - x_end) -
377 Scalar(0.25) * (xdot_begin + xdot_end);
379 auto t_c = t_begin + Scalar(0.5) * h;
380 auto x_c = Scalar(0.5) * (x_begin + x_end) +
381 h / Scalar(8) * (xdot_begin - xdot_end);
382 auto u_c = Scalar(0.5) * (u_begin + u_end);
384 this->subject_to(xdot_c == f(t_c, x_c, u_c, h));
393 void constrain_direct_transcription() {
394 Variable<Scalar> time{0};
396 for (
int i = 0; i < m_num_steps; ++i) {
397 auto x_begin = X().col(i);
398 auto x_end = X().col(i + 1);
400 Variable dt = this->dt()[0, i];
402 if (m_dynamics_type == DynamicsType::EXPLICIT_ODE) {
404 x_end == rk4<
const decltype(m_dynamics)&, VariableMatrix<Scalar>,
405 VariableMatrix<Scalar>, Variable<Scalar>>(
406 m_dynamics, x_begin, u, time, dt));
407 }
else if (m_dynamics_type == DynamicsType::DISCRETE) {
408 this->subject_to(x_end == m_dynamics(time, x_begin, u, dt));
418 void constrain_single_shooting() {
419 Variable<Scalar> time{0};
421 for (
int i = 0; i < m_num_steps; ++i) {
422 auto x_begin = X().col(i);
423 auto x_end = X().col(i + 1);
425 Variable dt = this->dt()[0, i];
427 if (m_dynamics_type == DynamicsType::EXPLICIT_ODE) {
428 x_end = rk4<
const decltype(m_dynamics)&, VariableMatrix<Scalar>,
429 VariableMatrix<Scalar>, Variable<Scalar>>(
430 m_dynamics, x_begin, u, time, dt);
431 }
else if (m_dynamics_type == DynamicsType::DISCRETE) {
432 x_end = m_dynamics(time, x_begin, u, dt);
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)
Definition ocp.hpp:109
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)
Definition ocp.hpp:70
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)
Definition ocp.hpp:209