目录

(一)左乘右乘

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点云的旋转平移矩阵相关推荐

  1. 《PCL点云库学习VS2010(X64)》Part 34 旋转平移矩阵用法

    <PCL点云库学习&VS2010(X64)>Part 34 旋转平移矩阵用法 1.变换与投影矩阵讲解: https://en.wikipedia.org/wiki/Transfor ...

  2. PCL 点云的旋转与平移

    PCL提供了两种点云平移.旋转的方式 方式1:使用Matrix4f手动输入坐标平移.旋转矩阵,理解更直观,但易出错 方式2:使用Affine3f定义坐标平移.旋转矩阵,简单且不易出错 代码实现: #i ...

  3. 内参矩阵、外参矩阵、旋转矩阵、平移矩阵、单应矩阵、本征矩阵、基础矩阵

    自己在单目结构光系统.双单目结构光系统及双目相机系统学习的过程中接触到如标题所列的各种矩阵,总感觉理解不到位,现在特总结下,方便日后查阅及修正自己的理解. 自己已经总结了单目相机各坐标系的变换,链接如 ...

  4. 点云旋转平移(一)—基础知识介绍

    点云的旋转和平移与立体几何和矩阵变换相关.点云中各个点的坐标由x.y.z组成.这里假设原始坐标为P0(x0, y0, z0),变换后的坐标为P(x, y, z). 一.点云平移 点的平移描述如下所示: ...

  5. java opencv 平移_如何使用opencv pnpRansac()函数中的平移矩阵和旋转矩阵设置Rajawali相机的旋转?...

    我正在开发Android AR应用程序 . 我正在使用RAJAWALI库进行AR渲染,使用openCV进行目标检测和跟踪 . 我正在使用opencv的PNPRansac函数计算旋转和平移矩阵 . cv ...

  6. 点云旋转平移(三)—python open3d点云旋转

    点云旋转平移介绍,请参考上一节:点云旋转平移(一)-基础知识介绍_Coding的叶子的博客-CSDN博客. 本节所使用的示例pcd点云文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下 ...

  7. SVD计算旋转,平移矩阵

    问题描述 最近在做手眼标定,3D点云相机+ABB机器人,因相机与机器人在流水线同侧,无法通过传统的eye-to-hand标定板固定在机械臂末端进行手眼标定. 相机与机械臂的位置如下图所示,C是相机,B ...

  8. 点云旋转平移(二)—python open3d点云平移

    点云旋转平移介绍,请参考上一节:点云旋转平移(一)-基础知识介绍_Coding的叶子的博客-CSDN博客. 本节所使用的示例pcd点云文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下 ...

  9. [线性代数]矩阵变换在几何中的体现:缩放、翻转、切片、旋转、平移矩阵;放射变换

    1.缩放矩阵 几何图示 对应公式 x ′ = − x y ′ = y \begin{aligned} &x^{\prime}=-x \\ &y^{\prime}=y \end{alig ...

最新文章

  1. 一天学习一点之express demo
  2. clion 查看内容窗口_苹果电脑(macOS)查看 WiFi 密码的两种方法
  3. Java面向对象之抽象方法抽象类、接口的使用
  4. 数据的格式化和处理(复习)
  5. visual studio 安装教程
  6. java cookie id,我如何在Java中获取会话ID
  7. grid安装前检查报PRVE-0426:/dev/shm less than the require
  8. python语言常用语法汇总
  9. 微软.Net离线语音识别
  10. matlab正激变换器,12个步骤设计恒流正激式开关电源
  11. 洛谷 P1879 [USACO06NOV]玉米田Corn Fields
  12. 示例:波士顿房价预测
  13. Jmeter 入门 从0-1 基础篇-实操
  14. 一篇写给迷茫的你或者想入门java的同学们
  15. FreeImage通用文件加载与转换器
  16. AI:大模型领域最新算法SOTA总结、人工智能领域AI工具产品集合分门别类(文本类、图片类、编程类、办公类、视频类、音频类、多模态类)的简介、使用方法(持续更新)之详细攻略
  17. Cisco Firepower 1000 Series FTD Software 7.2.0 ASA Software 9.18.1
  18. OSS云文件列举分页功能的解决方法
  19. epoll学习:思考一种高性能的服务器处理框架 - fanlb - 博客大巴
  20. 假币问题(八枚硬币及n枚硬币)

热门文章

  1. eclipse配置tomcat8.5(注意是8.5)
  2. Stegsolve查看隐水印(暗水印)java jar包工具
  3. Java中hashcode和equals详解
  4. python opencv根据颜色进行目标检测
  5. 基于微信小程序的短视频管理系统
  6. 安防监控摄像头接入云端实现直播、录像和大屏展示
  7. 招标投标中各流程时间期限的规定
  8. Android把图片压缩到一定大小并不失真
  9. 使用HTML语言和CSS开发商业站点
  10. Python爬虫 --爬取京东酒店旅行信息