| Directory: | ./ |
|---|---|
| File: | include/tsid/bindings/python/formulations/formulation.hpp |
| Date: | 2025-05-10 01:12:46 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 72 | 114 | 63.2% |
| Branches: | 76 | 150 | 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/contacts/measured-6d-wrench.hpp" | ||
| 31 | #include "tsid/tasks/task-joint-posture.hpp" | ||
| 32 | #include "tsid/tasks/task-se3-equality.hpp" | ||
| 33 | #include "tsid/tasks/task-com-equality.hpp" | ||
| 34 | #include "tsid/tasks/task-cop-equality.hpp" | ||
| 35 | #include "tsid/tasks/task-actuation-bounds.hpp" | ||
| 36 | #include "tsid/tasks/task-joint-bounds.hpp" | ||
| 37 | #include "tsid/tasks/task-joint-posVelAcc-bounds.hpp" | ||
| 38 | #include "tsid/tasks/task-angular-momentum-equality.hpp" | ||
| 39 | #include "tsid/tasks/task-two-frames-equality.hpp" | ||
| 40 | |||
| 41 | namespace tsid { | ||
| 42 | namespace python { | ||
| 43 | namespace bp = boost::python; | ||
| 44 | |||
| 45 | template <typename T> | ||
| 46 | struct InvDynPythonVisitor | ||
| 47 | : public boost::python::def_visitor<InvDynPythonVisitor<T> > { | ||
| 48 | template <class PyClass> | ||
| 49 | |||
| 50 | 8 | void visit(PyClass& cl) const { | |
| 51 |
2/4✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
|
8 | cl.def(bp::init<std::string, robots::RobotWrapper&, bool>( |
| 52 | (bp::args("name", "robot", "verbose")))) | ||
| 53 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | .def("data", &InvDynPythonVisitor::data) |
| 54 | 16 | .add_property("nVar", &T::nVar) | |
| 55 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | .add_property("nEq", &T::nEq) |
| 56 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | .add_property("nIn", &T::nIn) |
| 57 | |||
| 58 |
3/6✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
|
16 | .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_SE3, |
| 59 | bp::args("task", "weight", "priorityLevel", "transition duration")) | ||
| 60 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_COM, |
| 61 | bp::args("task", "weight", "priorityLevel", "transition duration")) | ||
| 62 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_Joint, |
| 63 | bp::args("task", "weight", "priorityLevel", "transition duration")) | ||
| 64 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_JointBounds, |
| 65 | bp::args("task", "weight", "priorityLevel", "transition duration")) | ||
| 66 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addMotionTask", |
| 67 | &InvDynPythonVisitor::addMotionTask_JointPosVelAccBounds, | ||
| 68 | bp::args("task", "weight", "priorityLevel", "transition duration")) | ||
| 69 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addMotionTask", &InvDynPythonVisitor::addMotionTask_AM, |
| 70 | bp::args("task", "weight", "priorityLevel", "transition duration")) | ||
| 71 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addMotionTask", |
| 72 | &InvDynPythonVisitor::addMotionTask_TwoFramesEquality, | ||
| 73 | bp::args("task", "weight", "priorityLevel", "transition duration")) | ||
| 74 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addForceTask", &InvDynPythonVisitor::addForceTask_COP, |
| 75 | bp::args("task", "weight", "priorityLevel", "transition duration")) | ||
| 76 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addActuationTask", &InvDynPythonVisitor::addActuationTask_Bounds, |
| 77 | bp::args("task", "weight", "priorityLevel", "transition duration")) | ||
| 78 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("updateTaskWeight", &InvDynPythonVisitor::updateTaskWeight, |
| 79 | bp::args("task_name", "weight")) | ||
| 80 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("updateRigidContactWeights", |
| 81 | &InvDynPythonVisitor::updateRigidContactWeights, | ||
| 82 | bp::args("contact_name", "force_regularization_weight")) | ||
| 83 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("updateRigidContactWeights", |
| 84 | &InvDynPythonVisitor::updateRigidContactWeightsWithMotionWeight, | ||
| 85 | bp::args("contact_name", "force_regularization_weight", | ||
| 86 | "motion_weight")) | ||
| 87 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
8 | .def("addRigidContact", |
| 88 | &InvDynPythonVisitor::addRigidContact6dDeprecated, | ||
| 89 | bp::args("contact"), | ||
| 90 |
2/4✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
|
16 | pinocchio::python::deprecated_function<>( |
| 91 | "Method addRigidContact(ContactBase) is deprecated. You " | ||
| 92 | "should use addRigidContact(ContactBase, double) instead")) | ||
| 93 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addRigidContact", &InvDynPythonVisitor::addRigidContact6d, |
| 94 | bp::args("contact", "force_reg_weight")) | ||
| 95 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addRigidContact", |
| 96 | &InvDynPythonVisitor::addRigidContact6dWithPriorityLevel, | ||
| 97 | bp::args("contact", "force_reg_weight", "motion_weight", | ||
| 98 | "priority_level")) | ||
| 99 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addRigidContact", &InvDynPythonVisitor::addRigidContactPoint, |
| 100 | bp::args("contact", "force_reg_weight")) | ||
| 101 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addRigidContact", |
| 102 | &InvDynPythonVisitor::addRigidContactPointWithPriorityLevel, | ||
| 103 | bp::args("contact", "force_reg_weight", "motion_weight", | ||
| 104 | "priority_level")) | ||
| 105 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addRigidContact", |
| 106 | &InvDynPythonVisitor::addRigidContactTwoFramePositions, | ||
| 107 | bp::args("contact", "force_reg_weight")) | ||
| 108 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("addRigidContact", |
| 109 | &InvDynPythonVisitor:: | ||
| 110 | addRigidContactTwoFramePositionsWithPriorityLevel, | ||
| 111 | bp::args("contact", "force_reg_weight", "motion_weight", | ||
| 112 | "priority_level")) | ||
| 113 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("removeTask", &InvDynPythonVisitor::removeTask, |
| 114 | bp::args("task_name", "duration")) | ||
| 115 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("removeRigidContact", &InvDynPythonVisitor::removeRigidContact, |
| 116 | bp::args("contact_name", "duration")) | ||
| 117 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("removeFromHqpData", &InvDynPythonVisitor::removeFromHqpData, |
| 118 | bp::args("constraint_name")) | ||
| 119 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("computeProblemData", &InvDynPythonVisitor::computeProblemData, |
| 120 | bp::args("time", "q", "v")) | ||
| 121 | |||
| 122 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("getActuatorForces", &InvDynPythonVisitor::getActuatorForces, |
| 123 | bp::args("HQPOutput")) | ||
| 124 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("getAccelerations", &InvDynPythonVisitor::getAccelerations, |
| 125 | bp::args("HQPOutput")) | ||
| 126 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("getContactForces", &InvDynPythonVisitor::getContactForces, |
| 127 | bp::args("HQPOutput")) | ||
| 128 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("checkContact", &InvDynPythonVisitor::checkContact, |
| 129 | bp::args("name", "HQPOutput")) | ||
| 130 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
16 | .def("getContactForce", &InvDynPythonVisitor::getContactForce, |
| 131 | bp::args("name", "HQPOutput")) | ||
| 132 |
2/4✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
|
8 | .def("addMeasuredForce", &InvDynPythonVisitor::addMeasuredForce, |
| 133 | bp::args("measured_force")); | ||
| 134 | 8 | } | |
| 135 | 2 | static pinocchio::Data data(T& self) { | |
| 136 | 2 | pinocchio::Data data = self.data(); | |
| 137 | 2 | return data; | |
| 138 | } | ||
| 139 | 1 | static bool addMotionTask_SE3(T& self, tasks::TaskSE3Equality& task, | |
| 140 | double weight, unsigned int priorityLevel, | ||
| 141 | double transition_duration) { | ||
| 142 | 1 | return self.addMotionTask(task, weight, priorityLevel, transition_duration); | |
| 143 | } | ||
| 144 | 1 | static bool addMotionTask_COM(T& self, tasks::TaskComEquality& task, | |
| 145 | double weight, unsigned int priorityLevel, | ||
| 146 | double transition_duration) { | ||
| 147 | 1 | return self.addMotionTask(task, weight, priorityLevel, transition_duration); | |
| 148 | } | ||
| 149 | 1 | static bool addMotionTask_Joint(T& self, tasks::TaskJointPosture& task, | |
| 150 | double weight, unsigned int priorityLevel, | ||
| 151 | double transition_duration) { | ||
| 152 | 1 | return self.addMotionTask(task, weight, priorityLevel, transition_duration); | |
| 153 | } | ||
| 154 | ✗ | static bool addMotionTask_JointBounds(T& self, tasks::TaskJointBounds& task, | |
| 155 | double weight, | ||
| 156 | unsigned int priorityLevel, | ||
| 157 | double transition_duration) { | ||
| 158 | ✗ | return self.addMotionTask(task, weight, priorityLevel, transition_duration); | |
| 159 | } | ||
| 160 | ✗ | static bool addMotionTask_JointPosVelAccBounds( | |
| 161 | T& self, tasks::TaskJointPosVelAccBounds& task, double weight, | ||
| 162 | unsigned int priorityLevel, double transition_duration) { | ||
| 163 | ✗ | return self.addMotionTask(task, weight, priorityLevel, transition_duration); | |
| 164 | } | ||
| 165 | ✗ | static bool addMotionTask_AM(T& self, tasks::TaskAMEquality& task, | |
| 166 | double weight, unsigned int priorityLevel, | ||
| 167 | double transition_duration) { | ||
| 168 | ✗ | return self.addMotionTask(task, weight, priorityLevel, transition_duration); | |
| 169 | } | ||
| 170 | ✗ | static bool addMotionTask_TwoFramesEquality( | |
| 171 | T& self, tasks::TaskTwoFramesEquality& task, double weight, | ||
| 172 | unsigned int priorityLevel, double transition_duration) { | ||
| 173 | ✗ | return self.addMotionTask(task, weight, priorityLevel, transition_duration); | |
| 174 | } | ||
| 175 | ✗ | static bool addForceTask_COP(T& self, tasks::TaskCopEquality& task, | |
| 176 | double weight, unsigned int priorityLevel, | ||
| 177 | double transition_duration) { | ||
| 178 | ✗ | return self.addForceTask(task, weight, priorityLevel, transition_duration); | |
| 179 | } | ||
| 180 | ✗ | static bool addActuationTask_Bounds(T& self, tasks::TaskActuationBounds& task, | |
| 181 | double weight, unsigned int priorityLevel, | ||
| 182 | double transition_duration) { | ||
| 183 | ✗ | return self.addActuationTask(task, weight, priorityLevel, | |
| 184 | ✗ | transition_duration); | |
| 185 | } | ||
| 186 | ✗ | static bool updateTaskWeight(T& self, const std::string& task_name, | |
| 187 | double weight) { | ||
| 188 | ✗ | return self.updateTaskWeight(task_name, weight); | |
| 189 | } | ||
| 190 | ✗ | static bool updateRigidContactWeights(T& self, | |
| 191 | const std::string& contact_name, | ||
| 192 | double force_regularization_weight) { | ||
| 193 | ✗ | return self.updateRigidContactWeights(contact_name, | |
| 194 | ✗ | force_regularization_weight); | |
| 195 | } | ||
| 196 | ✗ | static bool updateRigidContactWeightsWithMotionWeight( | |
| 197 | T& self, const std::string& contact_name, | ||
| 198 | double force_regularization_weight, double motion_weight) { | ||
| 199 | ✗ | return self.updateRigidContactWeights( | |
| 200 | ✗ | contact_name, force_regularization_weight, motion_weight); | |
| 201 | } | ||
| 202 | 2 | static bool addRigidContact6dDeprecated(T& self, | |
| 203 | contacts::Contact6d& contact) { | ||
| 204 | 2 | return self.addRigidContact(contact, 1e-5); | |
| 205 | } | ||
| 206 | ✗ | static bool addRigidContact6d(T& self, contacts::Contact6d& contact, | |
| 207 | double force_regularization_weight) { | ||
| 208 | ✗ | return self.addRigidContact(contact, force_regularization_weight); | |
| 209 | } | ||
| 210 | ✗ | static bool addRigidContact6dWithPriorityLevel( | |
| 211 | T& self, contacts::Contact6d& contact, double force_regularization_weight, | ||
| 212 | double motion_weight, const bool priority_level) { | ||
| 213 | ✗ | return self.addRigidContact(contact, force_regularization_weight, | |
| 214 | ✗ | motion_weight, priority_level); | |
| 215 | } | ||
| 216 | ✗ | static bool addRigidContactPoint(T& self, contacts::ContactPoint& contact, | |
| 217 | double force_regularization_weight) { | ||
| 218 | ✗ | return self.addRigidContact(contact, force_regularization_weight); | |
| 219 | } | ||
| 220 | ✗ | static bool addRigidContactPointWithPriorityLevel( | |
| 221 | T& self, contacts::ContactPoint& contact, | ||
| 222 | double force_regularization_weight, double motion_weight, | ||
| 223 | const bool priority_level) { | ||
| 224 | ✗ | return self.addRigidContact(contact, force_regularization_weight, | |
| 225 | ✗ | motion_weight, priority_level); | |
| 226 | } | ||
| 227 | ✗ | static bool addRigidContactTwoFramePositions( | |
| 228 | T& self, contacts::ContactTwoFramePositions& contact, | ||
| 229 | double force_regularization_weight) { | ||
| 230 | ✗ | return self.addRigidContact(contact, force_regularization_weight); | |
| 231 | } | ||
| 232 | ✗ | static bool addRigidContactTwoFramePositionsWithPriorityLevel( | |
| 233 | T& self, contacts::ContactTwoFramePositions& contact, | ||
| 234 | double force_regularization_weight, double motion_weight, | ||
| 235 | const bool priority_level) { | ||
| 236 | ✗ | return self.addRigidContact(contact, force_regularization_weight, | |
| 237 | ✗ | motion_weight, priority_level); | |
| 238 | } | ||
| 239 | ✗ | static bool removeTask(T& self, const std::string& task_name, | |
| 240 | double transition_duration) { | ||
| 241 | ✗ | return self.removeTask(task_name, transition_duration); | |
| 242 | } | ||
| 243 | 1 | static bool removeRigidContact(T& self, const std::string& contactName, | |
| 244 | double transition_duration) { | ||
| 245 | 1 | return self.removeRigidContact(contactName, transition_duration); | |
| 246 | } | ||
| 247 | ✗ | static bool removeFromHqpData(T& self, const std::string& constraintName) { | |
| 248 | ✗ | return self.removeFromHqpData(constraintName); | |
| 249 | } | ||
| 250 | 1001 | static HQPDatas computeProblemData(T& self, double time, | |
| 251 | const Eigen::VectorXd& q, | ||
| 252 | const Eigen::VectorXd& v) { | ||
| 253 | 1001 | HQPDatas Hqp; | |
| 254 |
4/8✓ Branch 1 taken 1001 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1001 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1001 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1001 times.
✗ Branch 11 not taken.
|
1001 | Hqp.set(self.computeProblemData(time, q, v)); |
| 255 | 1001 | return Hqp; | |
| 256 | } | ||
| 257 | 1000 | static Eigen::VectorXd getActuatorForces(T& self, | |
| 258 | const solvers::HQPOutput& sol) { | ||
| 259 | 1000 | return self.getActuatorForces(sol); | |
| 260 | } | ||
| 261 | 1000 | static Eigen::VectorXd getAccelerations(T& self, | |
| 262 | const solvers::HQPOutput& sol) { | ||
| 263 | 1000 | return self.getAccelerations(sol); | |
| 264 | } | ||
| 265 | ✗ | static Eigen::VectorXd getContactForces(T& self, | |
| 266 | const solvers::HQPOutput& sol) { | ||
| 267 | ✗ | return self.getContactForces(sol); | |
| 268 | } | ||
| 269 | 18 | static bool checkContact(T& self, const std::string& name, | |
| 270 | const solvers::HQPOutput& sol) { | ||
| 271 |
1/2✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
|
18 | tsid::math::Vector f = self.getContactForces(name, sol); |
| 272 |
2/2✓ Branch 1 taken 10 times.
✓ Branch 2 taken 8 times.
|
18 | if (f.size() > 0) return true; |
| 273 | 8 | return false; | |
| 274 | 18 | } | |
| 275 | 10 | static Eigen::VectorXd getContactForce(T& self, const std::string& name, | |
| 276 | const solvers::HQPOutput& sol) { | ||
| 277 | 10 | return self.getContactForces(name, sol); | |
| 278 | } | ||
| 279 | 1 | static bool addMeasuredForce(T& self, | |
| 280 | contacts::Measured6Dwrench& measured_force) { | ||
| 281 | 1 | return self.addMeasuredForce(measured_force); | |
| 282 | } | ||
| 283 | |||
| 284 | 8 | static void expose(const std::string& class_name) { | |
| 285 |
1/2✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
|
8 | std::string doc = "InvDyn info."; |
| 286 |
1/2✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
|
8 | bp::class_<T>(class_name.c_str(), doc.c_str(), bp::no_init) |
| 287 |
1/2✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
|
8 | .def(InvDynPythonVisitor<T>()); |
| 288 | 8 | } | |
| 289 | }; | ||
| 290 | } // namespace python | ||
| 291 | } // namespace tsid | ||
| 292 | |||
| 293 | #endif // ifndef __tsid_python_HQPOutput_hpp__ | ||
| 294 |