Как вращать облако точек вокруг оси?

У меня есть облако точек изображения глубины, которое было снято камерой на 30 градусов выше горизонтали (повернуто на 30 градусов по оси z). Я хочу перевести все точки обратно в их положение, как если бы камера находилась под углом 0 градусов, что, я думаю, я могу сделать со следующей матрицей вращения:

|cos(30) -sin(30) 0| 
|sin(30)  cos30   0| 
|0        0       1|

Однако, глядя на метод pcl для преобразования облака точек, я обнаружил следующее:

pcl::transformPointCloud (const PointCloud< PointT > &cloud_in, 
PointCloud< PointT > &cloud_out, const Eigen::Matrix< Scalar, 4, 4 > &transform)

Но почему это матрица 4х4, а не вращение 3х3 выше?

3 ответа

Решение
|x||1 0 0 a| =  |x+a|
|y||0 1 0 b|    |y+b|
|z||0 0 1 c|    |z+c|
|1||0 0 0 1|    |1  |

В этом примере мы переместили точку (x,y,z) в точку (x+a, y+b, z+c). Это можно сделать только с помощью матрицы 4х4.


|cos(30) -sin(30) 0 0| multiply The Matrix above. 
|sin(30)  cos30   0 0| 
|0        0       1 0|
|0        0       0 1|

Это даст вам вращение и перевод точки.

Матрица 4x4 - это матрица преобразования в следующем виде

| R    | t | 
|--------- |
|0 0 0 | 1 |

где R ваша матрица вращения 3х3 и t является вектором перевода 3x1. В твоем случае t = [0,0,0]'

Для получения дополнительной информации: http://en.wikipedia.org/wiki/Transformation_matrix

Мне нравится создавать такую ​​матрицу аффинного преобразования следующим образом:

      from scipy.spatial.transform import Rotation
def affine_transform(translation: np.ndarray, rotation: np.ndarray) -> np.ndarray:
      transform_matrix = np.eye(4)
      transform_matrix[:3, :3] = Rotation.from_rotvec(rotation).as_matrix()
      transform_matrix[:3, 3] = translation
      return transform_matrix
Другие вопросы по тегам