Skip to content

Commit b234747

Browse files
author
earlaud
committed
Forgot changes ?
1 parent 25b75f1 commit b234747

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#include <simple-mpc/inverse-dynamics/centroidal.hpp>
2+
3+
namespace simple_mpc
4+
{
5+
6+
CentroidalID::CentroidalID(const RobotModelHandler & model_handler, double control_dt, const Settings settings)
7+
: KinodynamicsID(model_handler, control_dt, settings)
8+
, settings_(settings)
9+
{
10+
// Update base task to be only on the base orientation
11+
const Eigen::Vector<double, 6> kp_base{0., 0., 0., 1., 1., 1.};
12+
baseTask_->Kp(settings_.kp_base * kp_base);
13+
baseTask_->Kd(2.0 * baseTask_->Kp().cwiseSqrt());
14+
15+
// Add the center of mass task
16+
comTask_ = std::make_shared<tsid::tasks::TaskComEquality>("task-com", robot_);
17+
comTask_->Kp(settings_.kp_com * Eigen::VectorXd::Ones(3));
18+
comTask_->Kd(2.0 * comTask_->Kp().cwiseSqrt());
19+
if (settings_.w_com > 0.)
20+
formulation_.addMotionTask(*comTask_, settings_.w_com, 1);
21+
22+
sampleCom_ = tsid::trajectories::TrajectorySample(3);
23+
24+
// Add foot tracking task
25+
const size_t n_contacts = model_handler_.getFeetNb();
26+
for (int i = 0; i < n_contacts; i++)
27+
{
28+
const std::string frame_name = model_handler.getFootFrameName(i);
29+
tsid::tasks::TaskSE3Equality & trackingTask =
30+
trackingTasks_.emplace_back("task-tracking-" + frame_name, robot_, frame_name);
31+
trackingTask.Kp(settings_.kp_feet_tracking * Eigen::VectorXd::Ones(6));
32+
trackingTask.Kd(2.0 * trackingTask.Kp().cwiseSqrt());
33+
// Do not add tasks ; will be done in setTarget depending on desired contacts.
34+
trackingSamples_.emplace_back(12, 6);
35+
}
36+
}
37+
38+
void CentroidalID::setTarget(
39+
const Eigen::Ref<const Eigen::Vector<double, 3>> & com_position,
40+
const Eigen::Ref<const Eigen::Vector<double, 3>> & com_velocity,
41+
const FeetPoseVector & feet_pose,
42+
const FeetVelocityVector & feet_velocity,
43+
const std::vector<bool> & contact_state_target,
44+
const std::vector<TargetContactForce> & f_target)
45+
{
46+
const size_t nq = model_handler_.getModel().nq;
47+
const size_t nv = model_handler_.getModel().nv;
48+
49+
// Set CoM target
50+
sampleCom_.setValue(com_position);
51+
sampleCom_.setDerivative(com_velocity);
52+
sampleCom_.setSecondDerivative(Eigen::Vector3d::Zero());
53+
comTask_->setReference(sampleCom_);
54+
55+
// Set feet tracking
56+
if (settings_.w_feet_tracking > 0.)
57+
{
58+
for (std::size_t foot_nb = 0; foot_nb < model_handler_.getFeetNb(); foot_nb++)
59+
{
60+
const std::string & task_name{"task-tracking-" + model_handler_.getFootFrameName(foot_nb)};
61+
if (!contact_state_target[foot_nb])
62+
{
63+
tsid::tasks::TaskSE3Equality & task{trackingTasks_[foot_nb]};
64+
tsid::trajectories::TrajectorySample & sample{trackingSamples_[foot_nb]};
65+
66+
// Add tracking task to tsid if necessary
67+
if (!feet_tracked_[foot_nb])
68+
{
69+
formulation_.addMotionTask(task, settings_.w_feet_tracking, 1);
70+
feet_tracked_[foot_nb] = true;
71+
}
72+
// Set foot reference
73+
tsid::math::SE3ToVector(feet_pose[foot_nb], sample.pos);
74+
sample.vel.head<3>() = feet_velocity[foot_nb].linear();
75+
sample.vel.tail<3>() = feet_velocity[foot_nb].angular();
76+
sample.acc.setZero();
77+
task.setReference(sample);
78+
}
79+
else
80+
{
81+
// remove task if necessary
82+
if (feet_tracked_[foot_nb])
83+
{
84+
formulation_.removeTask(task_name, 0);
85+
active_tsid_contacts_[foot_nb] = false;
86+
}
87+
}
88+
}
89+
}
90+
91+
// Set kinodynamics targets (will resize solver properly)
92+
KinodynamicsID::setTarget(
93+
model_handler_.getReferenceState().head(nq), model_handler_.getReferenceState().tail(nv),
94+
Eigen::VectorXd::Zero(nv), contact_state_target, f_target);
95+
}
96+
97+
} // namespace simple_mpc

0 commit comments

Comments
 (0)