| Directory: | ./ |
|---|---|
| File: | include/pinocchio/bindings/python/spatial/inertia.hpp |
| Date: | 2025-02-12 21:03:38 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 211 | 226 | 93.4% |
| Branches: | 287 | 577 | 49.7% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // | ||
| 2 | // Copyright (c) 2015-2024 CNRS INRIA | ||
| 3 | // Copyright (c) 2016 Wandercraft, 86 rue de Paris 91400 Orsay, France. | ||
| 4 | // | ||
| 5 | |||
| 6 | #ifndef __pinocchio_python_spatial_inertia_hpp__ | ||
| 7 | #define __pinocchio_python_spatial_inertia_hpp__ | ||
| 8 | |||
| 9 | #include <eigenpy/exception.hpp> | ||
| 10 | #include <eigenpy/eigenpy.hpp> | ||
| 11 | #include <eigenpy/memory.hpp> | ||
| 12 | #include <boost/python/tuple.hpp> | ||
| 13 | |||
| 14 | #include "pinocchio/spatial/inertia.hpp" | ||
| 15 | |||
| 16 | #include "pinocchio/bindings/python/utils/cast.hpp" | ||
| 17 | #include "pinocchio/bindings/python/utils/copyable.hpp" | ||
| 18 | #include "pinocchio/bindings/python/utils/printable.hpp" | ||
| 19 | |||
| 20 | #if EIGENPY_VERSION_AT_MOST(2, 8, 1) | ||
| 21 | EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(pinocchio::Inertia) | ||
| 22 | EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(pinocchio::PseudoInertiaTpl) | ||
| 23 | EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(pinocchio::LogCholeskyParametersTpl) | ||
| 24 | #endif | ||
| 25 | |||
| 26 | namespace pinocchio | ||
| 27 | { | ||
| 28 | namespace python | ||
| 29 | { | ||
| 30 | namespace bp = boost::python; | ||
| 31 | |||
| 32 | template<typename Inertia> | ||
| 33 | struct InertiaPythonVisitor : public boost::python::def_visitor<InertiaPythonVisitor<Inertia>> | ||
| 34 | { | ||
| 35 | enum | ||
| 36 | { | ||
| 37 | Options = Inertia::Options | ||
| 38 | }; | ||
| 39 | typedef typename Inertia::Scalar Scalar; | ||
| 40 | typedef typename Inertia::Vector3 Vector3; | ||
| 41 | typedef typename Inertia::Matrix3 Matrix3; | ||
| 42 | typedef typename Inertia::Vector6 Vector6; | ||
| 43 | typedef typename Inertia::Matrix6 Matrix6; | ||
| 44 | |||
| 45 | typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1, Options> VectorXs; | ||
| 46 | typedef MotionTpl<Scalar, Options> Motion; | ||
| 47 | typedef ForceTpl<Scalar, Options> Force; | ||
| 48 | |||
| 49 | public: | ||
| 50 | template<class PyClass> | ||
| 51 | 69 | void visit(PyClass & cl) const | |
| 52 | { | ||
| 53 |
3/8✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
4 | static const Scalar dummy_precision = Eigen::NumTraits<Scalar>::dummy_precision(); |
| 54 |
2/4✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 69 times.
✗ Branch 6 not taken.
|
69 | cl.def( |
| 55 | "__init__", | ||
| 56 | bp::make_constructor( | ||
| 57 | 69 | &InertiaPythonVisitor::makeFromMCI, bp::default_call_policies(), | |
| 58 | bp::args("mass", "lever", "inertia")), | ||
| 59 | "Initialize from mass, lever and 3d inertia.") | ||
| 60 | |||
| 61 |
3/6✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
|
138 | .def(bp::init<>(bp::arg("self"), "Default constructor.")) |
| 62 |
5/10✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 69 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 69 times.
✗ Branch 14 not taken.
|
138 | .def(bp::init<const Inertia &>((bp::arg("self"), bp::arg("clone")), "Copy constructor")) |
| 63 | |||
| 64 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 65 | "mass", &InertiaPythonVisitor::getMass, &InertiaPythonVisitor::setMass, | ||
| 66 | "Mass of the Spatial Inertia.") | ||
| 67 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
69 | .add_property( |
| 68 | "lever", | ||
| 69 | bp::make_function( | ||
| 70 | (typename Inertia::Vector3 & (Inertia::*)()) & Inertia::lever, | ||
| 71 | 69 | bp::return_internal_reference<>()), | |
| 72 | &InertiaPythonVisitor::setLever, | ||
| 73 | "Center of mass location of the Spatial Inertia. It corresponds to the location of the " | ||
| 74 | "center of mass regarding to the frame where the Spatial Inertia is expressed.") | ||
| 75 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 76 | "inertia", &InertiaPythonVisitor::getInertia, &InertiaPythonVisitor::setInertia, | ||
| 77 | "Rotational part of the Spatial Inertia, i.e. a symmetric matrix " | ||
| 78 | "representing the rotational inertia around the center of mass.") | ||
| 79 | |||
| 80 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | .def("matrix", (Matrix6(Inertia::*)() const)&Inertia::matrix, bp::arg("self")) |
| 81 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def("inverse", (Matrix6(Inertia::*)() const)&Inertia::inverse, bp::arg("self")) |
| 82 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 83 | "se3Action", &Inertia::template se3Action<Scalar, Options>, bp::args("self", "M"), | ||
| 84 | "Returns the result of the action of M on *this.") | ||
| 85 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 86 | "se3ActionInverse", &Inertia::template se3ActionInverse<Scalar, Options>, | ||
| 87 | bp::args("self", "M"), "Returns the result of the action of the inverse of M on *this.") | ||
| 88 | |||
| 89 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 90 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "setIdentity", &Inertia::setIdentity, bp::arg("self"), |
| 91 | "Set *this to be the Identity inertia.") | ||
| 92 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 93 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "setZero", &Inertia::setZero, bp::arg("self"), |
| 94 | "Set all the components of *this to zero.") | ||
| 95 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 96 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "setRandom", &Inertia::setRandom, bp::arg("self"), |
| 97 | "Set all the components of *this to random values.") | ||
| 98 | |||
| 99 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 69 times.
✗ Branch 6 not taken.
|
69 | .def(bp::self + bp::self) |
| 100 |
1/2✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
|
69 | .def(bp::self += bp::self) |
| 101 |
1/2✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
|
69 | .def(bp::self - bp::self) |
| 102 |
1/2✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
|
69 | .def(bp::self -= bp::self) |
| 103 |
1/2✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
|
69 | .def(bp::self * bp::other<Motion>()) |
| 104 | |||
| 105 | 138 | .add_property("np", (Matrix6(Inertia::*)() const)&Inertia::matrix) | |
| 106 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 107 | "vxiv", &Inertia::template vxiv<Motion>, bp::args("self", "v"), | ||
| 108 | "Returns the result of v x Iv.") | ||
| 109 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 110 | "vtiv", &Inertia::template vtiv<Motion>, bp::args("self", "v"), | ||
| 111 | "Returns the result of v.T * Iv.") | ||
| 112 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 113 | "vxi", | ||
| 114 | (Matrix6(Inertia::*)(const MotionDense<Motion> &) const)&Inertia::template vxi<Motion>, | ||
| 115 | bp::args("self", "v"), "Returns the result of v x* I, a 6x6 matrix.") | ||
| 116 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 117 | "ivx", | ||
| 118 | (Matrix6(Inertia::*)(const MotionDense<Motion> &) const)&Inertia::template ivx<Motion>, | ||
| 119 | bp::args("self", "v"), "Returns the result of I vx, a 6x6 matrix.") | ||
| 120 |
3/6✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
|
138 | .def( |
| 121 | "variation", | ||
| 122 | (Matrix6(Inertia::*)(const MotionDense<Motion> &) | ||
| 123 | const)&Inertia::template variation<Motion>, | ||
| 124 | bp::args("self", "v"), "Returns the time derivative of the inertia.") | ||
| 125 | |||
| 126 | #ifndef PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS | ||
| 127 |
1/2✓ Branch 2 taken 65 times.
✗ Branch 3 not taken.
|
65 | .def(bp::self == bp::self) |
| 128 |
1/2✓ Branch 2 taken 65 times.
✗ Branch 3 not taken.
|
65 | .def(bp::self != bp::self) |
| 129 | #endif | ||
| 130 | |||
| 131 | #ifndef PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS | ||
| 132 |
1/2✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
|
65 | .def( |
| 133 | "isApprox", &Inertia::isApprox, | ||
| 134 |
5/10✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 65 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 65 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 65 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 65 times.
✗ Branch 14 not taken.
|
195 | (bp::arg("self"), bp::arg("other"), bp::arg("prec") = dummy_precision), |
| 135 | "Returns true if *this is approximately equal to other, within the precision given " | ||
| 136 | "by prec.") | ||
| 137 | |||
| 138 |
1/2✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
|
65 | .def( |
| 139 |
4/8✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 65 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 65 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 65 times.
✗ Branch 11 not taken.
|
130 | "isZero", &Inertia::isZero, (bp::arg("self"), bp::arg("prec") = dummy_precision), |
| 140 | "Returns true if *this is approximately equal to the zero Inertia, within the " | ||
| 141 | "precision given by prec.") | ||
| 142 | #endif | ||
| 143 | |||
| 144 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 65 times.
✗ Branch 5 not taken.
|
69 | .def("Identity", &Inertia::Identity, "Returns the identity Inertia.") |
| 145 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("Identity") |
| 146 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("Zero", &Inertia::Zero, "Returns the zero Inertia.") |
| 147 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("Zero") |
| 148 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("Random", &Inertia::Random, "Returns a random Inertia.") |
| 149 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("Random") |
| 150 | |||
| 151 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 152 | "toDynamicParameters", &InertiaPythonVisitor::toDynamicParameters_proxy, | ||
| 153 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | bp::arg("self"), |
| 154 | "Returns the representation of the matrix as a vector of dynamic parameters." | ||
| 155 | "\nThe parameters are given as v = [m, mc_x, mc_y, mc_z, I_{xx}, I_{xy}, I_{yy}, " | ||
| 156 | "I_{xz}, I_{yz}, I_{zz}]^T " | ||
| 157 | "where I = I_C + mS^T(c)S(c) and I_C has its origin at the barycenter") | ||
| 158 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 159 | "FromDynamicParameters", &InertiaPythonVisitor::fromDynamicParameters_proxy, | ||
| 160 | bp::args("dynamic_parameters"), | ||
| 161 | "Builds and inertia matrix from a vector of dynamic parameters." | ||
| 162 | "\nThe parameters are given as dynamic_parameters = [m, mc_x, mc_y, mc_z, I_{xx}, " | ||
| 163 | "I_{xy}, I_{yy}, I_{xz}, I_{yz}, I_{zz}]^T " | ||
| 164 | "where I = I_C + mS^T(c)S(c) and I_C has its origin at the barycenter.") | ||
| 165 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromDynamicParameters") |
| 166 | |||
| 167 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 168 | "FromSphere", &Inertia::FromSphere, bp::args("mass", "radius"), | ||
| 169 | "Returns the Inertia of a sphere defined by a given mass and radius.") | ||
| 170 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromSphere") |
| 171 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 172 | "FromEllipsoid", &Inertia::FromEllipsoid, | ||
| 173 | bp::args("mass", "length_x", "length_y", "length_z"), | ||
| 174 | "Returns the Inertia of an ellipsoid shape defined by a mass and given dimensions " | ||
| 175 | "the semi-axis of values length_{x,y,z}.") | ||
| 176 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromEllipsoid") |
| 177 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 178 | "FromCylinder", &Inertia::FromCylinder, bp::args("mass", "radius", "length"), | ||
| 179 | "Returns the Inertia of a cylinder defined by its mass, radius and length along the " | ||
| 180 | "Z axis.") | ||
| 181 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromCylinder") |
| 182 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 183 | "FromBox", &Inertia::FromBox, bp::args("mass", "length_x", "length_y", "length_z"), | ||
| 184 | "Returns the Inertia of a box shape with a mass and of dimension the semi axis of " | ||
| 185 | "length_{x,y,z}.") | ||
| 186 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromBox") |
| 187 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 188 | "FromCapsule", &Inertia::FromCapsule, bp::args("mass", "radius", "height"), | ||
| 189 | "Computes the Inertia of a capsule defined by its mass, radius and length along the " | ||
| 190 | "Z axis. Assumes a uniform density.") | ||
| 191 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromCapsule") |
| 192 | |||
| 193 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 194 | "FromPseudoInertia", &Inertia::FromPseudoInertia, bp::args("pseudo_inertia"), | ||
| 195 | "Returns the Inertia created from a pseudo inertia object.") | ||
| 196 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromPseudoInertia") |
| 197 | |||
| 198 | 138 | .def( | |
| 199 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "toPseudoInertia", &Inertia::toPseudoInertia, bp::arg("self"), |
| 200 | "Returns the pseudo inertia representation of the inertia.") | ||
| 201 | |||
| 202 |
3/6✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
|
138 | .def( |
| 203 | "FromLogCholeskyParameters", &Inertia::FromLogCholeskyParameters, | ||
| 204 | bp::args("log_cholesky_parameters"), | ||
| 205 | "Returns the Inertia created from log Cholesky parameters.") | ||
| 206 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromLogCholeskyParameters") |
| 207 | |||
| 208 | 138 | .def("__array__", (Matrix6(Inertia::*)() const)&Inertia::matrix) | |
| 209 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 210 | "__array__", &__array__, | ||
| 211 |
9/18✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 69 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 69 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 69 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 69 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 69 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 69 times.
✗ Branch 26 not taken.
|
138 | (bp::arg("self"), bp::arg("dtype") = bp::object(), bp::arg("copy") = bp::object())) |
| 212 | #ifndef PINOCCHIO_PYTHON_NO_SERIALIZATION | ||
| 213 |
1/2✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
|
65 | .def_pickle(Pickle()) |
| 214 | #endif | ||
| 215 | ; | ||
| 216 | 69 | } | |
| 217 | |||
| 218 | 92 | static Scalar getMass(const Inertia & self) | |
| 219 | { | ||
| 220 | 92 | return self.mass(); | |
| 221 | } | ||
| 222 | 1 | static void setMass(Inertia & self, Scalar mass) | |
| 223 | { | ||
| 224 | 1 | self.mass() = mass; | |
| 225 | 1 | } | |
| 226 | |||
| 227 | 1 | static void setLever(Inertia & self, const Vector3 & lever) | |
| 228 | { | ||
| 229 | 1 | self.lever() = lever; | |
| 230 | 1 | } | |
| 231 | |||
| 232 | 7 | static Matrix3 getInertia(const Inertia & self) | |
| 233 | { | ||
| 234 | 7 | return self.inertia().matrix(); | |
| 235 | } | ||
| 236 | // static void setInertia(Inertia & self, const Vector6 & minimal_inertia) { | ||
| 237 | // self.inertia().data() = minimal_inertia; } | ||
| 238 | 1 | static void setInertia(Inertia & self, const Matrix3 & symmetric_inertia) | |
| 239 | { | ||
| 240 | 2 | if (!check_expression_if_real<Scalar>( | |
| 241 |
5/11✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
|
1 | isZero(symmetric_inertia - symmetric_inertia.transpose()))) |
| 242 | ✗ | throw eigenpy::Exception("The 3d inertia should be symmetric."); | |
| 243 |
2/4✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
|
2 | self.inertia().data() << symmetric_inertia(0, 0), symmetric_inertia(1, 0), |
| 244 |
6/12✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
|
1 | symmetric_inertia(1, 1), symmetric_inertia(0, 2), symmetric_inertia(1, 2), |
| 245 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | symmetric_inertia(2, 2); |
| 246 | 1 | } | |
| 247 | |||
| 248 | 32 | static VectorXs toDynamicParameters_proxy(const Inertia & self) | |
| 249 | { | ||
| 250 |
1/2✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
|
32 | return self.toDynamicParameters(); |
| 251 | } | ||
| 252 | |||
| 253 | 2 | static Inertia fromDynamicParameters_proxy(const VectorXs & params) | |
| 254 | { | ||
| 255 |
5/6✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
|
2 | if (params.rows() != 10 || params.cols() != 1) |
| 256 | { | ||
| 257 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | std::ostringstream shape; |
| 258 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
|
1 | shape << "(" << params.rows() << ", " << params.cols() << ")"; |
| 259 |
4/8✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
|
1 | throw std::invalid_argument( |
| 260 | "Wrong size: params" + shape.str() + " but should have the following shape (10, 1)"); | ||
| 261 | 1 | } | |
| 262 | 1 | return Inertia::FromDynamicParameters(params); | |
| 263 | } | ||
| 264 | |||
| 265 | static Inertia * | ||
| 266 | 2 | makeFromMCI(const Scalar & mass, const Vector3 & lever, const Matrix3 & inertia) | |
| 267 | { | ||
| 268 | #ifndef PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS | ||
| 269 |
3/6✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
|
2 | if (!inertia.isApprox(inertia.transpose())) |
| 270 | ✗ | throw eigenpy::Exception("The 3d inertia should be symmetric."); | |
| 271 | 2 | if ( | |
| 272 |
6/12✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
|
2 | (Vector3::UnitX().transpose() * inertia * Vector3::UnitX() < 0) |
| 273 |
7/14✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
|
2 | || (Vector3::UnitY().transpose() * inertia * Vector3::UnitY() < 0) |
| 274 |
9/18✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
|
4 | || (Vector3::UnitZ().transpose() * inertia * Vector3::UnitZ() < 0)) |
| 275 | ✗ | throw eigenpy::Exception("The 3d inertia should be positive."); | |
| 276 | #endif | ||
| 277 |
1/2✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2 | return new Inertia(mass, lever, inertia); |
| 278 | } | ||
| 279 | |||
| 280 | 69 | static void expose() | |
| 281 | { | ||
| 282 | #if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 6 && EIGENPY_VERSION_AT_LEAST(2, 9, 0) | ||
| 283 | typedef PINOCCHIO_SHARED_PTR_HOLDER_TYPE(Inertia) HolderType; | ||
| 284 | #else | ||
| 285 | typedef ::boost::python::detail::not_specified HolderType; | ||
| 286 | #endif | ||
| 287 | 69 | bp::class_<Inertia, HolderType>( | |
| 288 | "Inertia", | ||
| 289 | "This class represenses a sparse version of a Spatial Inertia and its is defined by its " | ||
| 290 | "mass, its center of mass location and the rotational inertia expressed around this " | ||
| 291 | "center of mass.\n\n" | ||
| 292 | "Supported operations ...", | ||
| 293 | bp::no_init) | ||
| 294 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(InertiaPythonVisitor<Inertia>()) |
| 295 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(CastVisitor<Inertia>()) |
| 296 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(ExposeConstructorByCastVisitor<Inertia, ::pinocchio::Inertia>()) |
| 297 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(CopyableVisitor<Inertia>()) |
| 298 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(PrintableVisitor<Inertia>()); |
| 299 | 69 | } | |
| 300 | |||
| 301 | private: | ||
| 302 | 1 | static Matrix6 __array__(const Inertia & self, bp::object, bp::object) | |
| 303 | { | ||
| 304 | 1 | return self.matrix(); | |
| 305 | } | ||
| 306 | |||
| 307 | struct Pickle : bp::pickle_suite | ||
| 308 | { | ||
| 309 | 1 | static boost::python::tuple getinitargs(const Inertia & I) | |
| 310 | { | ||
| 311 |
2/4✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
|
2 | return bp::make_tuple(I.mass(), (Vector3)I.lever(), I.inertia().matrix()); |
| 312 | } | ||
| 313 | |||
| 314 | 65 | static bool getstate_manages_dict() | |
| 315 | { | ||
| 316 | 65 | return true; | |
| 317 | } | ||
| 318 | }; | ||
| 319 | |||
| 320 | }; // struct InertiaPythonVisitor | ||
| 321 | |||
| 322 | template<typename PseudoInertia> | ||
| 323 | struct PseudoInertiaPythonVisitor | ||
| 324 | : public boost::python::def_visitor<PseudoInertiaPythonVisitor<PseudoInertia>> | ||
| 325 | { | ||
| 326 | enum | ||
| 327 | { | ||
| 328 | Options = PseudoInertia::Options | ||
| 329 | }; | ||
| 330 | typedef typename PseudoInertia::Scalar Scalar; | ||
| 331 | typedef typename PseudoInertia::Vector3 Vector3; | ||
| 332 | typedef typename PseudoInertia::Matrix3 Matrix3; | ||
| 333 | typedef typename PseudoInertia::Vector10 Vector10; | ||
| 334 | typedef typename PseudoInertia::Matrix4 Matrix4; | ||
| 335 | typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1, Options> VectorXs; | ||
| 336 | |||
| 337 | public: | ||
| 338 | template<class PyClass> | ||
| 339 | 69 | void visit(PyClass & cl) const | |
| 340 | { | ||
| 341 |
5/10✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 69 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 69 times.
✗ Branch 14 not taken.
|
207 | cl.def(bp::init<const Scalar &, const Vector3 &, const Matrix3 &>( |
| 342 |
3/6✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 69 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 69 times.
✗ Branch 9 not taken.
|
276 | (bp::arg("self"), bp::arg("mass"), bp::arg("h"), bp::arg("sigma")), |
| 343 | "Initialize from mass, vector part of the pseudo inertia and matrix part of the " | ||
| 344 | "pseudo inertia.")) | ||
| 345 |
3/6✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
|
69 | .def(bp::init<const PseudoInertia &>( |
| 346 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | (bp::arg("self"), bp::arg("clone")), "Copy constructor")) |
| 347 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 348 | "mass", &PseudoInertiaPythonVisitor::getMass, &PseudoInertiaPythonVisitor::setMass, | ||
| 349 | "Mass of the Pseudo Inertia.") | ||
| 350 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 351 | "h", &PseudoInertiaPythonVisitor::getH, &PseudoInertiaPythonVisitor::setH, | ||
| 352 | "Vector part of the Pseudo Inertia.") | ||
| 353 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 354 | "sigma", &PseudoInertiaPythonVisitor::getSigma, &PseudoInertiaPythonVisitor::setSigma, | ||
| 355 | "Matrix part of the Pseudo Inertia.") | ||
| 356 | |||
| 357 | 138 | .def( | |
| 358 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "toMatrix", &PseudoInertia::toMatrix, bp::arg("self"), |
| 359 | "Returns the pseudo inertia as a 4x4 matrix.") | ||
| 360 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 361 | "toDynamicParameters", &PseudoInertiaPythonVisitor::toDynamicParameters_proxy, | ||
| 362 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | bp::arg("self"), "Returns the dynamic parameters representation.") |
| 363 | 138 | .def( | |
| 364 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "toInertia", &PseudoInertia::toInertia, bp::arg("self"), |
| 365 | "Returns the inertia representation.") | ||
| 366 |
3/6✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
|
138 | .def( |
| 367 | "FromDynamicParameters", &PseudoInertiaPythonVisitor::fromDynamicParameters_proxy, | ||
| 368 | bp::args("dynamic_parameters"), | ||
| 369 | "Builds a pseudo inertia matrix from a vector of dynamic parameters." | ||
| 370 | "\nThe parameters are given as dynamic_parameters = [m, h_x, h_y, h_z, I_{xx}, " | ||
| 371 | "I_{xy}, I_{yy}, I_{xz}, I_{yz}, I_{zz}]^T.") | ||
| 372 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromDynamicParameters") |
| 373 | |||
| 374 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 375 | "FromMatrix", &PseudoInertia::FromMatrix, bp::args("pseudo_inertia_matrix"), | ||
| 376 | "Returns the Pseudo Inertia from a 4x4 matrix.") | ||
| 377 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromMatrix") |
| 378 | |||
| 379 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 380 | "FromInertia", &PseudoInertia::FromInertia, bp::args("inertia"), | ||
| 381 | "Returns the Pseudo Inertia from an Inertia object.") | ||
| 382 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("FromInertia") |
| 383 | |||
| 384 | 138 | .def("__array__", &PseudoInertia::toMatrix) | |
| 385 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 386 | "__array__", &__array__, | ||
| 387 |
9/18✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 69 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 69 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 69 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 69 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 69 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 69 times.
✗ Branch 26 not taken.
|
138 | (bp::arg("self"), bp::arg("dtype") = bp::object(), bp::arg("copy") = bp::object())) |
| 388 | #ifndef PINOCCHIO_PYTHON_NO_SERIALIZATION | ||
| 389 |
1/2✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
|
65 | .def_pickle(Pickle()) |
| 390 | #endif | ||
| 391 | ; | ||
| 392 | 69 | } | |
| 393 | |||
| 394 | 9 | static Scalar getMass(const PseudoInertia & self) | |
| 395 | { | ||
| 396 | 9 | return self.mass; | |
| 397 | } | ||
| 398 | ✗ | static void setMass(PseudoInertia & self, Scalar mass) | |
| 399 | { | ||
| 400 | ✗ | self.mass = mass; | |
| 401 | } | ||
| 402 | |||
| 403 | 9 | static Vector3 getH(const PseudoInertia & self) | |
| 404 | { | ||
| 405 | 9 | return self.h; | |
| 406 | } | ||
| 407 | ✗ | static void setH(PseudoInertia & self, const Vector3 & h) | |
| 408 | { | ||
| 409 | ✗ | self.h = h; | |
| 410 | } | ||
| 411 | |||
| 412 | 9 | static Matrix3 getSigma(const PseudoInertia & self) | |
| 413 | { | ||
| 414 | 9 | return self.sigma; | |
| 415 | } | ||
| 416 | ✗ | static void setSigma(PseudoInertia & self, const Matrix3 & sigma) | |
| 417 | { | ||
| 418 | ✗ | self.sigma = sigma; | |
| 419 | } | ||
| 420 | |||
| 421 | 1 | static VectorXs toDynamicParameters_proxy(const PseudoInertia & self) | |
| 422 | { | ||
| 423 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | return self.toDynamicParameters(); |
| 424 | } | ||
| 425 | |||
| 426 | 2 | static PseudoInertia fromDynamicParameters_proxy(const VectorXs & params) | |
| 427 | { | ||
| 428 |
5/6✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
|
2 | if (params.rows() != 10 || params.cols() != 1) |
| 429 | { | ||
| 430 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | std::ostringstream shape; |
| 431 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
|
1 | shape << "(" << params.rows() << ", " << params.cols() << ")"; |
| 432 |
4/8✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
|
1 | throw std::invalid_argument( |
| 433 | "Wrong size: params" + shape.str() + " but should have the following shape (10, 1)"); | ||
| 434 | 1 | } | |
| 435 | 1 | return PseudoInertia::FromDynamicParameters(params); | |
| 436 | } | ||
| 437 | |||
| 438 | 69 | static void expose() | |
| 439 | { | ||
| 440 | #if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 6 && EIGENPY_VERSION_AT_LEAST(2, 9, 0) | ||
| 441 | typedef PINOCCHIO_SHARED_PTR_HOLDER_TYPE(PseudoInertia) HolderType; | ||
| 442 | #else | ||
| 443 | typedef ::boost::python::detail::not_specified HolderType; | ||
| 444 | #endif | ||
| 445 | 69 | bp::class_<PseudoInertia, HolderType>( | |
| 446 | "PseudoInertia", | ||
| 447 | "This class represents a pseudo inertia matrix and it is defined by its mass, vector " | ||
| 448 | "part, and 3x3 matrix part.\n\n" | ||
| 449 | "Supported operations ...", | ||
| 450 | bp::no_init) | ||
| 451 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(PseudoInertiaPythonVisitor<PseudoInertia>()) |
| 452 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(CopyableVisitor<PseudoInertia>()) |
| 453 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(PrintableVisitor<PseudoInertia>()) |
| 454 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(CastVisitor<PseudoInertia>()) |
| 455 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(ExposeConstructorByCastVisitor<PseudoInertia, ::pinocchio::PseudoInertia>()); |
| 456 | 69 | } | |
| 457 | |||
| 458 | private: | ||
| 459 | 1 | static Matrix4 __array__(const PseudoInertia & self, bp::object, bp::object) | |
| 460 | { | ||
| 461 | 1 | return self.toMatrix(); | |
| 462 | } | ||
| 463 | |||
| 464 | struct Pickle : bp::pickle_suite | ||
| 465 | { | ||
| 466 | ✗ | static boost::python::tuple getinitargs(const PseudoInertia & pi) | |
| 467 | { | ||
| 468 | ✗ | return bp::make_tuple(pi.mass, pi.h, pi.sigma); | |
| 469 | } | ||
| 470 | |||
| 471 | 65 | static bool getstate_manages_dict() | |
| 472 | { | ||
| 473 | 65 | return true; | |
| 474 | } | ||
| 475 | }; | ||
| 476 | |||
| 477 | }; // struct PseudoInertiaPythonVisitor | ||
| 478 | |||
| 479 | template<typename LogCholeskyParameters> | ||
| 480 | struct LogCholeskyParametersPythonVisitor | ||
| 481 | : public boost::python::def_visitor<LogCholeskyParametersPythonVisitor<LogCholeskyParameters>> | ||
| 482 | { | ||
| 483 | enum | ||
| 484 | { | ||
| 485 | Options = LogCholeskyParameters::Options | ||
| 486 | }; | ||
| 487 | typedef typename LogCholeskyParameters::Scalar Scalar; | ||
| 488 | typedef typename LogCholeskyParameters::Vector10 Vector10; | ||
| 489 | typedef typename LogCholeskyParameters::Matrix10 Matrix10; | ||
| 490 | typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1, Options> VectorXs; | ||
| 491 | typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, Options> MatrixXs; | ||
| 492 | |||
| 493 | public: | ||
| 494 | template<class PyClass> | ||
| 495 | 69 | void visit(PyClass & cl) const | |
| 496 | { | ||
| 497 |
2/4✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 69 times.
✗ Branch 6 not taken.
|
69 | cl.def( |
| 498 | "__init__", | ||
| 499 | bp::make_constructor( | ||
| 500 | 69 | &LogCholeskyParametersPythonVisitor::makeFromParameters, bp::default_call_policies(), | |
| 501 | bp::args("log_cholesky_parameters")), | ||
| 502 | "Initialize from log cholesky parameters.") | ||
| 503 |
3/6✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
|
69 | .def(bp::init<const LogCholeskyParameters &>( |
| 504 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | (bp::arg("self"), bp::arg("clone")), "Copy constructor")) |
| 505 | |||
| 506 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 507 | "parameters", &LogCholeskyParametersPythonVisitor::getParameters, | ||
| 508 | &LogCholeskyParametersPythonVisitor::setParameters, "Log Cholesky parameters.") | ||
| 509 | |||
| 510 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 511 | "toDynamicParameters", &LogCholeskyParametersPythonVisitor::toDynamicParameters_proxy, | ||
| 512 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | bp::arg("self"), "Returns the dynamic parameters representation.") |
| 513 | 138 | .def( | |
| 514 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "toPseudoInertia", &LogCholeskyParameters::toPseudoInertia, bp::arg("self"), |
| 515 | "Returns the Pseudo Inertia representation.") | ||
| 516 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 517 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "toInertia", &LogCholeskyParameters::toInertia, bp::arg("self"), |
| 518 | "Returns the Inertia representation.") | ||
| 519 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 520 | "calculateJacobian", &LogCholeskyParametersPythonVisitor::calculateJacobian_proxy, | ||
| 521 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | bp::arg("self"), "Calculates the Jacobian of the log Cholesky parameters.") |
| 522 | |||
| 523 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("__array__", &LogCholeskyParametersPythonVisitor::getParameters) |
| 524 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 525 | "__array__", &__array__, | ||
| 526 |
9/18✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 69 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 69 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 69 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 69 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 69 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 69 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 69 times.
✗ Branch 26 not taken.
|
138 | (bp::arg("self"), bp::arg("dtype") = bp::object(), bp::arg("copy") = bp::object())) |
| 527 | #ifndef PINOCCHIO_PYTHON_NO_SERIALIZATION | ||
| 528 |
1/2✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
|
65 | .def_pickle(Pickle()) |
| 529 | #endif | ||
| 530 | ; | ||
| 531 | 69 | } | |
| 532 | |||
| 533 | 2 | static LogCholeskyParameters * makeFromParameters(const VectorXs & params) | |
| 534 | { | ||
| 535 |
5/6✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
|
2 | if (params.rows() != 10 || params.cols() != 1) |
| 536 | { | ||
| 537 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | std::ostringstream shape; |
| 538 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
|
1 | shape << "(" << params.rows() << ", " << params.cols() << ")"; |
| 539 |
4/8✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
|
1 | throw std::invalid_argument( |
| 540 | "Wrong size: params" + shape.str() + " but should have the following shape (10, 1)"); | ||
| 541 | 1 | } | |
| 542 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
|
1 | return new LogCholeskyParameters(params); |
| 543 | } | ||
| 544 | |||
| 545 | 2 | static VectorXs getParameters(const LogCholeskyParameters & self) | |
| 546 | { | ||
| 547 | 2 | return self.parameters; | |
| 548 | } | ||
| 549 | ✗ | static void setParameters(LogCholeskyParameters & self, const Vector10 & parameters) | |
| 550 | { | ||
| 551 | ✗ | self.parameters = parameters; | |
| 552 | } | ||
| 553 | |||
| 554 | 1 | static VectorXs toDynamicParameters_proxy(const LogCholeskyParameters & self) | |
| 555 | { | ||
| 556 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | return self.toDynamicParameters(); |
| 557 | } | ||
| 558 | |||
| 559 | 1 | static MatrixXs calculateJacobian_proxy(const LogCholeskyParameters & self) | |
| 560 | { | ||
| 561 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | return self.calculateJacobian(); |
| 562 | } | ||
| 563 | |||
| 564 | 69 | static void expose() | |
| 565 | { | ||
| 566 | #if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 6 && EIGENPY_VERSION_AT_LEAST(2, 9, 0) | ||
| 567 | typedef PINOCCHIO_SHARED_PTR_HOLDER_TYPE(LogCholeskyParameters) HolderType; | ||
| 568 | #else | ||
| 569 | typedef ::boost::python::detail::not_specified HolderType; | ||
| 570 | #endif | ||
| 571 | 69 | bp::class_<LogCholeskyParameters, HolderType>( | |
| 572 | "LogCholeskyParameters", | ||
| 573 | "This class represents log Cholesky parameters.\n\n" | ||
| 574 | "Supported operations ...", | ||
| 575 | bp::no_init) | ||
| 576 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(LogCholeskyParametersPythonVisitor<LogCholeskyParameters>()) |
| 577 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(CopyableVisitor<LogCholeskyParameters>()) |
| 578 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(PrintableVisitor<LogCholeskyParameters>()) |
| 579 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(CastVisitor<LogCholeskyParameters>()) |
| 580 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(ExposeConstructorByCastVisitor< |
| 581 | LogCholeskyParameters, ::pinocchio::LogCholeskyParameters>()); | ||
| 582 | 69 | } | |
| 583 | |||
| 584 | private: | ||
| 585 | 1 | static VectorXs __array__(const LogCholeskyParameters & self, bp::object, bp::object) | |
| 586 | { | ||
| 587 | 1 | return self.parameters; | |
| 588 | } | ||
| 589 | |||
| 590 | struct Pickle : bp::pickle_suite | ||
| 591 | { | ||
| 592 | ✗ | static boost::python::tuple getinitargs(const LogCholeskyParameters & lcp) | |
| 593 | { | ||
| 594 | ✗ | return bp::make_tuple(lcp.parameters); | |
| 595 | } | ||
| 596 | |||
| 597 | 65 | static bool getstate_manages_dict() | |
| 598 | { | ||
| 599 | 65 | return true; | |
| 600 | } | ||
| 601 | }; | ||
| 602 | |||
| 603 | }; // struct LogCholeskyParametersPythonVisitor | ||
| 604 | |||
| 605 | } // namespace python | ||
| 606 | } // namespace pinocchio | ||
| 607 | |||
| 608 | #endif // ifndef __pinocchio_python_spatial_inertia_hpp__ | ||
| 609 |