GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/tsid/bindings/python/formulations/formulation.hpp Lines: 66 102 64.7 %
Date: 2024-02-02 08:47:34 Branches: 75 148 50.7 %

Line Branch Exec Source
1
//
2
// Copyright (c) 2018 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
#ifndef __tsid_python_HQPOutput_hpp__
19
#define __tsid_python_HQPOutput_hpp__
20
21
#include "tsid/bindings/python/fwd.hpp"
22
23
#include <pinocchio/bindings/python/utils/deprecation.hpp>
24
25
#include "tsid/formulations/inverse-dynamics-formulation-acc-force.hpp"
26
#include "tsid/bindings/python/solvers/HQPData.hpp"
27
#include "tsid/contacts/contact-6d.hpp"
28
#include "tsid/contacts/contact-point.hpp"
29
#include "tsid/contacts/contact-two-frame-positions.hpp"
30
#include "tsid/tasks/task-joint-posture.hpp"
31
#include "tsid/tasks/task-se3-equality.hpp"
32
#include "tsid/tasks/task-com-equality.hpp"
33
#include "tsid/tasks/task-cop-equality.hpp"
34
#include "tsid/tasks/task-actuation-bounds.hpp"
35
#include "tsid/tasks/task-joint-bounds.hpp"
36
#include "tsid/tasks/task-joint-posVelAcc-bounds.hpp"
37
#include "tsid/tasks/task-angular-momentum-equality.hpp"
38
#include "tsid/tasks/task-two-frames-equality.hpp"
39
40
namespace tsid {
41
namespace python {
42
namespace bp = boost::python;
43
44
template <typename T>
45
struct InvDynPythonVisitor
46
    : public boost::python::def_visitor<InvDynPythonVisitor<T> > {
47
  template <class PyClass>
48
49
7
  void visit(PyClass& cl) const {
50
7
    cl.def(bp::init<std::string, robots::RobotWrapper&, bool>(
51
               (bp::args("name", "robot", "verbose"))))
52

7
        .def("data", &InvDynPythonVisitor::data)
53
7
        .add_property("nVar", &T::nVar)
54
14
        .add_property("nEq", &T::nEq)
55
7
        .add_property("nIn", &T::nIn)
56
57
7
        .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_SE3,
58
             bp::args("task", "weight", "priorityLevel", "transition duration"))
59

14
        .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_COM,
60
             bp::args("task", "weight", "priorityLevel", "transition duration"))
61

14
        .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_Joint,
62
             bp::args("task", "weight", "priorityLevel", "transition duration"))
63

14
        .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_JointBounds,
64
             bp::args("task", "weight", "priorityLevel", "transition duration"))
65

14
        .def("addMotionTask",
66
             &InvDynPythonVisitor::addMotionTask_JointPosVelAccBounds,
67
             bp::args("task", "weight", "priorityLevel", "transition duration"))
68

14
        .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_AM,
69
             bp::args("task", "weight", "priorityLevel", "transition duration"))
70

14
        .def("addMotionTask",
71
             &InvDynPythonVisitor::addMotionTask_TwoFramesEquality,
72
             bp::args("task", "weight", "priorityLevel", "transition duration"))
73

14
        .def("addForceTask", &InvDynPythonVisitor::addForceTask_COP,
74
             bp::args("task", "weight", "priorityLevel", "transition duration"))
75

14
        .def("addActuationTask", &InvDynPythonVisitor::addActuationTask_Bounds,
76
             bp::args("task", "weight", "priorityLevel", "transition duration"))
77

14
        .def("updateTaskWeight", &InvDynPythonVisitor::updateTaskWeight,
78
             bp::args("task_name", "weight"))
79

14
        .def("updateRigidContactWeights",
80
             &InvDynPythonVisitor::updateRigidContactWeights,
81
             bp::args("contact_name", "force_regularization_weight"))
82

14
        .def("updateRigidContactWeights",
83
             &InvDynPythonVisitor::updateRigidContactWeightsWithMotionWeight,
84
             bp::args("contact_name", "force_regularization_weight",
85
                      "motion_weight"))
86

14
        .def("addRigidContact",
87
             &InvDynPythonVisitor::addRigidContact6dDeprecated,
88
             bp::args("contact"),
89
             pinocchio::python::deprecated_function<>(
90
                 "Method addRigidContact(ContactBase) is deprecated. You "
91
                 "should use addRigidContact(ContactBase, double) instead"))
92


14
        .def("addRigidContact", &InvDynPythonVisitor::addRigidContact6d,
93
             bp::args("contact", "force_reg_weight"))
94

14
        .def("addRigidContact",
95
             &InvDynPythonVisitor::addRigidContact6dWithPriorityLevel,
96
             bp::args("contact", "force_reg_weight", "motion_weight",
97
                      "priority_level"))
98

14
        .def("addRigidContact", &InvDynPythonVisitor::addRigidContactPoint,
99
             bp::args("contact", "force_reg_weight"))
100

14
        .def("addRigidContact",
101
             &InvDynPythonVisitor::addRigidContactPointWithPriorityLevel,
102
             bp::args("contact", "force_reg_weight", "motion_weight",
103
                      "priority_level"))
104

14
        .def("addRigidContact",
105
             &InvDynPythonVisitor::addRigidContactTwoFramePositions,
106
             bp::args("contact", "force_reg_weight"))
107

14
        .def("addRigidContact",
108
             &InvDynPythonVisitor::
109
                 addRigidContactTwoFramePositionsWithPriorityLevel,
110
             bp::args("contact", "force_reg_weight", "motion_weight",
111
                      "priority_level"))
112

14
        .def("removeTask", &InvDynPythonVisitor::removeTask,
113
             bp::args("task_name", "duration"))
114

14
        .def("removeRigidContact", &InvDynPythonVisitor::removeRigidContact,
115
             bp::args("contact_name", "duration"))
116

14
        .def("removeFromHqpData", &InvDynPythonVisitor::removeFromHqpData,
117
             bp::args("constraint_name"))
118

14
        .def("computeProblemData", &InvDynPythonVisitor::computeProblemData,
119
             bp::args("time", "q", "v"))
120
121

14
        .def("getActuatorForces", &InvDynPythonVisitor::getActuatorForces,
122
             bp::args("HQPOutput"))
123

14
        .def("getAccelerations", &InvDynPythonVisitor::getAccelerations,
124
             bp::args("HQPOutput"))
125

14
        .def("getContactForces", &InvDynPythonVisitor::getContactForces,
126
             bp::args("HQPOutput"))
127

14
        .def("checkContact", &InvDynPythonVisitor::checkContact,
128
             bp::args("name", "HQPOutput"))
129

14
        .def("getContactForce", &InvDynPythonVisitor::getContactForce,
130
             bp::args("name", "HQPOutput"));
131
7
  }
132
2
  static pinocchio::Data data(T& self) {
133
2
    pinocchio::Data data = self.data();
134
2
    return data;
135
  }
136
1
  static bool addMotionTask_SE3(T& self, tasks::TaskSE3Equality& task,
137
                                double weight, unsigned int priorityLevel,
138
                                double transition_duration) {
139
1
    return self.addMotionTask(task, weight, priorityLevel, transition_duration);
140
  }
141
1
  static bool addMotionTask_COM(T& self, tasks::TaskComEquality& task,
142
                                double weight, unsigned int priorityLevel,
143
                                double transition_duration) {
144
1
    return self.addMotionTask(task, weight, priorityLevel, transition_duration);
145
  }
146
1
  static bool addMotionTask_Joint(T& self, tasks::TaskJointPosture& task,
147
                                  double weight, unsigned int priorityLevel,
148
                                  double transition_duration) {
149
1
    return self.addMotionTask(task, weight, priorityLevel, transition_duration);
150
  }
151
  static bool addMotionTask_JointBounds(T& self, tasks::TaskJointBounds& task,
152
                                        double weight,
153
                                        unsigned int priorityLevel,
154
                                        double transition_duration) {
155
    return self.addMotionTask(task, weight, priorityLevel, transition_duration);
156
  }
157
  static bool addMotionTask_JointPosVelAccBounds(
158
      T& self, tasks::TaskJointPosVelAccBounds& task, double weight,
159
      unsigned int priorityLevel, double transition_duration) {
160
    return self.addMotionTask(task, weight, priorityLevel, transition_duration);
161
  }
162
  static bool addMotionTask_AM(T& self, tasks::TaskAMEquality& task,
163
                               double weight, unsigned int priorityLevel,
164
                               double transition_duration) {
165
    return self.addMotionTask(task, weight, priorityLevel, transition_duration);
166
  }
167
  static bool addMotionTask_TwoFramesEquality(
168
      T& self, tasks::TaskTwoFramesEquality& task, double weight,
169
      unsigned int priorityLevel, double transition_duration) {
170
    return self.addMotionTask(task, weight, priorityLevel, transition_duration);
171
  }
172
  static bool addForceTask_COP(T& self, tasks::TaskCopEquality& task,
173
                               double weight, unsigned int priorityLevel,
174
                               double transition_duration) {
175
    return self.addForceTask(task, weight, priorityLevel, transition_duration);
176
  }
177
  static bool addActuationTask_Bounds(T& self, tasks::TaskActuationBounds& task,
178
                                      double weight, unsigned int priorityLevel,
179
                                      double transition_duration) {
180
    return self.addActuationTask(task, weight, priorityLevel,
181
                                 transition_duration);
182
  }
183
  static bool updateTaskWeight(T& self, const std::string& task_name,
184
                               double weight) {
185
    return self.updateTaskWeight(task_name, weight);
186
  }
187
  static bool updateRigidContactWeights(T& self,
188
                                        const std::string& contact_name,
189
                                        double force_regularization_weight) {
190
    return self.updateRigidContactWeights(contact_name,
191
                                          force_regularization_weight);
192
  }
193
  static bool updateRigidContactWeightsWithMotionWeight(
194
      T& self, const std::string& contact_name,
195
      double force_regularization_weight, double motion_weight) {
196
    return self.updateRigidContactWeights(
197
        contact_name, force_regularization_weight, motion_weight);
198
  }
199
2
  static bool addRigidContact6dDeprecated(T& self,
200
                                          contacts::Contact6d& contact) {
201
2
    return self.addRigidContact(contact, 1e-5);
202
  }
203
  static bool addRigidContact6d(T& self, contacts::Contact6d& contact,
204
                                double force_regularization_weight) {
205
    return self.addRigidContact(contact, force_regularization_weight);
206
  }
207
  static bool addRigidContact6dWithPriorityLevel(
208
      T& self, contacts::Contact6d& contact, double force_regularization_weight,
209
      double motion_weight, const bool priority_level) {
210
    return self.addRigidContact(contact, force_regularization_weight,
211
                                motion_weight, priority_level);
212
  }
213
  static bool addRigidContactPoint(T& self, contacts::ContactPoint& contact,
214
                                   double force_regularization_weight) {
215
    return self.addRigidContact(contact, force_regularization_weight);
216
  }
217
  static bool addRigidContactPointWithPriorityLevel(
218
      T& self, contacts::ContactPoint& contact,
219
      double force_regularization_weight, double motion_weight,
220
      const bool priority_level) {
221
    return self.addRigidContact(contact, force_regularization_weight,
222
                                motion_weight, priority_level);
223
  }
224
  static bool addRigidContactTwoFramePositions(
225
      T& self, contacts::ContactTwoFramePositions& contact,
226
      double force_regularization_weight) {
227
    return self.addRigidContact(contact, force_regularization_weight);
228
  }
229
  static bool addRigidContactTwoFramePositionsWithPriorityLevel(
230
      T& self, contacts::ContactTwoFramePositions& contact,
231
      double force_regularization_weight, double motion_weight,
232
      const bool priority_level) {
233
    return self.addRigidContact(contact, force_regularization_weight,
234
                                motion_weight, priority_level);
235
  }
236
  static bool removeTask(T& self, const std::string& task_name,
237
                         double transition_duration) {
238
    return self.removeTask(task_name, transition_duration);
239
  }
240
1
  static bool removeRigidContact(T& self, const std::string& contactName,
241
                                 double transition_duration) {
242
1
    return self.removeRigidContact(contactName, transition_duration);
243
  }
244
  static bool removeFromHqpData(T& self, const std::string& constraintName) {
245
    return self.removeFromHqpData(constraintName);
246
  }
247
1001
  static HQPDatas computeProblemData(T& self, double time,
248
                                     const Eigen::VectorXd& q,
249
                                     const Eigen::VectorXd& v) {
250
1001
    HQPDatas Hqp;
251


1001
    Hqp.set(self.computeProblemData(time, q, v));
252
1001
    return Hqp;
253
  }
254
1000
  static Eigen::VectorXd getActuatorForces(T& self,
255
                                           const solvers::HQPOutput& sol) {
256
1000
    return self.getActuatorForces(sol);
257
  }
258
1000
  static Eigen::VectorXd getAccelerations(T& self,
259
                                          const solvers::HQPOutput& sol) {
260
1000
    return self.getAccelerations(sol);
261
  }
262
  static Eigen::VectorXd getContactForces(T& self,
263
                                          const solvers::HQPOutput& sol) {
264
    return self.getContactForces(sol);
265
  }
266
18
  static bool checkContact(T& self, const std::string& name,
267
                           const solvers::HQPOutput& sol) {
268
36
    tsid::math::Vector f = self.getContactForces(name, sol);
269

18
    if (f.size() > 0) return true;
270
8
    return false;
271
  }
272
10
  static Eigen::VectorXd getContactForce(T& self, const std::string& name,
273
                                         const solvers::HQPOutput& sol) {
274
10
    return self.getContactForces(name, sol);
275
  }
276
277
7
  static void expose(const std::string& class_name) {
278
7
    std::string doc = "InvDyn info.";
279

7
    bp::class_<T>(class_name.c_str(), doc.c_str(), bp::no_init)
280
        .def(InvDynPythonVisitor<T>());
281
7
  }
282
};
283
}  // namespace python
284
}  // namespace tsid
285
286
#endif  // ifndef __tsid_python_HQPOutput_hpp__