PCL 点云位姿变换(Transforms)

PCL专栏目录及须知-CSDN博客

1.原理

矩阵变换

2.使用场景

需点云变换的场景

3.注意事项

刚体变换只包括平移、旋转。变换后两点距离保持不变。

仿射变换包括平移、旋转、缩放、倾斜。变换后保持平直性、平行性。

Eigen::Isometry3d用于刚体变换(只包含平移旋转,不包含缩放),如果要加入缩放,那么在变换后再添加一个缩放的矩阵即可

4.关键函数

(1)缩放【如果要缩放,那么先执行缩放

Eigen::Isometry3d mat = Eigen::Isometry3d::Identity();
mat= Eigen::Scaling(0.5);

 (2)刚体变换(执行完缩放之后,再执行平移和旋转

 // 平移
Eigen::Isometry3d mat = Eigen::Isometry3d::Identity();        // 单位矩阵
mat.translate(Eigen::Vector3d(1.0, 1.0, 1.0));                // 设置平移参数(X轴、Y轴、Z轴)【translate为左乘,pretranslate为右乘】
// 旋转【角度使用弧度制,旋转轴使用向量】【rotate为左乘,prerotate为右乘】
mat.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d(1, 0, 0)));             // 设置旋转参数(旋转角度、旋转轴)【沿x轴旋转45°】

5.代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/common/transforms.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

int main()
{
    /****************刚体变换********************/
    // 原始点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile("D:/code/csdn/data/rabbit.pcd", *cloud_in);   // 加载原始点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>);   // 结果点云

    // 变换矩阵
    // 缩放【最好是第一步】
    Eigen::Isometry3d mat_scale = Eigen::Isometry3d::Identity();
    mat_scale = Eigen::Scaling(0.5);

    pcl::transformPointCloud(*cloud_in, *cloud_in, mat_scale.matrix());    // 缩放变换

    // 平移【缩放变换完之后再进行平移旋转】
    Eigen::Isometry3d mat = Eigen::Isometry3d::Identity();        // 单位矩阵
    mat.translate(Eigen::Vector3d(0.1, 0.1, 0.1));                // 设置平移参数(X轴、Y轴、Z轴)【translate为左乘,pretranslate为右乘】
    // 旋转【角度使用弧度制,旋转轴使用向量】【rotate为左乘,prerotate为右乘】
    mat.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d(1, 0, 0)));             // 设置旋转参数(旋转角度、旋转轴)【沿x轴旋转45°】
    mat.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d(0, 1, 0)));             // 设置旋转参数(旋转角度、旋转轴)【沿y轴旋转45°】
    mat.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d(0, 0, 1)));             // 设置旋转参数(旋转角度、旋转轴)【沿z轴旋转45°】

    // 平移旋转变换
    pcl::transformPointCloud(*cloud_in, *cloud_out, mat.matrix());    // 刚体变换
    pcl::io::savePCDFileBinary("D:/code/csdn/data/rabbit_1.pcd", *cloud_out);    // 保存点云
}

6.结果展示

左侧为变换前,右侧为变换后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值