GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: src/tasks/task-angular-momentum-equality.cpp Lines: 0 42 0.0 %
Date: 2024-02-02 08:47:34 Branches: 0 70 0.0 %

Line Branch Exec Source
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 "tsid/tasks/task-angular-momentum-equality.hpp"
19
#include "tsid/robots/robot-wrapper.hpp"
20
#include <pinocchio/algorithm/joint-configuration.hpp>
21
#include <pinocchio/algorithm/centroidal.hpp>
22
23
namespace tsid {
24
namespace tasks {
25
using namespace math;
26
using namespace trajectories;
27
using namespace pinocchio;
28
29
TaskAMEquality::TaskAMEquality(const std::string& name, RobotWrapper& robot)
30
    : TaskMotion(name, robot), m_constraint(name, 3, robot.nv()) {
31
  m_Kp.setZero(3);
32
  m_Kd.setZero(3);
33
  m_L_error.setZero(3);
34
  m_dL_error.setZero(3);
35
  m_L.setZero(3);
36
  m_dL.setZero(3);
37
  m_dL_des.setZero(3);
38
  m_ref.resize(3);
39
}
40
41
int TaskAMEquality::dim() const {
42
  // return self._mask.sum ()
43
  return 3;
44
}
45
46
const Vector3& TaskAMEquality::Kp() { return m_Kp; }
47
48
const Vector3& TaskAMEquality::Kd() { return m_Kd; }
49
50
void TaskAMEquality::Kp(ConstRefVector Kp) {
51
  PINOCCHIO_CHECK_INPUT_ARGUMENT(Kp.size() == 3,
52
                                 "The size of the Kp vector needs to equal 3");
53
  m_Kp = Kp;
54
}
55
56
void TaskAMEquality::Kd(ConstRefVector Kd) {
57
  PINOCCHIO_CHECK_INPUT_ARGUMENT(Kd.size() == 3,
58
                                 "The size of the Kd vector needs to equal 3");
59
  m_Kd = Kd;
60
}
61
62
void TaskAMEquality::setReference(const TrajectorySample& ref) { m_ref = ref; }
63
64
const TrajectorySample& TaskAMEquality::getReference() const { return m_ref; }
65
66
const Vector3& TaskAMEquality::getDesiredMomentumDerivative() const {
67
  return m_dL_des;
68
}
69
70
Vector3 TaskAMEquality::getdMomentum(ConstRefVector dv) const {
71
  return m_constraint.matrix() * dv - m_drift;
72
}
73
74
const Vector3& TaskAMEquality::momentum_error() const { return m_L_error; }
75
76
const Vector3& TaskAMEquality::momentum() const { return m_L; }
77
const Vector& TaskAMEquality::momentum_ref() const { return m_ref.getValue(); }
78
79
const Vector& TaskAMEquality::dmomentum_ref() const {
80
  return m_ref.getDerivative();
81
}
82
83
const ConstraintBase& TaskAMEquality::getConstraint() const {
84
  return m_constraint;
85
}
86
87
const ConstraintBase& TaskAMEquality::compute(const double, ConstRefVector,
88
                                              ConstRefVector v, Data& data) {
89
  // Compute errors
90
  // Get momentum jacobian
91
  const Matrix6x& J_am = m_robot.momentumJacobian(data);
92
  m_L = J_am.bottomRows(3) * v;
93
  m_L_error = m_L - m_ref.getValue();
94
95
  m_dL_des = -m_Kp.cwiseProduct(m_L_error) + m_ref.getDerivative();
96
97
#ifndef NDEBUG
98
//      std::cout<<m_name<<" errors: "<<m_L_error.norm()<<" "
99
//        <<m_dL_error.norm()<<std::endl;
100
#endif
101
102
  m_drift = m_robot.angularMomentumTimeVariation(data);
103
  m_constraint.setMatrix(J_am.bottomRows(3));
104
  m_constraint.setVector(m_dL_des - m_drift);
105
106
  return m_constraint;
107
}
108
109
}  // namespace tasks
110
}  // namespace tsid