参考:一文搞懂旋转矩阵,豆包,详解 欧拉角与四元数
目录
一、旋转矩阵简述
旋转矩阵是用于描述向量或坐标系在欧氏空间中旋转变换的正交矩阵
核心性质
- 正交性:旋转矩阵的转置等于其逆矩阵,即RT=R−1;
- 保长性:向量经旋转矩阵变换后,长度保持不变;
- 行列式为 1:区别于镜像变换(行列式为 -1),确保变换仅为旋转而非翻转。
坐标系中公式推导:
符合右手定则的坐标系:
所谓“符合右手定则”,是指手四根手指由X转向Y时,大拇指方向与Z轴正方向一致。

1.绕单轴旋转
对于绕X轴旋转,其旋转平面为ZOY平面,如下图所示,其旋转方向为由Y轴向Z轴旋转的方向
即为从x正方向看过去的逆时针方向

转为极坐标系求旋转矩阵:
同理,绕y轴旋转:

绕z轴旋转:

综上:坐标系内一物体(向量坐标)绕单一坐标轴旋转的变换矩阵为
2.绕任意轴旋转(罗德里格斯公式)
旋转矩阵的构建依赖转轴(如绕 X/Y/Z 轴的旋转矩阵结构不同,绕任意轴需用罗德里格斯公式且需转轴单位向量)。
罗德里格斯公式(Rodrigues' Rotation Formula)是 三维空间中绕任意轴旋转的通用数学工具,核心作用是:给定旋转轴、旋转角度和原始向量 / 坐标系,直接计算旋转后的向量或对应的旋转矩阵,无需依赖复杂的多轴旋转矩阵叠加。它完美弥补了 “仅绕 X/Y/Z 轴旋转” 的局限性。
罗德里格斯公式的本质是 “将绕任意轴的旋转分解为三个简单变换的叠加”

罗德里格斯公式有两种核心形式:直接计算旋转后向量(适合快速求解单个向量)和 生成旋转矩阵(适合批量向量旋转、坐标系变换)。
1. 基础前提(必满足!)
- 旋转轴:需用 单位向量 u=(ux,uy,uz)T(长度 = 1,若原始轴未归一化,需先通过 u=w/∥w∥ 归一化,∥w∥ 是原始轴的模长);
- 旋转角度 θ:遵循右手定则(四指沿旋转方向,拇指指向旋转轴 u,逆时针为正角度),数学 / 编程中默认单位为 弧度;
- 向量维度:仅适用于 三维向量(二维旋转无需此公式,直接用平面旋转矩阵)。
形式 1:直接计算旋转后向量(无矩阵,适合单向量)
已知原始向量 v、旋转轴单位向量 u、旋转角度 θ,旋转后向量 v′ 为:
形式 2:生成旋转矩阵(适合批量旋转、坐标系变换)
matlab可视化代码
%% 第一步:罗德里格斯公式计算(保留原始逻辑,数学上兼容ENU坐标系)
% 已知条件(ENU坐标系下的定义)
v = [1; 0; 0]; % 原始向量:沿X轴=东向(ENU的东)
w = [1; 1; 1]; % 原始旋转轴:东北天方向(ENU下的斜向)
theta = deg2rad(60); % 旋转角度(60°转换为弧度,右手定则:四指旋转,拇指指旋转轴方向)
theta_deg = 60; % 用于标注的角度(度)
% 步骤1:归一化旋转轴
u = w / norm(w); % norm(w)计算模长,归一化得到单位向量u
disp(u);
% 步骤2:构建辅助矩阵
I = eye(3); % 3阶单位矩阵
uuT = u * u'; % 外积矩阵(对称)
ux = [0, -u(3), u(2); % 反对称矩阵(数学上与坐标系无关,仅描述旋转)
u(3), 0, -u(1);
-u(2), u(1), 0];
% 步骤3:合成旋转矩阵
R = cos(theta)*I + (1 - cos(theta))*uuT + sin(theta)*ux;
% 步骤4:计算旋转后向量(ENU坐标系下的旋转结果)
v_prime = R * v;
% 输出数值结果(标注ENU坐标系语义)
disp('东北天(ENU)坐标系下的旋转矩阵 R:'); disp(round(R, 4));
disp('东北天(ENU)坐标系下旋转后向量 v''(东、北、天):'); disp(round(v_prime, 4));
%% 第二步:ENU坐标系可视化(核心修改:轴标签+视角+语义标注)
figure('Position', [200, 200, 800, 600]); % 图形窗口大小
hold on; % 保持绘图,后续叠加元素
% 1. 绘制旋转轴(ENU下:东北天方向,绿色虚线)
axis_len = 2; % 旋转轴显示长度(可调整)
quiver3(0, 0, 0, u(1)*axis_len, u(2)*axis_len, u(3)*axis_len, ...
'Color', [0, 0.7, 0], 'LineStyle', '--', 'LineWidth', 1.2, 'MaxHeadSize', 0.1);
% 标注旋转轴(明确ENU语义)
text(u(1)*axis_len + 0.1, u(2)*axis_len + 0.1, u(3)*axis_len + 0.1, ...
['旋转轴:东北天方向'], 'Color', [0, 0.7, 0], 'FontSize', 10);
% 2. 绘制原始向量v(ENU下:东向,红色实线)
quiver3(0, 0, 0, v(1), v(2), v(3), ...
'Color', [1, 0, 0], 'LineWidth', 1.5, 'MaxHeadSize', 0.15);
% 标注原始向量(明确ENU东向)
text(v(1) + 0.1, v(2) + 0.1, v(3) + 0.1, ...
'原始向量:东向(ENU-X)', 'Color', [1, 0, 0], 'FontSize', 10);
% 3. 绘制旋转后向量v'(ENU下:旋转后的东-北-天分量)
quiver3(0, 0, 0, v_prime(1), v_prime(2), v_prime(3), ...
'Color', [0, 0.4, 0.8], 'LineWidth', 1.5, 'MaxHeadSize', 0.15);
% 标注旋转后向量(显示ENU分量)
v_prime_str = sprintf('旋转后向量:东=%.4f, 北=%.4f, 天=%.4f', v_prime(1), v_prime(2), v_prime(3));
text(v_prime(1) + 0.1, v_prime(2) + 0.1, v_prime(3) + 0.1, ...
v_prime_str, 'Color', [0, 0.4, 0.8], 'FontSize', 9); % 字号略小,避免遮挡
% 4. 标注旋转角度+坐标系说明(中心位置)
text(0.5, 0.5, 0.8, ['东北天(ENU)坐标系'], 'FontSize', 12, 'FontWeight', 'bold', 'Color', [0.5, 0, 0.5]);
text(0.5, 0.5, 0.6, ['旋转角度:', num2str(theta_deg), '°'], ...
'FontSize', 11, 'FontWeight', 'bold', 'Color', [0.8, 0, 0]);
% 5. 优化ENU坐标系显示(关键:轴标签+视角+比例)
xlabel('东(E)', 'FontSize', 11); % ENU-X轴=东
ylabel('北(N)', 'FontSize', 11); % ENU-Y轴=北
zlabel('天(U)', 'FontSize', 11); % ENU-Z轴=天
title('罗德里格斯公式:东北天(ENU)坐标系三维向量旋转可视化', 'FontSize', 12);
grid on; % 显示三维网格
axis equal; % 轴比例一致,避免变形
view(30, 60); % ENU专用视角:方位角30°(从东向北看),仰角60°(突出天轴向上)
legend('旋转轴(东北天)', '原始向量(东向)', '旋转后向量', 'Location', 'northoutside');
hold off;
运行结果

问题:60度是绕什么轴旋转?
绕归一化之后的旋转轴

问题:构建的辅助矩阵有何实际含义
外积矩阵和反对称矩阵分别对应旋转的 “平行分量保留” 和 “垂直分量旋转” 功能
外积矩阵uuT:矩阵是对称的,对角线元素是各分量的平方,非对角线元素是交叉乘积。

反对称矩阵[u]×:主对角线元素全为 0,非对角线元素互为相反数。满足反对称性,矩阵的转置等于负的矩阵。

问题:旋转矩阵的构建和直接给出旋转后的向量有何不同?
构建了旋转矩阵R,对于任意给出的向量v,只需要利用旋转矩阵右乘向量:Rv,得到新的矩阵,复用性高
二、内旋与外旋
内旋和外旋的核心区别在于旋转所依托的坐标系不同:内旋(又称体旋)依托随旋转对象同步运动的自身坐标系(随动系) ,外旋(又称空旋)依托固定不动的世界坐标系(惯性系) ,二者的公式差异集中在旋转矩阵的相乘顺序和坐标系关联逻辑上
以重力加速度g为例:坐标系为东北天
g=(0,0,-9.8)
旋转操作:绕x轴转90度,再绕y轴转90度
初始姿态下二者坐标相同,均为东北天坐标系
计算基础旋转矩阵:
计算旋转之后的向量公式为
V1 = R' V' ,即为用总的旋转矩阵的转置左乘向量
所以只需要得到R'即可
1.外旋(固定世界坐标系-绕固定坐标系旋转)
- 定义:每次旋转均绕固定坐标系的原始轴进行,旋转轴方向始终不变。
坐标系绕自身轴旋转(矢量不动,坐标系动),等价于矢量绕原坐标系反向旋转
进行变换,绕x轴转90度,再绕y轴转90度,得到的值是
| 初始状态 |
初始坐标重合 |
| 绕x轴转90度 |
绕世界坐标系的x轴旋转90度 |
| 绕y轴转90度 |
再绕世界坐标系的y轴转90度,可以看到现在的姿态为地北东 g值为[9.8,0,0] |
计算单个旋转矩阵:
总外旋矩阵:Router=Ry(90∘)⋅Rx(90∘)= Rx(90∘)'⋅Ry(90∘)'
旋转后矢量:gouter=Router'⋅g' = [Ry(90∘)⋅Rx(90∘)]'⋅g' = Rx(90∘)'⋅Ry(90∘)'⋅g'
2.内旋(随动坐标系-绕自身坐标系旋转)
- 定义:首次旋转绕自身坐标系与固定坐标系重合的轴,后续旋转均绕前一次旋转后更新的自身坐标系轴进行,旋转轴随对象运动而改变。
矢量自身绕固定坐标系(东北天) 的轴旋转(坐标系不动,矢量动)
进行变换,绕x轴转90度,再绕y轴转90度,得到的
| 初始状态 | ![]() |
| 绕x轴转90度 |
因为初始坐标重合,所以这里内旋外旋都一样 |
| 绕y轴转90度 |
第一步旋转之后y轴与z轴重合,这里是绕自身的y轴旋转,也就是在世界坐标中的z轴 g值为[0,-9.8,0] |
总内旋矩阵:Rinner=Rx(90∘)⋅Ry(90∘)
旋转后矢量:ginner=Rinner'⋅g' = [Rx(90∘)⋅Ry(90∘)]' ⋅g' = Ry(90∘)'⋅Rx(90∘)' ⋅ g'
3.多次旋转
按顺序执行的旋转操作:第 1 步 = R1,第 2 步 = R2,第 3 步 = R3,第 4 步 = R4(以此类推)
| 内旋 | 外旋 |
| 构建总内旋矩阵: Rinner(n)=R1⋅R2⋅...⋅Rn-1⋅Rn | 构建总外旋矩阵: Router(n)=Rn⋅Rn−1⋅...⋅R2⋅R1 |
| V = Rinner(n)' ⋅ V' | V = Router(n)' ⋅ V' |
| V = Rn'⋅...⋅R2'⋅R1' ⋅ V' | V = R1'⋅R2'⋅...Rn' ⋅ V' |
每一步旋转矩阵Rk为固定坐标系下的内旋矩阵(绕 x/y/z 轴的标准旋转矩阵)
注意:内旋为逐步左乘旋转矩阵,相当于每一步都换了一个旋转坐标系,外旋则为所有旋转矩阵可叠加,因为这些旋转发生在同一个世界坐标系
三、欧拉角和四元数
1.欧拉角(Eulerangle)
欧拉角是 3 个连续的旋转角度,通过 “绕不同坐标轴的三次旋转” 唯一确定刚体的姿态。
- 横滚角:roll(绕X轴旋转);
- 俯仰角:pitch(绕Y轴旋转);
- 偏航角(航向角):yaw(绕Z轴旋转)。
从正方向看进去逆时针旋转角度为正。

旋转矩阵表示为:
R = Rz(α)Ry(β)Rx(γ)


缺点:
- 欧拉角是不可传递的,旋转的顺序影响旋转的结果,不同的应用又可能使用不同的旋转顺序,旋转顺序无法统一
- 3个旋转的角度可以不受限制,即可以是10000度,也可以是-1500度;
- 可能造成万向节死锁(Gimbal Lock)
对于动态欧拉角,即绕物体坐标系旋转。(静态不存在万向锁的问题)无论roll和yaw为多少度,只要pitch为±90°(即绕第二个轴的旋转),就会出现万向锁现象。
需要限制旋转角度范围来避免万向节死锁
2.四元数(Quaternion)
对于一个物体的旋转,其实我们只需要知道四个值:一个旋转的向量 + 一个旋转的角度。而四元数也正是这样的设计:其中x,y,z 代表的是向量的三维坐标,w代表的是角度;同时我们也可以写成以下的形式方便我们计算和分析:
q=(x,y,z,w)
四元数本质上是一个超复数,q = xi + yj + zk + w , i^2 = j^ 2 = k^2 = -1;
要旋转一个三维向量 v=(vx,vy,vz),步骤如下:
- 将向量 v转换为「纯四元数」v=0+vxi+vyj+vzk(实部为 0);
- 计算旋转四元数 q 的「共轭四元数」q∗=w−xi−yj−zk(单位四元数的逆等于共轭);
- 旋转后的纯四元数:v′=q⋅v⋅q∗(四元数乘法);
- 从 v′ 中提取虚部,即为旋转后的向量 v
- v′=(vx′,vy′,vz′)。
缺点:
- 四元数的数字表示不直观。
- 单个四元数不能表示在任何方向上超过180度的旋转。
3.相互转换

















3900

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



