6#ifndef __pinocchio_python_spatial_se3_hpp__
7#define __pinocchio_python_spatial_se3_hpp__
9#include <eigenpy/eigenpy.hpp>
10#include <eigenpy/memory.hpp>
11#include <boost/python/tuple.hpp>
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"
19#include "pinocchio/utils/string.hpp"
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"
26#if EIGENPY_VERSION_AT_MOST(2, 8, 1)
27EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(pinocchio::SE3)
34 namespace bp = boost::python;
36 template<
typename SE3>
37 struct SE3PythonVisitor :
public boost::python::def_visitor<SE3PythonVisitor<SE3>>
39 typedef typename SE3::Scalar Scalar;
42 Options = SE3::Options
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;
50 typedef MotionTpl<Scalar, Options> Motion;
51 typedef ForceTpl<Scalar, Options> Force;
52 typedef InertiaTpl<Scalar, Options> Inertia;
55 template<
class PyClass>
56 void visit(PyClass & cl)
const
58 static const Scalar dummy_precision = Eigen::NumTraits<Scalar>::dummy_precision();
60 cl.def(bp::init<const Matrix3 &, const Vector3 &>(
61 (bp::arg(
"self"), bp::arg(
"rotation"), bp::arg(
"translation")),
62 "Initialize from a rotation matrix and a translation vector."))
63 .def(bp::init<const Quaternion &, const Vector3 &>(
64 (bp::arg(
"self"), bp::arg(
"quat"), bp::arg(
"translation")),
65 "Initialize from a quaternion and a translation vector."))
66 .def(bp::init<int>((bp::arg(
"self"), bp::arg(
"int")),
"Init to identity."))
67 .def(bp::init<const Matrix4 &>(
68 (bp::arg(
"self"), bp::arg(
"array")),
"Initialize from an homogeneous matrix."))
69 .def(bp::init<const SE3 &>((bp::arg(
"self"), bp::arg(
"clone")),
"Copy constructor"))
74 (
typename SE3::AngularRef(SE3::*)()) & SE3::rotation,
75 bp::return_internal_reference<>()),
76 (void(SE3::*)(const Matrix3 &)) & SE3::rotation,
77 "The rotation part of the transformation.")
81 (typename SE3::LinearRef(SE3::*)()) & SE3::translation,
82 bp::return_internal_reference<>()),
83 (void(SE3::*)(const Vector3 &)) & SE3::translation,
84 "The translation part of the transformation.")
87 "homogeneous", &SE3::toHomogeneousMatrix,
88 "Returns the equivalent homegeneous matrix (acting on SE3).")
90 "action", (ActionMatrixType(SE3::*)() const)&SE3::toActionMatrix,
91 "Returns the related action matrix (acting on Motion).")
93 "toActionMatrix", (ActionMatrixType(SE3::*)() const)&SE3::toActionMatrix,
94 bp::arg(
"self"),
"Returns the related action matrix (acting on Motion).")
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")
100 "toActionMatrixInverse", (ActionMatrixType(SE3::*)() const)&SE3::toActionMatrixInverse,
102 "Returns the inverse of the action matrix (acting on Motion).\n"
103 "This is equivalent to do m.inverse().toActionMatrix()")
105 "dualAction", (ActionMatrixType(SE3::*)() const)&SE3::toDualActionMatrix,
106 "Returns the related dual action matrix (acting on Force).")
108 "toDualActionMatrix", (ActionMatrixType(SE3::*)() const)&SE3::toDualActionMatrix,
109 bp::arg(
"self"),
"Returns the related dual action matrix (acting on Force).")
112 "setIdentity", &SE3PythonVisitor::setIdentity, bp::arg(
"self"),
113 "Set *this to the identity placement.")
115 "setRandom", &SE3PythonVisitor::setRandom, bp::arg(
"self"),
116 "Set *this to a random placement.")
118 .def(
"inverse", &SE3::inverse, bp::arg(
"self"),
"Returns the inverse transform")
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.")
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.")
129 "act", (SE3(SE3::*)(const SE3 & other) const)&SE3::act, bp::args(
"self",
"M"),
130 "Returns the result of *this * M.")
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.")
136 "act", (Motion(SE3::*)(const Motion &) const)&SE3::act, bp::args(
"self",
"motion"),
137 "Returns the result action of *this onto a Motion.")
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.")
143 "act", (Force(SE3::*)(const Force &) const)&SE3::act, bp::args(
"self",
"force"),
144 "Returns the result of *this onto a Force.")
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.")
150 "act", (Inertia(SE3::*)(const Inertia &) const)&SE3::act, bp::args(
"self",
"inertia"),
151 "Returns the result of *this onto a Force.")
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.")
157#ifndef PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS
159 "isApprox", &SE3::isApprox,
160 (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 "
165 "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.")
170 .def(
"__invert__", &SE3::inverse,
"Returns the inverse of *this.")
171 .def(bp::self * bp::self)
172 .def(
"__mul__", &__mul__<Motion>)
173 .def(
"__mul__", &__mul__<Force>)
174 .def(
"__mul__", &__mul__<Inertia>)
175 .def(
"__mul__", &__mul__<Vector3>)
176 .add_property(
"np", &SE3::toHomogeneousMatrix)
178#ifndef PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS
179 .def(bp::self == bp::self)
180 .def(bp::self != bp::self)
183 .def(
"Identity", &SE3::Identity,
"Returns the identity transformation.")
184 .staticmethod(
"Identity")
185 .def(
"Random", &SE3::Random,
"Returns a random transformation.")
186 .staticmethod(
"Random")
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"
194 "\tA: Initial transformation\n"
195 "\tB: Target transformation\n"
196 "\talpha: Interpolation factor")
197 .staticmethod(
"Interpolate")
199 .def(
"__array__", &SE3::toHomogeneousMatrix)
201 "__array__", &__array__,
202 (bp::arg(
"self"), bp::arg(
"dtype") = bp::object(), bp::arg(
"copy") = bp::object()))
204#ifndef PINOCCHIO_PYTHON_NO_SERIALIZATION
205 .def_pickle(Pickle())
210 static std::string scopeName()
212 static std::string scope_name;
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;
221 typedef ::boost::python::detail::not_specified HolderType;
223 bp::class_<SE3, HolderType>(
224 "SE3",
"SE3 transformation defined by a 3d vector and a rotation matrix.",
225 bp::init<>(bp::arg(
"self"),
"Default constructor."))
226 .def(SE3PythonVisitor<SE3>())
227 .def(CastVisitor<SE3>())
228 .def(ExposeConstructorByCastVisitor<SE3, ::pinocchio::SE3>())
229 .def(CopyableVisitor<SE3>())
230 .def(bp::self_ns::str(bp::self_ns::self))
231 .def(
"__repr__", &repr);
235 static Matrix4 __array__(
const SE3 & self, bp::object, bp::object)
237 return self.toHomogeneousMatrix();
240 struct Pickle : bp::pickle_suite
242 static boost::python::tuple getinitargs(
const SE3 & M)
244 return bp::make_tuple((Matrix3)M.rotation(), (Vector3)M.translation());
247 static bool getstate_manages_dict()
253 static void setIdentity(SE3 & self)
257 static void setRandom(SE3 & self)
262 template<
typename Spatial>
263 static Spatial __mul__(
const SE3 & self,
const Spatial & other)
265 return self.act(other);
268 static std::string repr(
const SE3 & self)
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,
" ",
"");
286 std::stringstream ss_repr;
288 ss_repr << homegeneous_repr;
291 return ss_repr.str();
Main pinocchio namespace.
bool replace(std::string &input_str, const std::string &from, const std::string &to)
Replace string from with to in input_str.