#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/common/transforms.h>
#include <pcl/filters/passthrough.h>
#include<pcl/common/common.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
typedef pcl::PointXYZRGB PointT; PointXYZ-->PointXYZRGB
typedef pcl::PointCloud<PointT> PointCloud;
// 旋转矩阵的具体定义 (请参考 https://en.wikipedia.org/wiki/Rotation_matrix)
int
main(int argc, char** argv)
{
//输入ply
std::string src_cloud_path = "pointCloud_trunc_passthroughed_.ply";
PointCloud::Ptr cloud_in(new PointCloud);
pcl::io::loadPLYFile(src_cloud_path, *cloud_in);
//点云旋转
PointCloud::Ptr cloud_icp(new PointCloud);//目标点云
double theta = M_PI / 20; // 设置旋转弧度的角度
Eigen::Matrix4f transformation_matrix = Eigen::Matrix4f::Identity();//设置旋转矩阵
transformation_matrix(0, 0) = cos(theta);
transformation_matrix(0, 1) = -sin(theta);
transformation_matrix(1, 0) = sin(theta);
transformation_matrix(1, 1) = cos(theta);
// 设置平移矩阵
transformation_matrix(0, 3) = 0.0;
transformation_matrix(1, 3) = 0.0;
transformation_matrix(2, 3) = 4.0;
// 执行初始变换
pcl::transformPointCloud(*cloud_in, *cloud_icp, transformation_matrix);
//可视化单个点云
pcl::visualization::PCLVisualizer viewer("registration Viewer");
viewer.addPointCloud(cloud_icp, "source cloud");
//执行一个 while 循环,每次调用 spinOnce 都给视窗处理事件的时间,允许鼠标键盘等交互操作
while (!viewer.wasStopped())
{
viewer.spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(10000));
}
pcl::io::savePLYFile("cartman_passed_rotated_trans.ply", *cloud_icp);
return (0);
}