Rot2, Pose2, Point2 now all work fairly well in Python. See Pose2.cpp for examples on method overloading and auto-declarations
							parent
							
								
									ec934770f3
								
							
						
					
					
						commit
						2455780829
					
				|  | @ -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>("Point2", init<>()) | ||||
|     .def(init<double, double>()) | ||||
|     .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) | ||||
|   ; | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,72 @@ | |||
| #include <boost/python.hpp> | ||||
| #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<Matrix&>, boost::optional<Matrix&>) const | ||||
|     = &Pose2::range; | ||||
|   double (Pose2::*range2)(const Point2&, boost::optional<Matrix&>, boost::optional<Matrix&>) const | ||||
|     = &Pose2::range; | ||||
| 
 | ||||
|   Rot2 (Pose2::*bearing1)(const Pose2&, boost::optional<Matrix&>, boost::optional<Matrix&>) const | ||||
|     = &Pose2::bearing; | ||||
|   Rot2 (Pose2::*bearing2)(const Point2&, boost::optional<Matrix&>, boost::optional<Matrix&>) const | ||||
|     = &Pose2::bearing; | ||||
| 
 | ||||
|   class_<Pose2>("Pose2", init<>()) | ||||
|     .def(init<Pose2>()) | ||||
|     .def(init<double, double, double>()) | ||||
|     .def(init<double, Point2>()) | ||||
|     .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<copy_const_reference>()) | ||||
|     .def("r", &Pose2::r, return_value_policy<copy_const_reference>()) | ||||
|     .def("translation", &Pose2::translation, return_value_policy<copy_const_reference>()) | ||||
|     .def("rotation", &Pose2::rotation, return_value_policy<copy_const_reference>()) | ||||
| 
 | ||||
|     .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__
 | ||||
|   ; | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,48 @@ | |||
| #include <boost/python.hpp> | ||||
| #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>("Rot2", init<>()) | ||||
|     .def(init<double>()) | ||||
| 
 | ||||
|     .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__
 | ||||
|   ; | ||||
| 
 | ||||
| } | ||||
|  | @ -2,9 +2,12 @@ | |||
| #include <boost/cstdint.hpp> | ||||
| 
 | ||||
| void exportPoint2(); | ||||
| void exportRot2(); | ||||
| void exportPose2(); | ||||
| 
 | ||||
| BOOST_PYTHON_MODULE(libgeometry){ | ||||
|   using namespace boost::python; | ||||
| 
 | ||||
|   exportPoint2(); | ||||
|   exportRot2(); | ||||
|   exportPose2(); | ||||
| } | ||||
		Loading…
	
		Reference in New Issue