diff --git a/include/eigenpy/quaternion.hpp b/include/eigenpy/quaternion.hpp index 84723e2fb0883c0d0245f7ab189c575e503fdd58..9b89fe2f4a2a7ecc0cbdf0d173ca8fe1ae64631e 100644 --- a/include/eigenpy/quaternion.hpp +++ b/include/eigenpy/quaternion.hpp @@ -97,7 +97,7 @@ namespace eigenpy typedef typename QuaternionBase::Scalar Scalar; typedef typename Quaternion::Coefficients Coefficients; typedef typename QuaternionBase::Vector3 Vector3; - typedef typename Eigen::Matrix<Scalar,4,1> Vector4; + typedef Coefficients Vector4; typedef typename QuaternionBase::Matrix3 Matrix3; typedef typename QuaternionBase::AngleAxisType AngleAxis; @@ -110,23 +110,25 @@ namespace eigenpy void visit(PyClass& cl) const { cl - .def(bp::init<>(bp::arg("self"),"Default constructor")) + .def(bp::init<>(bp::arg("self"),"Default constructor")[bp::return_value_policy<bp::return_by_value>()]) .def(bp::init<Matrix3>((bp::arg("self"),bp::arg("R")), "Initialize from rotation matrix.\n" - "\tR : a rotation matrix 3x3.")) - .def(bp::init<Vector4>((bp::arg("self"),bp::arg("vec4")), - "Initialize from a vector 4D.\n" - "\tvec4 : a 4D vector representing quaternion coefficients in the order xyzw.")) + "\tR : a rotation matrix 3x3.")[bp::return_value_policy<bp::return_by_value>()]) .def(bp::init<AngleAxis>((bp::arg("self"),bp::arg("aa")), "Initialize from an angle axis.\n" "\taa: angle axis object.")) .def(bp::init<Quaternion>((bp::arg("self"),bp::arg("quat")), "Copy constructor.\n" - "\tquat: a quaternion.")) + "\tquat: a quaternion.")[bp::return_value_policy<bp::return_by_value>()]) .def("__init__",bp::make_constructor(&QuaternionVisitor::FromTwoVectors, bp::default_call_policies(), (bp::arg("u"),bp::arg("v"))), "Initialize from two vectors u and v") + .def("__init__",bp::make_constructor(&QuaternionVisitor::FromOneVector, + bp::default_call_policies(), + (bp::arg("vec4"))), + "Initialize from a vector 4D.\n" + "\tvec4 : a 4D vector representing quaternion coefficients in the order xyzw.") .def(bp::init<Scalar,Scalar,Scalar,Scalar> ((bp::arg("self"),bp::arg("w"),bp::arg("x"),bp::arg("y"),bp::arg("z")), "Initialize from coefficients.\n\n" @@ -266,6 +268,12 @@ namespace eigenpy Quaternion* q(new Quaternion); q->setFromTwoVectors(u,v); return q; } + + static Quaternion* FromOneVector(const Vector4& v) + { + Quaternion* q(new Quaternion(v)); + return q; + } static bool __eq__(const Quaternion & u, const Quaternion & v) {