src/tasks/task-contact-force-equality.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2017 CNRS
3 //
4 // This file is part of tsid
5 // tsid is free software: you can redistribute it
6 // and/or modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation, either version
8 // 3 of the License, or (at your option) any later version.
9 // tsid is distributed in the hope that it will be
10 // useful, but WITHOUT ANY WARRANTY; without even the implied warranty
11 // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // General Lesser Public License for more details. You should have
13 // received a copy of the GNU Lesser General Public License along with
14 // tsid If not, see
15 // <http://www.gnu.org/licenses/>.
16 //
17 
18 #include <Eigen/Dense>
19 #include <pinocchio/multibody/model.hpp>
21 
22 namespace tsid {
23 namespace tasks {
24 
25 using namespace tsid::math;
26 using namespace std;
27 
29  const std::string& name, RobotWrapper& robot, const double dt,
32  m_contact(&contact),
33  m_constraint(name, 6, 12),
34  m_ref(6, 6),
35  m_fext(6, 6) {
36  m_forceIntegralError = Vector::Zero(6);
37  m_dt = dt;
38  m_leak_rate = 0.05;
40 }
41 
42 int TaskContactForceEquality::dim() const { return 6; }
43 
44 const Vector& TaskContactForceEquality::Kp() const { return m_Kp; }
45 const Vector& TaskContactForceEquality::Kd() const { return m_Kd; }
46 const Vector& TaskContactForceEquality::Ki() const { return m_Ki; }
48  return m_leak_rate;
49 }
50 
53  "The size of the Kp vector needs to equal 6");
54  m_Kp = Kp;
55 }
56 
59  "The size of the Kd vector needs to equal 6");
60  m_Kd = Kd;
61 }
62 
65  "The size of the Ki vector needs to equal 6");
66  m_Ki = Ki;
67 }
68 
70 
72  return m_contact_name;
73 }
74 
76  return *m_contact;
77 }
78 
81  m_contact = &contact;
83 }
84 
86  m_ref = ref;
87 }
88 
91  return m_ref;
92 }
93 
95  m_fext = f_ext;
96 }
97 
100  return m_fext;
101 }
102 
104  const double t, ConstRefVector q, ConstRefVector v, Data& data,
105  const std::vector<std::shared_ptr<ContactLevel> >* contacts) {
106  bool contactFound = false;
107  if (m_contact_name != "") {
108  // look if the associated contact is in the list of contact
109  for (auto cl : *contacts) {
110  if (m_contact_name == cl->contact.name()) {
111  contactFound = true;
112  break;
113  }
114  }
115  } else {
116  std::cout << "[TaskContactForceEquality] ERROR: Contact name empty"
117  << std::endl;
118  return m_constraint;
119  }
120  if (!contactFound) {
121  std::cout << "[TaskContactForceEquality] ERROR: Contact name not in the "
122  "list of contact in the formulation pb"
123  << std::endl;
124  return m_constraint;
125  }
126  return compute(t, q, v, data);
127 }
128 
132  Data& /*data*/) {
133  auto& M = m_constraint.matrix();
134  M = m_contact->getForceGeneratorMatrix(); // 6x12 for a 6d contact
135 
136  Vector forceError = m_ref.getValue() - m_fext.getValue();
137  Vector f_ref =
138  m_ref.getValue() + m_Kp.cwiseProduct(forceError) +
139  m_Kd.cwiseProduct(m_ref.getDerivative() - m_fext.getDerivative()) +
140  m_Ki.cwiseProduct(m_forceIntegralError);
141  m_constraint.vector() = f_ref;
142 
144  (forceError - m_leak_rate * m_forceIntegralError) * m_dt;
145 
146  return m_constraint;
147 }
148 
150  return m_constraint;
151 }
152 
153 } // namespace tasks
154 } // namespace tsid
demo_quadruped.v
v
Definition: demo_quadruped.py:80
tsid::tasks::TaskContactForceEquality::Vector
math::Vector Vector
Definition: tasks/task-contact-force-equality.hpp:36
tsid::tasks::TaskContactForceEquality::Kd
const Vector & Kd() const
Definition: src/tasks/task-contact-force-equality.cpp:45
tsid::trajectories::TrajectorySample::getDerivative
const math::Vector & getDerivative() const
Definition: trajectories/trajectory-base.hpp:44
tsid::contacts::ContactBase
Base template of a Contact.
Definition: contact-base.hpp:31
tsid::tasks::TaskContactForceEquality::m_dt
double m_dt
Definition: tasks/task-contact-force-equality.hpp:87
tsid::trajectories::TrajectorySample
Definition: trajectories/trajectory-base.hpp:33
pinocchio::DataTpl
PINOCCHIO_CHECK_INPUT_ARGUMENT
#define PINOCCHIO_CHECK_INPUT_ARGUMENT(...)
tsid::tasks::TaskContactForceEquality::m_Kd
Vector m_Kd
Definition: tasks/task-contact-force-equality.hpp:85
tsid::math::ConstraintEquality::vector
const Vector & vector() const override
Definition: src/math/constraint-equality.cpp:55
tsid::tasks::TaskContactForceEquality::getConstraint
const ConstraintBase & getConstraint() const override
Definition: src/tasks/task-contact-force-equality.cpp:149
tsid::tasks::TaskContactForceEquality::setExternalForce
void setExternalForce(TrajectorySample &f_ext)
Definition: src/tasks/task-contact-force-equality.cpp:94
tsid::tasks::TaskContactForceEquality::getLeakRate
const double & getLeakRate() const
Definition: src/tasks/task-contact-force-equality.cpp:47
tsid::tasks::TaskContactForceEquality::setLeakRate
void setLeakRate(double leak)
Definition: src/tasks/task-contact-force-equality.cpp:69
tsid::math::ConstraintBase
Abstract class representing a linear equality/inequality constraint. Equality constraints are represe...
Definition: constraint-base.hpp:35
tsid::tasks::TaskContactForceEquality::m_Kp
Vector m_Kp
Definition: tasks/task-contact-force-equality.hpp:84
tsid::tasks::TaskContactForce
Definition: task-contact-force.hpp:28
task-contact-force-equality.hpp
ref
list ref
setup.data
data
Definition: setup.in.py:48
demo_quadruped.robot
robot
Definition: demo_quadruped.py:51
test_Contact.Kp
Kp
Definition: test_Contact.py:44
tsid::tasks::TaskContactForceEquality::getExternalForce
const TrajectorySample & getExternalForce() const
Definition: src/tasks/task-contact-force-equality.cpp:99
tsid::math
Definition: constraint-base.hpp:26
tsid::tasks::TaskContactForceEquality::m_leak_rate
double m_leak_rate
Definition: tasks/task-contact-force-equality.hpp:88
test_Contact.contact
contact
Definition: test_Contact.py:37
tsid::tasks::TaskContactForceEquality::getAssociatedContactName
virtual const std::string & getAssociatedContactName() override
Definition: src/tasks/task-contact-force-equality.cpp:71
demo_quadruped.q
q
Definition: demo_quadruped.py:74
tsid::tasks::TaskContactForceEquality::m_fext
TrajectorySample m_fext
Definition: tasks/task-contact-force-equality.hpp:82
tsid::tasks::TaskContactForceEquality::setAssociatedContact
void setAssociatedContact(contacts::ContactBase &contact)
Definition: src/tasks/task-contact-force-equality.cpp:79
tsid::tasks::TaskContactForceEquality::m_contact_name
std::string m_contact_name
Definition: tasks/task-contact-force-equality.hpp:79
tsid::contacts::ContactBase::getForceGeneratorMatrix
virtual const Matrix & getForceGeneratorMatrix()=0
tsid::tasks::TaskContactForceEquality::setReference
void setReference(TrajectorySample &ref)
Definition: src/tasks/task-contact-force-equality.cpp:85
tsid::math::ConstraintBase::matrix
virtual const Matrix & matrix() const
Definition: constraint-base.cpp:35
tsid::tasks::TaskContactForceEquality::getReference
const TrajectorySample & getReference() const
Definition: src/tasks/task-contact-force-equality.cpp:90
demo_quadruped.dt
float dt
Definition: demo_quadruped.py:41
tsid::trajectories::TrajectorySample::getValue
TSID_DISABLE_WARNING_PUSH const TSID_DISABLE_WARNING_DEPRECATED math::Vector & getValue() const
Definition: trajectories/trajectory-base.hpp:43
demo_quadruped.vector
vector
Definition: demo_quadruped.py:49
tsid::tasks::TaskContactForceEquality::Kp
const Vector & Kp() const
Definition: src/tasks/task-contact-force-equality.cpp:44
M
M
demo_quadruped.contacts
int contacts
Definition: demo_quadruped.py:98
setup.name
name
Definition: setup.in.py:179
tsid::tasks::TaskContactForceEquality::getAssociatedContact
virtual const contacts::ContactBase & getAssociatedContact()
Definition: src/tasks/task-contact-force-equality.cpp:75
tsid::contacts::ContactBase::name
const std::string & name() const
Definition: contact-base.cpp:25
tsid::tasks::TaskContactForceEquality::dim
int dim() const override
Return the dimension of the task. \info should be overloaded in the child class.
Definition: src/tasks/task-contact-force-equality.cpp:42
tsid::tasks::TaskContactForceEquality::m_ref
TrajectorySample m_ref
Definition: tasks/task-contact-force-equality.hpp:81
tsid
Definition: bindings/python/constraint/constraint-bound.cpp:21
std
tsid::tasks::TaskContactForceEquality::compute
const ConstraintBase & compute(double t, ConstRefVector q, ConstRefVector v, Data &data) override
Definition: src/tasks/task-contact-force-equality.cpp:129
tsid::tasks::TaskContactForceEquality::TaskContactForceEquality
TaskContactForceEquality(const std::string &name, RobotWrapper &robot, const double dt, contacts::ContactBase &contact)
Definition: src/tasks/task-contact-force-equality.cpp:28
tsid::robots::RobotWrapper
Wrapper for a robot based on pinocchio.
Definition: robots/robot-wrapper.hpp:37
cl
cl
tsid::tasks::TaskContactForceEquality::m_forceIntegralError
Vector m_forceIntegralError
Definition: tasks/task-contact-force-equality.hpp:83
tsid::tasks::TaskContactForceEquality::Ki
const Vector & Ki() const
Definition: src/tasks/task-contact-force-equality.cpp:46
tsid::tasks::TaskContactForceEquality::m_constraint
ConstraintEquality m_constraint
Definition: tasks/task-contact-force-equality.hpp:80
test_Contact.Kd
int Kd
Definition: test_Contact.py:45
t
Transform3f t
tsid::tasks::TaskContactForceEquality::m_Ki
Vector m_Ki
Definition: tasks/task-contact-force-equality.hpp:86
tsid::tasks::TaskBase::ConstRefVector
math::ConstRefVector ConstRefVector
Definition: task-base.hpp:39
tsid::tasks::TaskContactForceEquality::m_contact
contacts::ContactBase * m_contact
Definition: tasks/task-contact-force-equality.hpp:78


tsid
Author(s): Andrea Del Prete, Justin Carpentier
autogenerated on Sat May 3 2025 02:48:17