PCL点云的旋转平移矩阵
目录
(一)左乘右乘
1.左乘
2.右乘
(二)旋转平移矩阵公式
1.绕X轴逆时针旋转角度θ
2.绕Y轴逆时针旋转角度θ
3.绕Z轴逆时针旋转角度θ
4.平移
(三)旋转平移矩阵的逆
(四)PCL实现
旋转平移变换矩阵是先旋转再平移的T=rotation*translation。 在固定坐标系下面,我们用左乘的方法;在非固定的坐标系下面,用右乘。
(一)左乘右乘
1.左乘
每次采取的变化,都是围绕着基座标的话,我们便可以用“左乘”,比如说,我们想要先进行一次旋转变化A,然后再进行一次平移变化B,采用的变化就是B·A的矩阵描述总变换。
此时平移变化B是在基坐标上进行的。
2.右乘
在第一个变化生效的时候,第二个变化的基座标系已经发生了改变,需要基于第二的坐标系再变化,即右乘为A·B。
此时平移变化B是在第一次旋转变化后的坐标上进行的。
(二)旋转平移矩阵公式
1.绕X轴逆时针旋转角度θ
2.绕Y轴逆时针旋转角度θ
3.绕Z轴逆时针旋转角度θ
4.平移
(三)旋转平移矩阵的逆
已知坐标系B相对于A的位姿,要想求坐标系A相对于B的位姿,则需要求齐次变换矩阵的逆,即:
下面展示一个示例,求T的逆矩阵:
(四)PCL实现
//****变换点云位置****//#include <pcl/io/pcd_io.h>
#include <pcl/common/transforms.h>
#include <pcl/visualization/cloud_viewer.h>int main()
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile("点云库字样.pcd", *cloud);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_transformed(new pcl::PointCloud<pcl::PointXYZ>);//Eigen::Matrix4f rotation_x = Eigen::Matrix4f::Identity();//定义绕X轴的旋转矩阵,并初始化为单位阵//double angle_x = M_PI / 2;//旋转90°//rotation_x(1, 1) = cos(angle_x);//rotation_x(1, 2) = -sin(angle_x);//rotation_x(2, 1) = sin(angle_x);//rotation_x(2, 2) = cos(angle_x);//pcl::transformPointCloud(*cloud, *cloud_transformed, rotation_x);//Eigen::Matrix4f rotation_y = Eigen::Matrix4f::Identity();//定义绕Y轴的旋转矩阵,并初始化为单位阵//double angle_y = M_PI / 2;//旋转90°//rotation_y(0, 0) = cos(angle_y);//rotation_y(0, 2) = sin(angle_y);//rotation_y(2, 0) = -sin(angle_y);//rotation_y(2, 2) = cos(angle_y);//pcl::transformPointCloud(*cloud, *cloud_transformed, rotation_y);//Eigen::Matrix4f rotation_z = Eigen::Matrix4f::Identity();//定义绕Z轴的旋转矩阵,并初始化为单位阵//double angle_z = M_PI / 2;//旋转90°//rotation_z(0, 0) = cos(angle_z);//rotation_z(0, 1) = -sin(angle_z);//rotation_z(1, 0) = sin(angle_z);//rotation_z(1, 1) = cos(angle_z);//pcl::transformPointCloud(*cloud, *cloud_transformed, rotation_z);Eigen::Vector4f cloudCentroid;pcl::compute3DCentroid(*cloud, cloudCentroid);//计算点云质心Eigen::Matrix4f translation = Eigen::Matrix4f::Identity();//定义平移矩阵,并初始化为单位阵translation(0, 3) = -cloudCentroid[0];translation(1, 3) = -cloudCentroid[1];translation(2, 3) = -cloudCentroid[2];pcl::transformPointCloud(*cloud, *cloud_transformed, translation);//for (int i = 0; i < cloud->size(); i++)//点云中的每个点减去质心,也可实现平移//{// pcl::PointXYZ temp;// temp.x = cloud->points[i].x - cloud_Centroid[0];// temp.y = cloud->points[i].y - cloud_Centroid[1];// temp.z = cloud->points[i].z - cloud_Centroid[2];// cloud_transformed->push_back(temp);//}//可视化pcl::visualization::PCLVisualizer viewer("PCLVisualizer");viewer.initCameraParameters();int v1(0);viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1);viewer.addCoordinateSystem(200, v1);viewer.setBackgroundColor(128.0 / 255.0, 138.0 / 255.0, 135.0 / 255.0, v1);viewer.addText("Cloud before transforming", 10, 10, "v1 test", v1);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color(cloud, 0, 255, 0);viewer.addPointCloud(cloud, color, "cloud", v1);int v2(0);viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer.addCoordinateSystem(200, v2);viewer.setBackgroundColor(128.0 / 255.0, 138.0 / 255.0, 135.0 / 255.0, v2);viewer.addText("Cloud after transforming", 10, 10, "v2 test", v2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color_transformed(cloud_transformed, 0, 255, 0);viewer.addPointCloud(cloud_transformed, color_transformed, "cloud_transformed", v2);while (!viewer.wasStopped()){viewer.spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}return 0;
}
PCL点云的旋转平移矩阵相关推荐
- 《PCL点云库学习VS2010(X64)》Part 34 旋转平移矩阵用法
<PCL点云库学习&VS2010(X64)>Part 34 旋转平移矩阵用法 1.变换与投影矩阵讲解: https://en.wikipedia.org/wiki/Transfor ...
- PCL 点云的旋转与平移
PCL提供了两种点云平移.旋转的方式 方式1:使用Matrix4f手动输入坐标平移.旋转矩阵,理解更直观,但易出错 方式2:使用Affine3f定义坐标平移.旋转矩阵,简单且不易出错 代码实现: #i ...
- 内参矩阵、外参矩阵、旋转矩阵、平移矩阵、单应矩阵、本征矩阵、基础矩阵
自己在单目结构光系统.双单目结构光系统及双目相机系统学习的过程中接触到如标题所列的各种矩阵,总感觉理解不到位,现在特总结下,方便日后查阅及修正自己的理解. 自己已经总结了单目相机各坐标系的变换,链接如 ...
- 点云旋转平移(一)—基础知识介绍
点云的旋转和平移与立体几何和矩阵变换相关.点云中各个点的坐标由x.y.z组成.这里假设原始坐标为P0(x0, y0, z0),变换后的坐标为P(x, y, z). 一.点云平移 点的平移描述如下所示: ...
- java opencv 平移_如何使用opencv pnpRansac()函数中的平移矩阵和旋转矩阵设置Rajawali相机的旋转?...
我正在开发Android AR应用程序 . 我正在使用RAJAWALI库进行AR渲染,使用openCV进行目标检测和跟踪 . 我正在使用opencv的PNPRansac函数计算旋转和平移矩阵 . cv ...
- 点云旋转平移(三)—python open3d点云旋转
点云旋转平移介绍,请参考上一节:点云旋转平移(一)-基础知识介绍_Coding的叶子的博客-CSDN博客. 本节所使用的示例pcd点云文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下 ...
- SVD计算旋转,平移矩阵
问题描述 最近在做手眼标定,3D点云相机+ABB机器人,因相机与机器人在流水线同侧,无法通过传统的eye-to-hand标定板固定在机械臂末端进行手眼标定. 相机与机械臂的位置如下图所示,C是相机,B ...
- 点云旋转平移(二)—python open3d点云平移
点云旋转平移介绍,请参考上一节:点云旋转平移(一)-基础知识介绍_Coding的叶子的博客-CSDN博客. 本节所使用的示例pcd点云文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下 ...
- [线性代数]矩阵变换在几何中的体现:缩放、翻转、切片、旋转、平移矩阵;放射变换
1.缩放矩阵 几何图示 对应公式 x ′ = − x y ′ = y \begin{aligned} &x^{\prime}=-x \\ &y^{\prime}=y \end{alig ...
最新文章
- 一天学习一点之express demo
- clion 查看内容窗口_苹果电脑(macOS)查看 WiFi 密码的两种方法
- Java面向对象之抽象方法抽象类、接口的使用
- 数据的格式化和处理(复习)
- visual studio 安装教程
- java cookie id,我如何在Java中获取会话ID
- grid安装前检查报PRVE-0426:/dev/shm less than the require
- python语言常用语法汇总
- 微软.Net离线语音识别
- matlab正激变换器,12个步骤设计恒流正激式开关电源
- 洛谷 P1879 [USACO06NOV]玉米田Corn Fields
- 示例:波士顿房价预测
- Jmeter 入门 从0-1 基础篇-实操
- 一篇写给迷茫的你或者想入门java的同学们
- FreeImage通用文件加载与转换器
- AI:大模型领域最新算法SOTA总结、人工智能领域AI工具产品集合分门别类(文本类、图片类、编程类、办公类、视频类、音频类、多模态类)的简介、使用方法(持续更新)之详细攻略
- Cisco Firepower 1000 Series FTD Software 7.2.0 ASA Software 9.18.1
- OSS云文件列举分页功能的解决方法
- epoll学习:思考一种高性能的服务器处理框架 - fanlb - 博客大巴
- 假币问题(八枚硬币及n枚硬币)