GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: include/tsid/bindings/python/robots/robot-wrapper.hpp Lines: 63 101 62.4 %
Date: 2024-02-02 08:47:34 Branches: 94 192 49.0 %

Line Branch Exec Source
1
//
2
// Copyright (c) 2018 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
#ifndef __tsid_python_robot_wrapper_hpp__
19
#define __tsid_python_robot_wrapper_hpp__
20
21
#include "tsid/bindings/python/fwd.hpp"
22
23
#include "tsid/robots/robot-wrapper.hpp"
24
25
namespace tsid {
26
namespace python {
27
namespace bp = boost::python;
28
29
template <typename Robot>
30
struct RobotPythonVisitor
31
    : public boost::python::def_visitor<RobotPythonVisitor<Robot> > {
32
  typedef std::vector<std::string> std_vec;
33
  typedef Eigen::Matrix<double, 3, Eigen::Dynamic> Matrix3x;
34
35
  template <class PyClass>
36
37
7
  void visit(PyClass &cl) const {
38
7
    cl
39
        .def(bp::init<std::string, std_vec, bool>(
40
            (bp::arg("filename"), bp::arg("package_dir"), bp::arg("verbose")),
41
            "Default constructor without RootJoint."))
42



14
        .def(bp::init<std::string, std_vec, pinocchio::JointModelVariant &,
43
                      bool>((bp::arg("filename"), bp::arg("package_dir"),
44
                             bp::arg("roottype"), bp::arg("verbose")),
45
                            "Default constructor with RootJoint."))
46




14
        .def(bp::init<pinocchio::Model, bool>(
47
            (bp::arg("Pinocchio Model"), bp::arg("verbose")),
48
            "Default constructor from pinocchio model without RootJoint."))
49


14
        .def(bp::init<pinocchio::Model, robots::RobotWrapper::RootJointType,
50
                      bool>(
51
            (bp::arg("Pinocchio Model"), bp::arg("rootJoint"),
52
             bp::arg("verbose")),
53
            "Default constructor from pinocchio model with RootJoint."))
54



14
        .def("__init__",
55
             bp::make_constructor(RobotPythonVisitor<Robot>::makeClass))
56

14
        .add_property("nq", &Robot::nq)
57
14
        .add_property("nv", &Robot::nv)
58
7
        .add_property("na", &Robot::na)
59
7
        .add_property("nq_actuated", &Robot::nq_actuated)
60
7
        .add_property("is_fixed_base", &Robot::is_fixed_base)
61
62
7
        .def("model", &RobotPythonVisitor::model)
63

7
        .def("data", &RobotPythonVisitor::data)
64
65
7
        .add_property("rotor_inertias", &RobotPythonVisitor::rotor_inertias)
66
7
        .add_property("gear_ratios", &RobotPythonVisitor::gear_ratios)
67
7
        .def("set_rotor_inertias", &RobotPythonVisitor::set_rotor_inertias,
68
             bp::arg("inertia vector"))
69

14
        .def("set_gear_ratios", &RobotPythonVisitor::set_gear_ratios,
70
             bp::arg("gear ratio vector"))
71
72

14
        .def("computeAllTerms", &RobotPythonVisitor::computeAllTerms,
73
             bp::args("data", "q", "v"), "compute all dynamics")
74

14
        .def("com", &RobotPythonVisitor::com, bp::arg("data"))
75

14
        .def("com_vel", &RobotPythonVisitor::com_vel, bp::arg("data"))
76

14
        .def("com_acc", &RobotPythonVisitor::com_acc, bp::arg("data"))
77

14
        .def("Jcom", &RobotPythonVisitor::Jcom, bp::arg("data"))
78

14
        .def("mass", &RobotPythonVisitor::mass, bp::arg("data"))
79

14
        .def("nonLinearEffect", &RobotPythonVisitor::nonLinearEffects,
80
             bp::arg("data"))
81

14
        .def("position", &RobotPythonVisitor::position,
82
             bp::args("data", "index"))
83

14
        .def("velocity", &RobotPythonVisitor::velocity,
84
             bp::args("data", "index"))
85

14
        .def("acceleration", &RobotPythonVisitor::acceleration,
86
             bp::args("data", "index"))
87
88

14
        .def("framePosition", &RobotPythonVisitor::framePosition,
89
             bp::args("data", "index"))
90

14
        .def("frameVelocity", &RobotPythonVisitor::frameVelocity,
91
             bp::args("data", "index"))
92

14
        .def("frameAcceleration", &RobotPythonVisitor::frameAcceleration,
93
             bp::args("data", "index"))
94

14
        .def("frameClassicAcceleration",
95
             &RobotPythonVisitor::frameClassicAcceleration,
96
             bp::args("data", "index"))
97

14
        .def("frameVelocityWorldOriented",
98
             &RobotPythonVisitor::frameVelocityWorldOriented,
99
             bp::args("data", "index"))
100

14
        .def("frameAccelerationWorldOriented",
101
             &RobotPythonVisitor::frameAccelerationWorldOriented,
102
             bp::args("data", "index"))
103

14
        .def("frameClassicAccelerationWorldOriented",
104
             &RobotPythonVisitor::frameClassicAccelerationWorldOriented,
105
             bp::args("data", "index"))
106

14
        .def("angularMomentumTimeVariation",
107
             &RobotPythonVisitor::angularMomentumTimeVariation, bp::arg("data"))
108

14
        .def("setGravity", &RobotPythonVisitor::setGravity, bp::arg("gravity"));
109
7
  }
110
111
5
  static boost::shared_ptr<Robot> makeClass(
112
      const std::string &filename, const std::vector<std::string> &stdvec,
113
      bp::object &bpObject, bool verbose) {
114
5
    pinocchio::JointModelFreeFlyer root_joint =
115

5
        bp::extract<pinocchio::JointModelFreeFlyer>(bpObject)();
116

10
    boost::shared_ptr<Robot> p(
117

5
        new tsid::robots::RobotWrapper(filename, stdvec, root_joint, verbose));
118
10
    return p;
119
  }
120
121
1012
  static pinocchio::Model model(const Robot &self) { return self.model(); }
122
1004
  static pinocchio::Data data(const Robot &self) {
123
1004
    pinocchio::Data data(self.model());
124
1004
    return data;
125
  }
126
  static Eigen::VectorXd rotor_inertias(const Robot &self) {
127
    return self.rotor_inertias();
128
  }
129
  static Eigen::VectorXd gear_ratios(const Robot &self) {
130
    return self.gear_ratios();
131
  }
132
  static bool set_rotor_inertias(Robot &self, Eigen::VectorXd &rotor_inertias) {
133
    return self.rotor_inertias(rotor_inertias);
134
  }
135
  static bool set_gear_ratios(Robot &self, Eigen::VectorXd &gear_ratios) {
136
    return self.gear_ratios(gear_ratios);
137
  }
138
139
3
  static Eigen::Vector3d com(const Robot &self, const pinocchio::Data &data) {
140
3
    return self.com(data);
141
  }
142
  static Eigen::Vector3d com_vel(const Robot &self,
143
                                 const pinocchio::Data &data) {
144
    return self.com_vel(data);
145
  }
146
  static Eigen::Vector3d com_acc(const Robot &self,
147
                                 const pinocchio::Data &data) {
148
    return self.com_acc(data);
149
  }
150
  static Matrix3x Jcom(const Robot &self, const pinocchio::Data &data) {
151
    return self.Jcom(data);
152
  }
153
6001
  static void computeAllTerms(const Robot &self, pinocchio::Data &data,
154
                              const Eigen::VectorXd &q,
155
                              const Eigen::VectorXd &v) {
156
6001
    self.computeAllTerms(data, q, v);
157
6001
  }
158
  static Eigen::MatrixXd mass(Robot &self, pinocchio::Data &data) {
159
    return self.mass(data);
160
  }
161
  static Eigen::VectorXd nonLinearEffects(const Robot &self,
162
                                          const pinocchio::Data &data) {
163
    return self.nonLinearEffects(data);
164
  }
165
3
  static pinocchio::SE3 position(const Robot &self, const pinocchio::Data &data,
166
                                 const pinocchio::Model::JointIndex &index) {
167
3
    return self.position(data, index);
168
  }
169
  static pinocchio::Motion velocity(const Robot &self,
170
                                    const pinocchio::Data &data,
171
                                    const pinocchio::Model::JointIndex &index) {
172
    return self.velocity(data, index);
173
  }
174
  static pinocchio::Motion acceleration(
175
      const Robot &self, const pinocchio::Data &data,
176
      const pinocchio::Model::JointIndex &index) {
177
    return self.acceleration(data, index);
178
  }
179
  static pinocchio::SE3 framePosition(
180
      const Robot &self, const pinocchio::Data &data,
181
      const pinocchio::Model::FrameIndex &index) {
182
    return self.framePosition(data, index);
183
  }
184
  static pinocchio::Motion frameVelocity(
185
      const Robot &self, const pinocchio::Data &data,
186
      const pinocchio::Model::FrameIndex &index) {
187
    return self.frameVelocity(data, index);
188
  }
189
  static pinocchio::Motion frameAcceleration(
190
      const Robot &self, const pinocchio::Data &data,
191
      const pinocchio::Model::FrameIndex &index) {
192
    return self.frameAcceleration(data, index);
193
  }
194
  static pinocchio::Motion frameClassicAcceleration(
195
      const Robot &self, const pinocchio::Data &data,
196
      const pinocchio::Model::FrameIndex &index) {
197
    return self.frameClassicAcceleration(data, index);
198
  }
199
  static pinocchio::Motion frameVelocityWorldOriented(
200
      const Robot &self, const pinocchio::Data &data,
201
      const pinocchio::Model::FrameIndex &index) {
202
    return self.frameVelocityWorldOriented(data, index);
203
  }
204
  static pinocchio::Motion frameAccelerationWorldOriented(
205
      const Robot &self, const pinocchio::Data &data,
206
      const pinocchio::Model::FrameIndex &index) {
207
    return self.frameAccelerationWorldOriented(data, index);
208
  }
209
  static pinocchio::Motion frameClassicAccelerationWorldOriented(
210
      const Robot &self, const pinocchio::Data &data,
211
      const pinocchio::Model::FrameIndex &index) {
212
    return self.frameClassicAccelerationWorldOriented(data, index);
213
  }
214
  static Eigen::Vector3d angularMomentumTimeVariation(
215
      const Robot &self, const pinocchio::Data &data) {
216
    return self.angularMomentumTimeVariation(data);
217
  }
218
1
  static void setGravity(Robot &self, const pinocchio::Motion &gravity) {
219
1
    return self.setGravity(gravity);
220
  }
221
7
  static void expose(const std::string &class_name) {
222
7
    std::string doc = "Robot Wrapper info.";
223

7
    bp::class_<Robot>(class_name.c_str(), doc.c_str(), bp::no_init)
224
        .def(RobotPythonVisitor<Robot>());
225
    ;
226
    bp::enum_<robots::RobotWrapper::RootJointType>("RootJointType")
227

14
        .value("FIXED_BASE_SYSTEM", robots::RobotWrapper::FIXED_BASE_SYSTEM)
228
7
        .value("FLOATING_BASE_SYSTEM",
229
               robots::RobotWrapper::FLOATING_BASE_SYSTEM)
230
7
        .export_values();
231
7
  }
232
};
233
}  // namespace python
234
}  // namespace tsid
235
236
#endif  // ifndef __tsid_python_robot_wrapper_hpp__