读完几个loam算法,满篇的坐标轴旋转,还是手写的(作者,用eigen写不好嘛。。。),我滴天适应了好久…,今天就总结一下坐标轴旋转问题。
一、首先,我们看一下ros中关于欧拉角旋转的函数:setRPY、setEuler、setEulerZYX(1、3等价)
ros中的欧拉角可以分为绕定轴(外旋方式)和绕动轴(内旋方式)的变换方式,函数没有给出Euler时,是按定轴转动,矩阵依次左乘。若函数的名字中有Euler,则表示为绕动轴转动的方式,矩阵依次右乘。
1.setRPY()
这个函数采用固定轴的旋转方式,先绕定轴x旋转(横滚),然后再绕定轴y (俯仰),最后绕定轴z(偏航)。从数学形式上说,这是绕定轴XYZ矩阵依次左乘.即:R=R(z)R(y)R(x)的顺序。由于是绕着定轴转动,所以很直观,便于人机交互。
2.setEuler()
这种方式是绕着动轴转动,先绕Y轴,在绕变换后的X轴,再绕变换后的Z轴旋转。从数学形式上说,这是绕定轴YXZ矩阵依次右乘.即:R= R(y)R(x)R(z)的顺序。
3.setEulerZYX()
与2相同,此种旋转变换也是绕动轴旋转,只不过次序为ZYX,矩阵也是右乘,即R = R(z)R(y)R(x)。我们发现,这里的R与1中的R的最终结果相同,所以1和3的定义最终是等价的。
总结:“外定左,内动右” 。
二、再看,我们定义一个坐标系如下
欧拉角对于旋转方向的定义:该轴的正向往逆向看去,逆时针方向即为正方向(右手定则)。绕某个轴的单次旋转矩阵:按照机器人前(x)-左(y)-上(z)的坐标系定义,并令横滚角为roll、俯仰角为pitch、航向角为yaw,假设旋转矩阵是按照z-y-x的顺序旋转得来,那么旋转矩阵可以表示为:
,其中theta=roll.
,其中theta=pitch.
,其中theta=yaw.
旋转矩阵的记法:
(还是不理解可以去b站,搜索一个中国台湾的老师讲解的课程,相当清晰!·)
三、ros的tf监听、发布及显示
tf_tree树中的箭头表示父子坐标系,上面为父坐标系,下面为子坐标系,显示的是坐标系变换之间的关系;
rviz界面显示的是坐标变换的关系;(左侧添加tf插件:层次也是与tf_tree一致)。
ros的监听/发布接口解释:
==》: a系到b系的坐标系变换;等价==》b在a下的坐标及姿态描述;
a系到b系的坐标系变换;等价==》b系到a系的坐标变换,so
a系到b系的坐标变换;等价==》a在b下的坐标及姿态描述。
------------------------------------------------------------可爱的分割线
这篇写完(这篇草稿已经是去年10月份左右了,拖着拖着还是觉得写完吧),对激光slam的工作可能会放一段落了,研究生进程过一大半了要准备投简历找工作咯!不知道以后还有没有接触SLAM的机会。祝大家在SLAM道路上一帆风顺!