src/contacts/contact-6d.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, ConstRefMatrix contactPoints,
32  const double frictionCoefficient,
33  const double minNormalForce, const double maxNormalForce)
35  m_motionTask(name, robot, frameName),
36  m_forceInequality(name, 17, 12),
37  m_forceRegTask(name, 6, 12),
38  m_contactPoints(contactPoints),
39  m_contactNormal(contactNormal),
40  m_mu(frictionCoefficient),
41  m_fMin(minNormalForce),
42  m_fMax(maxNormalForce) {
43  this->init();
44 }
45 
47  const std::string& frameName, ConstRefMatrix contactPoints,
49  const double frictionCoefficient,
50  const double minNormalForce, const double maxNormalForce,
51  const double)
53  m_motionTask(name, robot, frameName),
54  m_forceInequality(name, 17, 12),
55  m_forceRegTask(name, 6, 12),
56  m_contactPoints(contactPoints),
57  m_contactNormal(contactNormal),
58  m_mu(frictionCoefficient),
59  m_fMin(minNormalForce),
60  m_fMax(maxNormalForce) {
61  std::cout << "[Contact6d] The constructor with forceRegWeight is deprecated "
62  "now. forceRegWeight should now be specified when calling "
63  "addRigidContact()\n";
64  this->init();
65 }
66 
68  m_weightForceRegTask << 1, 1, 1e-3, 2, 2, 2;
69  m_forceGenMat.resize(6, 12);
70  m_fRef = Vector6::Zero();
74 }
75 
77  Vector3 t1, t2;
78  const int n_in = 4 * 4 + 1;
79  const int n_var = 3 * 4;
80  Matrix B = Matrix::Zero(n_in, n_var);
81  Vector lb = -1e10 * Vector::Ones(n_in);
82  Vector ub = Vector::Zero(n_in);
83  t1 = m_contactNormal.cross(Vector3::UnitX());
84  if (t1.norm() < 1e-5) t1 = m_contactNormal.cross(Vector3::UnitY());
85  t2 = m_contactNormal.cross(t1);
86  t1.normalize();
87  t2.normalize();
88 
89  B.block<1, 3>(0, 0) = (-t1 - m_mu * m_contactNormal).transpose();
90  B.block<1, 3>(1, 0) = (t1 - m_mu * m_contactNormal).transpose();
91  B.block<1, 3>(2, 0) = (-t2 - m_mu * m_contactNormal).transpose();
92  B.block<1, 3>(3, 0) = (t2 - m_mu * m_contactNormal).transpose();
93 
94  for (int i = 1; i < 4; i++) {
95  B.block<4, 3>(4 * i, 3 * i) = B.topLeftCorner<4, 3>();
96  }
97 
98  B.block<1, 3>(n_in - 1, 0) = m_contactNormal.transpose();
99  B.block<1, 3>(n_in - 1, 3) = m_contactNormal.transpose();
100  B.block<1, 3>(n_in - 1, 6) = m_contactNormal.transpose();
101  B.block<1, 3>(n_in - 1, 9) = m_contactNormal.transpose();
102  ub(n_in - 1) = m_fMax;
103  lb(n_in - 1) = m_fMin;
104 
108 }
109 
112  f.size() == n_force(),
113  "f needs to contain " + std::to_string(n_force()) + " rows");
114  double n = 0.0;
115  for (int i = 0; i < 4; i++) n += m_contactNormal.dot(f.segment<3>(i * 3));
116  return n;
117 }
118 
122 }
123 
125  typedef Eigen::Matrix<double, 6, 6> Matrix6;
126  Matrix6 A = Matrix6::Zero();
127  A.diagonal() = m_weightForceRegTask;
130 }
131 
133  assert(m_contactPoints.rows() == 3);
134  assert(m_contactPoints.cols() == 4);
135  for (int i = 0; i < 4; i++) {
136  m_forceGenMat.block<3, 3>(0, i * 3).setIdentity();
137  m_forceGenMat.block<3, 3>(3, i * 3) =
139  }
140 }
141 
142 unsigned int Contact6d::n_motion() const { return 6; }
143 unsigned int Contact6d::n_force() const { return 12; }
144 
145 const Vector& Contact6d::Kp() const { return m_motionTask.Kp(); }
146 const Vector& Contact6d::Kd() const { return m_motionTask.Kd(); }
149 
151  PINOCCHIO_CHECK_INPUT_ARGUMENT(contactPoints.rows() == 3,
152  "The number of rows needs to be 3");
153  PINOCCHIO_CHECK_INPUT_ARGUMENT(contactPoints.cols() == 4,
154  "The number of cols needs to be 4");
155  if (contactPoints.rows() != 3 || contactPoints.cols() != 4) return false;
156  m_contactPoints = contactPoints;
158  return true;
159 }
160 
162 
165  contactNormal.size() == 3,
166  "The size of the contactNormal vector needs to equal 3");
167  if (contactNormal.size() != 3) return false;
170  return true;
171 }
172 
173 bool Contact6d::setFrictionCoefficient(const double frictionCoefficient) {
175  frictionCoefficient > 0.0,
176  "The friction coefficient needs to be positive");
177  if (frictionCoefficient <= 0.0) return false;
178  m_mu = frictionCoefficient;
180  return true;
181 }
182 
183 bool Contact6d::setMinNormalForce(const double minNormalForce) {
185  minNormalForce > 0.0 && minNormalForce <= m_fMax,
186  "The minimal normal force needs to be greater than 0 and less than or "
187  "equal to the maximal force");
188  if (minNormalForce <= 0.0 || minNormalForce > m_fMax) return false;
189  m_fMin = minNormalForce;
191  lb(lb.size() - 1) = m_fMin;
192  return true;
193 }
194 
195 bool Contact6d::setMaxNormalForce(const double maxNormalForce) {
196  PINOCCHIO_CHECK_INPUT_ARGUMENT(maxNormalForce >= m_fMin,
197  "The maximal force needs to be greater than "
198  "or equal to the minimal force");
199  if (maxNormalForce < m_fMin) return false;
200  m_fMax = maxNormalForce;
202  ub(ub.size() - 1) = m_fMax;
203  return true;
204 }
205 
207  m_fRef = f_ref;
209 }
210 
212 
216  Data& data) {
217  return m_motionTask.compute(t, q, v, data);
218 }
219 
223  const Data&) {
224  return m_forceInequality;
225 }
226 
228 
230  const double, ConstRefVector, ConstRefVector, const Data&) {
231  return m_forceRegTask;
232 }
233 
234 double Contact6d::getMinNormalForce() const { return m_fMin; }
235 double Contact6d::getMaxNormalForce() const { return m_fMax; }
236 
238 
240  return m_motionTask.getConstraint();
241 }
242 
244  return m_forceInequality;
245 }
246 
248  return m_forceRegTask;
249 }
tsid::contacts::Contact6d::getMinNormalForce
double getMinNormalForce() const override
Definition: src/contacts/contact-6d.cpp:234
demo_quadruped.v
v
Definition: demo_quadruped.py:80
tsid::contacts::Contact6d::getContactPoints
const Matrix3x & getContactPoints() const override
Definition: src/contacts/contact-6d.cpp:161
ex_4_plan_LIPM_romeo.A
A
Definition: ex_4_plan_LIPM_romeo.py:110
tsid::contacts::ContactBase
Base template of a Contact.
Definition: contact-base.hpp:31
tsid::contacts::Contact6d::Vector3
math::Vector3 Vector3
Definition: contacts/contact-6d.hpp:37
tsid::contacts::Contact6d::updateForceRegularizationTask
void updateForceRegularizationTask()
Definition: src/contacts/contact-6d.cpp:124
test_Constraint.ub
ub
Definition: test_Constraint.py:13
pinocchio::DataTpl
tsid::contacts::Contact6d::computeForceRegularizationTask
const ConstraintEquality & computeForceRegularizationTask(double t, ConstRefVector q, ConstRefVector v, const Data &data) override
Definition: src/contacts/contact-6d.cpp:229
PINOCCHIO_CHECK_INPUT_ARGUMENT
#define PINOCCHIO_CHECK_INPUT_ARGUMENT(...)
tsid::math::ConstraintEquality
Definition: math/constraint-equality.hpp:26
tsid::contacts::Contact6d::setReference
void setReference(const SE3 &ref)
Definition: src/contacts/contact-6d.cpp:211
skew.hpp
tsid::contacts::Contact6d::m_contactNormal
Vector3 m_contactNormal
Definition: contacts/contact-6d.hpp:114
B
B
tsid::contacts::Contact6d::m_fMin
double m_fMin
Definition: contacts/contact-6d.hpp:118
tsid::math::ConstraintBase
Abstract class representing a linear equality/inequality constraint. Equality constraints are represe...
Definition: constraint-base.hpp:35
tsid::contacts::ContactBase::Matrix
math::Matrix Matrix
Definition: contact-base.hpp:39
i
int i
ref
list ref
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::Contact6d::m_fRef
Vector6 m_fRef
Definition: contacts/contact-6d.hpp:115
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
tsid::contacts::Contact6d::m_forceGenMat
Matrix m_forceGenMat
Definition: contacts/contact-6d.hpp:120
tsid::contacts::Contact6d::getNormalForce
double getNormalForce(ConstRefVector f) const override
Definition: src/contacts/contact-6d.cpp:110
tsid::contacts::Contact6d::computeMotionTask
const ConstraintBase & computeMotionTask(double t, ConstRefVector q, ConstRefVector v, Data &data) override
Definition: src/contacts/contact-6d.cpp:213
tsid::contacts::Contact6d::m_mu
double m_mu
Definition: contacts/contact-6d.hpp:117
tsid::contacts::Contact6d::getMotionTask
const TaskSE3Equality & getMotionTask() const override
Definition: src/contacts/contact-6d.cpp:237
f
f
tsid::contacts::Contact6d::updateForceInequalityConstraints
void updateForceInequalityConstraints()
Definition: src/contacts/contact-6d.cpp:76
tsid::math::ConstraintEquality::setVector
bool setVector(ConstRefVector b) override
Definition: src/math/constraint-equality.cpp:75
tsid::contacts::Contact6d::m_forceInequality
ConstraintInequality m_forceInequality
Definition: contacts/contact-6d.hpp:111
tsid::contacts::Contact6d::setRegularizationTaskWeightVector
void setRegularizationTaskWeightVector(ConstRefVector &w)
Definition: src/contacts/contact-6d.cpp:119
pinocchio::skew
Eigen::Matrix< typename D::Scalar, 3, 3, PINOCCHIO_EIGEN_PLAIN_TYPE(D)::Options > skew(const Eigen::MatrixBase< D > &v)
tsid::contacts::Contact6d::setMinNormalForce
bool setMinNormalForce(double minNormalForce) override
Definition: src/contacts/contact-6d.cpp:183
tsid::contacts::Contact6d::m_contactPoints
Matrix3x m_contactPoints
Definition: contacts/contact-6d.hpp:113
tsid::contacts::Contact6d::setContactPoints
bool setContactPoints(ConstRefMatrix contactPoints)
Definition: src/contacts/contact-6d.cpp:150
demo_quadruped.q
q
Definition: demo_quadruped.py:74
tsid::contacts::Contact6d::init
void init()
Definition: src/contacts/contact-6d.cpp:67
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::Contact6d::Contact6d
Contact6d(const std::string &name, RobotWrapper &robot, const std::string &frameName, ConstRefMatrix contactPoints, ConstRefVector contactNormal, const double frictionCoefficient, const double minNormalForce, const double maxNormalForce)
Definition: src/contacts/contact-6d.cpp:29
t2
dictionary t2
tsid::contacts::Contact6d::Matrix3x
math::Matrix3x Matrix3x
Definition: contacts/contact-6d.hpp:35
tsid::contacts::Contact6d::m_forceRegTask
ConstraintEquality m_forceRegTask
Definition: contacts/contact-6d.hpp:112
tsid::contacts::Contact6d::updateForceGeneratorMatrix
void updateForceGeneratorMatrix()
Definition: src/contacts/contact-6d.cpp:132
test_Constraint.lb
float lb
Definition: test_Constraint.py:12
tsid::contacts::Contact6d::Vector
math::Vector Vector
Definition: contacts/contact-6d.hpp:38
tsid::math::ConstraintInequality
Definition: math/constraint-inequality.hpp:26
tsid::contacts::Contact6d::n_motion
unsigned int n_motion() const override
Return the number of motion constraints.
Definition: src/contacts/contact-6d.cpp:142
demo_quadruped.contacts
int contacts
Definition: demo_quadruped.py:98
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::Contact6d::getMaxNormalForce
double getMaxNormalForce() const override
Definition: src/contacts/contact-6d.cpp:235
tsid::contacts::Contact6d::m_motionTask
TaskSE3Equality m_motionTask
Definition: contacts/contact-6d.hpp:110
tsid::contacts::Contact6d::setFrictionCoefficient
bool setFrictionCoefficient(double frictionCoefficient)
Definition: src/contacts/contact-6d.cpp:173
tsid::contacts::Contact6d::getForceGeneratorMatrix
const Matrix & getForceGeneratorMatrix() override
Definition: src/contacts/contact-6d.cpp:227
tsid::contacts::Contact6d::n_force
unsigned int n_force() const override
Return the number of force variables.
Definition: src/contacts/contact-6d.cpp:143
tsid::contacts::Contact6d::setMaxNormalForce
bool setMaxNormalForce(double maxNormalForce) override
Definition: src/contacts/contact-6d.cpp:195
tsid::contacts::Contact6d::m_weightForceRegTask
Vector6 m_weightForceRegTask
Definition: contacts/contact-6d.hpp:116
tsid::contacts::Contact6d::setContactNormal
bool setContactNormal(ConstRefVector contactNormal)
Definition: src/contacts/contact-6d.cpp:163
tsid
Definition: bindings/python/constraint/constraint-bound.cpp:21
contact-6d.hpp
tsid::contacts::Contact6d::getForceRegularizationTask
const ConstraintEquality & getForceRegularizationTask() const override
Definition: src/contacts/contact-6d.cpp:247
tsid::contacts::Contact6d::setForceReference
void setForceReference(ConstRefVector &f_ref)
Definition: src/contacts/contact-6d.cpp:206
tsid::contacts::Contact6d::getForceConstraint
const ConstraintInequality & getForceConstraint() const override
Definition: src/contacts/contact-6d.cpp:243
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::contacts::Contact6d::Kd
const Vector & Kd() const
Definition: src/contacts/contact-6d.cpp:146
tsid::contacts::Contact6d::ConstRefVector
math::ConstRefVector ConstRefVector
Definition: contacts/contact-6d.hpp:34
tsid::tasks::TaskSE3Equality::Kd
const Vector & Kd() const
Definition: src/tasks/task-se3-equality.cpp:77
tsid::contacts::Contact6d::computeForceTask
const ConstraintInequality & computeForceTask(double t, ConstRefVector q, ConstRefVector v, const Data &data) override
Definition: src/contacts/contact-6d.cpp:220
tsid::math::ConstRefMatrix
const typedef Eigen::Ref< const Matrix > ConstRefMatrix
Definition: math/fwd.hpp:51
tsid::contacts::Contact6d::SE3
pinocchio::SE3 SE3
Definition: contacts/contact-6d.hpp:42
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::tasks::TaskSE3Equality
Definition: tasks/task-se3-equality.hpp:31
test_Contact.frameName
string frameName
Definition: test_Contact.py:29
demo_quadruped.contactNormal
contactNormal
Definition: demo_quadruped.py:29
tsid::contacts::Contact6d::m_fMax
double m_fMax
Definition: contacts/contact-6d.hpp:119
tsid::contacts::Contact6d::Kp
const Vector & Kp() const
Definition: src/contacts/contact-6d.cpp:145
n
Vec3f n
tsid::math::ConstraintBase::setMatrix
virtual bool setMatrix(ConstRefMatrix A)
Definition: constraint-base.cpp:39
tsid::contacts::Contact6d::getMotionConstraint
const ConstraintBase & getMotionConstraint() const override
Definition: src/contacts/contact-6d.cpp:239


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