@@ -16,8 +16,26 @@ namespace simple_mpc
1616 class KinodynamicsID
1717 {
1818 public:
19- KinodynamicsID (const simple_mpc::RobotModelHandler & model_handler)
20- : model_handler_(model_handler)
19+ struct Settings
20+ {
21+ double kp_posture = 1.0 ;
22+ double kp_base = 0.0 ;
23+ double kp_contact = 0.0 ;
24+
25+ double w_posture = 1e2 ;
26+ double w_base = 0 .;
27+ double w_constact_force_ = 0 .;
28+ double w_contact_motion_ = 0 .;
29+
30+ static Settings Default ()
31+ {
32+ return {};
33+ } // Work-around c++ bug to have a default constructor
34+ };
35+
36+ KinodynamicsID (const simple_mpc::RobotModelHandler & model_handler, const Settings settings = Settings::Default())
37+ : settings_(settings)
38+ , model_handler_(model_handler)
2139 , data_handler_(model_handler_)
2240 , robot_(model_handler_.getModel())
2341 , formulation_(" tsid" , robot_)
@@ -29,42 +47,33 @@ namespace simple_mpc
2947
3048 formulation_.computeProblemData (0 , model_handler.getReferenceState ().head (nq), Eigen::VectorXd::Zero (nv));
3149
32- const double kp_contact = 0.0 ;
33- const double kp_posture = 1.0 ;
34- const double kp_base = 0.0 ;
35-
36- const double w_base = 0 .;
37- const double w_posture = 1e2 ;
38- const double w_forceRef_ = 0 .;
39- const double w_motionRef_ = 0 .;
40-
4150 // Prepare contact point task
4251 // const Eigen::Vector3d normal {0, 0, 1};
4352 // for (std::string foot_name : model_handler_.getFeetNames()) {
4453 // std::shared_ptr<tsid::contacts::ContactPoint> cp =
4554 // std::make_shared<tsid::contacts::ContactPoint>(foot_name, robot_, foot_name, normal, 0.3, 1.0, 100.);
46- // cp->Kp(kp_contact * Eigen::VectorXd::Ones(3));
55+ // cp->Kp(settings_. kp_contact * Eigen::VectorXd::Ones(3));
4756 // cp->Kd(2.0 * cp->Kp().cwiseSqrt());
4857 // cp->setReference(data_handler_.getFootPose(foot_name));
4958 // cp->useLocalFrame(false);
50- // formulation_.addRigidContact(*cp, w_forceRef_, w_motionRef_ , 0);
59+ // formulation_.addRigidContact(*cp, settings_.w_constact_force_, settings_.w_contact_motion_ , 0);
5160 // contactPoints_.push_back(cp);
5261 // }
5362
5463 // Add the posture task
5564 postureTask_ = std::make_shared<tsid::tasks::TaskJointPosture>(" task-posture" , robot_);
56- postureTask_->Kp (kp_posture * Eigen::VectorXd::Ones (nu));
65+ postureTask_->Kp (settings_. kp_posture * Eigen::VectorXd::Ones (nu));
5766 postureTask_->Kd (2.0 * postureTask_->Kp ().cwiseSqrt ());
58- formulation_.addMotionTask (*postureTask_, w_posture, 1 );
67+ formulation_.addMotionTask (*postureTask_, settings_. w_posture , 1 );
5968
6069 samplePosture_ = tsid::trajectories::TrajectorySample (robot_.nq_actuated (), robot_.na ());
6170
6271 // Add the base task
6372 baseTask_ = std::make_shared<tsid::tasks::TaskSE3Equality>(" task-base" , robot_, " root_joint" );
64- baseTask_->Kp (kp_base * Eigen::VectorXd::Ones (6 ));
73+ baseTask_->Kp (settings_. kp_base * Eigen::VectorXd::Ones (6 ));
6574 baseTask_->Kd (2.0 * baseTask_->Kp ().cwiseSqrt ());
6675 baseTask_->setReference (pose_base_);
67- // formulation_.addMotionTask(*baseTask_, w_base, 0);
76+ // formulation_.addMotionTask(*baseTask_, settings_. w_base, 0);
6877
6978 sampleBase_ = tsid::trajectories::TrajectorySample (12 , 6 );
7079
@@ -100,7 +109,7 @@ namespace simple_mpc
100109 // std::string name = model_handler_.getFeetNames()[i];
101110 // if (contact_state[i]) {
102111 // if(!check_contact(name)) {
103- // // formulation_.addRigidContact(*contactPoints_[i], w_forceRef_, w_motionRef_ , 0);
112+ // // formulation_.addRigidContact(*contactPoints_[i], w_constact_force_, w_contact_motion_ , 0);
104113 // }
105114 // else {
106115 // contactPoints_[i]->setForceReference(forces.segment(i * 3, 3));
@@ -135,11 +144,13 @@ namespace simple_mpc
135144 tau_res = formulation_.getActuatorForces (sol_);
136145 }
137146
147+ // Order matters to be instanciated in the right order
148+ const Settings settings_;
138149 const simple_mpc::RobotModelHandler & model_handler_;
139150 simple_mpc::RobotDataHandler data_handler_;
140-
141151 tsid::robots::RobotWrapper robot_;
142152 tsid::InverseDynamicsFormulationAccForce formulation_;
153+
143154 std::vector<std::shared_ptr<tsid::contacts::ContactPoint>> contactPoints_;
144155 std::shared_ptr<tsid::tasks::TaskJointPosture> postureTask_;
145156 std::shared_ptr<tsid::tasks::TaskSE3Equality> baseTask_;
0 commit comments