src/tasks/task-two-frames-equality.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"
21 
22 namespace tsid {
23 namespace tasks {
24 using namespace std;
25 using namespace math;
26 using namespace trajectories;
27 using namespace pinocchio;
28 
31  const std::string& frameName1,
32  const std::string& frameName2)
33  : TaskMotion(name, robot),
34  m_frame_name1(frameName1),
35  m_frame_name2(frameName2),
36  m_constraint(name, 6, robot.nv()) {
37  assert(m_robot.model().existFrame(frameName1));
38  assert(m_robot.model().existFrame(frameName2));
39  m_frame_id1 = m_robot.model().getFrameId(frameName1);
40  m_frame_id2 = m_robot.model().getFrameId(frameName2);
41 
42  m_v_ref.setZero();
43  m_a_ref.setZero();
44  m_wMl1.setIdentity();
45  m_wMl2.setIdentity();
46  m_p_error_vec.setZero(6);
47  m_v_error_vec.setZero(6);
48  m_p.resize(12);
49  m_v.resize(6);
50  m_p_ref.resize(12);
51  m_v_ref_vec.resize(6);
52  m_Kp.setZero(6);
53  m_Kd.setZero(6);
54  m_a_des.setZero(6);
55  m_J1.setZero(6, robot.nv());
56  m_J2.setZero(6, robot.nv());
57  m_J1_rotated.setZero(6, robot.nv());
58  m_J2_rotated.setZero(6, robot.nv());
59 
60  m_mask.resize(6);
61  m_mask.fill(1.);
62  setMask(m_mask);
63 }
64 
66  TaskMotion::setMask(mask);
67  int n = dim();
68  m_constraint.resize(n, (unsigned int)m_J1.cols());
69  m_p_error_masked_vec.resize(n);
70  m_v_error_masked_vec.resize(n);
71  m_drift_masked.resize(n);
72  m_a_des_masked.resize(n);
73 }
74 
75 int TaskTwoFramesEquality::dim() const { return (int)m_mask.sum(); }
76 
77 const Vector& TaskTwoFramesEquality::Kp() const { return m_Kp; }
78 
79 const Vector& TaskTwoFramesEquality::Kd() const { return m_Kd; }
80 
82  assert(Kp.size() == 6);
83  m_Kp = Kp;
84 }
85 
87  assert(Kd.size() == 6);
88  m_Kd = Kd;
89 }
90 
92  return m_p_error_masked_vec;
93 }
94 
96  return m_v_error_masked_vec;
97 }
98 
100  return m_a_des_masked;
101 }
102 
104  return m_constraint.matrix() * dv + m_drift_masked;
105 }
106 
108 
110 
112  return m_constraint;
113 }
114 
118  Data& data) {
119  // Calculating task with formulation: [J1 - J2 0 0] dv = [-J1dot*v +
120  // J2dot*v]
121 
122  SE3 oMi1, oMi2;
123  Motion v_frame1, v_frame2;
124  Motion m_drift1, m_drift2;
131 
132  // Transformations from local to local-world-aligned frame (thus only rotation
133  // is used)
134  m_wMl1.rotation(oMi1.rotation());
135  m_wMl2.rotation(oMi2.rotation());
136 
139 
140  // Doing all calculations in local-world-aligned frame
141  errorInSE3(oMi1, oMi2, m_p_error); // pos err in local oMi1 frame
142  m_p_error_vec = m_wMl1.toActionMatrix() *
143  m_p_error.toVector(); // pos err in local-world-aligned frame
144 
145  m_v_error = m_wMl2.act(v_frame2) -
146  m_wMl1.act(v_frame1); // vel err in local-world-aligned frame
147 
148  // desired acc in local-world-aligned frame
149  m_a_des = m_Kp.cwiseProduct(m_p_error_vec) +
150  m_Kd.cwiseProduct(m_v_error.toVector());
151 
152  m_v_error_vec = m_v_error.toVector();
153 
154  m_drift = (m_wMl1.act(m_drift1) - m_wMl2.act(m_drift2));
155 
156  m_J1_rotated.noalias() =
157  m_wMl1.toActionMatrix() *
158  m_J1; // Use an explicit temporary m_J_rotated to avoid allocations
159  m_J1 = m_J1_rotated;
160 
161  m_J2_rotated.noalias() = m_wMl2.toActionMatrix() * m_J2;
162  m_J2 = m_J2_rotated;
163 
164  int idx = 0;
165  for (int i = 0; i < 6; i++) {
166  if (m_mask(i) != 1.) continue;
167 
168  m_constraint.matrix().row(idx) = m_J1.row(i) - m_J2.row(i);
169  m_constraint.vector().row(idx) = (m_a_des - m_drift.toVector()).row(i);
170  m_a_des_masked(idx) = m_a_des(i);
171  m_drift_masked(idx) = m_drift.toVector()(i);
174 
175  idx += 1;
176  }
177 
178  return m_constraint;
179 }
180 } // namespace tasks
181 } // namespace tsid
tsid::tasks::TaskTwoFramesEquality::m_v_ref_vec
Vector m_v_ref_vec
Definition: tasks/task-two-frames-equality.hpp:107
tsid::tasks::TaskTwoFramesEquality::Kp
void Kp(ConstRefVector Kp)
Definition: src/tasks/task-two-frames-equality.cpp:81
tsid::tasks::TaskTwoFramesEquality::m_a_des
Vector m_a_des
Definition: tasks/task-two-frames-equality.hpp:112
tsid::tasks::TaskTwoFramesEquality::m_Kp
Vector m_Kp
Definition: tasks/task-two-frames-equality.hpp:110
tsid::robots::RobotWrapper::framePosition
SE3 framePosition(const Data &data, const Model::FrameIndex index) const
Definition: src/robots/robot-wrapper.cpp:216
tsid::tasks::TaskTwoFramesEquality::m_p
Vector m_p
Definition: tasks/task-two-frames-equality.hpp:106
tsid::robots::RobotWrapper::frameVelocity
Motion frameVelocity(const Data &data, const Model::FrameIndex index) const
Definition: src/robots/robot-wrapper.cpp:235
pinocchio::DataTpl
tsid::tasks::TaskTwoFramesEquality::m_a_ref
Motion m_a_ref
Definition: tasks/task-two-frames-equality.hpp:108
tsid::tasks::TaskTwoFramesEquality::m_v_ref
Motion m_v_ref
Definition: tasks/task-two-frames-equality.hpp:108
tsid::math::errorInSE3
void errorInSE3(const pinocchio::SE3 &M, const pinocchio::SE3 &Mdes, pinocchio::Motion &error)
Definition: src/math/utils.cpp:46
dv
dv
tsid::math::ConstraintEquality::vector
const Vector & vector() const override
Definition: src/math/constraint-equality.cpp:55
tsid::tasks::TaskTwoFramesEquality::Kd
const Vector & Kd() const
Definition: src/tasks/task-two-frames-equality.cpp:79
tsid::tasks::TaskTwoFramesEquality::position_error
const Vector & position_error() const override
Definition: src/tasks/task-two-frames-equality.cpp:91
tsid::math::ConstraintBase
Abstract class representing a linear equality/inequality constraint. Equality constraints are represe...
Definition: constraint-base.hpp:35
tsid::tasks::TaskTwoFramesEquality::m_v_error_masked_vec
Vector m_v_error_masked_vec
Definition: tasks/task-two-frames-equality.hpp:105
tsid::tasks::TaskMotion::setMask
virtual void setMask(math::ConstRefVector mask)
Definition: task-motion.cpp:29
tsid::tasks::TaskTwoFramesEquality::SE3
pinocchio::SE3 SE3
Definition: tasks/task-two-frames-equality.hpp:42
i
int i
setup.data
data
Definition: setup.in.py:48
tsid::tasks::TaskTwoFramesEquality::Vector
math::Vector Vector
Definition: tasks/task-two-frames-equality.hpp:37
demo_quadruped.robot
robot
Definition: demo_quadruped.py:51
utils.hpp
test_Contact.Kp
Kp
Definition: test_Contact.py:44
tsid::tasks::TaskTwoFramesEquality::m_J1
Matrix6x m_J1
Definition: tasks/task-two-frames-equality.hpp:115
ModelTpl< context::Scalar, context::Options >::existFrame
bool existFrame(const std::string &name, const FrameType &type=(FrameType)(JOINT|FIXED_JOINT|BODY|OP_FRAME|SENSOR)) const
tsid::tasks::TaskTwoFramesEquality::m_J1_rotated
Matrix6x m_J1_rotated
Definition: tasks/task-two-frames-equality.hpp:116
tsid::tasks::TaskMotion::m_mask
Vector m_mask
Definition: task-motion.hpp:53
tsid::math::ConstraintEquality::resize
void resize(unsigned int r, unsigned int c) override
Definition: src/math/constraint-equality.cpp:46
tsid::tasks::TaskTwoFramesEquality::getConstraint
const ConstraintBase & getConstraint() const override
Definition: src/tasks/task-two-frames-equality.cpp:111
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::tasks::TaskTwoFramesEquality::m_p_error_vec
Vector m_p_error_vec
Definition: tasks/task-two-frames-equality.hpp:104
tsid::tasks::TaskTwoFramesEquality::m_v_error
Motion m_v_error
Definition: tasks/task-two-frames-equality.hpp:103
task-two-frames-equality.hpp
ex_4_conf.nv
int nv
Definition: ex_4_conf.py:23
tsid::robots::RobotWrapper::frameClassicAcceleration
Motion frameClassicAcceleration(const Data &data, const Model::FrameIndex index) const
Definition: src/robots/robot-wrapper.cpp:295
tsid::tasks::TaskTwoFramesEquality::m_J2
Matrix6x m_J2
Definition: tasks/task-two-frames-equality.hpp:115
tsid::tasks::TaskTwoFramesEquality::m_Kd
Vector m_Kd
Definition: tasks/task-two-frames-equality.hpp:111
tsid::robots::RobotWrapper::model
const Model & model() const
Accessor to model.
Definition: src/robots/robot-wrapper.cpp:102
tsid::math::Index
std::size_t Index
Definition: math/fwd.hpp:53
tsid::math::ConstraintBase::matrix
virtual const Matrix & matrix() const
Definition: constraint-base.cpp:35
tsid::tasks::TaskTwoFramesEquality::TaskTwoFramesEquality
TaskTwoFramesEquality(const std::string &name, RobotWrapper &robot, const std::string &frameName1, const std::string &frameName2)
Definition: src/tasks/task-two-frames-equality.cpp:29
tsid::tasks::TaskTwoFramesEquality::m_p_error_masked_vec
Vector m_p_error_masked_vec
Definition: tasks/task-two-frames-equality.hpp:105
robot-wrapper.hpp
tsid::tasks::TaskTwoFramesEquality::m_wMl1
SE3 m_wMl1
Definition: tasks/task-two-frames-equality.hpp:109
tsid::tasks::TaskTwoFramesEquality::m_drift_masked
Vector m_drift_masked
Definition: tasks/task-two-frames-equality.hpp:114
tsid::tasks::TaskTwoFramesEquality::m_constraint
ConstraintEquality m_constraint
Definition: tasks/task-two-frames-equality.hpp:117
ModelTpl< context::Scalar, context::Options >::getFrameId
FrameIndex getFrameId(const std::string &name, const FrameType &type=(FrameType)(JOINT|FIXED_JOINT|BODY|OP_FRAME|SENSOR)) const
tsid::tasks::TaskTwoFramesEquality::m_J2_rotated
Matrix6x m_J2_rotated
Definition: tasks/task-two-frames-equality.hpp:116
tsid::robots::RobotWrapper::frameJacobianLocal
void frameJacobianLocal(Data &data, const Model::FrameIndex index, Data::Matrix6x &J) const
Definition: src/robots/robot-wrapper.cpp:338
tsid::tasks::TaskTwoFramesEquality::frame_id1
Index frame_id1() const
Definition: src/tasks/task-two-frames-equality.cpp:107
tsid::tasks::TaskTwoFramesEquality::m_frame_id2
Index m_frame_id2
Definition: tasks/task-two-frames-equality.hpp:102
setup.name
name
Definition: setup.in.py:179
tsid::tasks::TaskMotion
Definition: task-motion.hpp:26
tsid::math::ConstRefVector
const typedef Eigen::Ref< const Vector > ConstRefVector
Definition: math/fwd.hpp:48
tsid::tasks::TaskTwoFramesEquality::getDesiredAcceleration
const Vector & getDesiredAcceleration() const override
Definition: src/tasks/task-two-frames-equality.cpp:99
tsid::tasks::TaskTwoFramesEquality::m_frame_id1
Index m_frame_id1
Definition: tasks/task-two-frames-equality.hpp:101
tsid
Definition: bindings/python/constraint/constraint-bound.cpp:21
std
tsid::tasks::TaskTwoFramesEquality::getAcceleration
Vector getAcceleration(ConstRefVector dv) const override
Definition: src/tasks/task-two-frames-equality.cpp:103
tsid::robots::RobotWrapper
Wrapper for a robot based on pinocchio.
Definition: robots/robot-wrapper.hpp:37
tsid::tasks::TaskTwoFramesEquality::m_v
Vector m_v
Definition: tasks/task-two-frames-equality.hpp:106
tsid::tasks::TaskTwoFramesEquality::m_drift
Motion m_drift
Definition: tasks/task-two-frames-equality.hpp:113
tsid::tasks::TaskTwoFramesEquality::m_v_error_vec
Vector m_v_error_vec
Definition: tasks/task-two-frames-equality.hpp:104
tsid::tasks::TaskTwoFramesEquality::m_p_error
Motion m_p_error
Definition: tasks/task-two-frames-equality.hpp:103
test_Contact.Kd
int Kd
Definition: test_Contact.py:45
tsid::tasks::TaskTwoFramesEquality::frame_id2
Index frame_id2() const
Definition: src/tasks/task-two-frames-equality.cpp:109
tsid::tasks::TaskBase::m_robot
RobotWrapper & m_robot
Reference on the robot model.
Definition: task-base.hpp:64
pinocchio::MotionTpl
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::tasks::TaskTwoFramesEquality::m_a_des_masked
Vector m_a_des_masked
Definition: tasks/task-two-frames-equality.hpp:112
tsid::tasks::TaskTwoFramesEquality::velocity_error
const Vector & velocity_error() const override
Definition: src/tasks/task-two-frames-equality.cpp:95
tsid::tasks::TaskTwoFramesEquality::m_wMl2
SE3 m_wMl2
Definition: tasks/task-two-frames-equality.hpp:109
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::tasks::TaskBase::ConstRefVector
math::ConstRefVector ConstRefVector
Definition: task-base.hpp:39
n
Vec3f n
pinocchio
tsid::tasks::TaskTwoFramesEquality::m_p_ref
Vector m_p_ref
Definition: tasks/task-two-frames-equality.hpp:107


tsid
Author(s): Andrea Del Prete, Justin Carpentier
autogenerated on Thu Apr 3 2025 02:47:16