annotate applications/lab/bouncing_cube.py @ 44:cbf199e007c2

Added some demo applications
author windel
date Sat, 18 Feb 2012 16:42:23 +0100
parents
children 6dd7d6a1737c
rev   line source
44
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
1 from PyQt4.QtGui import *
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
2 from PyQt4.QtCore import *
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
3 from PyQt4.QtOpenGL import QGLWidget
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
4 from OpenGL.GL import *
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
5 from OpenGL.GLU import gluPerspective
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
6 import sys
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
7 from random import random
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
8 from math import pi, cos, sin, fabs, sqrt
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
9 from numpy import mat, array, ones, zeros, eye
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
10 from numpy.linalg import norm
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
11 import numpy as np
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
12 import time
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
13 import scipy.integrate
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
14
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
15 """
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
16 Test script that lets a dice bounce.
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
17 Converted from 20-sim equations into python code.
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
18
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
19 20-sim website:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
20 http://www.20sim.com
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
21
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
22 """
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
23 def drawCube(w):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
24 glBegin(GL_QUADS) # Start Drawing The Cube
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
25 glColor3f(0.0,1.0,0.0) # Set The Color To Blue
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
26 glVertex3f( w, w,-w) # Top Right Of The Quad (Top)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
27 glVertex3f(-w, w,-w) # Top Left Of The Quad (Top)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
28 glVertex3f(-w, w, w) # Bottom Left Of The Quad (Top)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
29 glVertex3f( w, w, w) # Bottom Right Of The Quad (Top)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
30
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
31 glColor3f(1.0,0.5,0.0) # Set The Color To Orange
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
32 glVertex3f( w,-w, w) # Top Right Of The Quad (Bottom)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
33 glVertex3f(-w,-w, w) # Top Left Of The Quad (Bottom)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
34 glVertex3f(-w,-w,-w) # Bottom Left Of The Quad (Bottom)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
35 glVertex3f( w,-w,-w) # Bottom Right Of The Quad (Bottom)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
36
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
37 glColor3f(1.0,0.0,0.0) # Set The Color To Red
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
38 glVertex3f( w, w, w) # Top Right Of The Quad (Front)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
39 glVertex3f(-w, w, w) # Top Left Of The Quad (Front)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
40 glVertex3f(-w,-w, w) # Bottom Left Of The Quad (Front)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
41 glVertex3f( w,-w, w) # Bottom Right Of The Quad (Front)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
42
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
43 glColor3f(1.0,1.0,0.0) # Set The Color To Yellow
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
44 glVertex3f( w,-w,-w) # Bottom Left Of The Quad (Back)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
45 glVertex3f(-w,-w,-w) # Bottom Right Of The Quad (Back)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
46 glVertex3f(-w, w,-w) # Top Right Of The Quad (Back)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
47 glVertex3f( w, w,-w) # Top Left Of The Quad (Back)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
48
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
49 glColor3f(0.0,0.0,1.0) # Set The Color To Blue
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
50 glVertex3f(-w, w, w) # Top Right Of The Quad (Left)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
51 glVertex3f(-w, w,-w) # Top Left Of The Quad (Left)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
52 glVertex3f(-w,-w,-w) # Bottom Left Of The Quad (Left)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
53 glVertex3f(-w,-w, w) # Bottom Right Of The Quad (Left)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
54
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
55 glColor3f(1.0,0.0,1.0) # Set The Color To Violet
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
56 glVertex3f( w, w,-w) # Top Right Of The Quad (Right)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
57 glVertex3f( w, w, w) # Top Left Of The Quad (Right)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
58 glVertex3f( w,-w, w) # Bottom Left Of The Quad (Right)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
59 glVertex3f( w,-w,-w) # Bottom Right Of The Quad (Right)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
60 glEnd() # Done Drawing The Quad
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
61
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
62 def drawFloor(w, h):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
63 glBegin(GL_QUADS) # Start Drawing The Cube
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
64
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
65 glColor3f(1.0,0.5,0.0) # Set The Color To Orange
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
66 glVertex3f( w,-w,h)# Top Right Of The Quad (Bottom)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
67 glVertex3f(-w,-w,h)# Top Left Of The Quad (Bottom)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
68 glVertex3f(-w,w,h)# Bottom Left Of The Quad (Bottom)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
69 glVertex3f( w,w,h)# Bottom Right Of The Quad (Bottom)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
70 glEnd() # Done Drawing The Quad
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
71
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
72 def drawAxis():
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
73 glLineWidth(0.5)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
74 glBegin(GL_LINES)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
75 glColor3f(1.0, 0.0, 0.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
76 glVertex3f(0,0,0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
77 glVertex3f(1,0,0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
78 glColor3f(0.0, 1.0, 0.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
79 glVertex3f(0,0,0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
80 glVertex3f(0,1,0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
81 glColor3f(0.0, 0.0, 1.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
82 glVertex3f(0,0,0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
83 glVertex3f(0,0,1)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
84 glEnd()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
85
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
86
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
87 def cross(A, B):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
88 a = A.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
89 b = B.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
90 return mat(np.cross(a, b)).T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
91
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
92 def skew(X):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
93 Y = mat(zeros( (3, 3) ))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
94 a,b,c = X.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
95 Y[0,1] = -c
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
96 Y[0,2] = b
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
97 Y[1,0] = c
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
98 Y[1,2] = -a
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
99 Y[2,0] = -b
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
100 Y[2,1] = a
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
101 return Y
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
102
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
103 def adjoint(T):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
104 W = T[0:3, 0]
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
105 V = T[3:6, 0]
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
106 a = mat(zeros( (6,6) ) )
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
107 a[0:3, 0:3] = skew(W)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
108 a[3:6, 0:3] = skew(V)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
109 a[3:6, 3:6] = skew(W)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
110 return a
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
111
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
112 def Adjoint(H):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
113 R = H[0:3, 0:3]
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
114 P = H[0:3, 3]
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
115 a = mat(zeros( (6,6) ) )
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
116 a[0:3, 0:3] = R
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
117 a[3:6, 3:6] = R
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
118 a[3:6, 0:3] = skew(P) * R
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
119 return a
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
120
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
121 def quatToR(q):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
122 x, y, z, w = q.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
123 r = mat(eye(3))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
124 r[0,0] = 1 - (2*y**2+2*z**2)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
125 r[0,1] = 2*x*y+2*z*w
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
126 r[0,2] = 2*x*z - 2*y*w
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
127 r[1,0] = 2*x*y-2*z*w
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
128 r[1,1] = 1 - (2*x**2 + 2*z**2)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
129 r[1,2] = 2*y*z + 2*x*w
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
130 r[2,0] = 2*x*z+2*y*w
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
131 r[2,1] = 2*y*z - 2*x*w
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
132 r[2,2] = 1 - (2*x**2+2*y**2)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
133 return r
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
134
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
135 def rotateAbout(axis, angle):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
136 ax, ay, az = (axis/norm(axis)).A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
137 qx = ax*sin(angle/2.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
138 qy = ay*sin(angle/2.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
139 qz = az*sin(angle/2.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
140 qw = cos(angle/2.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
141 q = mat(array([qx,qy,qz,qw])).T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
142 return q
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
143
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
144 def normalizeQuaternion(quat):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
145 x,y,z,w = quat.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
146 magnitude = sqrt(x*x + y*y + z*z + w*w)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
147 x = x / magnitude
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
148 y = y / magnitude
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
149 z = z / magnitude
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
150 w = w / magnitude
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
151 quat[0, 0] = x
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
152 quat[1, 0] = y
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
153 quat[2, 0] = z
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
154 quat[3, 0] = w
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
155 return quat
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
156
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
157 def VTo4x4(V):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
158 v1, v2, v3 = V.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
159 return mat(array( \
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
160 [[0.0, -v3, v2, -v1], \
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
161 [ v3, 0.0, -v1, -v2], \
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
162 [-v2, v1, 0.0, -v3], \
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
163 [v1, v2, v3, 0.0] ]))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
164
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
165 def homogeneous(R,p):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
166 H = mat(eye(4))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
167 H[0:3, 0:3] = R
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
168 H[0:3, 3] = p
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
169 return H
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
170
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
171 def rateOfChange(states, thetime, parameters):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
172 quat = states[0:4, 0] # Orientation (4)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
173 pos = states[4:7, 0] # Position (3)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
174 P = states[7:13, 0] # Momentum (6)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
175 massI, gravity = parameters
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
176 # Rigid body parts:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
177 # Forward Kinematic chain:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
178 H = homogeneous(quatToR(quat), pos) # Forward kinematics
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
179
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
180 AdjX2 = mat(eye(6)) # The connectionpoint in the real world
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
181 adjAdjX2_1 = adjoint(AdjX2[0:6,0])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
182 adjAdjX2_2 = adjoint(AdjX2[0:6,1])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
183 adjAdjX2_3 = adjoint(AdjX2[0:6,2])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
184 adjAdjX2_4 = adjoint(AdjX2[0:6,3])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
185 adjAdjX2_5 = adjoint(AdjX2[0:6,4])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
186 adjAdjX2_6 = adjoint(AdjX2[0:6,5])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
187 AdjInv2 = Adjoint(H.I)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
188 M2 = AdjInv2.T * (massI * AdjInv2) # Transfor mass to base frame
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
189 MassMatrix = M2
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
190
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
191 wrenchGrav2 = mat( zeros((1,6)) )
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
192 wrenchGrav2[0, 0:3] = -cross(gravity, pos).T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
193 wrenchGrav2[0, 3:6] = gravity.T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
194
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
195 Bk = mat( zeros( (6,6) ))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
196 Bk[0:3, 0:3] = skew(P[0:3, 0])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
197 Bk[3:6, 0:3] = skew(P[3:6, 0])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
198 Bk[0:3, 3:6] = skew(P[3:6, 0])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
199
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
200 # TODO: do this a cholesky:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
201 v = np.linalg.solve(MassMatrix, P) # Matrix inverse like thingy !
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
202
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
203 T2_00 = v # Calculate the relative twist!
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
204 TM2 = T2_00.T * M2
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
205 twistExternal = T2_00 # Twist van het blokje
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
206 TMSum2 = TM2
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
207
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
208 PDotBodies = mat( zeros( (6,1)) )
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
209 PDotBodies[0,0] = TMSum2 * (adjAdjX2_1 * T2_00)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
210 PDotBodies[1,0] = TMSum2 * (adjAdjX2_2 * T2_00)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
211 PDotBodies[2,0] = TMSum2 * (adjAdjX2_3 * T2_00)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
212 PDotBodies[3,0] = TMSum2 * (adjAdjX2_4 * T2_00)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
213 PDotBodies[4,0] = TMSum2 * (adjAdjX2_5 * T2_00)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
214 PDotBodies[5,0] = TMSum2 * (adjAdjX2_6 * T2_00)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
215
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
216 PDot = -PDotBodies - Bk * v
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
217 PDot += wrenchGrav2.T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
218
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
219 ##### Contact wrench part:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
220 HB_W = H # Is H-matrix van het blokje
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
221 WrenchB = mat(zeros( (1,6) ))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
222 for px in [-0.5, 0.5]:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
223 for py in [-0.5, 0.5]:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
224 for pz in [-0.5, 0.5]:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
225 HB1_B = homogeneous(mat(eye(3)), mat([px,py,pz]).T)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
226 HB1_W = HB_W * HB1_B
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
227 HW1_W = homogeneous(mat(eye(3)), HB1_W[0:3,3])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
228 HW_W1 = HW1_W.I
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
229 HB_W1 = HW_W1 * HB_W
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
230
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
231 AdjHB_W1 = Adjoint(HB_W1)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
232 TB_W1_W1 = AdjHB_W1 * twistExternal
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
233 z = HB1_W[2, 3]
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
234 vx, vy, vz = TB_W1_W1[3:6, 0].A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
235 if z < 0:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
236 # Contact forces:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
237 Fx = -50.0*vx
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
238 Fy = -50.0*vy
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
239 Fz = -z*50000.0
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
240 else:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
241 Fx = 0.0
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
242 Fy = 0.0
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
243 Fz = 0.0
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
244 # TODO: reflect impulse
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
245 WrenchW1 = mat([0,0,0,0,0,Fz])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
246 # Transform it back:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
247 WrenchB += (AdjHB_W1.T * WrenchW1.T).T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
248 ##### End of contact wrench
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
249
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
250 PDot += (WrenchB * AdjInv2).T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
251
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
252 # Position and orientation rates:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
253 QOmega = VTo4x4(v[0:3, 0])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
254 quatDot = 0.5 * QOmega * quat
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
255 vel = v[3:6, 0]
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
256 posDot = skew(v[0:3]) * pos + vel
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
257 # The rate vector:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
258 rates = mat(zeros( (13,1) ))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
259 rates[0:4, 0] = quatDot
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
260 rates[4:7, 0] = posDot
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
261 rates[7:13, 0] = PDot
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
262 return rates
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
263
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
264 def fWrapper(y, t, parameters):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
265 y = mat(y).T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
266 dy = rateOfChange(y, t, parameters)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
267 return dy.T.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
268
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
269 def SCIPY(endtime, dt, state, parameters):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
270 times = np.arange(0.0, endtime, dt)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
271 y0 = state.T.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
272 res = scipy.integrate.odeint(fWrapper, y0, times, args=(parameters,))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
273 states = []
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
274 res = res.T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
275 r,c = res.shape
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
276 for ci in range(0,c):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
277 states.append(mat(res[:,ci]).T)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
278 return states
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
279
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
280 def RK4(endtime, dt, state, parameters):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
281 t = 0.0
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
282 states = []
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
283 while t < endtime:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
284 newstate = mat (zeros( state.shape )) # Create a new object
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
285
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
286 #### Runge Kutta integration:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
287 k1 = rateOfChange(state, t, parameters)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
288 k2 = rateOfChange(state + 0.5*dt*k1, t, parameters)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
289 k3 = rateOfChange(state + 0.5*dt*k1, t, parameters)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
290 k4 = rateOfChange(state + dt*k3, t, parameters)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
291 newstate = state + (dt/6.0)*(k1+2*k2+2*k3+k4)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
292
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
293 # Normalize quat:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
294 newstate[0:4, 0] = normalizeQuaternion(newstate[0:4, 0])
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
295 states.append(newstate)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
296
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
297 state = newstate
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
298
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
299 t += dt
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
300 print state[6,0], t, ' ', (t/endtime)*100.0, '%'
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
301 return states
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
302
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
303
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
304 def simulate(endtime, dt):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
305 PInitial = mat( zeros((6,1)) )
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
306 posInitial = mat(array([-1.2, -1.3, 2.8])).T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
307 quatInitial = rotateAbout(mat(array([0.2, 1.0, 0.4])).T, 0.5)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
308 # Parameters:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
309 gravity = mat( array([0,0,-9.81]) ).T
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
310 massI = mat(eye(6)) * 1.01 # Mass matrix
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
311 parameters = (massI, gravity)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
312
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
313 # The state vector!
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
314 state = mat(zeros( (13,1) ))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
315 state[0:4, 0] = quatInitial
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
316 state[4:7, 0] = posInitial
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
317 state[7:13, 0] = PInitial
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
318
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
319 return SCIPY(endtime, dt, state, parameters)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
320
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
321 class W(QGLWidget):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
322 time = 0.0
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
323 index = 0
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
324 def __init__(self, states, dt, parent=None):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
325 super(W, self).__init__(parent)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
326 self.firstRun = True
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
327 self.savePNGS = False
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
328 self.dt = dt
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
329 self.resize(500,500)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
330 self.states = states
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
331 self.UP()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
332 t = QTimer(self)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
333 t.timeout.connect(self.UP)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
334 t.start(self.dt*1000.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
335
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
336 def UP(self):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
337 self.time += self.dt
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
338 if self.states:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
339 state = self.states[self.index]
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
340 self.Dicequat = state[0:4, 0]
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
341 self.Dicepos = state[4:7, 0]
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
342 self.index += 1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
343 if self.index == len(self.states):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
344 self.index = 0
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
345 self.firstRun = False
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
346 # Paint:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
347 self.update()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
348 if self.firstRun:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
349 # Create png images for the movie:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
350 if self.savePNGS:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
351 pm = self.renderPixmap()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
352 pm.save('image'+str(self.index)+'.png')
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
353
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
354 def initializeGL(self):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
355 glClearColor(0.0, 0.5, 0.0, 1.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
356 glEnable(GL_DEPTH_TEST)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
357 glDepthFunc(GL_LESS)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
358 glShadeModel(GL_SMOOTH)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
359 def resizeGL(self,w,h):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
360 glViewport(0, 0, w, h)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
361 glMatrixMode(GL_PROJECTION)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
362 glLoadIdentity()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
363 gluPerspective(45.0, float(w)/float(h), 0.1, 100.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
364 glMatrixMode(GL_MODELVIEW)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
365 def paintGL(self):
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
366 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # Clear buffers
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
367 glLoadIdentity() # Reset The View
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
368
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
369 glLoadIdentity()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
370 glTranslatef(0.0,-2.0,-10.0) # Move Left And Into The Screen
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
371 glRotatef(-90.0, 1.0, 0.0, 0.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
372 drawFloor(2.0, 0.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
373 drawAxis()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
374 self.renderText(1.0, 0.0, 0.0, 'X')
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
375 self.renderText(0.0, 1.0, 0.0, 'Y')
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
376 self.renderText(0.0, 0.0, 1.0, 'Z')
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
377
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
378 self.renderText(0.0,0.0,1.2,str(self.time))
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
379
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
380 x,y,z = self.Dicepos.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
381 R = quatToR(self.Dicequat)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
382
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
383 glTranslatef(x, y, z)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
384 # Trick to rotate the openGL matrix:
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
385 r = R.A1
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
386 rotR = (r[0], r[3], r[6], 0.0,
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
387 r[1], r[4], r[7], 0.0,
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
388 r[2], r[5], r[8], 0.0,
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
389 0.0, 0.0, 0.0, 1.0)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
390 glMultMatrixd(rotR)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
391
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
392 drawCube(0.6)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
393
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
394 et = 20.0
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
395 dt = 0.04
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
396 print 'starting integration... endtime =', et, ' stepsize =', dt
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
397 t0 = time.time()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
398 states = simulate(et, dt)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
399 t1 = time.time()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
400 print 'That was heavy, it took me ', t1-t0, ' seconds!'
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
401 app = QApplication(sys.argv)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
402 w = W(states, dt)
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
403 w.show()
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
404 sys.exit(app.exec_())
cbf199e007c2 Added some demo applications
windel
parents:
diff changeset
405