一、根据公式,自己编写函数
S表示旋转顺序,我习惯上将‘XYZ’定义为“先旋转X,再旋转Y,最后旋转Z”,所以最后的R=Rz*Ry*Rx(特别注意这里!不同的地方表示的含义不一样,有些工具(比如Matlab)里面'XYZ',表示的是“先旋转Z,再旋转Y,最后旋转X”,所以最后的R=Rx*Ry*Rz)
注意:区分角度的单位是度还是弧度!deg2rad()是Matlab自带的角度转弧度的函数!
二、Matlab自带的函数eul2rotm()
官方文档:https://ww2.mathworks.cn/help/robotics/ref/eul2rotm.html
特别注意红框里面的两处(之前想当然的认为Matlab里面的XYZ跟自己习惯的一样,然而并不是,英语好点的话也不会折腾这么久了......)
第一处:Matlab中S='XYZ'的意义是指“先旋转Z,再旋转Y,最后旋转X”;
第二处:调用函数的时候,参数1也就是eul(1*3的行向量)里面的三个数,顺序要跟S对应上,
S='XYZ'时,eul=[angleX angleY angleZ]
S='ZYX'时,eul=[angleZ angleY angleX]
......
三、关于Direction Cosine Matrix函数angle2dcm()
参考:https://en.wikiversity.org/wiki/PlanetPhysics/Direction_Cosine_Matrix
R_dcm=angle2dcm(angleZ, angleY ,angleX,'ZYX');
R_rotm=eul2rotm(eul,'ZYX');(其中eul=[angleZ angleY angleX])
运行结果:
可以发现:二者是一个逆(正交单位阵,转置=逆)的关系,因此,如果eul2rotm结果描述的旋转是A->B的旋转,那么angle2dcm结果描述的是B->A的旋转!注意这一点即可!
参考:
[1]https://blog..net/zzcoming/article/details/52065276
[2]https://blog..net/u012423865/article/details/78219787