bindings/python/spatial/se3.hpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2015-2023 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 
22 
24 
25 namespace pinocchio
26 {
27  namespace python
28  {
29  namespace bp = boost::python;
30 
31  BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(isIdentity_overload,SE3::isIdentity,0,1)
32 
33  template<typename T> struct call;
34 
35  template<typename Scalar, int Options>
36  struct call< SE3Tpl<Scalar,Options> >
37  {
39 
40  static bool isApprox(const SE3 & self, const SE3 & other,
41  const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
42  {
43  return self.isApprox(other,prec);
44  }
45  };
46 
48 
49  template<typename SE3>
51  : public boost::python::def_visitor< SE3PythonVisitor<SE3> >
52  {
53  typedef typename SE3::Scalar Scalar;
54  typedef typename SE3::Matrix3 Matrix3;
55  typedef typename SE3::Vector3 Vector3;
56  typedef typename SE3::Matrix4 Matrix4;
57  typedef typename SE3::Quaternion Quaternion;
58 
59  public:
60 
61  template<class PyClass>
62  void visit(PyClass& cl) const
63  {
64  cl
65  .def(bp::init<Matrix3,Vector3>
66  (bp::args("self","rotation","translation"),
67  "Initialize from a rotation matrix and a translation vector."))
68  .def(bp::init<Quaternion,Vector3>
69  (bp::args("self","quat","translation"),
70  "Initialize from a quaternion and a translation vector."))
71  .def(bp::init<int>(bp::args("self","int"),"Init to identity."))
72  .def(bp::init<SE3>(bp::args("self","other"), "Copy constructor."))
73  .def(bp::init<Matrix4>
74  (bp::args("self","array"),
75  "Initialize from an homogeneous matrix."))
76 
77  .add_property("rotation",
78  bp::make_function((typename SE3::AngularRef (SE3::*)()) &SE3::rotation,bp::return_internal_reference<>()),
79  (void (SE3::*)(const Matrix3 &)) &SE3::rotation,
80  "The rotation part of the transformation.")
81  .add_property("translation",
82  bp::make_function((typename SE3::LinearRef (SE3::*)()) &SE3::translation,bp::return_internal_reference<>()),
83  (void (SE3::*)(const Vector3 &)) &SE3::translation,
84  "The translation part of the transformation.")
85 
86  .add_property("homogeneous",&SE3::toHomogeneousMatrix,
87  "Returns the equivalent homegeneous matrix (acting on SE3).")
88  .add_property("action",&SE3::toActionMatrix,
89  "Returns the related action matrix (acting on Motion).")
90  .def("toActionMatrix",&SE3::toActionMatrix,bp::arg("self"),
91  "Returns the related action matrix (acting on Motion).")
92  .add_property("actionInverse",&SE3::toActionMatrixInverse,
93  "Returns the inverse of the action matrix (acting on Motion).\n"
94  "This is equivalent to do m.inverse().action")
95  .def("toActionMatrixInverse",&SE3::toActionMatrixInverse,bp::arg("self"),
96  "Returns the inverse of the action matrix (acting on Motion).\n"
97  "This is equivalent to do m.inverse().toActionMatrix()")
98  .add_property("dualAction",&SE3::toDualActionMatrix,
99  "Returns the related dual action matrix (acting on Force).")
100  .def("toDualActionMatrix",&SE3::toDualActionMatrix,bp::arg("self"),
101  "Returns the related dual action matrix (acting on Force).")
102 
103  .def("setIdentity",&SE3PythonVisitor::setIdentity,bp::arg("self"),
104  "Set *this to the identity placement.")
105  .def("setRandom",&SE3PythonVisitor::setRandom,bp::arg("self"),
106  "Set *this to a random placement.")
107 
108  .def("inverse", &SE3::inverse, bp::arg("self"),
109  "Returns the inverse transform")
110 
111  .def("act", (Vector3 (SE3::*)(const Vector3 &) const) &SE3::act,
112  bp::args("self","point"),
113  "Returns a point which is the result of the entry point transforms by *this.")
114  .def("actInv", (Vector3 (SE3::*)(const Vector3 &) const) &SE3::actInv,
115  bp::args("self","point"),
116  "Returns a point which is the result of the entry point by the inverse of *this.")
117 
118  .def("act", (SE3 (SE3::*)(const SE3 & other) const) &SE3::act,
119  bp::args("self","M"), "Returns the result of *this * M.")
120  .def("actInv", (SE3 (SE3::*)(const SE3 & other) const) &SE3::actInv,
121  bp::args("self","M"), "Returns the result of the inverse of *this times M.")
122 
123  .def("act", (Motion (SE3::*)(const Motion &) const) &SE3::act,
124  bp::args("self","motion"), "Returns the result action of *this onto a Motion.")
125  .def("actInv", (Motion (SE3::*)(const Motion &) const) &SE3::actInv,
126  bp::args("self","motion"), "Returns the result of the inverse of *this onto a Motion.")
127 
128  .def("act", (Force (SE3::*)(const Force &) const) &SE3::act,
129  bp::args("self","force"), "Returns the result of *this onto a Force.")
130  .def("actInv", (Force (SE3::*)(const Force &) const) &SE3::actInv,
131  bp::args("self","force"), "Returns the result of the inverse of *this onto an Inertia.")
132 
133  .def("act", (Inertia (SE3::*)(const Inertia &) const) &SE3::act,
134  bp::args("self","inertia"), "Returns the result of *this onto a Force.")
135  .def("actInv", (Inertia (SE3::*)(const Inertia &) const) &SE3::actInv,
136  bp::args("self","inertia"), "Returns the result of the inverse of *this onto an Inertia.")
137 
138  .def("isApprox",
140  isApproxSE3_overload(bp::args("self","other","prec"),
141  "Returns true if *this is approximately equal to other, within the precision given by prec."))
142 
143  .def("isIdentity",
145  isIdentity_overload(bp::args("self","prec"),
146  "Returns true if *this is approximately equal to the identity placement, within the precision given by prec."))
147 
148  .def("__invert__",&SE3::inverse,"Returns the inverse of *this.")
149  .def(bp::self * bp::self)
150  .def("__mul__",&__mul__<Motion>)
151  .def("__mul__",&__mul__<Force>)
152  .def("__mul__",&__mul__<Inertia>)
153  .def("__mul__",&__mul__<Vector3>)
154  .add_property("np",&SE3::toHomogeneousMatrix)
155 
156  .def(bp::self == bp::self)
157  .def(bp::self != bp::self)
158 
159  .def("Identity",&SE3::Identity,"Returns the identity transformation.")
160  .staticmethod("Identity")
161  .def("Random",&SE3::Random,"Returns a random transformation.")
162  .staticmethod("Random")
163  .def("Interpolate",&SE3::template Interpolate<double>,
164  bp::args("A","B","alpha"),
165  "Linear interpolation on the SE3 manifold.\n\n"
166  "This method computes the linear interpolation between A and B, such that the result C = A + (B-A)*t if it would be applied on classic Euclidian space.\n"
167  "This operation is very similar to the SLERP operation on Rotations.\n"
168  "Parameters:\n"
169  "\tA: Initial transformation\n"
170  "\tB: Target transformation\n"
171  "\talpha: Interpolation factor")
172  .staticmethod("Interpolate")
173 
174  .def("__array__",&SE3::toHomogeneousMatrix)
175 
176  .def_pickle(Pickle())
177  ;
178  }
179 
180  static void expose()
181  {
182 #if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 6 && EIGENPY_VERSION_AT_LEAST(2,9,0)
183  typedef PINOCCHIO_SHARED_PTR_HOLDER_TYPE(SE3) HolderType;
184 #else
185  typedef ::boost::python::detail::not_specified HolderType;
186 #endif
187  bp::class_<SE3,HolderType>("SE3",
188  "SE3 transformation defined by a 3d vector and a rotation matrix.",
189  bp::init<>(bp::arg("self"),"Default constructor."))
190  .def(SE3PythonVisitor<SE3>())
191  .def(CopyableVisitor<SE3>())
192  .def(PrintableVisitor<SE3>())
193  ;
194 
195  }
196  private:
197 
198  struct Pickle : bp::pickle_suite
199  {
200  static
201  boost::python::tuple
202  getinitargs(const SE3 & M)
203  { return bp::make_tuple((Matrix3)M.rotation(),(Vector3)M.translation()); }
204 
205  static bool getstate_manages_dict() { return true; }
206  };
207 
208  static void setIdentity(SE3 & self) { self.setIdentity(); }
209  static void setRandom(SE3 & self) { self.setRandom(); }
210 
211  template<typename Spatial>
212  static Spatial __mul__(const SE3 & self, const Spatial & other)
213  { return self.act(other); }
214  };
215 
216  } // namespace python
217 } // namespace pinocchio
218 
219 #endif // ifndef __pinocchio_python_spatial_se3_hpp__
SE3GroupAction< D >::ReturnType actInv(const D &d) const
by = aXb.actInv(ay)
Definition: se3-base.hpp:97
static boost::python::tuple getinitargs(const SE3 &M)
Set the Python method str and repr to use the overloading operator<<.
Definition: printable.hpp:21
bool isIdentity(const Scalar &prec=Eigen::NumTraits< Scalar >::dummy_precision()) const
BOOST_PYTHON_FUNCTION_OVERLOADS(computeKKTContactDynamicMatrixInverse_overload, computeKKTContactDynamicMatrixInverse_proxy, 4, 5) static const Eigen
static Spatial __mul__(const SE3 &self, const Spatial &other)
SE3::Scalar Scalar
Definition: conversions.cpp:13
ActionMatrixType toActionMatrix() const
The action matrix of .
Definition: se3-base.hpp:60
static bool isApprox(const SE3 &self, const SE3 &other, const Scalar &prec=Eigen::NumTraits< Scalar >::dummy_precision())
Eigen::Quaternion< Scalar, Options > Quaternion
SE3Tpl inverse() const
aXb = bXa.inverse()
#define PINOCCHIO_SHARED_PTR_HOLDER_TYPE(T)
traits< SE3Tpl >::Matrix4 Matrix4
Add the Python method copy to allow a copy of this by calling the copy constructor.
Definition: copyable.hpp:21
HomogeneousMatrixType toHomogeneousMatrix() const
Definition: se3-base.hpp:44
traits< SE3Tpl >::Vector3 Vector3
Main pinocchio namespace.
Definition: timings.cpp:28
auto call(R(*f)(Args...), typename convert_type< Args >::type... args)
Definition: pybind11.hpp:118
SE3GroupAction< D >::ReturnType act(const D &d) const
ay = aXb.act(by)
Definition: se3-base.hpp:90
ActionMatrixType toActionMatrixInverse() const
The action matrix of .
Definition: se3-base.hpp:70
#define EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(...)
traits< SE3Tpl >::Matrix3 Matrix3


pinocchio
Author(s):
autogenerated on Fri Jun 23 2023 02:38:32