RoMa完整指南:PyTorch 3D旋转工具箱,一站搞定四元数、旋转矩阵与欧拉角互转
【免费下载链接】romaRoMa: A lightweight library to deal with 3D rotations in PyTorch.项目地址: https://gitcode.com/gh_mirrors/roma1/roma
RoMa是一个轻量级的PyTorch 3D 旋转操作库(Rotation Manipulation),为机器学习与梯度优化提供可微分的 3D 旋转表示转换:四元数、旋转矩阵、旋转向量与欧拉角互转,还内置旋转空间度量、SLERP 球面插值、6D 旋转回归和刚体点云配准,让姿态估计、三维重建与机器人学任务一步到位。
🎯 什么是 RoMa:为什么需要它
在 3D 视觉、SLAM、机器人控制中,"一个物体怎么转"可以用多种数学形式描述:
- 旋转矩阵(rotmat):3×3 正交矩阵,直观但冗余;
- 单位四元数(unitquat):4 维向量,无万向锁,GPU 批量运算高效;
- 旋转向量(rotvec):3 维向量,"角度 × 轴",最紧凑;
- 欧拉角 / Tait-Bryan 角:人类可读,但存在万向锁。
RoMa 把这些表示之间的转换全部实现为可微分函数——也就是说,神经网络可以直接输出这些量并做反向传播,小角度等数值边界情况也经过专门处理,避免了学术代码里常见的 NaN 梯度问题。
🚀 快速安装:一条命令完成
最简单的方式是通过 pip 直接安装:
pip install roma如果想使用最新源码版本,可以克隆仓库后本地安装:
git clone https://gitcode.com/gh_mirrors/roma1/roma cd roma pip install .项目元信息见 pyproject.toml,源码采用 3-Clause BSD 许可证(见 LICENSE)。
安装后验证一下:python -m unittest即可运行完整的单元测试套件(位于test/目录)。
🧩 RoMa 支持的 4 种旋转表示
| 表示 | 张量形状 | 特点 |
|---|---|---|
| 旋转向量 rotvec | ...x3 | 最紧凑,轴角形式 |
| 单位四元数 unitquat | ...x4 | XYZW 约定,计算稳定 |
| 旋转矩阵 rotmat | ...x3x3 | 列向量约定(R @ x) |
| 欧拉角 euler | ...x3 | 支持任意旋转约定如"xyz" |
RoMa 的所有函数都支持任意数量的批次维度(batch dims)——无论你的数据形状是(3,)、(2,3)还是(B,H,W,3),同一套 API 都能直接批量处理,这在大规模训练中非常省心。
🔁 核心功能一:四种表示自由互转
RoMa 在 roma/mappings.py 和 roma/euler.py 中提供了完整的互转矩阵:
rotvec_to_unitquat/unitquat_to_rotvec:旋转向量 ↔ 四元数unitquat_to_rotmat/rotmat_to_unitquat:四元数 ↔ 旋转矩阵rotvec_to_rotmat/rotmat_to_rotvec:旋转向量 ↔ 旋转矩阵euler_to_unitquat/rotmat_to_euler:欧拉角与其余表示互转(支持degrees=True度数模式)quat_xyzw_to_wxyz:不同四元数分量约定的转换
典型流程示例(更多可参考 examples/snippets/rotvec_to_unitquat.py):
import torch, roma rotvec = torch.randn(2, 3, 3) q = roma.rotvec_to_unitquat(rotvec) # 转四元数 R = roma.unitquat_to_rotmat(q) # 转旋转矩阵 euler = roma.unitquat_to_euler("xyz", q, degrees=True) # 转欧拉角(度)📈 核心功能二:从任意输出回归合法旋转(Procrustes / 6D 表示)
做姿态回归时,网络输出往往不是合法旋转。RoMa 在 roma/mappings.py 中提供了三种"从欧氏空间到旋转空间"的可微映射:
| 函数 | 输入形状 | 说明 |
|---|---|---|
special_procrustes | ...x3x3 | 将任意 3×3 矩阵投影到最近旋转矩阵(推荐) |
special_gramschmidt | ...x3x2 | 6D 旋转表示转换(Zhou et al. 的流行方案) |
symmatrixvec_to_unitquat | ...x10 | 10 维对称矩阵向量 → 四元数对偶 |
# 把网络输出的任意 3x3 矩阵"修正"为合法旋转矩阵 R = roma.special_procrustes(torch.randn(4, 3, 3))procrustes还支持前向模式微分(torch.func.jvp/jacfwd/vmap),方便做高阶导数研究。相关数值精度讨论可见test/test_procrustes_derivatives.py。
📐 核心功能三:旋转空间度量与 SLERP 插值
roma/utils.py 内置了旋转空间的常用工具:
- 距离度量:
rotmat_geodesic_distance(测地距离,比朴素实现精度高得多,小角度下也不产生 NaN 梯度)、rotvec_geodesic_distance、unitquat_geodesic_distance、rotmat_cosine_angle; - 四元数运算:
quat_product、quat_conjugation、quat_normalize、quat_action(旋转作用到向量); - 组合与求逆:
rotmat_composition、rotvec_inverse等; - SLERP 球面插值:
unitquat_slerp、rotvec_slerp(最短路径)、rotmat_slerp,还有 GPU 加速版unitquat_slerp_fast; - 随机采样:
random_rotmat、random_unitquat、random_rotvec,便于数据增强与测试。
# 两个旋转向量之间按最短路径做 5 步球面插值 steps = torch.linspace(0, 1.0, 5) rotvecs = roma.rotvec_slerp(rotvec0, rotvec1, steps)完整示例见 examples/snippets/rotvec_slerp.py 与 examples/snippets/metrics.py。
🤖 核心功能四:刚体变换与点云配准
roma/transforms.py 提供了面向应用的变换类:
Rigid:旋转矩阵 + 平移向量的刚体变换,支持@组合、.inverse()求逆、.to_homogeneous()导出 4×4 齐次矩阵;RigidUnitQuat:用四元数参数化的版本,可直接与Rigid互转;Orthogonal/ScalingOrthogonal/Scale等中间变换类,按需组合。
配合 roma/utils.py 中的rigid_points_registration与rigid_vectors_registration,可以一键对齐两组点云(经典 ICP 预处理、Sim(3) 对齐):
# 用 Procrustes 对齐两组点 T, s = roma.rigid_vectors_registration(x, y, compute_scaling=True)示例参考 examples/snippets/rigid_registration.py 与 examples/snippets/transforms.py。
📂 项目结构速览
roma/ # 核心库源码 mappings.py # 表示互转 + Procrustes/6D 回归 euler.py # 欧拉角映射 utils.py # 度量、四元数运算、SLERP、配准 transforms.py # Rigid / RigidUnitQuat 等变换类 internal.py # 批量维度等内部工具 examples/ # 各功能的最小示例 snippets/ # 按主题拆分的代码片段 test/ # 单元测试(test_mappings.py、test_euler.py 等) docsource/ # Sphinx 文档源码官方 API 文档由 Sphinx 生成,构建脚本为 build_doc.sh;examples/下还有mapping_benchmark.py(转换效率基准)与geodesic_distance_comparison.py(距离实现精度对比)等进阶示例。
✅ 总结:RoMa 适合谁
- 🧠3D 视觉 / 姿态估计从业者:网络直接回归旋转,Procrustes 一步"洗"出合法旋转矩阵;
- 🤖机器人 / 控制工程师:四元数运算、变换组合求逆、点云配全都备齐;
- 🎓研究生与学习者:API 简洁、批次维度自由、数值处理严谨,是 PyTorch 生态里最省心的 3D 旋转工具箱。
一句话:装好 RoMa,四元数、旋转矩阵、旋转向量、欧拉角从此随便换,反向传播一路畅通。
【免费下载链接】romaRoMa: A lightweight library to deal with 3D rotations in PyTorch.项目地址: https://gitcode.com/gh_mirrors/roma1/roma
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考