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

У меня есть облако точек изображения глубины, которое было снято камерой на 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 выше?

1

Решение

|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|

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

3

Другие решения

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

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

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

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

2

По вопросам рекламы [email protected]