【杂记四】刚体运动 +SE(3)

【杂记四】刚体运动 +SE(3)

一、基础知识

1. 什么是刚体

刚体(Rigid Body) 就是一个不会变形的物体。

举例:

一个木块、一只水瓶、一台手机,都可以近似看作刚体。

即使你用力搬动它,它内部形状和尺寸不会变化。

2. 三维空间中的刚体运动是什么?

刚体在三维空间中,运动有 两种基本形式:

平移运动(Translation)

整个物体沿着某个方向移动,但方向不变、不会转动。

💡 举例:

你把水杯从桌子左边滑到右边,杯子没转,只是“平移”

旋转运动(Rotation)

刚体围绕某个轴“旋转”,但中心可能不动。

💡 举例:

你拿着一支笔转圈圈(像旋转陀螺),这就是绕笔心的旋转

3.总结

三维空间中刚体运动 = 平移 + 旋转 的组合!

准确地知道一个刚体的位置和方向,就要描述它的:

位置坐标(平移)

姿态 / 朝向(旋转,通常用欧拉角、四元数、旋转矩阵)

这就是机器人、机械臂、无人机、VR 控制器等领域中最基本的物理模型!

二、旋转描述

1. 欧拉角(Euler Angles)

就是用 3 个角度值,分别表示:绕 X轴、Y轴、Z轴 的转动。

比如:先绕 X 轴转 30°,再绕 Y 轴转 45°,再绕 Z 轴转 90°

优点:

通俗、好理解(类似你“抬头-摇头-歪头”)

缺点:

有个严重问题叫 万向节锁(Gimbal Lock):两个轴重合,导致一个旋转自由度丢失(会卡住)

如何利用缺点:

当旋转一个角度90度,与另一个角度重合,则会减少一个选择自由度。可以运用,限制不需要的自由度。

2. 旋转矩阵(Rotation Matrix)

一个 3×3 的矩阵,可以用来把一个向量旋转到另一个方向。

实质上是通过线性代数实现旋转。

优点:

数学上非常严谨,适合做组合、多次旋转

可以直接用于变换坐标、绘图、仿真

缺点:

不直观、占内存大(9个数)

3. 四元数(Quaternion)

数学家发明的一个超越三维的数学结构

用 4 个数字(而不是 3 或 9 个)就可以稳定表示任意旋转

优点:

没有万向节锁!(解决了欧拉角的问题)

更节省计算资源(比矩阵小,比欧拉角稳定)

缺点:

不直观,你看不懂那 4 个数具体“转了多少度”

但对机器人/无人机/Unity游戏/AR VR 来说超级常用!

4. 旋转变换

你想把一个物体旋转:

绕 X 轴 90°

绕 Y 轴 0°

绕 Z 轴 0°

用欧拉角表示就是 [90, 0, 0](单位:度)

# 欧拉角 (degree) → 旋转矩阵

import numpy as np

from scipy.spatial.transform import Rotation as R

# 欧拉角 (degree) → 旋转矩阵

euler_angles = [90, 0, 0] # 绕XYZ轴的旋转

r = R.from_euler('xyz', euler_angles, degrees=True)

rotation_matrix = r.as_matrix()

print("Rotation Matrix:\n", rotation_matrix)

欧拉角 ↔ 四元数

四元数(Quaternion)用的是 4 个值:[w, x, y, z]

继续上面的例子:

# 欧拉角 → 四元数

quat = r.as_quat()

print("Quaternion [x, y, z, w]:", quat)

# 四元数 → 欧拉角

r2 = R.from_quat(quat)

euler_back = r2.as_euler('xyz', degrees=True)

print("Recovered Euler:", euler_back)

四元数 ↔ 旋转矩阵

# 四元数 → 旋转矩阵

rot_mat2 = R.from_quat(quat).as_matrix()

print("Rotation Matrix from Quaternion:\n", rot_mat2)

# 旋转矩阵 → 四元数

quat_back = R.from_matrix(rot_mat2).as_quat()

print("Recovered Quaternion:", quat_back)

应用场景

三、SE(3)

1. 定义

SE(3) 全称是:Special Euclidean group in 3D:三维空间中的特殊欧几里得群

本质是:

描述一个刚体在三维空间中的“位置 + 姿态(方向)”的标准数学工具

相关文章