From 245578082924a3eeeb821bac7d41a93950fce802 Mon Sep 17 00:00:00 2001 From: Andrew Melim Date: Fri, 15 Nov 2013 22:59:36 +0000 Subject: [PATCH] Rot2, Pose2, Point2 now all work fairly well in Python. See Pose2.cpp for examples on method overloading and auto-declarations --- python/geometry/Point2.cpp | 11 +++-- python/geometry/Pose2.cpp | 72 ++++++++++++++++++++++++++++++ python/geometry/Rot2.cpp | 48 ++++++++++++++++++++ python/geometry/exportGeometry.cpp | 5 ++- 4 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 python/geometry/Pose2.cpp create mode 100644 python/geometry/Rot2.cpp diff --git a/python/geometry/Point2.cpp b/python/geometry/Point2.cpp index 0f87a6e48..0d1e7092b 100644 --- a/python/geometry/Point2.cpp +++ b/python/geometry/Point2.cpp @@ -4,20 +4,23 @@ using namespace boost::python; using namespace gtsam; -BOOST_PYTHON_FUNCTION_OVERLOADS(equals_overloads, &Point2::equals, 1, 2) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(print_overloads, Point2::print, 0, 1) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(equals_overloads, Point2::equals, 1, 2) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(compose_overloads, Point2::compose, 1, 3) void exportPoint2(){ class_("Point2", init<>()) .def(init()) - .def("print", &Point2::print) - .def("equals", &Point2::equals) + .def("print", &Point2::print, print_overloads(args("s"))) + .def("equals", &Point2::equals, equals_overloads(args("q","tol"))) .def("inverse", &Point2::inverse) - .def("compose", &Point2::compose) + .def("compose", &Point2::compose, compose_overloads(args("q", "H1", "H2"))) .def("between", &Point2::between) .def("dim", &Point2::dim) .def("retract", &Point2::retract) .def("x", &Point2::x) .def("y", &Point2::y) ; + } \ No newline at end of file diff --git a/python/geometry/Pose2.cpp b/python/geometry/Pose2.cpp new file mode 100644 index 000000000..577a8da2c --- /dev/null +++ b/python/geometry/Pose2.cpp @@ -0,0 +1,72 @@ +#include +#include "gtsam/geometry/Pose2.h" + +using namespace boost::python; +using namespace gtsam; + +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(print_overloads, Pose2::print, 0, 1) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(equals_overloads, Pose2::equals, 1, 2) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(compose_overloads, Pose2::compose, 1, 3) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(between_overloads, Pose2::between, 1, 3) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(transform_to_overloads, Pose2::transform_to, 1, 3) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(transform_from_overloads, Pose2::transform_from, 1, 3) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(bearing_overloads, Pose2::bearing, 1, 3) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(range_overloads, Pose2::range, 1, 3) + +// Manually wrap + +void exportPose2(){ + + double (Pose2::*range1)(const Pose2&, boost::optional, boost::optional) const + = &Pose2::range; + double (Pose2::*range2)(const Point2&, boost::optional, boost::optional) const + = &Pose2::range; + + Rot2 (Pose2::*bearing1)(const Pose2&, boost::optional, boost::optional) const + = &Pose2::bearing; + Rot2 (Pose2::*bearing2)(const Point2&, boost::optional, boost::optional) const + = &Pose2::bearing; + + class_("Pose2", init<>()) + .def(init()) + .def(init()) + .def(init()) + .def("print", &Pose2::print, print_overloads(args("s"))) + + .def("equals", &Pose2::equals, equals_overloads(args("pose","tol"))) + .def("inverse", &Pose2::inverse) + .def("compose", &Pose2::compose, compose_overloads(args("p2", "H1", "H2"))) + .def("between", &Pose2::between, between_overloads(args("p2", "H1", "H2"))) + .def("dim", &Pose2::dim) + .def("retract", &Pose2::retract) + + .def("transform_to", &Pose2::transform_to, + transform_to_overloads(args("point", "H1", "H2"))) + .def("transform_from", &Pose2::transform_from, + transform_to_overloads(args("point", "H1", "H2"))) + + .def("x", &Pose2::x) + .def("y", &Pose2::y) + .def("theta", &Pose2::theta) + // See documentation on call policy for more information + // https://wiki.python.org/moin/boost.python/CallPolicy + .def("t", &Pose2::t, return_value_policy()) + .def("r", &Pose2::r, return_value_policy()) + .def("translation", &Pose2::translation, return_value_policy()) + .def("rotation", &Pose2::rotation, return_value_policy()) + + .def("bearing", bearing1, bearing_overloads()) + .def("bearing", bearing2, bearing_overloads()) + + // Function overload example + .def("range", range1, range_overloads()) + .def("range", range2, range_overloads()) + + + .def("Expmap", &Pose2::Expmap) + .staticmethod("Expmap") + + .def(self * self) // __mult__ + ; + +} \ No newline at end of file diff --git a/python/geometry/Rot2.cpp b/python/geometry/Rot2.cpp new file mode 100644 index 000000000..06a6a7072 --- /dev/null +++ b/python/geometry/Rot2.cpp @@ -0,0 +1,48 @@ +#include +#include "gtsam/geometry/Rot2.h" + +using namespace boost::python; +using namespace gtsam; + +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(print_overloads, Rot2::print, 0, 1) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(equals_overloads, Rot2::equals, 1, 2) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(compose_overloads, Rot2::compose, 1, 3) +BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(relativeBearing_overloads, Rot2::relativeBearing, 1, 3) + +void exportRot2(){ + + class_("Rot2", init<>()) + .def(init()) + + .def("fromAngle", &Rot2::fromAngle) + .staticmethod("fromAngle") + + .def("fromDegrees", &Rot2::fromDegrees) + .staticmethod("fromDegrees") + + .def("fromCosSin", &Rot2::fromCosSin) + .staticmethod("fromCosSin") + + .def("atan2", &Rot2::atan2) + .staticmethod("atan2") + + .def("print", &Rot2::print, print_overloads(args("s"))) + .def("equals", &Rot2::equals, equals_overloads(args("q","tol"))) + .def("inverse", &Rot2::inverse) + .def("compose", &Rot2::compose, compose_overloads(args("q", "H1", "H2"))) + .def("between", &Rot2::between) + .def("dim", &Rot2::dim) + .def("retract", &Rot2::retract) + + .def("Expmap", &Rot2::Expmap) + .staticmethod("Expmap") + + .def("theta", &Rot2::theta) + .def("degrees", &Rot2::degrees) + .def("c", &Rot2::c) + .def("s", &Rot2::s) + + .def(self * self) // __mult__ + ; + +} \ No newline at end of file diff --git a/python/geometry/exportGeometry.cpp b/python/geometry/exportGeometry.cpp index 55bf7a83b..3887f7ca1 100644 --- a/python/geometry/exportGeometry.cpp +++ b/python/geometry/exportGeometry.cpp @@ -2,9 +2,12 @@ #include void exportPoint2(); +void exportRot2(); +void exportPose2(); BOOST_PYTHON_MODULE(libgeometry){ using namespace boost::python; - exportPoint2(); + exportRot2(); + exportPose2(); } \ No newline at end of file