空间坐标系以及空间两三维坐标系转换矩阵解释_三维空间坐标系-程序员宅基地

技术标签: 3d  旋转矩阵  三维空间坐标系  线性代数  

空间坐标系以及空间两三维坐标系转换矩阵解释

因为工作的原因,需要进行不同坐标系的一个转换,在查阅了众多的网页之后,发现有用的没几个,而且众多都是抄的同一篇文章,而且都是罗列以下旋转的方式,几乎没有解释旋转角的物理意义,也不说这个旋转角怎么得到的。在折腾了一天之后,终于弄清楚了,特意写下来,既能有助于记忆,又能装b,很好很强大。

基础背景

空间三维坐标系转换,大多出现在像我似的搞地图的这群B人里,当然还有搞游戏的大佬们。所以需要对空间三维坐标系做一个小的总结,来防止忘记或者混乱。

具体图形可百度,赖的放图

  • 地心坐标系
    空间三维坐标系,左手系
  • 高斯坐标系
    在搞激光点云的人眼里,基本上就指的是,当前度带(分3度带和6度带)中的高斯直角坐标系,右手系,点云中记录的点坐标大多有经纬度坐标、高斯坐标,两种坐标。
  • 像空间坐标系
    z轴正方向,与主光轴方向重合,x、y轴方向与相平面坐标系平行。右手系
  • 像平面坐标系
    xy轴方向与像素坐标系平行,单位为m,是一个物理坐标系
  • 像素坐标
    单位为像素,在与像平面坐标系进行转换的时候,需要知道每个像素的物理尺寸

三维坐标系转换

为了通用性,前边的空间坐标系只做一个概念上的罗列,这里针对任意两空间直角坐标系的相互转换进行解释。

  • 世界坐标系XYZ:仅仅用于表述,不代表物理意义上世界坐标系
  • 局部坐标系xyz
  • 旋转角:重点需要搞清楚,这个旋转角是从哪个坐标系旋转到哪个坐标系,在地图行业里的多传感器的联合标定中,这个旋转角是由相应的标定文件提供的。

已知条件

  1. 世界坐标系的三个坐标轴:world_x(1,0,0),world_y(0, 1, 0),world_z(0,0,1)
  2. 局部坐标系的三个坐标轴:local_x(g,h,i),local_y(d,e,f)local_z(a,b,c)
    其中,局部坐标系的坐标轴坐标均为世界坐标系下的坐标值,这点非常重要,同时,两空间三维坐标系还有个平移向量,因为只是很简单的坐标值平移,这里就不再赘述,默认两坐标系的原点相同。

旋转原理

这里盗一张图(找了好久,看到的一个良心博客 http://www.skcircle.com/?id=515)
在这里插入图片描述
如上图,P点为局部坐标系的z轴上一点,q为点P在世界坐标系ZOY平面上的投影点,r为点P在经过旋转之后的对应点,如果你去查看了贴的那个网页博客,请不要看他的旋转方式,并不是大佬描述错误,而是不适用空间三维坐标系的相互转换,因为这里涉及到一个很蛋疼的说法,这个旋转矩阵描述的是A坐标系到B坐标系转换方式

世界坐标系到局部坐标系的旋转矩阵R

注意:XYZ与xyz,我都会严格注意,不会写错!(写错老子就改!看其他博客的时候,就深受其害),为了描述方便,世界坐标系的轴或者坐标都会用大写的XYZ来代替,局部坐标用xyz来代替,而且为了防止0与O不好分辨,所有的0都用汉字零来表示

问:如何理解旋转矩阵究竟是描述的A到B,还是B到A?

答:旋转世界坐标系,使得世界坐标系与局部坐标系重合,那么得到的这个旋转矩阵,描述的是,世界坐标系到局部坐标系转换关系,用公式来表达

							 local = R * world 

结合上方图片:(注意理解旋转角)

  1. 逆时针旋转世界坐标系X轴,使得局部坐标系的 z轴 与世界坐标系的 XOZ 平面共面,结合上图(那个椭圆就是为了方便理解,而虚拟出来的点P的旋转轨迹),要想OP出现在XOZ平面上,就需要逆时针旋转X轴,旋转的角度为θ(注意,α为向量夹角,范围0 - 180,如果这个角不会求,要不,再去从小学开始复读一下吧)。但是注意,旋转角是有方向的,图里的例子,如果要逆时针把OZ,旋转到Oq,那么旋转的角度应该是360 - α。

注意:其实顺时针也可以,只需要保证所有的轴都同时为逆时针或者顺时针即可,不过大家都通用逆时针而已,所以,请把顺时针给从脑子里删除

  • 如何来获取旋转角度θ(而非向量夹角)
    就需要用到向量的叉乘,来确定向量的左右侧。这里要将OZ旋转到Oq,那么OZ就是基准,需要知道Oq在OZ的左侧还是右侧,图里是在右侧,与逆时针相反,用叉乘表示: OZ Oq 得到的向量与X轴的乘积小于零,那么旋转角度就应该是θ = 360 - α,如果在OZ的左侧的话,向量夹角就是旋转角度,θ = α。

    旋转的是X轴,那么矩阵描述应该为Rx
    在这里插入图片描述

  1. 经过步骤1之后,局部坐标系的z轴现在就表现为图里的Or,接着逆时针旋转世界坐标系的Y轴,使得世界坐标系的Z轴与局部坐标系得z轴重合,同理,观察Or在OZ得左侧,那么这一步得旋转角度θ = β。
    旋转的是轴,那么矩阵描述应该为Ry
    在这里插入图片描述
  2. 经过前两步得旋转,此时世界坐标系得Z轴与局部坐标系得z轴已经重合了,那么接着逆时针旋转世界坐标系Z轴,就是一个简单得二维上得旋转了,就会很好理解了,如下图所示
    在这里插入图片描述
    同理,求出旋转角θ,这次旋转的是世界坐标系的Z轴,那么旋转矩阵就是Rz,
    在这里插入图片描述

结束
经过上边的三步旋转,就将世界坐标系,旋转到了局部坐标系上,通过矩阵的左乘,就能得到世界坐标系到局部坐标系的旋转矩阵R
R = Rz * Ry * Rx

完整坐标值形式(加上偏移值)
local = R * world + T
其中T为世界坐标系原点在 局部坐标系中的坐标

局部坐标系到世界坐标系的旋转矩阵

但是现实中,往往是知道局部坐标系原点在世界坐标系中的坐标,因此,基本上都是求得局部坐标系到世界坐标系得旋转矩阵(上边的R,求个逆即可,自己玩去吧您那,赖的写了)
2021.11.12号,补充
还是写清楚吧,方便各位跟我一样的小白。
上边的旋转矩阵R,描述的是world到local的旋转方式,那么将R求逆得到W,同时知道局部坐标系原点在世界坐标系中的坐标O,那么local坐标转到world坐标的方式如下

									world = W * local + O
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guzhong_di/article/details/121114848

智能推荐

荣耀 MagicBook pro 拆机图及硬盘安装过程_magicbookpro 2019能拆硬盘吗-程序员宅基地

文章浏览阅读1.3w次。参考https://post.smzdm.com/p/avv4/补充:1.后盖拆的时候用硬卡片慢慢的别就行,要小心翼翼的一点一点的把卡口撬开,当时手边没有专业的撬棒,就用饭卡撬开了2.硬盘不能超过9.5mm,本人用的如下参数硬盘,感觉刚刚好3.在装硬盘时要把电池右边的橡胶条拔掉,不然硬盘装不进去4.软排线的蓝色面朝上5.在磁盘管理里面对磁盘进行初始化..._magicbookpro 2019能拆硬盘吗

echarts & vue——echarts图显示隐藏后不显示_vue3 echarts 地图 数据视图隐藏-程序员宅基地

文章浏览阅读2.1k次。踩坑记录echarts图显示隐藏后不显示echarts图显示隐藏后不显示因为大部分项目的需求都存在图的缺省内容,当后端返回空数据时,需要给用户反馈一个缺省提醒,所以一般把echarts图作了显示隐藏的功能那么问题来了,当返回空数据时,先把图隐藏起来,当再次请求到数据并把图进行实例化时,图怎么都显示不出来,控制台上也不报错Markdown将文本转换为 HTML。..._vue3 echarts 地图 数据视图隐藏

Lua中and和or的用法和记忆方法_lua and or 顺序-程序员宅基地

文章浏览阅读7.4k次,点赞7次,收藏7次。Lua中and和or的用法和记忆方法_lua and or 顺序

字符集修改引起的expdp impdp需要重新运行proc加载-程序员宅基地

文章浏览阅读100次。用impdp导入dmp文件出现如下错误 [oracle@localhost~]$ impdp zebra/zebra directory=back dumpfile=zebra20120420.dmp ..._expdp修改字符集

oracle优化书籍推荐_oracle sql优化书籍推荐-程序员宅基地

文章浏览阅读6.2k次。经常听到有做应用的朋友抱怨数据库的性能问题,比如非常低的并发,令人崩溃的响应时间,长时间的锁等待,锁升级,甚至是死锁,等等。本文针对应用开发人员经常接触的性能问题,推荐几本书,请大家关注。 一、《 oracle 9i/10g 编程艺术》内容简介 本书是一本关于Oracle 9j az& 10g数据库体系结构的权威图书,涵盖了所有最重要的Oracle体系结构特性,_oracle sql优化书籍推荐

php 数组分割,php 数组分割的方法-程序员宅基地

文章浏览阅读9.1k次。在 php 编程中,如果遇到数组的元素过多,不方便处理的情况下。我们可以通过分割数组的方法,将其变成一个个的小数组块,这样再处理就方便很多了。php 中预设了一个 array_chunk() 函数,可以将一个数组的元素,按照一定的数量分割成多个数组块。php array_chunk() 函数array_chunk():函数把一个数组分割为新的数组块。语法:array_chunk(array,siz..._php 数组分割

随便推点

使用vuepress-theme-reco搭建自己的博客-程序员宅基地

文章浏览阅读8k次,点赞29次,收藏103次。使用vuepress-theme-reco搭建自己的博客vuepress-theme-reco是VuePress的一个主题,大家可以参考VuePress和其他主题,搭建你自己风格的主题,这篇主要讲解vuepress-theme-reco主题的博客。VuePress是静态网页生成器,通过它,可以迅速的将我们的Markdown笔记变成网页,方便我们翻阅,查找。一、初始化项目1、引入vuepress-theme-reco主题npm install vuepress-theme-reco --save-d_vuepress-theme-reco

42. 接雨水 (左右双指针)_l42接雨水_双指针方法-程序员宅基地

文章浏览阅读220次。LeetCode: 42. 接雨水又成功忘记一题我记得我之前好像是做过这题的, 接雨水 >> 双指针解法, 说实话不记得怎么做了。。。而且博客、题目的提交记录也没相关记录, 太神奇了。。只找到了这题的记录, 博客指路: 11. 盛最多水的容器题目概述: 能接到多少雨水, 数组表示高度暴力法O(N2)O(N^2)O(N2)思路:枚举每根柱子, 之后从该柱子起, 从左从右找到最大值。比较左最大值 与 右最大值, 取较小的一个减去当前柱子, 结果累加到 ans返回 a_l42接雨水_双指针方法

排序算法:插入排序(python写法)_python插入排序代码-程序员宅基地

文章浏览阅读2.1k次。排序算法:插入排序(python写法)_python插入排序代码

I2C知识大全系列六 —— I2C应用之Linux下的I2C_linux控制i2c应用编程-程序员宅基地

文章浏览阅读3.9k次,点赞3次,收藏42次。本文是I2C知识大全系列文章的第六篇,介绍了Linux下的I2C应用。_linux控制i2c应用编程

微擎URL路由_noloading: true, noredirect: true-程序员宅基地

文章浏览阅读5.5k次。微擎提供一个创建URL的函数url($segment, $params = array(), $noredirect = false), 路由的表达式以斜杠“/”的方式组织,每个以斜杠分隔的片段都是指向某一控制器(controller)、操作(action)或是行为(do)。第二个参数则是以数组的形式表示URL中的QueryString。例如://生成此地址//http://we7...._noloading: true, noredirect: true

关于arduino程序编译成功但上传失败的情况_arduino编译完成但上传错误-程序员宅基地

文章浏览阅读2w次,点赞6次,收藏7次。注意,此文的前提是驱动已经安装好,端口和开发板都已正确选择;1.正如百度所得的答案。请将0,1接口上的线拔掉再进行上传;2.这是一个比较cd的情况,虽然我们的编辑语言是C语言,而且注释也确实可以通过//来注释,编译可以通过,但是上传不能成功,若在1的情况下无法成功,那么就尝试删掉所有的注释,或将//...注释改为/*...*/!..._arduino编译完成但上传错误

推荐文章

热门文章

相关标签