1. 从“转魔方”到“开飞机”:理解欧拉角的两种视角
大家好,我是老张,在机器人导航和三维仿真领域摸爬滚打了十几年。今天想和大家聊聊一个让很多初学者头疼,但又极其重要的概念:动态欧拉角和静态欧拉角。我刚开始接触时也懵,网上资料要么太学术,要么一笔带过,看完总觉得隔靴搔痒。后来在项目里踩了无数坑,才真正搞明白。今天我就用最“人话”的方式,结合我踩过的坑和实际项目经验,帮你彻底理清这两者的区别、联系和应用场景。
想象一下你手里有个魔方。第一种玩法,你始终盯着桌面(一个固定的参考系),每次旋转都明确告诉自己:“现在我要让魔方绕桌子的‘前-后’轴转90度”。这里的“桌子的轴”就是固定不动的,你所有的旋转指令都基于这个不变的“世界”。这就是静态欧拉角的思维方式,也叫外旋。它的核心是:旋转轴是固定于外部世界的,不随物体自身转动而改变。比如在地图导航里,我们描述一辆车“先向东偏北30度行驶,再爬坡10度”,这里的“东”和“北”就是地球上的固定方向,不会因为车头朝哪儿而改变。
第二种玩法,你把自己想象成魔方内部的一个小精灵。你发出的指令是:“先绕我自己的‘上-下’轴转90度,再绕我新的‘左-右’轴转90度”。你会发现,第二次旋转的“左-右”轴,已经随着第一次旋转而改变了方向。这就是动态欧拉角的思维方式,也叫内旋。它的核心是:旋转轴是固定在运动物体自身的,会随着物体的旋转而一起转动。这就像开飞机时,飞行员说“先向右滚转30度,再拉杆抬头15度”,这里的“右”和“上”是相对于飞机机身而言的,飞机一滚转,“上”的方向就变了。
这两种描述方式,最终都能让魔方或飞机到达同一个姿态,但思考和执行的路径完全不同。理解这个差异,是你玩转机器人、无人机、三维游戏引擎的基石。很多人在学习时感到混乱,往往是因为没分清自己正在使用哪一种“视角”来看待旋转。
2. 庖丁解牛:静态欧拉角(外旋)的数学本质与实战
2.1 理论拆解:像搭积木一样构建旋转
静态欧拉角,顾名思义,它的旋转轴是静态的、全局的。我们通常用一个固定的世界坐标系(比如东北天坐标系)作为参考。假设我们约定旋转顺序是Z-Y-X(即先绕Z轴转,再绕Y轴,最后绕X轴),对应的三个角度分别是偏航角(Yaw)、俯仰角(Pitch)、翻滚角(Roll)。
它的数学过程非常直观,就像搭积木,从右往左一块块拼起来。假设一个点P在世界坐标系中的初始坐标是 [x, y, z]。我们要计算它经过三次静态旋转后的新坐标。
第一步:绕世界坐标系的Z轴旋转 γ(偏航角) 这个旋转只改变点的x和y坐标,z坐标不变。旋转矩阵 R_z(γ) 长这样:
import numpy as np
def rotate_z(gamma):
return np.array([
[np.cos(gamma), -np.sin(gamma), 0],
[np.sin(gamma), np.cos(gamma), 0],
[0, 0, 1]
])
旋转后,点的坐标变为 P1 = R_z(γ) * P。
第二步:绕世界坐标系的Y轴旋转 β(俯仰角) 注意,这里依然是绕原始的、固定的世界Y轴旋转,而不是上一步旋转后的新Y轴。旋转矩阵 R_y(β) 如下:
def rotate_y(beta):
return np.array([
[np.cos(beta), 0, np.sin(beta)],
[0, 1, 0],
[-np.sin(beta), 0, np.cos(beta)]
])
此时,点的坐标变


1011

被折叠的 条评论
为什么被折叠?



