@@ -34,6 +34,39 @@ namespace simple_mpc
3434 feet_tracked_.push_back (false );
3535 trackingSamples_.emplace_back (12 , 6 );
3636 }
37+
38+ // By default initialize target in reference state
39+ const size_t nq = model_handler_.getModel ().nq ;
40+ const size_t nv = model_handler_.getModel ().nv ;
41+ const Eigen::VectorXd q_ref = model_handler.getReferenceState ().head (nq);
42+ const Eigen::VectorXd v_ref = model_handler.getReferenceState ().tail (nv);
43+ data_handler_.updateInternalData (q_ref, v_ref, false );
44+ const Eigen::Vector3d com_pos{data_handler_.getData ().com [0 ].head <3 >()};
45+ const Eigen::Vector3d com_vel{0 , 0 , 0 };
46+ FeetPoseVector feet_pose (n_contacts);
47+ FeetVelocityVector feet_vel (n_contacts);
48+ std::vector<bool > feet_contact (n_contacts);
49+ std::vector<TargetContactForce> feet_force;
50+ for (int i = 0 ; i < n_contacts; i++)
51+ {
52+ // By default initialize all foot in contact with same amount of force
53+ feet_contact[i] = true ;
54+ const RobotModelHandler::FootType foot_type = model_handler.getFootType (i);
55+ if (foot_type == RobotModelHandler::POINT)
56+ feet_force.push_back (TargetContactForce::Zero (3 ));
57+ else if (foot_type == RobotModelHandler::QUAD)
58+ feet_force.push_back (TargetContactForce::Zero (6 ));
59+ else
60+ assert (false );
61+ feet_force[i][2 ] = 9.81 * model_handler_.getMass () / n_contacts; // Weight on Z axis
62+ feet_pose[i] = data_handler_.getFootRefPose (i);
63+ feet_vel[i].setZero ();
64+ }
65+ setTarget (com_pos, com_vel, feet_pose, feet_vel, feet_contact, feet_force);
66+
67+ // Dry run to initialize solver data & output
68+ const tsid::solvers::HQPData & solver_data = formulation_.computeProblemData (0 , q_ref, v_ref);
69+ last_solution_ = solver_->solve (solver_data);
3770 }
3871
3972 void CentroidalID::setTarget (
0 commit comments