25 using namespace tasks;
27 using namespace solvers;
36 m_baseDynamics(new math::ConstraintEquality(
38 m_solutionDecoded(false) {
67 for (ConstraintLevel::iterator itt =
it->begin(); itt !=
it->end(); itt++) {
68 itt->second->resize(itt->second->rows(),
m_v +
m_k);
73 template <
class TaskLevelPo
inter>
76 unsigned int priorityLevel) {
78 const ConstraintBase &
c = tl->task.getConstraint();
81 std::make_shared<ConstraintEquality>(
c.name(),
c.rows(),
m_v +
m_k);
82 if (priorityLevel == 0)
m_eq +=
c.rows();
86 std::make_shared<ConstraintInequality>(
c.name(),
c.rows(),
m_v +
m_k);
87 if (priorityLevel == 0)
m_in +=
c.rows();
93 make_pair<
double, std::shared_ptr<ConstraintBase> >(weight,
98 TaskMotion &task,
double weight,
unsigned int priorityLevel,
99 double transition_duration) {
101 weight >= 0.0,
"The weight needs to be positive or equal to 0");
103 transition_duration >= 0.0,
104 "The transition duration needs to be greater than or equal to 0");
106 auto tl = std::make_shared<TaskLevel>(task, priorityLevel);
108 addTask(tl, weight, priorityLevel);
115 double transition_duration) {
117 weight >= 0.0,
"The weight needs to be positive or equal to 0");
119 transition_duration >= 0.0,
120 "The transition duration needs to be greater than or equal to 0");
122 auto tl = std::make_shared<TaskLevelForce>(task, priorityLevel);
124 addTask(tl, weight, priorityLevel);
129 TaskActuation &task,
double weight,
unsigned int priorityLevel,
130 double transition_duration) {
132 weight >= 0.0,
"The weight needs to be positive or equal to 0");
134 transition_duration >= 0.0,
135 "The transition duration needs to be greater than or equal to 0");
137 auto tl = std::make_shared<TaskLevel>(task, priorityLevel);
142 const ConstraintBase &
c = tl->task.getConstraint();
143 if (
c.isEquality()) {
145 std::make_shared<ConstraintEquality>(
c.name(),
c.rows(),
m_v +
m_k);
146 if (priorityLevel == 0)
m_eq +=
c.rows();
151 std::make_shared<ConstraintInequality>(
c.name(),
c.rows(),
m_v +
m_k);
152 if (priorityLevel == 0)
m_in +=
c.rows();
156 make_pair<
double, std::shared_ptr<ConstraintBase> >(weight,
163 const std::string &task_name,
double weight) {
164 ConstraintLevel::iterator
it;
168 if (
it->second->name() == task_name) {
179 double motion_weight,
unsigned int motionPriorityLevel) {
180 auto cl = std::make_shared<ContactLevel>(
contact);
186 const ConstraintBase &motionConstr =
contact.getMotionConstraint();
187 cl->motionConstraint = std::make_shared<ConstraintEquality>(
188 contact.name() +
"_motion_task", motionConstr.rows(),
m_v +
m_k);
189 m_hqpData[motionPriorityLevel].push_back(
191 motion_weight,
cl->motionConstraint));
193 const ConstraintInequality &forceConstr =
contact.getForceConstraint();
194 cl->forceConstraint = std::make_shared<ConstraintInequality>(
195 contact.name() +
"_force_constraint", forceConstr.rows(),
m_v +
m_k);
198 1.0,
cl->forceConstraint));
200 const ConstraintEquality &forceRegConstr =
201 contact.getForceRegularizationTask();
202 cl->forceRegTask = std::make_shared<ConstraintEquality>(
203 contact.name() +
"_force_reg_task", forceRegConstr.rows(),
m_v +
m_k);
206 force_regularization_weight,
cl->forceRegTask));
208 if (motionPriorityLevel == 0)
m_eq += motionConstr.rows();
209 m_in += forceConstr.rows();
215 std::cout <<
"[InverseDynamicsFormulationAccForce] Method "
216 "addRigidContact(ContactBase) is deprecated. You should use "
217 "addRigidContact(ContactBase, double) instead.\n";
222 const std::string &contact_name,
double force_regularization_weight,
223 double motion_weight) {
225 ConstraintLevel::iterator itt;
226 bool force_reg_task_found =
false;
227 bool motion_task_found =
false;
230 if (itt->second->name() == contact_name +
"_force_reg_task") {
231 if (force_regularization_weight >= 0.0)
232 itt->first = force_regularization_weight;
233 if (motion_task_found || motion_weight < 0.0)
236 force_reg_task_found =
true;
237 }
else if (itt->second->name() == contact_name +
"_motion_task") {
238 if (motion_weight >= 0.0) itt->first = motion_weight;
239 if (force_reg_task_found)
return true;
240 motion_task_found =
true;
249 auto tl = std::make_shared<MeasuredForceLevel>(measuredForce);
262 assert(
c->time_start <=
m_t);
263 if (m_t <= c->time_end) {
265 (
m_t -
c->time_start) / (
c->time_end -
c->time_start);
266 const double fMax =
c->fMax_start +
alpha * (
c->fMax_end -
c->fMax_start);
267 c->contactLevel->contact.setMaxNormalForce(
fMax);
283 unsigned int m =
cl->contact.n_force();
285 const ConstraintBase &mc =
287 cl->motionConstraint->matrix().leftCols(
m_v) = mc.matrix();
288 cl->motionConstraint->vector() = mc.vector();
291 cl->contact.getForceGeneratorMatrix();
292 m_Jc.middleRows(
cl->index,
m).noalias() =
T.transpose() * mc.matrix();
294 const ConstraintInequality &fc =
296 cl->forceConstraint->matrix().middleCols(
m_v +
cl->index,
m) = fc.matrix();
297 cl->forceConstraint->lowerBound() = fc.lowerBound();
298 cl->forceConstraint->upperBound() = fc.upperBound();
300 const ConstraintEquality &fr =
302 cl->forceRegTask->matrix().middleCols(
m_v +
cl->index,
m) = fr.matrix();
303 cl->forceRegTask->vector() = fr.vector();
329 if (
c.isEquality()) {
330 it->constraint->matrix().leftCols(
m_v) =
c.matrix();
331 it->constraint->vector() =
c.vector();
332 }
else if (
c.isInequality()) {
333 it->constraint->matrix().leftCols(
m_v) =
c.matrix();
334 it->constraint->lowerBound() =
c.lowerBound();
335 it->constraint->upperBound() =
c.upperBound();
337 it->constraint->matrix().leftCols(
m_v) = Matrix::Identity(
m_v,
m_v);
338 it->constraint->lowerBound() =
c.lowerBound();
339 it->constraint->upperBound() =
c.upperBound();
352 if (
it->task.getAssociatedContactName() !=
"") {
355 if (
it->task.getAssociatedContactName() ==
cl->contact.name()) {
357 c_size =
cl->contact.n_force();
370 if (
c.isEquality()) {
371 it->constraint->matrix().middleCols(i0, c_size) =
c.matrix();
372 it->constraint->vector() =
c.vector();
373 }
else if (
c.isInequality()) {
374 it->constraint->matrix().middleCols(i0, c_size) =
c.matrix();
375 it->constraint->lowerBound() =
c.lowerBound();
376 it->constraint->upperBound() =
c.upperBound();
378 it->constraint->matrix().middleCols(i0, c_size) =
379 Matrix::Identity(c_size, c_size);
380 it->constraint->lowerBound() =
c.lowerBound();
381 it->constraint->upperBound() =
c.upperBound();
387 if (
c.isEquality()) {
388 it->constraint->matrix().leftCols(
m_v).noalias() =
c.matrix() * M_a;
389 it->constraint->matrix().rightCols(
m_k).noalias() =
390 -
c.matrix() * J_a.transpose();
391 it->constraint->vector() =
c.vector();
392 it->constraint->vector().noalias() -=
c.matrix() * h_a;
393 }
else if (
c.isInequality()) {
394 it->constraint->matrix().leftCols(
m_v).noalias() =
c.matrix() * M_a;
395 it->constraint->matrix().rightCols(
m_k).noalias() =
396 -
c.matrix() * J_a.transpose();
397 it->constraint->lowerBound() =
c.lowerBound();
398 it->constraint->lowerBound().noalias() -=
c.matrix() * h_a;
399 it->constraint->upperBound() =
c.upperBound();
400 it->constraint->upperBound().noalias() -=
c.matrix() * h_a;
403 it->constraint->matrix().leftCols(
m_v) = M_a;
404 it->constraint->matrix().rightCols(
m_k) = -J_a.transpose();
405 it->constraint->lowerBound() =
c.lowerBound() - h_a;
406 it->constraint->upperBound() =
c.upperBound() - h_a;
426 m_tau.noalias() -= J_a.transpose() *
m_f;
455 if (
it->contact.name() ==
name) {
456 const int k =
it->contact.n_force();
457 return m_f.segment(
it->index, k);
460 return Vector::Zero(0);
467 if (
it->contact.name() ==
name) {
468 const int k =
it->contact.n_force();
469 assert(
f.size() == k);
470 f =
m_f.segment(
it->index, k);
487 if ((*it)->task.name() == taskName) {
488 if ((*it)->priority == 0) {
489 if ((*it)->constraint->isEquality())
490 m_eq -= (*it)->constraint->rows();
491 else if ((*it)->constraint->isInequality())
492 m_in -= (*it)->constraint->rows();
500 if ((*it)->task.name() == taskName) {
506 if ((*it)->task.name() == taskName) {
507 if ((*it)->priority == 0) {
508 if ((*it)->constraint->isEquality())
509 m_eq -= (*it)->constraint->rows();
511 m_in -= (*it)->constraint->rows();
521 const std::string &contactName,
double transition_duration) {
522 if (transition_duration > 0.0) {
524 if (
it->contact.name() == contactName) {
525 auto transitionInfo = std::make_shared<ContactTransitionInfo>();
526 transitionInfo->contactLevel =
it;
527 transitionInfo->time_start =
m_t;
528 transitionInfo->time_end =
m_t + transition_duration;
529 const int k =
it->contact.n_force();
530 if (
m_f.size() >=
it->index + k) {
532 transitionInfo->fMax_start =
it->contact.getNormalForce(
f);
534 transitionInfo->fMax_start =
it->contact.getMaxNormalForce();
536 transitionInfo->fMax_end =
it->contact.getMinNormalForce() + 1e-3;
545 assert(first_constraint_found);
547 bool second_constraint_found =
549 assert(second_constraint_found);
551 bool third_constraint_found =
553 assert(third_constraint_found);
555 bool contact_found =
false;
557 if ((*it)->contact.name() == contactName) {
558 m_k -= (*it)->contact.n_force();
559 m_eq -= (*it)->motionConstraint->rows();
560 m_in -= (*it)->forceConstraint->rows();
563 contact_found =
true;
571 k +=
it->contact.n_force();
573 return contact_found && first_constraint_found && second_constraint_found &&
574 third_constraint_found;
578 const std::string &measuredForceName) {
580 if ((*it)->measuredForce.name() == measuredForceName) {
589 const std::string &
name) {
593 for (ConstraintLevel::iterator itt =
it->begin();
594 !found && itt !=
it->end(); itt++) {
595 if (itt->second->name() ==
name) {