学惯导的人都知道怎么根据欧拉角或者姿态角计算旋转矩阵,直接照着公式两分钟就写好了代码。但是或许你没有注意到MATLAB中 eul2rotm和 angle2dcm两个函数的定义完全不一样, 两个函数算出来的旋转矩阵互为转置。MATLAB本身并未将两个函数的定义写得很清楚,经过一番搜索,终于搞清楚了原因。
一、eul2rotm和angle2dcm函数区别
参考问题Difference between angle2dcm and eul2rotm (same angle sequence, different result)里的回答:
- eul2rotm函数来自于 “Robotics System Toolbox”,这个工具箱约定的旋转是矢量旋转或者点旋转(point rotation)
- angle2dcm函数来自于“Aerospace Toolbox”,这个工具箱约定的旋转是坐标系旋转(frame rotation)
二、矢量旋转和坐标系旋转的区别
参考MATLAB官方文档Orientation, Position, and Coordinate Convention中的解释,两种旋转区别如下:
- 矢量旋转或者点旋转(Point Rotation): 坐标系不动,但是点或者矢量进行旋转
- 坐标系旋转(Frame Rotation): 点或者矢量不动,坐标系进行旋转
输入同样的旋转角度,矢量旋转和坐标系旋转结果相反。如下图,经过矢量旋转,坐标变成(a,b,c),而坐标系旋转的结果是(-a,b,c)。
三、MATLAB代码验证
参照上图,设个差不多的坐标,然后绕z轴转 - 45°。注意这两个函数默认都是ZYX的旋转方式,第一个角度是绕Z轴转的角度,以此类推。
test=[0 1 1];
r1 = eul2rotm([-pi/4 0 0]);
r2 = angle2dcm(-pi/4, 0, 0);
r1*test'
r2*test'
第一个结果为[ 0.7071 0.7071 1.0000] 。
第二个结果为[ - 0.7071 0.7071 1.0000],第一个数为负值。
四、参考资料
[1] Difference between angle2dcm and eul2rotm (same angle sequence, different result)
[2] Orientation, Position, and Coordinate Convention