Rigide Body Transformationsmatrix
Verfasst: Dienstag 2. Juli 2019, 09:17
Hallo
Ich möchte eine rigide Transformation auf einen Punkt anwenden. Dafür erzeuge ich eine die notwendige Transformationsmatrix und wende diese auf den Punkt an. An sich funktioniert alles, nur stimmt das Ergebnis nicht...
Den Fehler kann ich bisher nicht ausmachen, vielleicht übersehe ich was offensichtliches!?
Bei den Winkeln handelt es sich um rad. Wenn ich die Transf.matrix printe fällt mir auf, dass die Translationswerte dX,dY,dZ nicht richtig übernommen werden. WARUM?
Hier mal ein Ergebnis:
Das Ergebnis sollte ca. so aussehen: 124.12617, 192.60176, 7.87802! Vor allem die z-Koord. stimmt nicht...
UPDATE:
Folgendes habe ich jetzt geändert und die Ergebnisse sehen nun besser aus:
Habe ich jetzt hier noch einen groben Fehler drin?

Ich möchte eine rigide Transformation auf einen Punkt anwenden. Dafür erzeuge ich eine die notwendige Transformationsmatrix und wende diese auf den Punkt an. An sich funktioniert alles, nur stimmt das Ergebnis nicht...
Den Fehler kann ich bisher nicht ausmachen, vielleicht übersehe ich was offensichtliches!?
Code: Alles auswählen
def trig(angle):
r = angle
return cos(r), sin(r)
def matrix(rotation, translation):
xC, xS = trig(rotation[0])
yC, yS = trig(rotation[1])
zC, zS = trig(rotation[2])
dX = translation[0]
dY = translation[1]
dZ = translation[2]
Translate_matrix = np.array([[1, 0, 0, dX],
[0, 1, 0, dY],
[0, 0, 1, dZ],
[0, 0, 0, 1]])
Rotate_X_matrix = np.array([[1, 0, 0, 0],
[0, xC, -xS, 0],
[0, xS, xC, 0],
[0, 0, 0, 1]])
Rotate_Y_matrix = np.array([[yC, 0, yS, 0],
[0, 1, 0, 0],
[-yS, 0, yC, 0],
[0, 0, 0, 1]])
Rotate_Z_matrix = np.array([[zC, -zS, 0, 0],
[zS, zC, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
print np.dot(Rotate_Z_matrix,np.dot(Rotate_Y_matrix,np.dot(Rotate_X_matrix,Translate_matrix)))
return np.dot(Rotate_Z_matrix,np.dot(Rotate_Y_matrix,np.dot(Rotate_X_matrix,Translate_matrix)))
def transform(point, TransformArray):
p = np.array([0,0,0,1])
for i in range (0,len(point)-1):
p[i] = point[i]
p=np.dot(TransformArray,np.transpose(p))
for i in range (0,len(point)-1):
point[i]=p[i]
return point
if __name__ == '__main__':
point
matrix = matrix(rotation, translation)
print transform(point, matrix)
Hier mal ein Ergebnis:
Code: Alles auswählen
rotation = [0.0226817, -0.00242333, -0.00649134]
translation = [-0.19502307185234014, 0.9954635344879247, -9.30521311620628]
[[ 9.99975995e-01 6.43466541e-03 -2.56987423e-03 -1.64699688e-01]
[ -6.49127535e-03 9.99722075e-01 -2.26635509e-02 1.20734199e+00]
[ 2.42332763e-03 2.26796887e-02 9.99739846e-01 -9.28068813e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
Anfangspunkt: [123.44655, 191.39461, 16.75809 ]
Endpunkt: [124.06136880554668, 191.35583140470374, 16.75809]
UPDATE:
Folgendes habe ich jetzt geändert und die Ergebnisse sehen nun besser aus:
Code: Alles auswählen
def transform(point, TransformArray):
p = np.array([0.,0.,0.,1.])
for i in range (0,len(point)):
p[i] = float(point[i])
print p
p=np.dot(TransformArray,np.transpose(p))
for i in range (0,len(point)):
point[i]=p[i]
return point