51 inputTraj_ = Eigen::VectorXd::Zero(NB_STEPS * INPUT_SIZE);
52 stateTraj_ = Eigen::VectorXd::Zero((NB_STEPS + 1) * STATE_SIZE);
57 if(stateTraj.size() / STATE_SIZE != 1 + inputTraj.size() / INPUT_SIZE)
59 mc_rtc::log::error(
"Invalid state/input sizes, respectively {} and {}", stateTraj.size(), inputTraj.size());
61 stateTraj_ = stateTraj;
62 inputTraj_ = inputTraj;
67 if(playbackStep_ < NB_STEPS)
79 Eigen::Vector3d comddd;
80 comddd.head<INPUT_SIZE>() = inputTraj_.segment<INPUT_SIZE>(INPUT_SIZE * playbackStep_);
83 if(playbackTime_ >= (playbackStep_ + 1) * SAMPLING_PERIOD)
87 pendulum.integrateCoMJerk(comddd, dt);
92 Eigen::Vector3d comddd;
93 Eigen::VectorXd lastState = stateTraj_.segment<STATE_SIZE>(STATE_SIZE * NB_STEPS);
94 Eigen::Vector2d comd_f = lastState.segment<2>(2);
95 Eigen::Vector2d comdd_f = lastState.segment<2>(4);
96 if(std::abs(comd_f.x() * comdd_f.y() - comd_f.y() * comdd_f.x()) > 1e-4)
98 mc_rtc::log::warning(
"MPC terminal condition is not properly fulfilled");
100 double omega_f = -comd_f.dot(comdd_f) / comd_f.dot(comd_f);
101 double lambda_f = std::pow(omega_f, 2);
102 comddd = -omega_f * pendulum.comdd() - lambda_f * pendulum.comd();
104 pendulum.integrateCoMJerk(comddd, dt);
mc_planning::Pendulum Pendulum
static constexpr EIGEN_MAKE_ALIGNED_OPERATOR_NEW double SAMPLING_PERIOD
static constexpr unsigned INPUT_SIZE
static constexpr unsigned NB_STEPS
static constexpr unsigned STATE_SIZE
void integrate(mc_planning::Pendulum &state, double dt)
void integratePostPlayback(mc_planning::Pendulum &state, double dt)
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Preview()
void integratePlayback(mc_planning::Pendulum &state, double dt)