坐标系的平移、旋转变换——超详细_坐标系旋转-程序员宅基地

技术标签: 坐标变换  伺服控制  伺服系统  

        这次的文章,我们来看一看三维空间直角坐标系的平移和旋转变换,尽管这个内容早已见诸文献资料,但自己在看书籍以及期刊论文时,总是遇到让人百思不得其解的事情,就是不同的文献给出的同类型的旋转矩阵居然有不一样的,这让小D对文献中的公式产生了怀疑,也不知道哪个旋转矩阵才是对的。

        于是,自己动手,丰衣足食,为了验证公式的正确性,小D把旋转矩阵推了个遍,包括文献中只给出了公式而没有过程的旋转矩阵的推导。

三维空间直角坐标系的平移变换

        文章的开头,还是先讲讲坐标系的平移变换,平移变换的过程如下图所示:

图片

        假设点P是空间中的任意一点,其在XYZ坐标系中的坐标为(x, y, z)。现在点P不动,我们将XYZ坐标系做一个平移的操作,把XYZ平移到X´Y´Z´的位置,O´是平移后的坐标的原点,要注意的是,O´在XYZ中的坐标为(x0, y0, z0)。点P在XYZ坐标系中的坐标为(x, y, z),点P在平移后的坐标系X´Y´Z´中的坐标为(x´, y´, z´)。根据上面这个示意图,聪明的你一下就可以发现:

图片

通过上面的式子,我们可以求解出点P在X´Y´Z´坐标系中的坐标为:

图片

把上面的式子转换成矩阵的形式就是:

图片

        这就是三维空间直角坐标系的平移变换了。

三维空间直角坐标系的旋转变换

        下面我们来看看三维空间直角坐标系的旋转变换,小D最开始在研究旋转变换的时候,只推导了右手坐标系的旋转变换。有一次看到了一篇文献,它用的是左手坐标系,但小D对文献中给出的公式的正确性感到怀疑,而我们要在代码中用到相关的坐标转换,这意味着我们需要知道左手坐标系旋转矩阵的正确表达式,所以小D又把左手坐标系的旋转矩阵推导了一遍。

右手坐标系的旋转变换

        右手坐标系的旋转过程有三个,分别是绕X,Y,Z轴旋转,右手坐标系在旋转时,通常规定以逆时针旋转方向为正方向。

①XYZ右手坐标系绕X轴逆时针旋转θ角

        先来推导右手坐标系绕X轴旋转的旋转矩阵,这个过程可以用下面这个示意图表示:

图片

        假设P点为空间中任意一点,为了便于观察与推导,我们将P点放在YOZ平面内。P点在空间中保持不动,XYZ坐标系绕X轴逆时针旋转θ形成新的坐标系X´Y´Z´,P点在XYZ中的坐标为(x, y, z),P点在X´Y´Z´中的坐标为(x´, y´, z´),现在我们已知(x, y, z)、旋转角度θ和(x´, y´, z´),求旋转矩阵Rx。在推导的过程中,我们还要假设一个变量,就是点P相对于Y轴正方向逆时针的夹角为φ。

        很明显,点P在XYZ坐标系中的Y,Z轴坐标可以表示为:

图片

        点P在X´Y´Z´坐标系中Y´,Z´轴坐标为:

图片

        把x,y带入x´,y´中,同时P点在XYZ中X轴坐标与其在X´Y´Z´坐标系中的X´轴坐标是相等的,所以有:

图片

        把这个表达式表示成矩阵相乘的形式为:

图片

        上面的Rx就是XYZ右手坐标系绕X轴逆时针旋转θ角,空间中的点从XYZ坐标系变换到X´Y´Z´坐标系的旋转矩阵,Rx的表达式为:

图片

②XYZ右手坐标系绕Y轴逆时针旋转θ角

        有了前面的推导过程,XYZ右手坐标系绕Y轴逆时针旋转θ角的旋转矩阵的推导就一葫芦画瓢了。旋转过程如下图所示:

图片

点P在XYZ右手坐标系中的X,Z轴坐标为:

图片

点P在X´Y´Z´坐标系中的X,Z轴坐标为:

图片

把x,z带入x´,z´中,同时P点在XYZ中的Y轴坐标与X´Y´Z´坐标系中的Y´轴坐标是相等的,所以有:

图片

写成矩阵相乘的形式:

图片

所以,XYZ右手坐标系绕Y轴逆时针旋转θ角的旋转矩阵Ry为:

图片

XYZ右手坐标系绕Z轴逆时针旋转θ角

XYZ右手坐标系绕Z轴逆时针旋转θ的过程如下图所示:

图片

        点P在XYZ右手坐标系中的X,Y轴坐标为:

图片

        点P在X´Y´Z´坐标系中的x,y坐标为:

图片

        把x,y带入x´,y´中,同时P点在XYZ中的Z轴坐标与其在X´Y´Z´坐标系中的Z´轴坐标是相等的,所以有:

图片

写成矩阵相乘的形式:

图片

        所以,XYZ右手坐标系绕Z轴逆时针旋转θ角的旋转矩阵Rz为:

图片

左手坐标系的旋转变换

        左手坐标系的旋转过程也是三个,分别是绕X,Y,Z轴旋转,左手坐标系在旋转时,通常规定以顺时针旋转方向为正方向。

①XYZ左手坐标系绕X轴顺时针旋转θ角

        XYZ左手坐标系绕X轴顺时针旋转θ角的过程示意图如下所示:

图片

        上图中,点P为空间中任意一点,点P保持不动,XYZ左手坐标系绕X轴顺时针旋转θ角形成新的坐标系X´Y´Z´。已知点P在XYZ坐标系中的坐标为(x,y,z),点P在X´Y´Z´中的坐标为(x´,y´,z´),我们要求的是XYZ坐标系变换到X´Y´Z´坐标系这个过程中的旋转矩阵。

        从图中可以看出,点P在XYZ坐标系中的Y,Z轴坐标为:

图片

点P在X´Y´Z´坐标系中的Y,Z轴坐标为:

图片

把y,z带入y´,z´中,同时P点在XYZ中的X轴坐标与其在X´Y´Z´中的X´轴坐标是相等的,所以有:

图片

写成矩阵相乘的形式:

图片

所以,XYZ左手坐标系绕X轴顺时针旋转θ角的旋转矩阵为:

图片

XYZ左手坐标系绕Y轴顺时针旋转θ角

        XYZ左手坐标系绕Y轴顺时针旋转θ角形成X´Y´Z´坐标系,其过程示意图如下所示:

图片

点P在XYZ坐标系中的X,Z轴坐标为:

图片

点P在X´Y´Z´坐标系中的X,Z轴坐标为:

图片

把x,z带入x´,z´中,同时P点在XYZ中的Y轴坐标与其在X´Y´Z´坐标系中的Y´轴坐标是相等的,所以有:

图片

以矩阵形式表示为:

图片

所以,XYZ左手坐标系绕Y轴顺时针旋转θ角的旋转矩阵Ry为:

图片

③XYZ左手坐标系绕Z轴顺时针旋转θ角

        XYZ左手坐标系绕Z轴顺时针旋转θ角形成X´Y´Z´坐标系的过程示意图如下所示:

图片

点P在XYZ坐标系中的X,Y轴坐标为:

图片

点P在X´Y´Z´坐标系中的X,Y轴坐标为:

图片

        把x,y带入x´,y´中,同时P点在XYZ中的Z轴坐标与其在X´Y´Z´坐标系中的Z´轴坐标是相等的,所以有:

图片

        将上式表示成矩阵的形式为:

图片

        所以,XYZ左手坐标系绕Z轴顺时针旋转θ角的旋转矩阵Rz为:

图片

        左手坐标系的旋转矩阵到这里就推导完啦。

旋转矩阵的运用

        实际中,当我们要推导两个不同的坐标系,比如地心地固坐标系和北东天、北东天坐标系和机体坐标系等坐标系之间的变换关系时,就要用到上面的旋转矩阵。一般的方法是,根据实际的旋转过程,按旋转的先后顺序计算旋转矩阵。

        比如对于右手坐标系,如果有一个过程是先绕Y轴逆时针旋转α,再绕X轴顺时针旋转β,最后绕Z轴逆时针旋转γ,那么最终的旋转矩阵的表达就是:

图片

        在应用旋转矩阵的过程中,小D还总结了一个经验:不管是左手坐标系还是右手坐标系,假如绕X轴逆时针旋转θ角,相当于绕X轴顺时针旋转2π-θ角,同时也相当于绕X轴顺时针旋转-θ角。

旋转矩阵的验证

        推导了这么多公式,那推导结果是否正确呢?我们可以从《雷达数据处理及应用》中找到相关内容:

图片

图片

图片

        从书中的截图中可以验证,自己推导的平移变换以及右手坐标系的旋转矩阵是没有问题的。但是左手坐标系的推导,小D至今没有找到相关文献,但小D相信肯定是有的。

        然后小D向gpt求证,gpt给出的答案是这样的:

图片

        很显然,gpt给出的右手坐标系的旋转矩阵不是小D上面推导的结果,也跟书中的结果不一样。于是小D又去问了gpt4,gpt4的回答是这样的:

图片

        gpt4的回答和gpt3.5的回答如出一辙,当时小D心想,gpt脑子估计又瓦特了。直到最近,小D看到了一本英文书籍Geometric Transformations for 3D Modeling_Michael Mortenson,小D才明白,原来gpt是没有正确理解问题,它给出的是坐标系中的点转动,坐标轴不动的情况。这本英文书籍中坐标转换相关的内容是这样的:

图片

图片

图片

图片

图片

这个时候,小D才明白为什么gpt会给出那样的答案,因为旋转分为两种:

①点不动,坐标轴旋转,就是小D推导的公式

②坐标轴不动,点旋转,就是gpt第一次回答的公式

以另一种方式问它,它就回答对了“点不动,坐标轴旋转”的旋转矩阵正确的公式:

图片

图片

        到这里,就验证了小D推导的坐标转换的所有公式啦。

        如果想免费获取《雷达数据处理及应用》和Geometric Transformations for 3D Modeling_Michael Mortenson这两本书的PDF,可以关注“小D的线上笔记”哦,小D后台发给你。

参考文献

[1] 何友, 修建娟等, 雷达数据处理及应用[M]. 北京, 电子工业出版社, 2006, 64-66

[2] Michael E. Mortenson, Geometric Transformations for 3D Modeling_Michael Mortenson[M]. New York, Industrial Press Inc, 2009, 161-168

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jk_101/article/details/135055789

智能推荐

docker中mysql容器自动停止原因及解决方法_为什么我部署在docker里面的mysql,会被关闭-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏23次。docker update -m 400M --memory-reservation 400M --memory-swap 500M 容器名。将docker.cnf 复制到mysql容器内(容器名可用docker ps -a 查看到name列,即为容器名)sudo docker cp ./docker.cnf 容器名:/etc/mysql/conf.d。第五步:限制mysql内存占用(本机器内存为1G,可视自己的机器内容设置)查看设置内容后docker容器内存使用情况:docker stats。_为什么我部署在docker里面的mysql,会被关闭

【K8S系列】深入解析K8S存储-程序员宅基地

文章浏览阅读2.3w次,点赞91次,收藏122次。在 Kubernetes 中,存储具有非常广泛的应用场景。可以根据实际需求选择适合自己的存储方案,以便更好地管理容器化应用程序中的数据和资源。本文会从以下三个方面,带你了解k8s存储:1.k8s存储类型;2.存储使用场景;3.存储使用案例

oracle 重新编译用户无效对象_oracle重新编译失效对象-程序员宅基地

文章浏览阅读1.2w次。oracle sys用户无效对象select owner,object_name, replace(object_type,' ','') object_type,to_char(created,'yyyy-mm-dd') as created,to_char(last_ddl_time,'yyyy-mm-dd') as last_ddl_time,statusfrom dba_o_oracle重新编译失效对象

【愚公系列】2023年10月 WPF控件专题 RadioButton控件详解_wpf radiobutton-程序员宅基地

文章浏览阅读5.1w次,点赞2次,收藏3次。WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见的标准用户界面元素。自定义控件则允许开发人员使用XAML和C#等编程语言来创建个性化的用户界面元素。自定义控件可以根据需求提供更多的功能和自定义化选项,以及更好的用户体验。_wpf radiobutton

ES6(阮一峰)_es6 阮一峰-程序员宅基地

文章浏览阅读3.2k次。一、let 和const 命令let 命令块级作用域块级作用域与函数声明let 命令一、基本用法二、不存在变量提升:先声明再使用三、暂时性死区:先声明再赋值使用四、不允许重复声明:只要有let 就不能重复声明不允许再函数内部重新声明参数块级作用域es5没有块级作用域,var 声明会:1.内层变量可能会覆盖外层变量;2.用来计数的循环变量泄露为全局变量。块级作用域的作用:外层代码块不受内层代码块的影响。ES6 允许块级作用域的任意嵌套。内层作用域可以定义外层作用域的同名变量。匿名立_es6 阮一峰

Vue + Axios + ASP.NET Core WebAPI + 文件上传下载_axios filecontentresult-程序员宅基地

文章浏览阅读1.8k次。准备文件上传的API#region 文件上传 可以带参数[HttpPost(“upload”)]public JsonResult uploadProject(IFormFile file, string userId){if (file != null){var fileDir = “D:\aaa”;if (!Directory.Exists(fileDir)){Directory.CreateDirectory(fileDir);}//文件名称string projectFi_axios filecontentresult

随便推点

【Oracle和MySQL以及DM8】主流数据库Oracle以及MySQL批量生成数据1kw(1)-程序员宅基地

文章浏览阅读709次,点赞25次,收藏26次。总的来说,面试是有套路的,一面基础,二面架构,三面个人。最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

android studio最新安装教程详细,Android开发面试题及答案-程序员宅基地

文章浏览阅读345次,点赞3次,收藏9次。上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料。

【DP、线段树优化】琪露诺_c++ 琪露诺树-程序员宅基地

文章浏览阅读274次。跟去年(2017)PJ第四题几乎是一样的?/吐血DP方程可以很简单的推出来,f[i]=max{f[k]}+a[i]然而这样做是O(n^2)的看一下数据,200000的话要不nlogn 要不n由于题解里面单调队列和优先队列都有人用了,那就来一发线段树吧(或者实情是:单调队列不会打?)只要维护i-r~i-l中f[i]的区间最大值即可(单点修改-区间查询)40行AC#include&lt..._c++ 琪露诺树

【区块链DAPP】智能合约概述_智能合约账户状态的组成部分及说明-程序员宅基地

文章浏览阅读5.6k次,点赞5次,收藏45次。智能合约概述_智能合约账户状态的组成部分及说明

Git学习笔记(流程图+示例)_git常用流程图-程序员宅基地

文章浏览阅读1.6k次,点赞33次,收藏24次。学习git时的笔记_git常用流程图

C语言中的++和--运算符_c语言---程序员宅基地

文章浏览阅读1.7w次,点赞92次,收藏288次。++和--运算符分别是 += 1 和 -= 1 的简写。设计这样两个运算符的本意是方便程序员,但i++和++i使用不恰当有时候会造成混淆,反倒令刚入门的C程序员有点儿混乱。如果i++或者++i单独为一条指令,则效果并没有什么区别,都是令i = i + 1;但是如果和其它的运算符结合,则二者还是有区别的。具体来说,i++ 是先使用 i,然后执行 i = i + 1;而 ++i 则是先执行 i = i + 1,然后再使用 i 。举个例子看下:int i = 0;printf("i is: %d\n"._c语言--

推荐文章

热门文章

相关标签