Skip to content

Commit 975e39b

Browse files
authored
Merge pull request #267 from wxmerkt/topic/debug-quaternion-initialisation-segfault
Fix quaternion initialisation segfault under -march=native
2 parents 76f8c5c + 20a217a commit 975e39b

File tree

3 files changed

+54
-23
lines changed

3 files changed

+54
-23
lines changed

include/eigenpy/quaternion.hpp

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,16 @@ namespace eigenpy
110110
void visit(PyClass& cl) const
111111
{
112112
cl
113-
.def(bp::init<Matrix3>((bp::arg("self"),bp::arg("R")),
114-
"Initialize from rotation matrix.\n"
115-
"\tR : a rotation matrix 3x3.")[bp::return_value_policy<bp::return_by_value>()])
116-
.def(bp::init<AngleAxis>((bp::arg("self"),bp::arg("aa")),
117-
"Initialize from an angle axis.\n"
118-
"\taa: angle axis object."))
113+
.def("__init__",bp::make_constructor(&QuaternionVisitor::FromRotationMatrix,
114+
bp::default_call_policies(),
115+
(bp::arg("R"))),
116+
"Initialize from rotation matrix.\n"
117+
"\tR : a rotation matrix 3x3.")
118+
.def("__init__",bp::make_constructor(&QuaternionVisitor::FromAngleAxis,
119+
bp::default_call_policies(),
120+
(bp::arg("aa"))),
121+
"Initialize from an angle axis.\n"
122+
"\taa: angle axis object.")
119123
.def(bp::init<Quaternion>((bp::arg("self"),bp::arg("quat")),
120124
"Copy constructor.\n"
121125
"\tquat: a quaternion.")[bp::return_value_policy<bp::return_by_value>()])
@@ -130,11 +134,12 @@ namespace eigenpy
130134
"\tvec4 : a 4D vector representing quaternion coefficients in the order xyzw.")
131135
.def("__init__",bp::make_constructor(&QuaternionVisitor::DefaultConstructor),
132136
"Default constructor")
133-
.def(bp::init<Scalar,Scalar,Scalar,Scalar>
134-
((bp::arg("self"),bp::arg("w"),bp::arg("x"),bp::arg("y"),bp::arg("z")),
137+
.def("__init__",bp::make_constructor(&QuaternionVisitor::FromCoefficients,
138+
bp::default_call_policies(),
139+
(bp::arg("w"),bp::arg("x"),bp::arg("y"),bp::arg("z"))),
135140
"Initialize from coefficients.\n\n"
136141
"... note:: The order of coefficients is *w*, *x*, *y*, *z*. "
137-
"The [] operator numbers them differently, 0...4 for *x* *y* *z* *w*!"))
142+
"The [] operator numbers them differently, 0...4 for *x* *y* *z* *w*!")
138143

139144
.add_property("x",
140145
&QuaternionVisitor::getCoeff<0>,
@@ -244,16 +249,16 @@ namespace eigenpy
244249
;
245250
}
246251
private:
247-
252+
248253
template<int i>
249254
static void setCoeff(Quaternion & self, Scalar value) { self.coeffs()[i] = value; }
250-
255+
251256
template<int i>
252257
static Scalar getCoeff(Quaternion & self) { return self.coeffs()[i]; }
253-
258+
254259
static Quaternion & setFromTwoVectors(Quaternion & self, const Vector3 & a, const Vector3 & b)
255260
{ return self.setFromTwoVectors(a,b); }
256-
261+
257262
template<typename OtherQuat>
258263
static Quaternion & assign(Quaternion & self, const OtherQuat & quat)
259264
{ return self = quat; }
@@ -263,24 +268,42 @@ namespace eigenpy
263268
Quaternion* q(new Quaternion); q->setIdentity();
264269
return q;
265270
}
266-
267-
static Quaternion* FromTwoVectors(const Vector3& u, const Vector3& v)
271+
272+
static Quaternion* FromCoefficients(Scalar w, Scalar x, Scalar y, Scalar z)
273+
{
274+
Quaternion* q(new Quaternion(w, x, y, z));
275+
return q;
276+
}
277+
278+
static Quaternion* FromAngleAxis(const AngleAxis& aa)
279+
{
280+
Quaternion* q(new Quaternion(aa));
281+
return q;
282+
}
283+
284+
static Quaternion* FromTwoVectors(const Eigen::Ref<Vector3> u, const Eigen::Ref<Vector3> v)
268285
{
269286
Quaternion* q(new Quaternion); q->setFromTwoVectors(u,v);
270287
return q;
271288
}
272-
289+
273290
static Quaternion* DefaultConstructor()
274291
{
275292
return new Quaternion;
276293
}
277-
294+
278295
static Quaternion* FromOneVector(const Eigen::Ref<Vector4> v)
279296
{
280297
Quaternion* q(new Quaternion(v[3],v[0],v[1],v[2]));
281298
return q;
282299
}
283-
300+
301+
static Quaternion* FromRotationMatrix(const Eigen::Ref<Matrix3> R)
302+
{
303+
Quaternion* q(new Quaternion(R));
304+
return q;
305+
}
306+
284307
static bool __eq__(const Quaternion & u, const Quaternion & v)
285308
{
286309
return u.coeffs() == v.coeffs();

unittest/matrix.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ generateRowMajorMatrix(const Eigen::DenseIndex rows,
101101
typedef Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor> RowMajorMatrix;
102102
RowMajorMatrix A(rows, cols);
103103
typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1> Vector;
104-
Eigen::Map<Vector>(A.data(),A.size()) = Vector::LinSpaced(A.size(),1,A.size());
104+
Eigen::Map<Vector>(A.data(),A.size()) = Vector::LinSpaced(A.size(), 1, static_cast<Scalar>(A.size()));
105105
std::cout << "Matrix values:\n" << A << std::endl;
106106
return A;
107107
}
@@ -112,7 +112,7 @@ generateRowMajorVector(const Eigen::DenseIndex size)
112112
{
113113
typedef Eigen::Matrix<Scalar,1,Eigen::Dynamic,Eigen::RowMajor> RowMajorVector;
114114
RowMajorVector A(size);
115-
A.setLinSpaced(size,1,size);
115+
A.setLinSpaced(size, 1, static_cast<Scalar>(size));
116116
std::cout << "Vector values: " << A.transpose() << std::endl;
117117
return A;
118118
}
@@ -125,7 +125,7 @@ generateColMajorMatrix(const Eigen::DenseIndex rows,
125125
typedef Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> ColMajorMatrix;
126126
ColMajorMatrix A(rows, cols);
127127
typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1> Vector;
128-
Eigen::Map<Vector>(A.data(),A.size()) = Vector::LinSpaced(A.size(),1,A.size());
128+
Eigen::Map<Vector>(A.data(),A.size()) = Vector::LinSpaced(A.size(), 1, static_cast<Scalar>(A.size()));
129129
std::cout << "Matrix values:\n" << A << std::endl;
130130
return A;
131131
}
@@ -136,7 +136,7 @@ generateColMajorVector(const Eigen::DenseIndex size)
136136
{
137137
typedef Eigen::Matrix<Scalar,1,Eigen::Dynamic> ColMajorVector;
138138
ColMajorVector A(size);
139-
A.setLinSpaced(size,1,size);
139+
A.setLinSpaced(size, 1, static_cast<Scalar>(size));
140140
std::cout << "Vector values: " << A.transpose() << std::endl;
141141
return A;
142142
}

unittest/python/test_geometry.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,21 @@ def isapprox(a,b,epsilon=1e-6):
1313
return abs(a-b)<epsilon
1414

1515
# --- Quaternion ---------------------------------------------------------------
16+
# Coefficient initialisation
17+
verbose and print("[Quaternion] Coefficient initialisation")
1618
q = Quaternion(1,2,3,4)
1719
q.normalize()
1820
assert(isapprox(np.linalg.norm(q.coeffs()),q.norm()))
1921
assert(isapprox(np.linalg.norm(q.coeffs()),1))
2022

23+
# Coefficient-vector initialisation
24+
verbose and print("[Quaternion] Coefficient-vector initialisation")
2125
v = np.array([0.5,-0.5,0.5,0.5])
2226
qv = Quaternion(v)
2327
assert(isapprox(qv.coeffs(), v))
2428

29+
# Angle axis initialisation
30+
verbose and print("[Quaternion] AngleAxis initialisation")
2531
r = AngleAxis(q)
2632
q2 = Quaternion(r)
2733
assert(q==q)
@@ -34,6 +40,8 @@ def isapprox(a,b,epsilon=1e-6):
3440
assert(isapprox(Rq.dot(Rq.T),np.eye(3)))
3541
assert(isapprox(Rr,Rq))
3642

43+
# Rotation matrix initialisation
44+
verbose and print("[Quaternion] Rotation Matrix initialisation")
3745
qR = Quaternion(Rr)
3846
assert(q.isApprox(qR))
3947
assert(isapprox(q.coeffs(),qR.coeffs()))
@@ -43,7 +51,7 @@ def isapprox(a,b,epsilon=1e-6):
4351
qR[5]
4452
print("Error, this message should not appear.")
4553
except RuntimeError as e:
46-
if verbose: print("As expected, catched exception: ",e)
54+
if verbose: print("As expected, caught exception: ", e)
4755

4856
# --- Angle Vector ------------------------------------------------
4957
r = AngleAxis(.1,np.array([1,0,0],np.double))

0 commit comments

Comments
 (0)