117 std::shared_ptr<quad_utils::QuadKD> quadKD_;
123 const int n_body_ = 12, n_foot_ = 24, n_joints_ = 24, n_tail_ = 4,
124 m_body_ = 12, m_foot_ = 24, m_tail_ = 2;
127 Eigen::VectorXi
n_vec_, n_slack_vec_, m_vec_, g_vec_, g_slack_vec_,
128 n_cost_vec_, m_cost_vec_;
142 const grid_map::InterpolationMethods interp_type_ =
143 grid_map::InterpolationMethods::INTER_LINEAR;
149 int n_vars_, n_vars_primal_, n_vars_slack_, n_constraints_;
166 double Q_temporal_factor_, R_temporal_factor_;
169 Eigen::MatrixXd foot_pos_body_;
172 Eigen::MatrixXd foot_pos_world_;
175 Eigen::MatrixXd foot_vel_world_;
198 Eigen::VectorXd g_min_complex_soft_, g_max_complex_soft_;
201 Eigen::MatrixXd ground_height_;
204 Eigen::VectorXd w0_, z_L0_, z_U0_, lambda0_, g0_;
213 Eigen::MatrixXd x_reference_;
216 Eigen::VectorXd x_current_;
219 Eigen::MatrixXi contact_sequence_;
224 std::vector<int> first_step_idx_jac_g_;
227 Eigen::VectorXi iRow_jac_g_, jCol_jac_g_;
231 int nnz_h_, nnz_compact_h_;
234 Eigen::VectorXi nnz_step_jac_g_, nnz_step_hess_;
236 std::vector<int> first_step_idx_hess_g_;
240 Eigen::VectorXi iRow_h_, jCol_h_, iRow_compact_h_, jCol_compact_h_;
243 double panic_weights_, constraint_panic_weights_;
246 double first_element_duration_;
255 Eigen::VectorXi
fe_idxs_, u_idxs_, x_idxs_, slack_state_var_idxs_,
256 slack_constraint_var_idxs_, primal_constraint_idxs_,
257 slack_var_constraint_idxs_, dynamic_jac_var_idxs_,
258 relaxed_dynamic_jac_var_idxs_, panic_jac_var_idxs_,
259 dynamic_hess_var_idxs_, cost_idxs_, relaxed_constraint_idxs_;
263 constraint_panic_weights_vec_;
269 Eigen::MatrixXi
nnz_mat_, nrow_mat_, ncol_mat_, first_step_idx_mat_,
273 std::vector<std::vector<Eigen::VectorXi>>
iRow_mat_, jCol_mat_;
274 std::vector<std::vector<Eigen::VectorXi>> iRow_mat_relaxed_,
275 jCol_mat_relaxed_, relaxed_idx_in_full_sparse_;
281 std::vector<std::vector<
decltype(eval_g_spirit) *>> eval_vec_;
282 std::vector<std::vector<
decltype(eval_g_spirit_work) *>> eval_work_vec_;
283 std::vector<std::vector<
decltype(eval_g_spirit_incref) *>> eval_incref_vec_;
284 std::vector<std::vector<
decltype(eval_g_spirit_decref) *>> eval_decref_vec_;
285 std::vector<std::vector<
decltype(eval_g_spirit_checkout) *>>
287 std::vector<std::vector<
decltype(eval_g_spirit_release) *>> eval_release_vec_;
288 std::vector<std::vector<
decltype(eval_g_spirit_sparsity_out) *>>
292 quadNLP(SystemID default_system,
int N,
double dt,
double mu,
293 double panic_weights,
double constraint_panic_weights,
294 double Q_temporal_factor,
double R_temporal_factor,
295 const Eigen::VectorXi &fixed_complexity_schedule,
310 virtual bool get_nlp_info(Index &n, Index &m, Index &nnz_jac_g,
311 Index &nnz_h_lag, IndexStyleEnum &index_style);
315 Eigen::VectorXd &x_ub,
316 Eigen::VectorXd &u_lb,
317 Eigen::VectorXd &u_ub,
318 Eigen::VectorXd &g_l,
319 Eigen::VectorXd &g_u);
322 virtual bool get_bounds_info(Index n, Number *x_l, Number *x_u, Index m,
323 Number *g_l, Number *g_u);
327 Number *z_L, Number *z_U, Index m,
328 bool init_lambda, Number *lambda);
331 virtual bool eval_f(Index n,
const Number *x,
bool new_x, Number &obj_value);
334 virtual bool eval_grad_f(Index n,
const Number *x,
bool new_x,
339 const Eigen::VectorXd &u,
340 const Eigen::VectorXd &x1);
343 virtual bool eval_g(Index n,
const Number *x,
bool new_x, Index m, Number *g);
349 virtual bool eval_jac_g(Index n,
const Number *x,
bool new_x, Index m,
350 Index nele_jac, Index *iRow, Index *jCol,
353 virtual void compute_nnz_jac_g();
359 virtual bool eval_h(Index n,
const Number *x,
bool new_x, Number obj_factor,
360 Index m,
const Number *lambda,
bool new_lambda,
361 Index nele_hess, Index *iRow, Index *jCol,
364 virtual void compute_nnz_h();
369 const Number *z_L,
const Number *z_U, Index m,
370 const Number *g,
const Number *lambda,
371 Number obj_value,
const IpoptData *ip_data,
372 IpoptCalculatedQuantities *ip_cq);
374 virtual void update_initial_guess(
const quadNLP &nlp_prev,
int shift_idx);
376 virtual void update_solver(
377 const Eigen::VectorXd &initial_state,
const Eigen::MatrixXd &ref_traj,
378 const Eigen::MatrixXd &foot_positions,
379 const std::vector<std::vector<bool>> &contact_schedule,
380 const Eigen::VectorXi &adaptive_complexity_schedule,
381 const Eigen::VectorXd &ground_height,
382 const double &first_element_duration_,
int plan_index_diff,
385 void update_structure();
387 void get_lifted_trajectory(Eigen::MatrixXd &state_traj_lifted,
388 Eigen::MatrixXd &control_traj_lifted);
390 void get_heuristic_trajectory(Eigen::MatrixXd &state_traj_heuristic,
391 Eigen::MatrixXd &control_traj_heuristic);
394 template <
typename T>
395 inline Eigen::Block<T> get_primal_state_var(T &decision_var,
396 const int &idx)
const {
397 return decision_var.block(x_idxs_[idx], 0,
n_vec_[idx], 1);
401 template <
typename T>
402 inline Eigen::Block<T> get_primal_body_state_var(T &decision_var,
403 const int &idx)
const {
404 return decision_var.block(x_idxs_[idx], 0, n_body_, 1);
408 template <
typename T>
409 inline Eigen::Block<T> get_primal_foot_state_var(T &decision_var,
410 const int &idx)
const {
411 return decision_var.block(x_idxs_[idx] + n_body_, 0, n_foot_, 1);
415 template <
typename T>
416 inline Eigen::Block<T> get_primal_joint_state_var(T &decision_var,
417 const int &idx)
const {
418 return decision_var.block(x_idxs_[idx] + n_body_ + n_foot_, 0, n_joints_,
423 template <
typename T>
424 inline Eigen::Block<T> get_primal_control_var(T &decision_var,
425 const int &idx)
const {
426 return decision_var.block(u_idxs_[idx], 0, m_vec_[idx], 1);
430 template <
typename T>
431 inline Eigen::Block<T> get_primal_body_control_var(T &decision_var,
432 const int &idx)
const {
433 return decision_var.block(u_idxs_[idx], 0, m_body_, 1);
437 template <
typename T>
438 inline Eigen::Block<T> get_primal_foot_control_var(T &decision_var,
439 const int &idx)
const {
440 return decision_var.block(u_idxs_[idx] + m_body_, 0, m_foot_, 1);
445 template <
typename T>
446 inline Eigen::Block<T> get_slack_state_var(T &decision_var,
447 const int &idx)
const {
448 return decision_var.block(slack_state_var_idxs_[idx], 0,
449 2 * n_slack_vec_[idx], 1);
454 template <
typename T>
455 inline Eigen::Block<T> get_slack_constraint_var(T &decision_var,
456 const int &idx)
const {
457 return decision_var.block(slack_constraint_var_idxs_[idx], 0,
458 2 * g_slack_vec_[idx], 1);
462 template <
typename T>
463 inline Eigen::Block<T> get_primal_constraint_vals(T &constraint_vals,
464 const int &idx)
const {
465 return constraint_vals.block(primal_constraint_idxs_[idx], 0, g_vec_[idx],
470 template <
typename T>
471 inline Eigen::Block<T> get_relaxed_primal_constraint_vals(
472 T &constraint_vals,
const int &idx)
const {
473 return constraint_vals.block(relaxed_constraint_idxs_[idx], 0,
474 2 * g_slack_vec_[idx], 1);
479 template <
typename T>
480 inline Eigen::Block<T> get_slack_constraint_vals(T &constraint_vals,
481 const int &idx)
const {
482 return constraint_vals.block(slack_var_constraint_idxs_[idx], 0,
483 2 * n_slack_vec_[idx], 1);
488 template <
typename T>
489 inline Eigen::Block<T> get_dynamic_var(T &decision_var,
490 const int &idx)
const {
491 return decision_var.block(
fe_idxs_[idx], 0,
496 template <
typename T>
497 inline Eigen::Block<T> get_dynamic_jac_var(T &jacobian_var,
498 const int &idx)
const {
499 return jacobian_var.block(dynamic_jac_var_idxs_[idx], 0,
504 template <
typename T>
505 inline Eigen::Block<T> get_relaxed_dynamic_jac_var(T &jacobian_var,
506 const int &idx)
const {
507 return jacobian_var.block(
508 relaxed_dynamic_jac_var_idxs_[idx], 0,
515 template <
typename T>
516 inline Eigen::Block<T> get_slack_jac_var(T &jacobian_var,
517 const int &idx)
const {
518 return jacobian_var.block(panic_jac_var_idxs_[idx], 0,
519 4 * n_slack_vec_[idx], 1);
523 template <
typename T>
524 inline Eigen::Block<T> get_dynamic_hess_var(T &hessian_var,
525 const int &idx)
const {
526 return hessian_var.block(dynamic_hess_var_idxs_[idx], 0,
531 template <
typename T>
532 inline Eigen::Block<T> get_state_cost_hess_var(T &hessian_var,
533 const int &idx)
const {
534 return hessian_var.block(cost_idxs_[idx], 0, n_cost_vec_[idx], 1);
538 template <
typename T>
539 inline Eigen::Block<T> get_control_cost_hess_var(T &hessian_var,
540 const int &idx)
const {
541 return hessian_var.block(cost_idxs_[idx] + n_cost_vec_[idx], 0,
542 m_cost_vec_[idx], 1);
553 return primal_constraint_idxs_[idx];
564 return slack_var_constraint_idxs_[idx];
575 return relaxed_constraint_idxs_[idx];
613 return slack_state_var_idxs_[idx];
624 return slack_constraint_var_idxs_[idx];