← Back to team overview

yade-users team mailing list archive

[Question #449020]: Quaternions might not be represented properly in YADE

 

New question #449020 on Yade:
https://answers.launchpad.net/yade/+question/449020

I'm trying to output some data from clumps for use in an external program (SolidWorks), and I've not been able to reproduce the orientation of the clumps in YADE.

As a bit of background, I've seen that the quaternion can be converted into an axis-angle representation, according to this document: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.468.5407&rep=rep1&type=pdf

I've noticed during testing that the following code produces unexpected results:

```
from yade import qt
import numpy as np

def clamp (val, minval, maxval):
    if val < minval: return minval
    if val > maxval: return maxval
    return val

O.bodies.append(sphere([0,0,0],0.2,fixed=True,wire=True))	#Reference Sphere
sphId = O.bodies.append(sphere([0,0,0],0.2,fixed=False,wire=True)) #Rotating Sphere

arccos = np.arccos

def Rotate():
	global O,clumpId,pi,sphId
	#O.forces.addRot(sphId,Vector3(pi/10,0,0)) #Rotate about x
	O.forces.addRot(sphId,Vector3(0,pi/10,0)) #Rotate about y
	#O.forces.addRot(sphId,Vector3(0,0,pi/10)) #Rotate about z

O.engines=[
	ForceResetter(),
	PyRunner(iterPeriod=1,command='Rotate()'),
	NewtonIntegrator()
]

O.step()
for i in xrange(0,10):
	q = O.bodies[sphId].state.ori.normalized()
	ang = 2*arccos(clamp(q[0],-1,1))
	print('\t%g\t%g\t%g\t%g'%(ang,q[1],q[2],q[3]))
	O.step()
```

It prints the expected angle to rotate with and the vector to rotate about. I would expect that for each of the cases (x,y,and z), it would just change the angle (1st output) and the second three outputs would be the constant i,j, and k unit vectors respectively.

When rotationg about the x axis, that appears to be the case, as this is the output:

3.14159	0	0	1
2.82743	0	0	0.987688
2.51327	0	0	0.951057
2.19911	0	0	0.891007
1.88496	0	0	0.809017
1.5708	0	0	0.707107
1.25664	0	0	0.587785
0.942478	0	0	0.45399
0.628319	0	0	0.309017
0.314159	0	0	0.156434

But rotating about the other two axes does not produce the same results:

Rotate about y axis:

3.14159	0	0	1
3.14159	0.156434	0	0.987688
3.14159	0.309017	0	0.951057
3.14159	0.45399	0	0.891007
3.14159	0.587785	0	0.809017
3.14159	0.707107	0	0.707107
3.14159	0.809017	0	0.587785
3.14159	0.891007	0	0.45399
3.14159	0.951057	0	0.309017
3.14159	0.987688	0	0.156434


Rotate about z axis:

3.14159	0	0	1
3.14159	0	0.156434	0.987688
3.14159	0	0.309017	0.951057
3.14159	0	0.45399	0.891007
3.14159	0	0.587785	0.809017
3.14159	0	0.707107	0.707107
3.14159	0	0.809017	0.587785
3.14159	0	0.891007	0.45399
3.14159	0	0.951057	0.309017
3.14159	0	0.987688	0.156434

What is going on here? If I'm rotating a sphere from a default orientation about a principal axis, shouldn't the last three outputs on each line be the unit vector of the axis, as is the case with the x-axis?

Also, why does the default quaternion include a rotation of pi about the z axis?

Regardless of whether this is a bug or something wrong with my understanding, can someone help me figure out a workaround so I can obtain a useful axis-angle representation of a sphere or clump?

-- 
You received this question notification because your team yade-users is
an answer contact for Yade.