欧拉角与RPY与旋转矩阵的测试

指定欧拉角,是指按照指定的顺序,按照右乘的方式构建旋转矩阵。

验证一:指定旋转矩阵,得到欧拉角,按照轴角的方式重新构建矩阵:

///---------------------------//Eigen::Matrix3d rot_cl;rot_cl<<-0.00382504437037171  ,   0.190218909453634	,0.981734248929839,\-0.999948197804418,	 0.00853270673893375,	-0.00554929035141790,\-0.00943243040057437   ,  -0.981704619222084	,0.190176417714608;rot_cl.transposeInPlace();//上面是matlab出来的列为先输出的矩阵std::cout<<"rot_cl=\n"<<rot_cl<<std::endl;Eigen::Vector3d eulerAngle_lidar_to_camera_1=rot_cl.eulerAngles(2,1,0);std::cout<<"eulerAngle_lidar_to_camera_1 :"<<eulerAngle_lidar_to_camera_1[0]<<","<<eulerAngle_lidar_to_camera_1[1]<<","<<eulerAngle_lidar_to_camera_1[2]<<std::endl;Eigen::Matrix3d chk_mat = (AngleAxisd(eulerAngle_lidar_to_camera_1[0], Vector3d::UnitZ())* AngleAxisd(eulerAngle_lidar_to_camera_1[1], Vector3d::UnitY())* AngleAxisd(eulerAngle_lidar_to_camera_1[2], Vector3d::UnitX())).toRotationMatrix(); //compare rotation construct by euler anglesstd::cout<<"chk_mat=\n"<<chk_mat<<std::endl<<"diff=\n"<<(chk_mat-rot_cl)<<std::endl;

输出:

rot_cl=
-0.00382504   -0.999948 -0.009432430.190219  0.00853271   -0.9817050.981734 -0.00554929    0.190176
eulerAngle_lidar_to_camera_1 :1.5909,-1.37937,-0.0291714
chk_mat=
-0.00382504   -0.999948 -0.009432430.190219  0.00853271   -0.9817050.981734 -0.00554929    0.190176
diff=
-7.84962e-17  2.22045e-16 -2.94903e-176.66134e-16  2.75821e-16 -2.22045e-16
-2.22045e-16 -3.46945e-17 -8.32667e-17
x_lidar_in_cam=-0.00382504    0.190219    0.981734
y_lidar_in_cam=  -0.999948  0.00853271 -0.00554929
z_lidar_in_cam=-0.00943243   -0.981705    0.190176

以上是测试的lidar和camera的旋转矩阵。
camera的坐标系是右下前,lidar是前左上。
直接看旋转矩阵,可以知道,lidar的x大约为camera的z,lidar的y大约为camera坐标系的-x,lidar的z大约为camera坐标系的-y。

得到的欧拉角:1.5909,-1.37937,-0.0291714,根据获取时候用的rot_cl.eulerAngles(2,1,0);表示先获取Z轴的转角,再Y,再X,那么按照得到的角度,先绕Z轴旋转大概90度(逆时针),再按转动后的Y轴旋转大约-90(顺时针),再按转动后的X旋转约0度,就可以从camera的“右下前”得到lidar的坐标系“前左上”。

在这里插入图片描述
验证二:指定旋转矩阵,得到欧拉角,按照rotzrotyrotx重新构建矩阵:

//指定euler构造rotationyaw= 1.5909 ;//rotate around zpitch= -1.3794 ;//rotate around yroll=  -0.0292;//rotate around xEigen::Matrix3d rot_z;rot_z<<cos(yaw),-sin(yaw),0,\sin(yaw),cos(yaw),0,\0,0,1;Eigen::Matrix3d rot_y;rot_y<<cos(pitch),0,sin(pitch),\0,1,0,\-sin(pitch),0,cos(pitch);Eigen::Matrix3d rot_x;rot_x<<1,0,0,\0,cos(roll),-sin(roll),\0,sin(roll),cos(roll);Eigen::Matrix3d res_zyx=rot_z*rot_y*rot_x;std::cout<<"res_zyx=\n"<<res_zyx<<std::endl;//重新获取rotationEigen::Vector3d ang2=res_zyx.eulerAngles(2,1,0);std::cout<<"ang2 = "<<ang2.transpose()<<std::endl;

输出:

res_zyx=
-0.00382406   -0.999948 -0.009463120.190191  0.00856318    -0.981710.98174 -0.00555392    0.190149
ang2 =  1.5909 -1.3794 -0.0292

同上。

验证三:用另一张顺序获取euler angle

 ///-------------换一个顺序- x->y->z --------------//Eigen::Vector3d angle_xyz=res_zyx.eulerAngles(0,1,2);std::cout<<"angle_xyz="<<angle_xyz.transpose()<<std::endl;roll=angle_xyz[0];pitch=angle_xyz[1];yaw=angle_xyz[2];Eigen::Matrix3d rot_z2;rot_z2<<cos(yaw),-sin(yaw),0,\sin(yaw),cos(yaw),0,\0,0,1;Eigen::Matrix3d rot_y2;rot_y2<<cos(pitch),0,sin(pitch),\0,1,0,\-sin(pitch),0,cos(pitch);Eigen::Matrix3d rot_x2;rot_x2<<1,0,0,\0,cos(roll),-sin(roll),\0,sin(roll),cos(roll);Eigen::Matrix3d res_xyz=rot_x2*rot_y2*rot_z2;std::cout<<"res_xyz=\n"<<res_xyz<<std::endl;

输出:

angle_xyz=    1.37947 -0.00946326     1.57462
res_xyz=
-0.00382406   -0.999948 -0.009463120.190191  0.00856318    -0.981710.98174 -0.00555392    0.190149

可以看到,得到的旋转矩阵是一样的。

验证三:rpy

//测试rpy,旋转矩阵->四元数->rpyEigen::Quaterniond quater(res_xyz);Rot3 gtsam_rot(quater);gtsam::Vector3 gtsam_rpy=gtsam_rot.rpy();std::cout<<"gtsam_rpy ("<<gtsam_rpy[0]<<","<<gtsam_rpy[1]<<","<<gtsam_rpy[2]<<std::endl;

输出:

gtsam_rpy (-0.0292,-1.3794,1.5909

可以看到,与上面的欧拉角是反过来的。
这个含义是绕固定轴x\y\z(camera坐标系)旋转多少度后,可以到达lidar的坐标系。
绕x旋转-0.0292(roll),再绕固定轴y轴旋转-1.3794(pitch),再绕固定轴z轴旋转1.5909(yaw)
在乘法上是:
rot_zrot_yrot_x (rot_z <- rot_y <- rot_x)
即将后续的姿态变换放在左边。
rot(1.5909)rot(-1.3794)rot(-0.0292)
在数值上,与上面的用欧拉角,右乘的数值是一样的。上面欧拉角右乘是:
先绕z旋转,再绕y旋转,再绕x旋转,且后续旋转放在右边:
rot_z
rot_y
rot_x (rot_z -> rot_y -> rot_x)

在坐标上旋转也是可以直观看到的:
在这里插入图片描述

这里的rpy对应的roll(-0.0292)、pitch(-1.3794)、yaw(1.5909),与上面的得到对应zyx对应的角度: 1.5909(绕z轴) -1.3794(绕y轴) -0.0292(绕x轴)是一样的含义。

所以,如果我们说,经过RPY旋转(定轴,外旋)可以到达另一个坐标系,等价于经过绕动轴ZYX旋转(内旋)到达另一个坐标系。
所以,ZYX欧拉角旋转组合就与我们常说RPY旋转是对应的。

总结

给定一个旋转矩阵,代表了某种变换,可以有很多种不同的旋转组合得到这个变换,这个就是那12种欧拉角旋转方式。
There are six possibilities of choosing the rotation axes for proper Euler angles. In all of them, the first and third rotation axes are the same. The six possible sequences are:

z1-x′-z2″ (intrinsic rotations) or z2-x-z1 (extrinsic rotations)
x1-y′-x2″ (intrinsic rotations) or x2-y-x1 (extrinsic rotations)
y1-z′-y2″ (intrinsic rotations) or y2-z-y1 (extrinsic rotations)
z1-y′-z2″ (intrinsic rotations) or z2-y-z1 (extrinsic rotations)
x1-z′-x2″ (intrinsic rotations) or x2-z-x1 (extrinsic rotations)
y1-x′-y2″ (intrinsic rotations) or y2-x-y1 (extrinsic rotations)

There are six possibilities of choosing the rotation axes for Tait–Bryan angles. The six possible sequences are:

x-y′-z″ (intrinsic rotations) or z-y-x (extrinsic rotations)
y-z′-x″ (intrinsic rotations) or x-z-y (extrinsic rotations)
z-x′-y″ (intrinsic rotations) or y-x-z (extrinsic rotations)
x-z′-y″ (intrinsic rotations) or y-z-x (extrinsic rotations)
z-y′-x″ (intrinsic rotations) or x-y-z (extrinsic rotations): the intrinsic rotations are known as: yaw, pitch and roll
y-x′-z″ (intrinsic rotations) or z-x-y (extrinsic rotations)

以一种方式组合方式构建的旋转矩阵,可以以另一种不同顺序的方式得到不同欧拉角。但只要对应顺序去乘,就能得到一致的旋转矩阵。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1549684.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Gimbal Lock欧拉角死锁问题

技术背景 在前面几篇跟SETTLE约束算法相关的文章(1, 2, 3)中&#xff0c;都涉及到了大量的向量旋转的问题--通过一个旋转矩阵&#xff0c;给定三个空间上的欧拉角\(\alpha, \beta, \gamma\)&#xff0c;将指定的向量绕对应轴进行旋转操作。而本文主要就阐述这些旋转操作中&…

四元数与欧拉角之间的转换

在3D图形学中&#xff0c;最常用的旋转表示方法便是四元数和欧拉角&#xff0c;比起矩阵来具有节省存储空间和方便插值的优点。本文主要归纳了两种表达方式的转换&#xff0c;计算公式采用3D笛卡尔坐标系&#xff1a; 图1 3D Cartesian coordinate System (from wikipedia) 定义…

欧拉角、旋转矩阵及四元数

欧拉角、旋转矩阵及四元数 1. 简介2. 欧拉角2.1 欧拉角定义2.2 右手系和左手系2.3 转换流程 3. 旋转矩阵4. 四元数4.1 四元数与欧拉角和旋转矩阵之间等效变换4.2 测试Matlab代码 5. 总结 1. 简介 常用姿态参数表达方式包括方向余弦矩阵、欧拉轴/角参数、欧拉角、四元数以及罗德…

欧拉角物理含义

欧拉角定义 欧拉角与方向余弦矩阵以一对应 方向余弦矩阵与欧拉角存在一一对应关系。当已知欧拉角&#xff0c;规定了每次旋转的轴&#xff08;XYZ&#xff09;和每次旋转的角度&#xff0c;就可以得到方向余弦矩阵。 想想方向余弦矩阵是如何得到的&#xff1f;通过三个二维方向…

欧拉角表示的旋转相乘计算

在Eigen中用欧拉角表示旋转时&#xff0c;单次旋转多个角度和多次旋转单个角度的结果是不同的。具体试验如下&#xff1a; 在VS2017中用Eigen分别初始化两个欧拉角旋转&#xff1a; 第一个&#xff1a;欧拉角旋转为&#xff08;M_PI / 2, 0, M_PI / 4&#xff09; Eigen::Ve…

动态欧拉角与静态欧拉角的区别

看了网上好多的讲解,讲的都不是特别清晰,让人有一种很懵懵的感觉,感觉懂了,又貌似没懂的奇怪感觉,读了那么多的水文,大多都是内容差不多,好多文章之中错误百出,都是稍微提了一点,没有详细对比二者的区别,很难让人从心里真正明白其中含义.由于项目需要,这里对于动态欧拉角和静态…

旋转矩阵、欧拉角

旋转矩阵、欧拉角 注&#xff1a;下面为学习空间机器人技术系列课程笔记&#xff0c;加上一些自己的整理&#xff0c;方便复习。 一、旋转矩阵的引出 下面坐标系0的基向量为 ( x 0 &#xff0c; y 0 ) (x_{0}&#xff0c;y_{0}) (x0​&#xff0c;y0​)&#xff0c;坐标系1的基…

对于双欧拉角(正反欧拉角)的一些理解和思考

文章目录 一、正反欧拉角定义二、相关文献阐述三、对正反欧拉角的思考四、参考代码五、参考文献 最近看到有人讨论“双欧拉角”或者“正反欧拉角”的问题&#xff0c;因为自己之前没听说过这个概念&#xff0c;为了避免无知&#xff0c;因此找了一些文献进行学习和理解。不过基…

matlab 欧拉角 方向余弦,旋转矩阵、欧拉角之间转换

学习过程中涉及欧拉角和旋转矩阵的转换,索性整理学习一下欧拉角四元数和旋转矩阵的概念以及matlab中的互相转换 本文摘自各大课本,博客,自己学习整理使用,侵删 MATLAB矩阵乘法从左到右依次相乘 用R表示旋转矩阵。 yaw(偏航) pitch(俯仰) roll(横滚)分别表示Z Y X轴的转…

欧拉角旋转

欧拉角是一种表示三维旋转的描述方法&#xff0c;欧拉角的计算需要借助旋转矩阵&#xff0c;关于旋转矩阵的知识可先参考之前的文章&#xff1a;3维旋转矩阵推导与助记 欧拉角旋转 静态定义 对于在三维空间里的一个参考系&#xff0c;任何坐标系的取向&#xff0c;都可以用三…

欧拉角的理解

1 欧拉角概念 百度百科&#xff1a;欧拉角&#xff0c;用来确定定点转动刚体位置的3个一组独立角参量&#xff0c;欧拉角由章动角θ、旋进角&#xff08;即进动角&#xff09;ψ和自转角Φ组成。欧拉角为欧拉首先提出而得名。维基百科&#xff1a;Euler angles&#xff0c;莱昂…

四元数转欧拉角

四元数转欧拉角_在线测试工具 在线测试C程序工具 #include <stdio.h> #include <cmath>//四元数 struct Quaternion {double w, x, y, z; };//欧拉角 struct EulerAngles {double roll, pitch, yaw; };EulerAngles ToEulerAngles(Quaternion q) {EulerAngles angl…

详解 欧拉角与四元数

一、欧拉角 1.1 静态的定义 对于在三维空间里的一个参考系&#xff0c;任何坐标系的取向&#xff0c;都可以用三个欧拉角来表现。参考系又称为实验室参考系&#xff0c;是静止不动的。而坐标系则固定于刚体&#xff0c;随着刚体的旋转而旋转。 如图所示。设定xyz-轴为参考系…

四元数与欧拉角的转换

前言 一般情况下&#xff0c;每个领域都有自己默认是欧拉角定义。经典力学使用zxz&#xff0c;航空航天使用zyx/zxy。本文以无人机为对象讲解&#xff0c;使用zyx/zxy旋转顺序。为什么不同专业选用的欧拉角不同呢&#xff1f;一个是传统&#xff0c;另一重要的原因是不同的转序…

欧拉角转换四元数

欧拉角绕轴有x、y、z三个轴&#xff0c;旋转有不同的顺序。确定了不同的欧拉角矩阵。 针对绕轴的不同&#xff0c;欧拉角转换为四元数也不同。 绕x轴旋转 ϕ \phi ϕ角 四元数为 [ ( s i n ϕ 2 , 0 , 0 ) , c o s ( ϕ 2 ) ] T [(sin\frac{\phi}{2},0,0),cos(\frac{\phi}{…

欧拉角

欧拉角&#xff08;Euler Angles&#xff09;用来描述坐标轴的旋转。 坐标轴 原始坐标轴记为 x − y − z x-y-z x−y−z&#xff0c;旋转后坐标轴记为 X − Y − Z X-Y-Z X−Y−Z&#xff0c;坐标轴原点记为 O O O。 N ⃗ \vec{N} N 轴为 X Y XY XY与 x y xy xy两平面的交线&…

欧拉角及相关概念

欧拉角定义 欧拉角表示的是刚体的姿态变换。空间中的任意一点都可以用该点到对应坐标轴的垂直距离组成的三维向量描述&#xff0c;同理对某个物体的姿态&#xff0c;也可以用三个角度表示&#xff0c;三个角度分别为围绕对应坐标轴&#xff08;x,y,z&#xff09;旋转的…

欧拉角的概念理解和欧拉角旋转矩阵推导

欧拉角用来计算空间中刚体的旋转位置&#xff0c;目的是改变刚体的朝向. 具体来说,空间中有一个点p和一根轴k&#xff0c;点p绕轴k旋转θ角度到p,求p的坐标.这就是欧拉角要解决的问题. 只不过,欧拉角将1个点绕1根轴旋转1个角"转化为"1个点绕3个轴连续旋转3个角&quo…

欧拉角(Euler angles)

前言&#xff1a;本人也就英语4级水平&#xff0c;由于本篇中存在大量学术词汇&#xff0c;翻译时必然会有不当之处&#xff0c;原文可以在下面的链接中找到&#xff0c;具体意义各位可以自行斟酌 标红的部分是已发现存疑的翻译&#xff0c;也请各位指正。 维基百科-欧拉角 欧…

欧拉角(易理解)

欧拉角是什么 欧拉角是用来 唯一的 确定定点转动刚体位置的 三个一组的 独立角参量。 由章动量θ、旋进角&#xff08;即进动角&#xff09;ψ和自转角φ组成&#xff0c;为欧拉首先提出而得名。 通俗来讲的话有&#xff1a; eg&#xff1a;你去问路得到了两种回答 1 往东经…