src/contacts/contact-point.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2017 CNRS, NYU, MPI Tübingen
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 "tsid/math/utils.hpp"
20 
22 
23 using namespace tsid;
24 using namespace contacts;
25 using namespace math;
26 using namespace trajectories;
27 using namespace tasks;
28 
30  const std::string& frameName,
32  const double frictionCoefficient,
33  const double minNormalForce,
34  const double maxNormalForce)
36  m_motionTask(name, robot, frameName),
37  m_forceInequality(name, 5, 3),
38  m_forceRegTask(name, 3, 3),
39  m_contactNormal(contactNormal),
40  m_mu(frictionCoefficient),
41  m_fMin(minNormalForce),
42  m_fMax(maxNormalForce) {
43  m_weightForceRegTask << 1, 1, 1e-3;
44  m_forceGenMat.resize(3, 3);
45  m_fRef = Vector3::Zero();
46  m_contactPoints.resize(3, 1);
47  m_contactPoints.setZero();
51 
52  math::Vector motion_mask(6);
53  motion_mask << 1., 1., 1., 0., 0., 0.;
54  m_motionTask.setMask(motion_mask);
55 }
56 
57 void ContactPoint::useLocalFrame(bool local_frame) {
58  m_motionTask.useLocalFrame(local_frame);
59 }
60 
62  Vector3 t1, t2;
63  const int n_in = 4 * 1 + 1;
64  const int n_var = 3 * 1;
65  Matrix B = Matrix::Zero(n_in, n_var);
66  Vector lb = -1e10 * Vector::Ones(n_in);
67  Vector ub = Vector::Zero(n_in);
68  t1 = m_contactNormal.cross(Vector3::UnitX());
69  if (t1.norm() < 1e-5) t1 = m_contactNormal.cross(Vector3::UnitY());
70  t2 = m_contactNormal.cross(t1);
71  t1.normalize();
72  t2.normalize();
73 
74  B.block<1, 3>(0, 0) = (-t1 - m_mu * m_contactNormal).transpose();
75  B.block<1, 3>(1, 0) = (t1 - m_mu * m_contactNormal).transpose();
76  B.block<1, 3>(2, 0) = (-t2 - m_mu * m_contactNormal).transpose();
77  B.block<1, 3>(3, 0) = (t2 - m_mu * m_contactNormal).transpose();
78 
79  B.block<1, 3>(n_in - 1, 0) = m_contactNormal.transpose();
80  ub(n_in - 1) = m_fMax;
81  lb(n_in - 1) = m_fMin;
82 
86 }
87 
90  f.size() == n_force(),
91  "Size of f is wrong - needs to be " + std::to_string(n_force()));
92  return m_contactNormal.dot(f);
93 }
94 
96  return m_contactPoints;
97 }
98 
102 }
103 
105  Eigen::Matrix3d A = Eigen::Matrix3d::Zero();
106  A.diagonal() = m_weightForceRegTask;
109 }
110 
112 
113 unsigned int ContactPoint::n_motion() const { return m_motionTask.dim(); }
114 unsigned int ContactPoint::n_force() const { return 3; }
115 
117  m_Kp3 = m_motionTask.Kp().head<3>();
118  return m_Kp3;
119 }
120 
122  m_Kd3 = m_motionTask.Kd().head<3>();
123  return m_Kd3;
124 }
125 
128  "Size of Kp vector needs to equal 3");
129  Vector6 Kp6;
130  Kp6.head<3>() = Kp;
131  m_motionTask.Kp(Kp6);
132 }
133 
136  "Size of Kd vector needs to equal 3");
137  Vector6 Kd6;
138  Kd6.head<3>() = Kd;
139  m_motionTask.Kd(Kd6);
140 }
141 
144  contactNormal.size() == 3,
145  "Size of contact normal vector needs to equal 3");
146  if (contactNormal.size() != 3) return false;
149  return true;
150 }
151 
152 bool ContactPoint::setFrictionCoefficient(const double frictionCoefficient) {
153  PINOCCHIO_CHECK_INPUT_ARGUMENT(frictionCoefficient > 0.0,
154  "Friction coefficient needs to be positive");
155  if (frictionCoefficient <= 0.0) return false;
156  m_mu = frictionCoefficient;
158  return true;
159 }
160 
161 bool ContactPoint::setMinNormalForce(const double minNormalForce) {
163  minNormalForce > 0.0 && minNormalForce <= m_fMax,
164  "The minimal normal force needs to be greater than 0 and less than or "
165  "equal to the maximum force.");
166  if (minNormalForce <= 0.0 || minNormalForce > m_fMax) return false;
167  m_fMin = minNormalForce;
169  lb(lb.size() - 1) = m_fMin;
170  return true;
171 }
172 
173 bool ContactPoint::setMaxNormalForce(const double maxNormalForce) {
174  PINOCCHIO_CHECK_INPUT_ARGUMENT(maxNormalForce >= m_fMin,
175  "The maximal normal force needs to be greater "
176  "than or equal to the minimal force");
177  if (maxNormalForce < m_fMin) return false;
178  m_fMax = maxNormalForce;
180  ub(ub.size() - 1) = m_fMax;
181  return true;
182 }
183 
186  f_ref.size() == 3, "The size of the force reference needs to equal 3");
187  m_fRef = f_ref;
189 }
190 
191 void ContactPoint::setReference(const SE3& ref) {
193 }
194 
198  Data& data) {
199  return m_motionTask.compute(t, q, v, data);
200 }
201 
205  const Data&) {
206  return m_forceInequality;
207 }
208 
210 
212  const double, ConstRefVector, ConstRefVector, const Data&) {
213  return m_forceRegTask;
214 }
215 
216 double ContactPoint::getMinNormalForce() const { return m_fMin; }
217 double ContactPoint::getMaxNormalForce() const { return m_fMax; }
218 
220  return m_motionTask;
221 }
222 
224  return m_motionTask.getConstraint();
225 }
226 
228  return m_forceInequality;
229 }
230 
232  return m_forceRegTask;
233 }
tsid::contacts::ContactPoint::m_weightForceRegTask
Vector3 m_weightForceRegTask
Definition: contacts/contact-point.hpp:116
demo_quadruped.v
v
Definition: demo_quadruped.py:80
ex_4_plan_LIPM_romeo.A
A
Definition: ex_4_plan_LIPM_romeo.py:110
tsid::contacts::ContactPoint::updateForceGeneratorMatrix
void updateForceGeneratorMatrix()
Definition: src/contacts/contact-point.cpp:111
tsid::contacts::ContactBase
Base template of a Contact.
Definition: contact-base.hpp:31
tsid::contacts::ContactPoint::Vector6
math::Vector6 Vector6
Definition: contacts/contact-point.hpp:35
test_Constraint.ub
ub
Definition: test_Constraint.py:13
pinocchio::DataTpl
PINOCCHIO_CHECK_INPUT_ARGUMENT
#define PINOCCHIO_CHECK_INPUT_ARGUMENT(...)
tsid::math::ConstraintEquality
Definition: math/constraint-equality.hpp:26
tsid::contacts::ContactPoint::getForceGeneratorMatrix
const Matrix & getForceGeneratorMatrix() override
Definition: src/contacts/contact-point.cpp:209
tsid::contacts::ContactPoint::ContactPoint
ContactPoint(const std::string &name, RobotWrapper &robot, const std::string &frameName, ConstRefVector contactNormal, const double frictionCoefficient, const double minNormalForce, const double maxNormalForce)
Definition: src/contacts/contact-point.cpp:29
skew.hpp
tsid::contacts::ContactPoint::n_force
unsigned int n_force() const override
Return the number of force variables.
Definition: src/contacts/contact-point.cpp:114
contact-point.hpp
tsid::contacts::ContactPoint::m_forceInequality
ConstraintInequality m_forceInequality
Definition: contacts/contact-point.hpp:112
B
B
tsid::contacts::ContactPoint::computeForceTask
const ConstraintInequality & computeForceTask(double t, ConstRefVector q, ConstRefVector v, const Data &data) override
Definition: src/contacts/contact-point.cpp:202
tsid::tasks::TaskSE3Equality::setMask
virtual void setMask(math::ConstRefVector mask) override
Definition: src/tasks/task-se3-equality.cpp:63
tsid::math::ConstraintBase
Abstract class representing a linear equality/inequality constraint. Equality constraints are represe...
Definition: constraint-base.hpp:35
tsid::contacts::ContactPoint::useLocalFrame
void useLocalFrame(bool local_frame)
Specifies if properties of the contact point and motion task are expressed in the local or local worl...
Definition: src/contacts/contact-point.cpp:57
tsid::contacts::ContactBase::Matrix
math::Matrix Matrix
Definition: contact-base.hpp:39
tsid::contacts::ContactPoint::setReference
void setReference(const SE3 &ref)
Definition: src/contacts/contact-point.cpp:191
ref
list ref
tsid::contacts::ContactPoint::m_Kp3
Vector m_Kp3
Definition: contacts/contact-point.hpp:118
setup.data
data
Definition: setup.in.py:48
demo_quadruped.robot
robot
Definition: demo_quadruped.py:51
tsid::math::ConstraintInequality::lowerBound
const Vector & lowerBound() const override
Definition: src/math/constraint-inequality.cpp:66
utils.hpp
tsid::contacts::ContactPoint::getMotionConstraint
const ConstraintBase & getMotionConstraint() const override
Definition: src/contacts/contact-point.cpp:223
tsid::tasks::TaskSE3Equality::compute
const ConstraintBase & compute(const double t, ConstRefVector q, ConstRefVector v, Data &data) override
Definition: src/tasks/task-se3-equality.cpp:149
test_Contact.Kp
Kp
Definition: test_Contact.py:44
tsid::tasks::TaskSE3Equality::getConstraint
const ConstraintBase & getConstraint() const override
Definition: src/tasks/task-se3-equality.cpp:141
f
f
tsid::math::ConstraintEquality::setVector
bool setVector(ConstRefVector b) override
Definition: src/math/constraint-equality.cpp:75
tsid::contacts::ContactPoint::m_motionTask
TaskSE3Equality m_motionTask
Definition: contacts/contact-point.hpp:111
tsid::contacts::ContactPoint::m_contactNormal
Vector3 m_contactNormal
Definition: contacts/contact-point.hpp:114
demo_quadruped.q
q
Definition: demo_quadruped.py:74
tsid::contacts::ContactPoint::m_Kd3
Vector m_Kd3
Definition: contacts/contact-point.hpp:118
tsid::contacts::ContactPoint::n_motion
unsigned int n_motion() const override
Return the number of motion constraints.
Definition: src/contacts/contact-point.cpp:113
tsid::math::ConstraintInequality::setUpperBound
bool setUpperBound(ConstRefVector ub) override
Definition: src/math/constraint-inequality.cpp:84
tsid::math::ConstraintInequality::setLowerBound
bool setLowerBound(ConstRefVector lb) override
Definition: src/math/constraint-inequality.cpp:80
tsid::contacts::ContactPoint::setMaxNormalForce
bool setMaxNormalForce(const double maxNormalForce) override
Definition: src/contacts/contact-point.cpp:173
t2
dictionary t2
tsid::contacts::ContactPoint::getNormalForce
double getNormalForce(ConstRefVector f) const override
Definition: src/contacts/contact-point.cpp:88
tsid::contacts::ContactPoint::computeForceRegularizationTask
const ConstraintEquality & computeForceRegularizationTask(double t, ConstRefVector q, ConstRefVector v, const Data &data) override
Definition: src/contacts/contact-point.cpp:211
tsid::contacts::ContactPoint::getMotionTask
const TaskSE3Equality & getMotionTask() const override
Definition: src/contacts/contact-point.cpp:219
test_Constraint.lb
float lb
Definition: test_Constraint.py:12
tsid::math::ConstraintInequality
Definition: math/constraint-inequality.hpp:26
demo_quadruped.contacts
int contacts
Definition: demo_quadruped.py:98
tsid::contacts::ContactPoint::setFrictionCoefficient
bool setFrictionCoefficient(const double frictionCoefficient)
Definition: src/contacts/contact-point.cpp:152
setup.name
name
Definition: setup.in.py:179
w
w
tsid::tasks::TaskSE3Equality::Kp
const Vector & Kp() const
Definition: src/tasks/task-se3-equality.cpp:75
tsid::contacts::ContactPoint::Vector
math::Vector Vector
Definition: contacts/contact-point.hpp:37
tsid::contacts::ContactPoint::setForceReference
void setForceReference(ConstRefVector &f_ref)
Definition: src/contacts/contact-point.cpp:184
tsid::contacts::ContactPoint::setContactNormal
bool setContactNormal(ConstRefVector contactNormal)
Definition: src/contacts/contact-point.cpp:142
tsid::contacts::ContactPoint::getForceRegularizationTask
const ConstraintEquality & getForceRegularizationTask() const override
Definition: src/contacts/contact-point.cpp:231
tsid::contacts::ContactPoint::m_contactPoints
Matrix3x m_contactPoints
Definition: contacts/contact-point.hpp:117
tsid::math::Vector
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
Definition: math/fwd.hpp:35
tsid::contacts::ContactPoint::computeMotionTask
const ConstraintBase & computeMotionTask(double t, ConstRefVector q, ConstRefVector v, Data &data) override
Definition: src/contacts/contact-point.cpp:195
tsid::contacts::ContactPoint::m_mu
double m_mu
Definition: contacts/contact-point.hpp:119
tsid::contacts::ContactPoint::setRegularizationTaskWeightVector
void setRegularizationTaskWeightVector(ConstRefVector &w)
Definition: src/contacts/contact-point.cpp:99
tsid::contacts::ContactPoint::getMaxNormalForce
double getMaxNormalForce() const override
Definition: src/contacts/contact-point.cpp:217
tsid::contacts::ContactBase::Matrix3x
math::Matrix3x Matrix3x
Definition: contact-base.hpp:40
tsid
Definition: bindings/python/constraint/constraint-bound.cpp:21
tsid::contacts::ContactPoint::Vector3
math::Vector3 Vector3
Definition: contacts/contact-point.hpp:36
tsid::contacts::ContactPoint::m_fMax
double m_fMax
Definition: contacts/contact-point.hpp:121
tsid::contacts::ContactPoint::updateForceRegularizationTask
void updateForceRegularizationTask()
Definition: src/contacts/contact-point.cpp:104
tsid::contacts::ContactPoint::getMinNormalForce
double getMinNormalForce() const override
Definition: src/contacts/contact-point.cpp:216
tsid::contacts::ContactPoint::m_forceRegTask
ConstraintEquality m_forceRegTask
Definition: contacts/contact-point.hpp:113
tsid::tasks::TaskSE3Equality::setReference
void setReference(TrajectorySample &ref)
Definition: src/tasks/task-se3-equality.cpp:91
tsid::robots::RobotWrapper
Wrapper for a robot based on pinocchio.
Definition: robots/robot-wrapper.hpp:37
tsid::tasks::TaskSE3Equality::dim
int dim() const override
Return the dimension of the task. \info should be overloaded in the child class.
Definition: src/tasks/task-se3-equality.cpp:73
tsid::contacts::ContactPoint::updateForceInequalityConstraints
void updateForceInequalityConstraints()
Definition: src/contacts/contact-point.cpp:61
tsid::tasks::TaskSE3Equality::Kd
const Vector & Kd() const
Definition: src/tasks/task-se3-equality.cpp:77
tsid::math::ConstraintInequality::upperBound
const Vector & upperBound() const override
Definition: src/math/constraint-inequality.cpp:67
test_Contact.Kd
int Kd
Definition: test_Contact.py:45
t
Transform3f t
tsid::contacts::ContactPoint::m_fRef
Vector3 m_fRef
Definition: contacts/contact-point.hpp:115
tsid::contacts::ContactPoint::SE3
pinocchio::SE3 SE3
Definition: contacts/contact-point.hpp:41
tsid::contacts::ContactPoint::Kp
const Vector & Kp()
Definition: src/contacts/contact-point.cpp:116
tsid::tasks::TaskSE3Equality
Definition: tasks/task-se3-equality.hpp:31
tsid::contacts::ContactPoint::getContactPoints
const Matrix3x & getContactPoints() const override
Definition: src/contacts/contact-point.cpp:95
tsid::tasks::TaskSE3Equality::useLocalFrame
void useLocalFrame(bool local_frame)
Specifies if the jacobian and desired acceloration should be expressed in the local frame or the loca...
Definition: src/tasks/task-se3-equality.cpp:145
tsid::contacts::ContactPoint::getForceConstraint
const ConstraintInequality & getForceConstraint() const override
Definition: src/contacts/contact-point.cpp:227
tsid::contacts::ContactPoint::m_forceGenMat
Matrix m_forceGenMat
Definition: contacts/contact-point.hpp:124
test_Contact.frameName
string frameName
Definition: test_Contact.py:29
demo_quadruped.contactNormal
contactNormal
Definition: demo_quadruped.py:29
tsid::contacts::ContactBase::ConstRefVector
math::ConstRefVector ConstRefVector
Definition: contact-base.hpp:38
tsid::contacts::ContactPoint::setMinNormalForce
bool setMinNormalForce(const double minNormalForce) override
Definition: src/contacts/contact-point.cpp:161
tsid::math::ConstraintBase::setMatrix
virtual bool setMatrix(ConstRefMatrix A)
Definition: constraint-base.cpp:39
tsid::contacts::ContactPoint::m_fMin
double m_fMin
Definition: contacts/contact-point.hpp:120
tsid::contacts::ContactPoint::Kd
const Vector & Kd()
Definition: src/contacts/contact-point.cpp:121


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