77 TranscriptionMethod::DIRECT_TRANSCRIPTION)
117 TranscriptionMethod::DIRECT_TRANSCRIPTION)
122 m_U = this->decision_variable(
num_inputs, m_num_steps + 1);
127 m_DT[0,
i] = dt.count();
139 m_DT = this->decision_variable(1, m_num_steps + 1);
141 m_DT[0,
i].set_value(dt.count());
146 m_X = this->decision_variable(
num_states, m_num_steps + 1);
147 constrain_direct_transcription();
149 TranscriptionMethod::DIRECT_COLLOCATION) {
150 m_X = this->decision_variable(
num_states, m_num_steps + 1);
151 constrain_direct_collocation();
156 constrain_single_shooting();
163 template <
typename T>
166 this->subject_to(this->initial_state() == initial_state);
172 template <
typename T>
175 this->subject_to(this->final_state() == final_state);
187 for (
int i = 0;
i < m_num_steps + 1; ++
i) {
207 for (
int i = 0;
i < m_num_steps + 1; ++
i) {
210 auto dt = this->dt()[0,
i];
221 template <
typename T>
224 for (
int i = 0;
i < m_num_steps + 1; ++
i) {
233 template <
typename T>
236 for (
int i = 0;
i < m_num_steps + 1; ++
i) {
298 DynamicsType m_dynamics_type;
311 template <
typename F,
typename State,
typename Input,
typename Time>
313 auto halfdt = dt * Scalar(0.5);
319 return x + (
k1 +
k2 * Scalar(2) +
k3 * Scalar(2) +
k4) * (dt / Scalar(6));
323 void constrain_direct_collocation() {
324 slp_assert(m_dynamics_type == DynamicsType::EXPLICIT_ODE);
326 Variable<Scalar> time{0};
329 for (
int i = 0; i < m_num_steps; ++i) {
330 Variable h = dt()[0, i];
332 auto& f = m_dynamics;
335 auto t_end = t_begin + h;
337 auto x_begin = X().col(i);
338 auto x_end = X().col(i + 1);
340 auto u_begin = U().col(i);
341 auto u_end = U().col(i + 1);
343 auto xdot_begin = f(t_begin, x_begin, u_begin, h);
344 auto xdot_end = f(t_end, x_end, u_end, h);
345 auto xdot_c = Scalar(-3) / (Scalar(2) * h) * (x_begin - x_end) -
346 Scalar(0.25) * (xdot_begin + xdot_end);
348 auto t_c = t_begin + Scalar(0.5) * h;
349 auto x_c = Scalar(0.5) * (x_begin + x_end) +
350 h / Scalar(8) * (xdot_begin - xdot_end);
351 auto u_c = Scalar(0.5) * (u_begin + u_end);
353 this->subject_to(xdot_c == f(t_c, x_c, u_c, h));
360 void constrain_direct_transcription() {
361 Variable<Scalar> time{0};
363 for (
int i = 0; i < m_num_steps; ++i) {
364 auto x_begin = X().col(i);
365 auto x_end = X().col(i + 1);
367 Variable dt = this->dt()[0, i];
369 if (m_dynamics_type == DynamicsType::EXPLICIT_ODE) {
371 x_end == rk4<
const decltype(m_dynamics)&, VariableMatrix<Scalar>,
372 VariableMatrix<Scalar>, Variable<Scalar>>(
373 m_dynamics, x_begin, u, time, dt));
374 }
else if (m_dynamics_type == DynamicsType::DISCRETE) {
375 this->subject_to(x_end == m_dynamics(time, x_begin, u, dt));
383 void constrain_single_shooting() {
384 Variable<Scalar> time{0};
386 for (
int i = 0; i < m_num_steps; ++i) {
387 auto x_begin = X().col(i);
388 auto x_end = X().col(i + 1);
390 Variable dt = this->dt()[0, i];
392 if (m_dynamics_type == DynamicsType::EXPLICIT_ODE) {
393 x_end = rk4<
const decltype(m_dynamics)&, VariableMatrix<Scalar>,
394 VariableMatrix<Scalar>, Variable<Scalar>>(
395 m_dynamics, x_begin, u, time, dt);
396 }
else if (m_dynamics_type == DynamicsType::DISCRETE) {
397 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:108
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:69
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:200