src/contacts/contact-two-frame-positions.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2023 MIPT
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& name, RobotWrapper& robot, const std::string& frameName1,
31  const std::string& frameName2, const double minNormalForce,
32  const double maxNormalForce)
34  m_motionTask(
35  name, robot, frameName1,
36  frameName2), // Actual motion task with type TaskTwoFramesEquality
37  m_forceInequality(name, 3, 3),
38  m_forceRegTask(name, 3, 3),
39  m_fMin(minNormalForce),
40  m_fMax(maxNormalForce) {
41  m_weightForceRegTask << 1, 1, 1;
42  m_forceGenMat.resize(3, 3);
43  m_fRef = Vector3::Zero();
44  m_contactPoints.resize(3, 1);
45  m_contactPoints.setZero();
49 
50  // This contact has forceGenMat as 3x3 identity matrix, so it can be used only
51  // for emulating a ball joint between two frames The forces calculated will
52  // have only linear part (rotation will be unconstrained) So we need to set
53  // the appropriate mask for motion task (which can take into account rotation
54  // but we don't need it)
55  math::Vector motion_mask(6);
56  motion_mask << 1., 1., 1., 0., 0., 0.;
57  m_motionTask.setMask(motion_mask);
58 }
59 
61  Matrix B = Matrix::Identity(3, 3); // Force "gluing" two frames together can
62  // be arbitrary in sign/direction
63  Vector lb = m_fMin * Vector::Ones(3);
64  Vector ub = m_fMax * Vector::Ones(3);
65 
69 }
70 
72  return 0.0;
73 }
74 
76  return m_contactPoints;
77 }
78 
80  ConstRefVector& w) {
83 }
84 
86  typedef Eigen::Matrix<double, 3, 3> Matrix3;
87  Matrix3 A = Matrix3::Zero();
88  A.diagonal() = m_weightForceRegTask;
91 }
92 
94  m_forceGenMat.setIdentity();
95 }
96 
97 unsigned int ContactTwoFramePositions::n_motion() const {
98  return m_motionTask.dim();
99 }
100 unsigned int ContactTwoFramePositions::n_force() const { return 3; }
101 
103  m_Kp3 = m_motionTask.Kp().head<3>();
104  return m_Kp3;
105 }
106 
108  m_Kd3 = m_motionTask.Kd().head<3>();
109  return m_Kd3;
110 }
111 
113  assert(Kp.size() == 3);
114  Vector6 Kp6;
115  Kp6.head<3>() = Kp;
116  m_motionTask.Kp(Kp6);
117 }
118 
120  assert(Kd.size() == 3);
121  Vector6 Kd6;
122  Kd6.head<3>() = Kd;
123  m_motionTask.Kd(Kd6);
124 }
125 
127  return true;
128 }
129 
131  const double frictionCoefficient) {
132  return true;
133 }
134 
135 bool ContactTwoFramePositions::setMinNormalForce(const double minNormalForce) {
136  m_fMin = minNormalForce;
138  return true;
139 }
140 
141 bool ContactTwoFramePositions::setMaxNormalForce(const double maxNormalForce) {
142  m_fMax = maxNormalForce;
144  return true;
145 }
146 
148  m_fRef = f_ref;
150 }
151 
153  const double t, ConstRefVector q, ConstRefVector v, Data& data) {
154  return m_motionTask.compute(t, q, v, data);
155 }
156 
158  const double, ConstRefVector, ConstRefVector, const Data&) {
159  return m_forceInequality;
160 }
161 
163  return m_forceGenMat;
164 }
165 
166 const ConstraintEquality&
170  const Data&) {
171  return m_forceRegTask;
172 }
173 
176 
178  return m_motionTask;
179 }
180 
182  return m_motionTask.getConstraint();
183 }
184 
186  const {
187  return m_forceInequality;
188 }
189 
191  const {
192  return m_forceRegTask;
193 }
demo_quadruped.v
v
Definition: demo_quadruped.py:80
tsid::contacts::ContactTwoFramePositions::ContactTwoFramePositions
ContactTwoFramePositions(const std::string &name, RobotWrapper &robot, const std::string &frameName1, const std::string &frameName2, const double minNormalForce, const double maxNormalForce)
Definition: src/contacts/contact-two-frame-positions.cpp:29
ex_4_plan_LIPM_romeo.A
A
Definition: ex_4_plan_LIPM_romeo.py:110
tsid::contacts::ContactTwoFramePositions::updateForceInequalityConstraints
void updateForceInequalityConstraints()
Definition: src/contacts/contact-two-frame-positions.cpp:60
tsid::contacts::ContactBase
Base template of a Contact.
Definition: contact-base.hpp:31
tsid::contacts::ContactTwoFramePositions::getForceGeneratorMatrix
const Matrix & getForceGeneratorMatrix() override
Definition: src/contacts/contact-two-frame-positions.cpp:162
test_Constraint.ub
ub
Definition: test_Constraint.py:13
pinocchio::DataTpl
tsid::contacts::ContactTwoFramePositions::Kd
const Vector & Kd()
Definition: src/contacts/contact-two-frame-positions.cpp:107
tsid::contacts::ContactTwoFramePositions::computeMotionTask
const ConstraintBase & computeMotionTask(double t, ConstRefVector q, ConstRefVector v, Data &data) override
Definition: src/contacts/contact-two-frame-positions.cpp:152
tsid::math::ConstraintEquality
Definition: math/constraint-equality.hpp:26
tsid::contacts::ContactTwoFramePositions::m_forceRegTask
ConstraintEquality m_forceRegTask
Definition: contacts/contact-two-frame-positions.hpp:104
skew.hpp
tsid::contacts::ContactTwoFramePositions::getMotionConstraint
const ConstraintBase & getMotionConstraint() const override
Definition: src/contacts/contact-two-frame-positions.cpp:181
tsid::contacts::ContactTwoFramePositions::m_fMin
double m_fMin
Definition: contacts/contact-two-frame-positions.hpp:109
tsid::contacts::ContactTwoFramePositions::updateForceGeneratorMatrix
void updateForceGeneratorMatrix()
Definition: src/contacts/contact-two-frame-positions.cpp:93
B
B
tsid::tasks::TaskTwoFramesEquality::Kd
const Vector & Kd() const
Definition: src/tasks/task-two-frames-equality.cpp:79
tsid::math::ConstraintBase
Abstract class representing a linear equality/inequality constraint. Equality constraints are represe...
Definition: constraint-base.hpp:35
tsid::contacts::ContactTwoFramePositions::n_force
unsigned int n_force() const override
Return the number of force variables.
Definition: src/contacts/contact-two-frame-positions.cpp:100
tsid::contacts::ContactBase::Matrix
math::Matrix Matrix
Definition: contact-base.hpp:39
tsid::contacts::ContactTwoFramePositions::m_forceInequality
ConstraintInequality m_forceInequality
Definition: contacts/contact-two-frame-positions.hpp:103
setup.data
data
Definition: setup.in.py:48
tsid::contacts::ContactTwoFramePositions::setForceReference
void setForceReference(ConstRefVector &f_ref)
Definition: src/contacts/contact-two-frame-positions.cpp:147
demo_quadruped.robot
robot
Definition: demo_quadruped.py:51
tsid::contacts::ContactTwoFramePositions::getMinNormalForce
double getMinNormalForce() const override
Definition: src/contacts/contact-two-frame-positions.cpp:174
utils.hpp
tsid::contacts::ContactTwoFramePositions::m_forceGenMat
Matrix m_forceGenMat
Definition: contacts/contact-two-frame-positions.hpp:113
test_Contact.Kp
Kp
Definition: test_Contact.py:44
tsid::contacts::ContactTwoFramePositions::m_motionTask
TaskTwoFramesEquality m_motionTask
Definition: contacts/contact-two-frame-positions.hpp:102
tsid::contacts::ContactTwoFramePositions::setMaxNormalForce
bool setMaxNormalForce(const double maxNormalForce) override
Definition: src/contacts/contact-two-frame-positions.cpp:141
tsid::tasks::TaskTwoFramesEquality::getConstraint
const ConstraintBase & getConstraint() const override
Definition: src/tasks/task-two-frames-equality.cpp:111
tsid::contacts::ContactTwoFramePositions::getForceConstraint
const ConstraintInequality & getForceConstraint() const override
Definition: src/contacts/contact-two-frame-positions.cpp:185
tsid::math::ConstraintEquality::setVector
bool setVector(ConstRefVector b) override
Definition: src/math/constraint-equality.cpp:75
tsid::tasks::TaskTwoFramesEquality::setMask
virtual void setMask(math::ConstRefVector mask) override
Definition: src/tasks/task-two-frames-equality.cpp:65
tsid::tasks::TaskTwoFramesEquality::Kp
const Vector & Kp() const
Definition: src/tasks/task-two-frames-equality.cpp:77
tsid::contacts::ContactTwoFramePositions::m_weightForceRegTask
Vector3 m_weightForceRegTask
Definition: contacts/contact-two-frame-positions.hpp:106
demo_quadruped.q
q
Definition: demo_quadruped.py:74
tsid::contacts::ContactTwoFramePositions::m_Kp3
Vector m_Kp3
Definition: contacts/contact-two-frame-positions.hpp:108
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::ContactTwoFramePositions::getNormalForce
double getNormalForce(ConstRefVector f) const override
Definition: src/contacts/contact-two-frame-positions.cpp:71
tsid::contacts::ContactTwoFramePositions::m_fRef
Vector3 m_fRef
Definition: contacts/contact-two-frame-positions.hpp:105
tsid::contacts::ContactTwoFramePositions::updateForceRegularizationTask
void updateForceRegularizationTask()
Definition: src/contacts/contact-two-frame-positions.cpp:85
tsid::contacts::ContactTwoFramePositions::computeForceRegularizationTask
const ConstraintEquality & computeForceRegularizationTask(double t, ConstRefVector q, ConstRefVector v, const Data &data) override
Definition: src/contacts/contact-two-frame-positions.cpp:167
tsid::contacts::ContactTwoFramePositions::m_fMax
double m_fMax
Definition: contacts/contact-two-frame-positions.hpp:110
tsid::contacts::ContactTwoFramePositions::m_Kd3
Vector m_Kd3
Definition: contacts/contact-two-frame-positions.hpp:108
tsid::contacts::ContactTwoFramePositions::getMaxNormalForce
double getMaxNormalForce() const override
Definition: src/contacts/contact-two-frame-positions.cpp:175
test_Constraint.lb
float lb
Definition: test_Constraint.py:12
tsid::contacts::ContactTwoFramePositions::setFrictionCoefficient
bool setFrictionCoefficient(const double frictionCoefficient)
Definition: src/contacts/contact-two-frame-positions.cpp:130
tsid::math::ConstraintInequality
Definition: math/constraint-inequality.hpp:26
demo_quadruped.contacts
int contacts
Definition: demo_quadruped.py:98
setup.name
name
Definition: setup.in.py:179
w
w
tsid::contacts::ContactTwoFramePositions::setRegularizationTaskWeightVector
void setRegularizationTaskWeightVector(ConstRefVector &w)
Definition: src/contacts/contact-two-frame-positions.cpp:79
contact-two-frame-positions.hpp
tsid::math::Vector
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
Definition: math/fwd.hpp:35
tsid::contacts::ContactTwoFramePositions::getContactPoints
const Matrix3x & getContactPoints() const override
Definition: src/contacts/contact-two-frame-positions.cpp:75
tsid::contacts::ContactTwoFramePositions::setMinNormalForce
bool setMinNormalForce(const double minNormalForce) override
Definition: src/contacts/contact-two-frame-positions.cpp:135
tsid::contacts::ContactTwoFramePositions::getMotionTask
const TaskTwoFramesEquality & getMotionTask() const override
Definition: src/contacts/contact-two-frame-positions.cpp:177
tsid::contacts::ContactTwoFramePositions::Vector6
math::Vector6 Vector6
Definition: contacts/contact-two-frame-positions.hpp:36
tsid::contacts::ContactTwoFramePositions::setContactNormal
bool setContactNormal(ConstRefVector contactNormal)
Definition: src/contacts/contact-two-frame-positions.cpp:126
tsid::contacts::ContactBase::Matrix3x
math::Matrix3x Matrix3x
Definition: contact-base.hpp:40
tsid
Definition: bindings/python/constraint/constraint-bound.cpp:21
tsid::contacts::ContactTwoFramePositions::Vector
math::Vector Vector
Definition: contacts/contact-two-frame-positions.hpp:38
tsid::contacts::ContactTwoFramePositions::m_contactPoints
Matrix3x m_contactPoints
Definition: contacts/contact-two-frame-positions.hpp:107
tsid::robots::RobotWrapper
Wrapper for a robot based on pinocchio.
Definition: robots/robot-wrapper.hpp:37
tsid::contacts::ContactTwoFramePositions::n_motion
unsigned int n_motion() const override
Return the number of motion constraints.
Definition: src/contacts/contact-two-frame-positions.cpp:97
tsid::contacts::ContactTwoFramePositions::getForceRegularizationTask
const ConstraintEquality & getForceRegularizationTask() const override
Definition: src/contacts/contact-two-frame-positions.cpp:190
test_Contact.Kd
int Kd
Definition: test_Contact.py:45
t
Transform3f t
tsid::contacts::ContactTwoFramePositions::Kp
const Vector & Kp()
Definition: src/contacts/contact-two-frame-positions.cpp:102
demo_quadruped.contactNormal
contactNormal
Definition: demo_quadruped.py:29
tsid::contacts::ContactBase::ConstRefVector
math::ConstRefVector ConstRefVector
Definition: contact-base.hpp:38
tsid::tasks::TaskTwoFramesEquality::compute
const ConstraintBase & compute(const double t, ConstRefVector q, ConstRefVector v, Data &data) override
Definition: src/tasks/task-two-frames-equality.cpp:115
tsid::contacts::ContactTwoFramePositions::computeForceTask
const ConstraintInequality & computeForceTask(double t, ConstRefVector q, ConstRefVector v, const Data &data) override
Definition: src/contacts/contact-two-frame-positions.cpp:157
tsid::tasks::TaskTwoFramesEquality::dim
int dim() const override
Return the dimension of the task. \info should be overloaded in the child class.
Definition: src/tasks/task-two-frames-equality.cpp:75
tsid::math::ConstraintBase::setMatrix
virtual bool setMatrix(ConstRefMatrix A)
Definition: constraint-base.cpp:39
tsid::tasks::TaskTwoFramesEquality
Definition: tasks/task-two-frames-equality.hpp:31


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