三维空间坐标系变换-旋转矩阵「建议收藏」

三维空间坐标系变换-旋转矩阵「建议收藏」    空间中三维坐标变换一般由三种方式实现,第一种是旋转矩阵和旋转向量;第二种是欧拉角;第三种是四元数。这里先介绍旋转矩阵(旋转向量)与欧拉角实现三维空间坐标变换的方法以及两者之间的关系。    这里以常见的世界坐标系与相机坐标系间的变换为例。一、首先介绍从相机坐标系转换到世界坐标系,也就是比较通用的body到世界坐标系间的转换。    那么旋转的欧拉角按从世界坐标…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

       空间中三维坐标变换一般由三种方式实现,第一种是旋转矩阵和旋转向量;第二种是欧拉角;第三种是四元数。这里先介绍旋转矩阵(旋转向量)与欧拉角实现三维空间坐标变换的方法以及两者之间的关系。

       这里以常见的世界坐标系与相机坐标系间的变换为例。

一、首先介绍从相机坐标系转换到世界坐标系,也就是比较通用的body到世界坐标系间的转换。

       那么旋转的欧拉角按从世界坐标系转换到相机坐标系的过程,先按z轴旋转、之后y轴旋转、之后x轴旋转,最终得到相机坐标系,得到的角度分别是yaw、pitch、roll,那么从相机坐标系到世界坐标系的旋转矩阵按如下方式定义:

三维空间坐标系变换-旋转矩阵「建议收藏」

三维空间坐标系变换-旋转矩阵「建议收藏」

三维空间坐标系变换-旋转矩阵「建议收藏」

那么得到的相机(body)坐标系到世界坐标系间的旋转矩阵为:

三维空间坐标系变换-旋转矩阵「建议收藏」

cv::Mat IMUReader::angleToRotation(COORDINATES& carrier)
{

// R
cv::Mat R = cv::Mat::eye(3, 3, CV_32F);
R.at<float>(0, 0) = cos(carrier.yaw)*cos(carrier.pitch);
R.at<float>(0, 1) = cos(carrier.yaw)*sin(carrier.roll)*sin(carrier.pitch) – cos(carrier.roll)*sin(carrier.yaw);
R.at<float>(0, 2) = sin(carrier.yaw)*sin(carrier.roll) + cos(carrier.yaw)*cos(carrier.roll)*sin(carrier.pitch);
R.at<float>(1, 0) = cos(carrier.pitch)*sin(carrier.yaw);
R.at<float>(1, 1) = cos(carrier.yaw)*cos(carrier.roll) + sin(carrier.yaw)*sin(carrier.roll)*sin(carrier.pitch);
R.at<float>(1, 2) = cos(carrier.roll)*sin(carrier.yaw)*sin(carrier.pitch) – cos(carrier.yaw)*sin(carrier.roll);
R.at<float>(2, 0) = – sin(carrier.pitch);
R.at<float>(2, 1) = cos(carrier.pitch)*sin(carrier.roll);
R.at<float>(2, 2) = cos(carrier.roll)*cos(carrier.pitch);

return R;
}

对于平移矩阵为相机坐标系原点在世界坐标系下的坐标T,最终得到的坐标变换方程如下:

三维空间坐标系变换-旋转矩阵「建议收藏」

其理解过程为从世界坐标系经过z,y,x的旋转以及平移T后得到相机坐标系,那么从相机坐标转换的世界坐标实际上是反变换过程,最后一步是x旋转,那么通过定义Rx为反旋转将相机坐标反旋转过来,之后依次是y,z,旋转后得到的值为与世界坐标系同方向,但是有一个平移的T的坐标系下的坐标,之后再加一个T坐标就得到了在世界坐标系下的坐标。

 

二、下面介绍从世界坐标系旋转到相机坐标系,这是一个正向旋转的过程,首先绕z,y,x旋转并平移T得到相机坐标系,那么从世界坐标系到与相机坐标系同向的坐标系是只经过旋转,那么旋转矩阵为:

RxRyRz,而此时三个维度的旋转分别是:

三维空间坐标系变换-旋转矩阵「建议收藏」

三维空间坐标系变换-旋转矩阵「建议收藏」

对于平移矩阵是,此时坐标已经是与相机坐标系同向,但是与世界坐标系原点重合的坐标下的坐标,转换相机坐标系还需要加上的平移是世界坐标系原点在相机坐标系下的坐标T。

其理解过程就是一个在世界坐标系依照顺序进行z,y,x的旋转,之后再平移的过程。

其中对于z,y,x方向的旋转都是按照右手系定则,大拇指指向轴线方向,四指方向为旋转的正方向。

 

下面为之前整理,可能有错误,仅借鉴。

界坐标系下的坐标(Xw,Yw,Zw)转换到相机坐标系下(Xc,Yc,Zc)。

三维空间坐标系变换-旋转矩阵「建议收藏」

     那么这里涉及到旋转矩阵和平移矩阵。对于旋转我们有欧拉角描述,根据欧拉角计算出旋转矩阵。对于欧拉角指的是坐标系绕某个轴旋转的角度,那么从一个坐标系旋转到另一个坐标系需要三次旋转能够完成。对于绕坐标轴旋转分为两种,一种是绕原坐标系的固定轴旋转,一种是绕部分旋转后的坐标轴旋转,这里介绍比较常用的绕部分旋转后的坐标轴旋转。同时,对于绕坐标轴旋转其旋转的顺序也是有关系,如绕XYZ旋转和绕ZYX旋转。那么一种比较常用的表示方式是航空航天的偏航-俯仰-滚转表示法,其中坐标可以沿机头朝向为x轴,飞机左侧为y轴,飞机正上方为z轴。那么偏航为绕z轴旋转,之后俯仰是绕y轴旋转,滚转是绕x轴旋转,即该欧拉角的旋转顺序为ZYX.

       上面介绍了旋转方式-欧拉角,下面介绍旋转矩阵的生成。这里分开不同轴讨论,先绕X轴旋转。我们定义旋转变换公式为:

三维空间坐标系变换-旋转矩阵「建议收藏」

其中,M为旋转矩阵,公式定义的是从世界坐标系向相机坐标系的转换,那么我们就按世界坐标向相机坐标旋转,如下:

三维空间坐标系变换-旋转矩阵「建议收藏」

这里我们定义了从左侧的世界坐标转到右侧的相机坐标,其旋转为绕X轴正向旋转90度,这里的正向旋转是以沿X轴方向看,顺时针旋转为正向,否则为负向。那么从世界坐标系向相机坐标系的旋转矩阵即为:

三维空间坐标系变换-旋转矩阵「建议收藏」

此时从世界坐标向相机坐标的转换过程如下:

三维空间坐标系变换-旋转矩阵「建议收藏」

所以,这里需要注意的是几点:(1)坐标是从世界坐标系向相机坐标系旋转,所有对于旋转方程是旋转矩阵乘以世界坐标得到相机坐标;(2)旋转是从世界坐标向相机坐标的旋转,即从源坐标系向目标坐标系旋转,这里是从世界坐标系向相机坐标系旋转;(3)旋转角度是沿着坐标轴的正向看,顺时针为正,逆时针为负;(4)旋转矩阵的形式如上,绕坐标轴旋转的轴坐标是不会变化的,所以是对应位置是1,接下来是0 cos(theta)  sin(theta), 在接下来是0   -sin(theta)  cos(theta)。

以上四个点的方向是与最终的变换公式相关的,有一个地方发生变化,那么最终的旋转变换公式也会发生变化,为了统一,那么这里按这样的规定,从而确定旋转变换公式的固定。

        上面介绍了绕X轴旋转的情况,其它绕Y轴和Z轴的旋转矩阵相同,分别是:

绕Y轴旋转矩阵:

三维空间坐标系变换-旋转矩阵「建议收藏」

绕Z轴旋转矩阵:

三维空间坐标系变换-旋转矩阵「建议收藏」

那么假如从世界坐标系向相机坐标系的旋转过程中,显示绕Z轴旋转了theta,之后绕旋转后坐标系的Y轴旋转了beta,之后绕旋转后坐标系X轴旋转了alpha,那么最终的旋转矩阵如下:

三维空间坐标系变换-旋转矩阵「建议收藏」

以上是对旋转矩阵的描述,那么对三维坐标系的转换,除了包含旋转,还要包含平移。即坐标系先从源旋转到与目标坐标系相同的方向,之后再平移。对于平移这里也规定从源坐标向目标坐标系。

三维空间坐标系变换-旋转矩阵「建议收藏」

这里目标坐标系在源坐标系下的坐标是(1,3,2),那么从源坐标系转到目标坐标系的变换即为:

三维空间坐标系变换-旋转矩阵「建议收藏」

于是这里规定几点:(1)变换是从源坐标系到目标坐标系,这里是从世界坐标系到相机坐标系;(2)平移变换是目标坐标系原点在源坐标系旋转到与目标坐标系相同方向后的坐标系下的坐标,这里即变换矩阵是目标坐标系原点在世界坐标系变换为与目标坐标系相同方向后在变换后世界坐标系中的坐标位置;(3)此时的变换矩阵需要加上负号。

如果不加负号,也可以将变换矩阵定义为源坐标系原点在目标坐标系下的位置,这里不用变换源坐标系。经过以上步骤可以将源坐标系中的坐标点转换到目标坐标系下。

 

对于旋转矩阵的旋转向量以及欧拉角的关系与变换:

对于旋转矩阵与旋转向量:

上面介绍了通过旋转矩阵和平移矩阵描述两个坐标系间的变换,其实也相当于表示了6自由度的三维刚体运行。但是旋转矩阵有几个缺点:SO(3)的旋转矩阵有9个量,但一次旋转只有3个自由度。因此,这种表达式冗余。而且对于旋转矩阵自身也有约束,它必须是正交矩阵,且行列式为1,这些约束会使求解变得困难。一种更紧凑的方式是使用旋转xian向量描述。即对于坐标系的旋转,任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个向量,其方向与旋转轴yizh一致,而长度等于旋转角。这种向量称为旋转向量(或轴角,Axis-Angle)。这种表示法只需一个三维向量即可描述旋转。对于xuan旋转向量和旋转矩阵间的转换可以通过罗德里格斯公司(Rodrigues Formula)来计算。

对于旋转矩阵与欧拉角:

三维空间坐标系变换-旋转矩阵「建议收藏」

三维空间坐标系变换-旋转矩阵「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210027.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue3.0中关闭eslint(全部不检测)[通俗易懂]

    vue3.0中关闭eslint(全部不检测)[通俗易懂]前言:在项目中eslint检查是一个很棒的工具,但是在非正式场合,或者某些情况下,他会给我们带来很多不方便,这里分享下如何在新建项目后把他的eslint检查先关掉(正式项目不推荐关闭,因为良好的习惯是从每一行代码的规范开始)方法:打开我们的.eslintrc.js文件,把’@vue/standard’注释,然后把服务重启,重启,重启,重要的事情说三遍.eslintrc.jsmodule.exports={root:true,…

    2022年6月7日
    98
  • 比特币矿机哪种型号好_不考虑电费哪个矿机最好

    比特币矿机哪种型号好_不考虑电费哪个矿机最好矿机电源对于比特币矿机来说至关重要,毕竟挖矿中矿机稳定运行是非常重要的,而矿机电源就是保障比特币矿机稳定运行的重要法宝。现在矿机电源应用范围那么高,说明在技术,还有设备方面都完善了很多,而且完善之后的矿机,在做工跟加工方面都好很多,提高了很多,这是非常重要的一点,不管是在哪几个方面,在生产量方面也会越来越好,随着现在时代的不断的改变,矿机电源的应用会越来越精细化。因为比特币挖矿需要多显卡多芯片…

    2022年9月1日
    1
  • 学习BoundsChecker

    对C++程序不熟悉,但是因为工作需要,要对一些程序进行测试分析,找出是否有内存泄露情况。在网上找到了大家比较推崇的BoundsChecker,安装后开始看软件自带的手册,为了让更多的同事一起学习,要将全英文的手册翻译成中文,在这个学习过程中,也把成果不断贴出来大家分享吧!今天先贴手册的目录                                                Boun

    2022年4月10日
    42
  • 猫学习IOS(五岁以下儿童)UI之360其他下载管理器广场UI

    猫学习IOS(五岁以下儿童)UI之360其他下载管理器广场UI

    2022年1月14日
    56
  • 计算机浮点表示法 教案,计算机组成原理——浮点数表示方法(示例代码)

    计算机浮点表示法 教案,计算机组成原理——浮点数表示方法(示例代码)简介这篇文章主要介绍了计算机组成原理——浮点数表示方法(示例代码)以及相关的经验技巧,文章约568字,浏览量241,点赞数7,值得推荐!为了表示浮点数,数被分为两部分:整数部分和小数部分。例如,浮点数14.234就有整数部分14和小数部分0.234.首先把浮点数转换成二进制数,步骤如下:1把整数部分转换成二进制.2把小数部分转换成二进制.3在两部分之间加上小数点.浮点数还可以规范化,浮点数可以用单…

    2022年6月18日
    26
  • putty 报server unexpectedly closed network connection错误

    putty 报server unexpectedly closed network connection错误由于IP变了,再用putty访问组内的服务器时,竟然总是出错,报serverunexpectedlyclosednetworkconnection错误。查了下防火墙设置,原来里面指定了allow的IP端,真的是晕死了,改好,一试,果然OK了

    2022年10月20日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号