下面是我个人的理解;
首先需要明确几个关键点:
1.欧拉角的准确定义->涉及到定轴问题;
2.角速度和欧拉角速度是一个旋转向量;
3.运动的过程中存在三个坐标系,分别是惯性坐标系,体坐标系以及欧拉角坐标系(非官方解释,而是我的理解);
4.欧拉角是用来描述位置的,而不是描述运动过程。
欧拉角的定义
这里有三个关键的信息:三次,有序,独立;
三次:这里我们将运动分为三个状态,分别是初始状态,上一刻状态,当前状态,如果已知一个欧拉角,永远都是从初始状态开始旋转三次后得到当前状态,而不是从上一刻状态中开始旋转,比如,第一次三次旋转运动后位于状态1,第二次又换了一组欧拉角让你计算出最后的姿态,此刻不是从状态1的位置开始旋转三次,而是重新从初始状态开始按照新的那组欧拉角进行旋转三次后,获得到状态2,依此类推。
有序:指的是欧拉角三个角度按照一定顺序进行旋转,为什么要强调有序呢,因为按照不同顺序旋转时,最后的姿态是不一样的。
独立:任意一个改变一个角度,都不会影响到另外两个角度。
还有一个点,这里欧拉角的定义是进动角,章动角和自转角,这是经典的欧拉角定义,而大家平常了解的俯仰角,横滚角和偏航角也是欧拉角,那他们的区别在哪里呢,区别在于三次绕的旋转轴的定义不一样,我这里就以最熟悉的的欧拉角,即俯仰-横滚-偏航先来解释,而该组欧拉角的旋转轴顺序为z-y-x,后面我也会说明另外一组欧拉角,这样可以做比较好的对比。
可能有些解释大家还不理解,或者不知道我为什么要提出来,我们先做好瞄点,后面讲例子的时候慢慢解答,目前瞄点如下:
1.永远都是从初始状态开始旋转三次后得到当前状态;
2.三个角度按照一定顺序进行旋转;
3.任意一个改变一个角度,都不会影响到另外两个角度;
4.不同欧拉角名称定义区别在于旋转轴定义不一样;
一共4个瞄点。
角速度和欧拉角速度是一个旋转向量
说到三维向量,大部分人可以在坐标系中构建出一个箭头,但是旋转向量就没有普通向量那么直观,但是旋转向量在坐标系中也是一个箭头,但是长度指的是旋转值,而不是向量的大小。
到此我们再加一个瞄点:
1.永远都是从初始状态开始旋转三次后得到当前状态;
2.三个角度按照一定顺序进行旋转;
3.任意一个改变一个角度,都不会影响到另外两个角度;
4.不同欧拉角名称定义区别在于旋转轴定义不一样;
5.角速度和欧拉角速度是一个旋转向量;
一共5个瞄点。
开头我提到的第三四个关键点: 3.运动的过程中存在三个坐标系,分别是惯性坐标系,体坐标系以及欧拉角坐标系(非官方解释,而是我的理解);4.欧拉角是用来描述位置的,而不是描述运动过程。
我们也作为一个瞄点:
1.永远都是从初始状态开始旋转三次后得到当前状态;
2.三个角度按照一定顺序进行旋转;
3.任意一个改变一个角度,都不会影响到另外两个角度;
4.不同欧拉角名称定义区别在于旋转轴定义不一样;
5.角速度和欧拉角速度是一个旋转向量;
6.运动过程中存在三个坐标系,重点是欧拉角坐标系;
7.欧拉角是用来描述位置的,而不是描述运动过程。
一共7个瞄点。
那现在开始讲解为什么从陀螺仪获取的角速度不能直接积分后得到欧拉角
先说根本原因:一个重要的东西-欧拉角的定轴。
大家都知道,角速度就是体坐标系三轴分别旋转的角速度,积分后就是体坐标系旋转的角度。
欧拉角的旋转是这样的
假设欧拉角的偏航角-俯仰角-横滚角(20°,10°,30°)。
下面是一个飞机模型的初始姿态
这里有三个坐标系,三轴都是灰色的是惯性坐标系,红-绿-蓝轴为体坐标系的x-y-z轴,紫-浅蓝-橙轴为欧拉角坐标系的横滚轴-俯仰轴-偏航轴,这里我引入了欧拉角坐标系,现在三个坐标系是重合的。
按照我们前面说的z-y-x的顺序,所以肯定是先绕偏航轴旋转20°,再绕俯仰轴旋转10°,最后绕横滚轴旋转30°。
因此我们可以将一组欧拉角(20°,10°,30°)分成三个姿态,即三个欧拉角:
(20°,0°,0°)- 先绕偏航轴旋转20°
(20°,10°,0°)- 在上一个位置再绕俯仰轴旋转10°
(20°,10°,30°)- 在上一个位置再绕横滚轴旋转30°
为什么"在上一个位置再绕俯仰轴旋转10°"操作时我描述为(20°,10°,0°),而不是(0°,10°,0°),因为我在前面的第1和第7个瞄点中说过:1.永远都是从初始状态开始旋转三次后得到当前状态;7.欧拉角是用来描述位置的,而不是描述运动过程。
即真正的运动过程是:
(20°,0°,0°)= (0°,0°,0°)-> (20°,0°,0°);
(20°,10°,0°)= (0°,0°,0°)-> (20°,10°,0°);
(20°,10°,30°)= (0°,0°,0°)->(20°,10°,30°);
而不是:
(20°,0°,0°)= (0°,0°,0°)-> (20°,0°,0°);
(20°,10°,0°)= (0°,0°,0°)-> (20°,0°,0°) -> (20°,10°,0°);
(20°,10°,30°)= (0°,0°,0°)-> (20°,0°,0°) -> (20°,10°,0°)->(20°,10°, 30°);
不知道大家能不能理解我的意思。
这里的两个瞄点就是这个意思,那我们还剩下下面几个瞄点:
2.三个角度按照一定顺序进行旋转;
3.任意一个改变一个角度,都不会影响到另外两个角度;
4.不同欧拉角名称定义区别在于旋转轴定义不一样;
5.角速度和欧拉角速度是一个旋转向量;
6.运动过程中存在三个坐标系,重点是欧拉角坐标系;
一共5个瞄点。
接下来我们开始旋转,
1.假设现在欧拉角是(20°,0°,0°),即偏航为20°,其他的为0°,那飞机就是绕偏航轴旋转20°
此时如果按照z轴的角速度进行积分,那此时z轴旋转角度也是20°,到这里z轴角速度积分后的角度确实等于欧拉角中的偏航角,因为该运动中偏航轴和z轴是重合的,所以旋转后这里的体坐标系和欧拉角坐标系还是重合的。
2.现在第二个姿态
假设现在欧拉角是(20°,10°,0°),即偏航为20°,俯仰为10°,横滚为0°,那飞机就是绕偏航轴旋转20°后绕俯仰轴旋转10度。
此时如果按照y轴的角速度进行积分,那此时y轴旋转角度也是10°,和前面一样,到这里,角速度积分后角度(z,y,x)为(20°,10°,0°),和欧拉角一样,这也是因为旋转时偏航轴和俯仰轴重合。
3.现在第三个姿态
假设现在欧拉角是(20°,10°,30°),即偏航为20°,俯仰为10°,横滚为30°,那飞机就是绕偏航轴旋转20°后绕俯仰轴旋转10度最后绕横滚轴旋转30度。
现在已经到最后的姿态了,我们简单梳理一下角速度运动的过程,就会发现角速度直接积分后的角度是(20°,10°,30°),那不就和欧拉角(20°,10°,30°)一样吗?!
但是我们仔细观察会发现,第一次是绕偏航轴旋转20°,旋转前偏航轴和z轴是重合的,所以角速度积分就是偏航角,第二次是绕俯仰轴旋转10°,旋转前俯仰轴和y轴是重合的,所以角速度积分就是俯仰角,但是旋转后会发现,体坐标系的z轴,也就是蓝色箭头和欧拉坐标系的偏航轴即橙色箭头已经不重合了,只是后面我们没有对体坐标系的z轴进行旋转,所以没有改变z轴和角速度积分和偏航角,第三次是绕横滚轴旋转30°,旋转前x轴和横滚轴依旧是重合的,所以角速度积分等于横滚角,但是我们也会发现,前面体坐标系的z和y轴都改变位置了,但是发现欧拉角坐标系的偏航轴和俯仰轴没有改变。
那到这里大家可能会问,按照你这么说那岂不是角速度直接积分后就是欧拉角了吗,那不就和理论不一样吗。
先说结论:只是在特殊的情况类似我们刚刚举的例子下,角速度直接积分是等于欧拉角的;在大部分运动中,不能直接积分得到欧拉角。
再说根本原因:在刚举的例子中,因为每次旋转时,欧拉角坐标系的旋转轴和体坐标系的旋转轴是同一个轴,即体坐标系旋转多少,欧拉角就改变多少;但是实际运动中,不会每次旋转的轴都一样,下面举出例子。
1.实际物体旋转超过3次
现在我们使用角速度控制,而不是控制模型的最终欧拉角,现在是初始状态:
现在按照体坐标系中z旋转20°->y轴旋转10°->x轴旋转30°->z轴旋转15°的运动过程运动:
z轴旋转20°
可以看到,旋转前偏航轴和体坐标系的z轴是重合的,所以偏航角等于z轴旋转角度20°;
y轴旋转10°:
因为旋转前俯仰轴和y轴是重合的,所以俯仰角等于y轴旋转角度,现在请大家观察一下,可以发现蓝色的轴和橙色的轴已经不重合了(橙色为偏航轴,蓝色为体坐标系中的z轴),大家先记住这个点;
x轴旋转30°
同样的,旋转前横滚轴和x轴是重合的,所以横滚角确实等于x轴旋转角度,即30°,但是可以发现现在绿色轴和浅蓝色轴已经不重合了(绿色为体坐标系y轴,浅蓝色为俯仰轴);
z轴旋转15°
现在可以发现此刻的欧拉角是(33°,2.3°,31.4°),而不是角速度直接积分后的(10°+15°,20°,30°),那为什么第四次旋转后欧拉角就不直接等于角速度积分了,因为这次旋转前z轴和偏航轴已经不重合了。
2.三次旋转时与欧拉角定义的旋转顺序不一致
我们一直在强调欧拉角定义时的旋转顺序很重要,前面我们以(20°,10°,30°)来演示物体的旋转怎么得到最后的欧拉角,现在我们改变旋转顺序,即从z-y-x变成x-y-z,即体坐标系的旋转轴按照x-y-z的顺序分别旋转20°,10°,30°。
初始状态
x轴旋转20°
旋转前体坐标系和欧拉角坐标系重合,所以横滚角等于x轴旋转角度,但是现在绿色轴和浅蓝色轴不重合了(y轴和俯仰轴)
y轴旋转10°
所以第二次绕y轴旋转时,角速度积分就不是欧拉角了。
z轴旋转30°
可以看到因为旋转前z轴和偏航轴也不重合,所以角速度积分不等于欧拉角,并且一眼看出,好像不能通过简单的相加减由角速度算出欧拉角。
可以发现角速度积分和欧拉角不一样的根本原因是:不是每次旋转时体坐标系的旋转轴都和欧拉角的轴重合。
这里可能有人问了,前面三次旋转时就是一样的,为什么这里也是三次旋转就不一样。
先说根本原因:旋转轴和欧拉角的轴不重合;
而这里的三次旋转相比于前面的三次旋转它改变了旋转轴和欧拉角轴重合的特性,因为我们按照x-y-z的顺序旋转物体,而软件姿态解算时是按照z-y-x的顺序进行解算的。
那如果这里依旧是按照x-y-z的旋转顺序旋转物体,软件姿态解算时也按照x-y-z的顺序进行解算,那是不是就和前面的三次旋转一样,是的。
多轴同时旋转
我认为这个更好理解,多轴旋转时,旋转轴已经不是平时的三个坐标轴的某个轴了,而是三维空间中一个轴,而欧拉角依旧是按照一个先后顺序来描述姿态的,所以二者的旋转轴肯定不重合,那么角速度直接积分肯定不是欧拉角。
比如体坐标系按照(20°/s, 10°/s, 30°/s)的角速度同时运动一秒,那角速度积分后的角度应该是(20°,10°,30°),下面我们来看最终的欧拉角
可以看到欧拉角不是(20°,10°,30°),并且依旧找不到规律
瞄点
还记得剩下的瞄点吗
2.三个角度按照一定顺序进行旋转;
3.任意一个改变一个角度,都不会影响到另外两个角度;
4.不同欧拉角名称定义区别在于旋转轴定义不一样;
5.角速度和欧拉角速度是一个旋转向量;
6.运动过程中存在三个坐标系,重点是欧拉角坐标系;
一共5个瞄点。
经过刚刚的讲解,我们也可以解决第2个瞄点
第3个瞄点也很直观:
可以看到改变任意欧拉角其中一个或者两个角,都不会影响到其他的角。
这是因为每次改变角度,只是旋转对应的欧拉角轴,并且因为旋转过的轴会变成定轴,所以后面旋转的轴不会影响到前面的旋转。
第6个瞄点其实在刚刚的描述中已经很清晰了,我就不再废话了(欧拉角坐标系非官方定义,不喜勿喷)
那瞄点剩下
4.不同欧拉角名称定义区别在于旋转轴定义不一样;
5.角速度和欧拉角速度是一个旋转向量;
一共2个瞄点。
到这里大家应该明白了,角速度直接积分不等于欧拉角的根本原因是欧拉角的旋转轴和体坐标系旋转轴不重合,那为什么不重合,哪个环节导致他们不重合的呢。
这也是为了解释为什么欧拉角是独立的,而角速度积分不是相互独立的。
先给结论:因为欧拉角轴每次旋转后都会固定旋转轴
大家可以重新观察前面的例子,比如我们第一次的例子,
第一次旋转后,看起来好像没什么改变,实际上橙色的轴已经固定住了,也就是偏航轴固定了,只是因为蓝色的轴(z轴)没有移动位置,二者重合没看出来;
第二次旋转后就可以看出来了,橙色的轴被固定住了,没有随蓝色的轴移动,从这里开始,偏航轴就和z轴不重合了,所以这就导致后面如果绕z轴旋转了,因为不重合性,角速度积分就不等于欧拉角了。
因为欧拉角坐标系的定义就是这样的,旋转后的轴就被固定,未旋转的轴就会跟着前面的旋转而移动。
看到这里,其实大家就不必要继续问:为什么欧拉角的特性就是决定旋转后的轴就被固定。
因为这个问题没有意义,数学家可能也是无意组合后发现就是在这个固定的轨道下,欧拉角就可以描述姿态,而不是通过已知结论来反推为什么的.
讲到这里,我假设大家已经理解和接收为什么角速度积分为什么不等于欧拉角了,那就会引申出“通过角速度怎么计算出欧拉角”
由于篇幅已经过长,下一篇文章我将通过直观的办法,而非单纯数学公式来分享我的理解,并且看官还需要记住,我们还有3个瞄点未解决:
4.不同欧拉角名称定义区别在于旋转轴定义不一样;
5.角速度和欧拉角速度是一个旋转向量;
一共2个瞄点。
最后:运动过程的演示基于vofa软件中的cube控件,但是官方的cube控件没有这么多功能,这是我通过修改cube控件文件内部代码后添加的新功能,目的是教学演示,有需要的可以加qq群:1126181573 获取.qml文件。
下篇文章见。