2016-04-20 2 views
2

Как использовать популярный transformations.py library для поворота точки вокруг оси?Как повернуть точку с помощью transformations.py

Я пытаюсь повернуть точку на 90 градусов относительно оси z, но я не получаю ожидаемых результатов, и хотя документы файла содержат несколько примеров создания матриц преобразования, на самом деле это не показывает, как использовать эти матрицы для применения преобразования. Мой код:

from math import pi 
import transformations as tf 
import numpy as np 

alpha, beta, gamma = 0, 0, pi/2. 
origin, xaxis, yaxis, zaxis = (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1) 
Rx = tf.rotation_matrix(alpha, xaxis) 
Ry = tf.rotation_matrix(beta, yaxis) 
Rz = tf.rotation_matrix(gamma, zaxis) 
R = tf.concatenate_matrices(Rx, Ry, Rz) 

point0 = np.array([[0, 1, 0, 0]]) 

point1 = R * point0 
#point1 = R * point0.T # same result 
#point1 = np.multiply(R, point0) # same result 
#point1 = np.multiply(R, point0.T) # same result 
point1_expected = np.array([[1, 0, 0, 0]]) 

assert point1.tolist() == point1_expected.tolist() # this fails 

Это вычисляет point1 как:

[[ 0.00000000e+00 -1.00000000e+00 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 6.12323400e-17 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] 

, который не имеет никакого смысла для меня. Умножение матрицы 4x4 на матрицу 4x1 должно приводить к 4x1, а не к 4x4. Что я делаю не так?

ответ

2

transformations.py работает с np.array объектами, а не np.matrix, даже в функциях whatever_matrix. (Это хорошая вещь, потому что np.matrix это ужасно.) Вы должны использовать dot для матричного умножения:

point1 = R.dot(point0) 

Кроме того, вы сделали point0 ряд вектор по какой-то причине. Он должен быть либо вектор-столбец или простой 1-мерный вектор:

point0 = np.array([0, 1, 0, 0]) 
+0

Это не кажется, чтобы быть правдой, и просто дает мне другую ошибку, 'ValueError: формы (4,4) и (1 , 4) не выровнены: 4 (dim 1)! = 1 (dim 0) '. Если я делаю 'R.dot (point0.T)', тогда я получаю бессмысленный вектор '[[-1, 6.12, 0, 0]]'. – Cerin

+0

@Cerin: По какой-то причине вы сделали 1x4 массив вместо 4x1. (Вероятно, вы, вероятно, должны использовать одномерный массив для вектора вместо 2-мерного.) Что касается 6.12, вы не смотрите на экспонента. Это 6.12e-17, что составляет 0 до ошибки округления. – user2357112

+0

Вы правы, я пропустил экспонента, и мой знак вращения был назад. Благодарю. – Cerin

Смежные вопросы