| Directory: | ./ |
|---|---|
| File: | include/pinocchio/bindings/python/spatial/se3.hpp |
| Date: | 2025-02-12 21:03:38 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 87 | 98 | 88.8% |
| Branches: | 123 | 288 | 42.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_se3_hpp__ | ||
| 7 | #define __pinocchio_python_spatial_se3_hpp__ | ||
| 8 | |||
| 9 | #include <eigenpy/eigenpy.hpp> | ||
| 10 | #include <eigenpy/memory.hpp> | ||
| 11 | #include <boost/python/tuple.hpp> | ||
| 12 | |||
| 13 | #include "pinocchio/spatial/se3.hpp" | ||
| 14 | #include "pinocchio/spatial/motion.hpp" | ||
| 15 | #include "pinocchio/spatial/force.hpp" | ||
| 16 | #include "pinocchio/spatial/inertia.hpp" | ||
| 17 | #include "pinocchio/spatial/explog.hpp" | ||
| 18 | |||
| 19 | #include "pinocchio/utils/string.hpp" | ||
| 20 | |||
| 21 | #include "pinocchio/bindings/python/utils/cast.hpp" | ||
| 22 | #include "pinocchio/bindings/python/utils/copyable.hpp" | ||
| 23 | #include "pinocchio/bindings/python/utils/printable.hpp" | ||
| 24 | #include "pinocchio/bindings/python/utils/namespace.hpp" | ||
| 25 | |||
| 26 | #if EIGENPY_VERSION_AT_MOST(2, 8, 1) | ||
| 27 | EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(pinocchio::SE3) | ||
| 28 | #endif | ||
| 29 | |||
| 30 | namespace pinocchio | ||
| 31 | { | ||
| 32 | namespace python | ||
| 33 | { | ||
| 34 | namespace bp = boost::python; | ||
| 35 | |||
| 36 | template<typename SE3> | ||
| 37 | struct SE3PythonVisitor : public boost::python::def_visitor<SE3PythonVisitor<SE3>> | ||
| 38 | { | ||
| 39 | typedef typename SE3::Scalar Scalar; | ||
| 40 | enum | ||
| 41 | { | ||
| 42 | Options = SE3::Options | ||
| 43 | }; | ||
| 44 | typedef typename SE3::Matrix3 Matrix3; | ||
| 45 | typedef typename SE3::Vector3 Vector3; | ||
| 46 | typedef typename SE3::Matrix4 Matrix4; | ||
| 47 | typedef typename SE3::Quaternion Quaternion; | ||
| 48 | typedef typename SE3::ActionMatrixType ActionMatrixType; | ||
| 49 | |||
| 50 | typedef MotionTpl<Scalar, Options> Motion; | ||
| 51 | typedef ForceTpl<Scalar, Options> Force; | ||
| 52 | typedef InertiaTpl<Scalar, Options> Inertia; | ||
| 53 | |||
| 54 | public: | ||
| 55 | template<class PyClass> | ||
| 56 | 69 | void visit(PyClass & cl) const | |
| 57 | { | ||
| 58 |
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(); |
| 59 | |||
| 60 |
4/8✓ 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.
|
138 | cl.def(bp::init<const Matrix3 &, const Vector3 &>( |
| 61 |
2/4✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 69 times.
✗ Branch 6 not taken.
|
207 | (bp::arg("self"), bp::arg("rotation"), bp::arg("translation")), |
| 62 | "Initialize from a rotation matrix and a translation vector.")) | ||
| 63 |
4/8✓ 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.
|
138 | .def(bp::init<const Quaternion &, const Vector3 &>( |
| 64 |
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.
|
207 | (bp::arg("self"), bp::arg("quat"), bp::arg("translation")), |
| 65 | "Initialize from a quaternion and a translation vector.")) | ||
| 66 |
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<int>((bp::arg("self"), bp::arg("int")), "Init to identity.")) |
| 67 |
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 Matrix4 &>( |
| 68 |
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("array")), "Initialize from an homogeneous matrix.")) |
| 69 |
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 SE3 &>((bp::arg("self"), bp::arg("clone")), "Copy constructor")) |
| 70 | |||
| 71 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 72 | "rotation", | ||
| 73 | bp::make_function( | ||
| 74 | (typename SE3::AngularRef(SE3::*)()) & SE3::rotation, | ||
| 75 | 69 | bp::return_internal_reference<>()), | |
| 76 | (void(SE3::*)(const Matrix3 &)) & SE3::rotation, | ||
| 77 | "The rotation part of the transformation.") | ||
| 78 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .add_property( |
| 79 | "translation", | ||
| 80 | bp::make_function( | ||
| 81 | (typename SE3::LinearRef(SE3::*)()) & SE3::translation, | ||
| 82 | 69 | bp::return_internal_reference<>()), | |
| 83 | (void(SE3::*)(const Vector3 &)) & SE3::translation, | ||
| 84 | "The translation part of the transformation.") | ||
| 85 | |||
| 86 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 87 | "homogeneous", &SE3::toHomogeneousMatrix, | ||
| 88 | "Returns the equivalent homegeneous matrix (acting on SE3).") | ||
| 89 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 90 | "action", (ActionMatrixType(SE3::*)() const)&SE3::toActionMatrix, | ||
| 91 | "Returns the related action matrix (acting on Motion).") | ||
| 92 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 93 | "toActionMatrix", (ActionMatrixType(SE3::*)() const)&SE3::toActionMatrix, | ||
| 94 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | bp::arg("self"), "Returns the related action matrix (acting on Motion).") |
| 95 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 96 | "actionInverse", (ActionMatrixType(SE3::*)() const)&SE3::toActionMatrixInverse, | ||
| 97 | "Returns the inverse of the action matrix (acting on Motion).\n" | ||
| 98 | "This is equivalent to do m.inverse().action") | ||
| 99 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 100 | "toActionMatrixInverse", (ActionMatrixType(SE3::*)() const)&SE3::toActionMatrixInverse, | ||
| 101 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | bp::arg("self"), |
| 102 | "Returns the inverse of the action matrix (acting on Motion).\n" | ||
| 103 | "This is equivalent to do m.inverse().toActionMatrix()") | ||
| 104 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .add_property( |
| 105 | "dualAction", (ActionMatrixType(SE3::*)() const)&SE3::toDualActionMatrix, | ||
| 106 | "Returns the related dual action matrix (acting on Force).") | ||
| 107 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 108 | "toDualActionMatrix", (ActionMatrixType(SE3::*)() const)&SE3::toDualActionMatrix, | ||
| 109 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | bp::arg("self"), "Returns the related dual action matrix (acting on Force).") |
| 110 | |||
| 111 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 112 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "setIdentity", &SE3PythonVisitor::setIdentity, bp::arg("self"), |
| 113 | "Set *this to the identity placement.") | ||
| 114 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def( |
| 115 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | "setRandom", &SE3PythonVisitor::setRandom, bp::arg("self"), |
| 116 | "Set *this to a random placement.") | ||
| 117 | |||
| 118 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
138 | .def("inverse", &SE3::inverse, bp::arg("self"), "Returns the inverse transform") |
| 119 | |||
| 120 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 121 | "act", (Vector3(SE3::*)(const Vector3 &) const)&SE3::act, bp::args("self", "point"), | ||
| 122 | "Returns a point which is the result of the entry point transforms by *this.") | ||
| 123 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 124 | "actInv", (Vector3(SE3::*)(const Vector3 &) const)&SE3::actInv, | ||
| 125 | bp::args("self", "point"), | ||
| 126 | "Returns a point which is the result of the entry point by the inverse of *this.") | ||
| 127 | |||
| 128 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 129 | "act", (SE3(SE3::*)(const SE3 & other) const)&SE3::act, bp::args("self", "M"), | ||
| 130 | "Returns the result of *this * M.") | ||
| 131 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 132 | "actInv", (SE3(SE3::*)(const SE3 & other) const)&SE3::actInv, bp::args("self", "M"), | ||
| 133 | "Returns the result of the inverse of *this times M.") | ||
| 134 | |||
| 135 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 136 | "act", (Motion(SE3::*)(const Motion &) const)&SE3::act, bp::args("self", "motion"), | ||
| 137 | "Returns the result action of *this onto a Motion.") | ||
| 138 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 139 | "actInv", (Motion(SE3::*)(const Motion &) const)&SE3::actInv, | ||
| 140 | bp::args("self", "motion"), "Returns the result of the inverse of *this onto a Motion.") | ||
| 141 | |||
| 142 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 143 | "act", (Force(SE3::*)(const Force &) const)&SE3::act, bp::args("self", "force"), | ||
| 144 | "Returns the result of *this onto a Force.") | ||
| 145 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 146 | "actInv", (Force(SE3::*)(const Force &) const)&SE3::actInv, bp::args("self", "force"), | ||
| 147 | "Returns the result of the inverse of *this onto an Inertia.") | ||
| 148 | |||
| 149 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 150 | "act", (Inertia(SE3::*)(const Inertia &) const)&SE3::act, bp::args("self", "inertia"), | ||
| 151 | "Returns the result of *this onto a Force.") | ||
| 152 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 153 | "actInv", (Inertia(SE3::*)(const Inertia &) const)&SE3::actInv, | ||
| 154 | bp::args("self", "inertia"), | ||
| 155 | "Returns the result of the inverse of *this onto an Inertia.") | ||
| 156 | |||
| 157 | #ifndef PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS | ||
| 158 |
2/4✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 65 times.
✗ Branch 5 not taken.
|
130 | .def( |
| 159 | "isApprox", &SE3::isApprox, | ||
| 160 |
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), |
| 161 | "Returns true if *this is approximately equal to other, within the precision given " | ||
| 162 | "by prec.") | ||
| 163 | |||
| 164 |
1/2✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
|
65 | .def( |
| 165 |
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 | "isIdentity", &SE3::isIdentity, (bp::arg("self"), bp::arg("prec") = dummy_precision), |
| 166 | "Returns true if *this is approximately equal to the identity placement, within the " | ||
| 167 | "precision given by prec.") | ||
| 168 | #endif | ||
| 169 | |||
| 170 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("__invert__", &SE3::inverse, "Returns the inverse of *this.") |
| 171 |
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) |
| 172 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("__mul__", &__mul__<Motion>) |
| 173 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("__mul__", &__mul__<Force>) |
| 174 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("__mul__", &__mul__<Inertia>) |
| 175 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("__mul__", &__mul__<Vector3>) |
| 176 | 138 | .add_property("np", &SE3::toHomogeneousMatrix) | |
| 177 | |||
| 178 | #ifndef PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS | ||
| 179 |
2/4✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 65 times.
✗ Branch 6 not taken.
|
65 | .def(bp::self == bp::self) |
| 180 |
1/2✓ Branch 2 taken 65 times.
✗ Branch 3 not taken.
|
65 | .def(bp::self != bp::self) |
| 181 | #endif | ||
| 182 | |||
| 183 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
69 | .def("Identity", &SE3::Identity, "Returns the identity transformation.") |
| 184 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("Identity") |
| 185 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("Random", &SE3::Random, "Returns a random transformation.") |
| 186 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("Random") |
| 187 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 188 | "Interpolate", &SE3::template Interpolate<Scalar>, bp::args("A", "B", "alpha"), | ||
| 189 | "Linear interpolation on the SE3 manifold.\n\n" | ||
| 190 | "This method computes the linear interpolation between A and B, such that the " | ||
| 191 | "result C = A + (B-A)*t if it would be applied on classic Euclidian space.\n" | ||
| 192 | "This operation is very similar to the SLERP operation on Rotations.\n" | ||
| 193 | "Parameters:\n" | ||
| 194 | "\tA: Initial transformation\n" | ||
| 195 | "\tB: Target transformation\n" | ||
| 196 | "\talpha: Interpolation factor") | ||
| 197 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .staticmethod("Interpolate") |
| 198 | |||
| 199 | 138 | .def("__array__", &SE3::toHomogeneousMatrix) | |
| 200 |
2/4✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 69 times.
✗ Branch 5 not taken.
|
138 | .def( |
| 201 | "__array__", &__array__, | ||
| 202 |
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())) |
| 203 | |||
| 204 | #ifndef PINOCCHIO_PYTHON_NO_SERIALIZATION | ||
| 205 |
1/2✓ Branch 1 taken 65 times.
✗ Branch 2 not taken.
|
65 | .def_pickle(Pickle()) |
| 206 | #endif | ||
| 207 | ; | ||
| 208 | 69 | } | |
| 209 | |||
| 210 | static std::string scopeName() | ||
| 211 | { | ||
| 212 | static std::string scope_name; | ||
| 213 | return scope_name; | ||
| 214 | } | ||
| 215 | |||
| 216 | 69 | static void expose() | |
| 217 | { | ||
| 218 | #if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 6 && EIGENPY_VERSION_AT_LEAST(2, 9, 0) | ||
| 219 | typedef PINOCCHIO_SHARED_PTR_HOLDER_TYPE(SE3) HolderType; | ||
| 220 | #else | ||
| 221 | typedef ::boost::python::detail::not_specified HolderType; | ||
| 222 | #endif | ||
| 223 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | bp::class_<SE3, HolderType>( |
| 224 | "SE3", "SE3 transformation defined by a 3d vector and a rotation matrix.", | ||
| 225 |
1/2✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
|
138 | bp::init<>(bp::arg("self"), "Default constructor.")) |
| 226 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(SE3PythonVisitor<SE3>()) |
| 227 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(CastVisitor<SE3>()) |
| 228 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(ExposeConstructorByCastVisitor<SE3, ::pinocchio::SE3>()) |
| 229 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def(CopyableVisitor<SE3>()) |
| 230 |
1/2✓ Branch 2 taken 69 times.
✗ Branch 3 not taken.
|
138 | .def(bp::self_ns::str(bp::self_ns::self)) |
| 231 |
1/2✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
|
69 | .def("__repr__", &repr); |
| 232 | 69 | } | |
| 233 | |||
| 234 | private: | ||
| 235 | 2 | static Matrix4 __array__(const SE3 & self, bp::object, bp::object) | |
| 236 | { | ||
| 237 | 2 | return self.toHomogeneousMatrix(); | |
| 238 | } | ||
| 239 | |||
| 240 | struct Pickle : bp::pickle_suite | ||
| 241 | { | ||
| 242 | 1 | static boost::python::tuple getinitargs(const SE3 & M) | |
| 243 | { | ||
| 244 |
3/6✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
|
2 | return bp::make_tuple((Matrix3)M.rotation(), (Vector3)M.translation()); |
| 245 | } | ||
| 246 | |||
| 247 | 65 | static bool getstate_manages_dict() | |
| 248 | { | ||
| 249 | 65 | return true; | |
| 250 | } | ||
| 251 | }; | ||
| 252 | |||
| 253 | 1 | static void setIdentity(SE3 & self) | |
| 254 | { | ||
| 255 | 1 | self.setIdentity(); | |
| 256 | 1 | } | |
| 257 | 3 | static void setRandom(SE3 & self) | |
| 258 | { | ||
| 259 | 3 | self.setRandom(); | |
| 260 | 3 | } | |
| 261 | |||
| 262 | template<typename Spatial> | ||
| 263 | 14 | static Spatial __mul__(const SE3 & self, const Spatial & other) | |
| 264 | { | ||
| 265 | 14 | return self.act(other); | |
| 266 | } | ||
| 267 | |||
| 268 | ✗ | static std::string repr(const SE3 & self) | |
| 269 | { | ||
| 270 | // bp::object | ||
| 271 | // py_rotation(bp::handle<>(eigenpy::EigenToPy<Matrix3,Scalar>::convert(self.rotation()))); | ||
| 272 | // std::string rotation_repr = | ||
| 273 | // bp::extract<std::string>(py_rotation.attr("__repr__")()); | ||
| 274 | // | ||
| 275 | // bp::object | ||
| 276 | // py_translation(bp::handle<>(eigenpy::EigenToPy<Vector3,Scalar>::convert(self.translation()))); | ||
| 277 | // std::string translation_repr = | ||
| 278 | // bp::extract<std::string>(py_translation.attr("__repr__")()); | ||
| 279 | |||
| 280 | ✗ | bp::object py_homogeneous( | |
| 281 | ✗ | bp::handle<>(eigenpy::EigenToPy<Matrix4, Scalar>::convert(self.toHomogeneousMatrix()))); | |
| 282 | ✗ | std::string homegeneous_repr = bp::extract<std::string>(py_homogeneous.attr("__repr__")()); | |
| 283 | ✗ | replace(homegeneous_repr, "\n", ""); | |
| 284 | ✗ | replace(homegeneous_repr, " ", ""); | |
| 285 | |||
| 286 | ✗ | std::stringstream ss_repr; | |
| 287 | ✗ | ss_repr << "SE3("; | |
| 288 | ✗ | ss_repr << homegeneous_repr; | |
| 289 | ✗ | ss_repr << ")"; | |
| 290 | |||
| 291 | ✗ | return ss_repr.str(); | |
| 292 | } | ||
| 293 | }; | ||
| 294 | |||
| 295 | } // namespace python | ||
| 296 | } // namespace pinocchio | ||
| 297 | |||
| 298 | #endif // ifndef __pinocchio_python_spatial_se3_hpp__ | ||
| 299 |