坐标系与旋转:地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数基础
各位同学,今天我们来聊聊飞控里最绕不开、也最容易出坑的一个话题——坐标系与旋转。
说实话,我刚开始做四旋翼那会儿,觉得坐标系这东西有啥好学的?不就是几个箭头嘛。结果第一次试飞,飞机在天上翻了个跟头,我在地面站看着姿态数据完全懵了——欧拉角突然跳变,控制量直接饱和。嗯,从那以后我才明白,坐标系搞不清楚,飞控代码写得再漂亮也是白搭。
这一节,我们就把地球坐标系、机体坐标系、欧拉角、旋转矩阵、四元数这五样东西彻底捋清楚。你想想看,飞机在天上飞,它得知道自己“朝哪”、“歪了多少”、“转得快不快”。这些信息,全靠坐标系和旋转来描述。
1. 地球坐标系:我们站在哪里看飞机?
地球坐标系,也叫导航坐标系或惯性坐标系(近似)。说白了,就是在地面上选一个固定点,然后定义三个轴:
- X轴:指向正北(或正东,看具体定义)
- Y轴:指向正东(或正北,与X轴垂直)
- Z轴:指向地心(即“向下”)
我习惯用 NED(北-东-地) 坐标系,也就是X北、Y东、Z地。为什么?因为飞控里加速度计测的是重力加速度,方向是向下的,正好和Z轴对齐,省去一个符号转换。
2. 机体坐标系:飞机自己怎么看自己?
机体坐标系固定在飞机上,随飞机一起运动。原点在飞机质心,三个轴:
- X轴:指向机头(前进方向)
- Y轴:指向机身右侧
- Z轴:指向机身下方(符合右手定则)
你想想看,飞机上的IMU(惯性测量单元)测到的角速度和加速度,都是在机体坐标系下的。而我们要控制飞机的位置和姿态,却需要在地球坐标系下描述。这就引出了一个问题——怎么把机体坐标系下的数据,转换到地球坐标系下?
答案就是:旋转。
3. 欧拉角:最直观的旋转描述
欧拉角,说白了就是用三个角度来描述飞机的姿态:
- 滚转角(Roll,φ):绕X轴旋转,飞机左右倾斜
- 俯仰角(Pitch,θ):绕Y轴旋转,飞机抬头低头
- 偏航角(Yaw,ψ):绕Z轴旋转,飞机左右转向
这三个角度的旋转顺序,我建议用 Z-Y-X(先偏航、再俯仰、最后滚转)。为什么?因为这种顺序下,偏航角对应的是机头指向,俯仰角对应的是抬头角度,物理意义最直观。
4. 旋转矩阵:数学上的“坐标系转换器”
旋转矩阵,就是把一个向量从一个坐标系旋转到另一个坐标系的数学工具。它是一个3x3的正交矩阵,行列式为1。
从机体坐标系到地球坐标系的旋转矩阵,可以用欧拉角表示:
R = Rz(ψ) * Ry(θ) * Rx(φ)
其中:
Rz(ψ) = [cosψ -sinψ 0; sinψ cosψ 0; 0 0 1]
Ry(θ) = [cosθ 0 sinθ; 0 1 0; -sinθ 0 cosθ]
Rx(φ) = [1 0 0; 0 cosφ -sinφ; 0 sinφ cosφ]
注意顺序:先绕Z轴转ψ,再绕Y轴转θ,最后绕X轴转φ。矩阵乘法是从右往左读的。
我个人的习惯是,在代码里把旋转矩阵写成函数,输入欧拉角,输出矩阵。这样调试的时候,可以单独验证每个轴的旋转是否正确。
5. 四元数:飞控里的“真香”选择
说实话,欧拉角和旋转矩阵都有硬伤。欧拉角有万向锁,旋转矩阵有9个参数(计算量大,还容易因为数值误差不再是正交矩阵)。所以,现代飞控里,姿态表示几乎都用 四元数。
四元数是一个超复数,形式为:
q = w + xi + yj + zk
其中:
w 是实部
x, y, z 是虚部
i² = j² = k² = ijk = -1
用四元数表示旋转,只需要4个参数,没有万向锁,而且插值平滑。我当年从欧拉角切换到四元数时,最大的感受就是——姿态解算再也不“抽风”了。
四元数和旋转矩阵可以互相转换。比如,从四元数到旋转矩阵:
R = [1-2(y²+z²) 2(xy-wz) 2(xz+wy);
2(xy+wz) 1-2(x²+z²) 2(yz-wx);
2(xz-wy) 2(yz+wx) 1-2(x²+y²)]
看着复杂,但代码实现起来就是几行乘法的事。
6. 知识体系总览
下面这张图,是我自己总结的坐标系与旋转的知识结构。你把它理清了,后面学动力学建模就顺了。
这张图把三个坐标系和三种旋转表示方法串在了一起。你从地球坐标系和机体坐标系出发,中间经过旋转表示,最后落到三种数学工具上。我个人建议你把它打印出来贴在工位上,写代码时瞄一眼,思路会清晰很多。
好了,坐标系与旋转的基础就讲到这里。这些东西看着简单,但实际用起来坑不少。我当年在无人机竞赛里,就因为坐标系搞反,飞机直接撞墙——嗯,那又是另一个故事了。
公众号:蓝海资料掘金营,微信deep3321