当前位置: 首页 > article >正文

【杂记四】刚体运动 +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三维空间中的特殊欧几里得群

本质是:

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


http://www.kler.cn/a/601037.html

相关文章:

  • Linux 安装 Redis
  • 【AI】NLP
  • 生活电子常识——浏览器解决DNS劫持,避免自动跳转非法网站
  • 2025.3.25总结
  • SPPAS安装及问题汇总
  • StarRocks数据导出到Hive
  • Pear Admin Flask 开发问题
  • 深入理解现代C++在IT行业中的核心地位与应用实践
  • 【Linux网络-多路转接select】
  • PhotoShop学习02
  • 【蓝桥杯】每日练习 Day11 逆序对问题和多路归并
  • VMware 安装 mac os系统
  • vue项目中播放ws(Websocket协议)视频流
  • PHP开发:小区物业管理缴费小程序uniapp在线报修系统、活动报名、在线商城
  • Kotlin中 StateFlow 或 SharedFlow 的区别
  • 微信小程序开发:页面结构与样式设计
  • 如何在 Java 中查找 PDF 页面大小(教程)
  • 【C++初阶】--- 类与对象(中)
  • 蓝桥杯C++基础算法-多重背包(优化)
  • 字节跳动前端开发实习生面试总结