
一个“+1”的升维,统一了刚体运动描述的全部规则
大家好,这里是【深蓝具身智能】。
本文出自我们公众号开设的新专栏——《具身智能基础》。
这是本栏目下的第五篇文章,补全具身智能L0级必备知识,来聊聊【齐次坐标与齐次变换】,全文近 6000 字,建议收藏阅读。
你的订阅和收藏,将支持我们把这件事持续做下去✨
具身智能的本质,是让AI智能体扎根三维物理世界,完成感知、定位、规划、控制的全闭环。
不管是自动驾驶车辆的行驶轨迹、人形机器人的肢体运动,还是无人机的空间姿态调控、机械臂的抓取作业,背后都在重复一件事:
三维空间刚体的坐标变换。
此前我们详细介绍了李群、李代数、四元数等刚体姿态表征工具,我们可以通过下图厘清几者之间的关系:

简单说:笛卡尔坐标是“原始描述”,齐次变换是“工程转换器”,李群李代数是“理论优化器”,四元数是“轻量化载体”。
没有齐次变换,后续所有刚体建模、轨迹规划、深度学习可微优化都无法落地。

为何刚体运动需要“升维思考”?
在三维笛卡尔坐标系中,我们描述空间点位置、刚体运动的公式非常直观,但这套体系存在一个致命硬伤,也是所有工程场景抛弃纯笛卡尔坐标的核心原因:
我们定义:三维空间任意点坐标为三维旋转矩阵为 (,属于SO(3)),平移向量为。
刚体完整运动(旋转+平移)的原始公式为:
这个公式看似简单,实则存在核心问题:运算不统一。
旋转是矩阵乘法,平移是向量加法,两种运算割裂,无法统一为矩阵运算。
这就导致:多次连续的刚体运动,无法直接通过矩阵连乘叠加,只能分步计算。

▲三维空间的刚体的三自由度移动和三自由度转动描述©【深蓝具身智能】编译
单次变换场景下,分步计算尚可使用,但在具身智能复杂任务中,该缺陷会被无限放大,直接导致工程失效,以下是几个典型场景:
-
机械臂多连杆运动:
机械臂存在数十个连杆与关节,每一级关节都要做一次旋转+平移变换。若分步计算,每一步都会引入计算误差,多级叠加后末端执行器偏差会达到厘米甚至分米级,无法完成精准抓取;
-
SLAM 实时建图与定位:
机器人每帧位姿都需要基于上一帧连续变换,分步运算会大幅增加计算耗时,无法满足实时定位的毫秒级要求,同时误差持续累积导致轨迹漂移;
-
自动驾驶轨迹迭代:
车辆需要不断更新车身位姿与规划轨迹,割裂的运算会拖慢决策速度,影响行车安全性;
-
神经网络端到端优化:
深度学习要求运算全程可微,“乘法+加法”混合形式会破坏梯度反向传播的连续性,无法用于仿真训练与模型优化。
普通笛卡尔坐标运算低效、误差累积、不支持可微计算,完全无法适配复杂连续的运动场景。
为了解决「旋转平移运算割裂、连续运动无法叠加」的核心痛点,引入了齐次坐标,通过升维的方式,统一所有刚体运动运算规则。

通俗解读+数学定义:什么是齐次坐标?
齐次坐标的核心逻辑非常简单:将n维空间的坐标,升维为n+1维坐标,用升维代价换取运算统一。
针对三维空间,就是将3维笛卡尔坐标,拓展为4维齐次坐标。

▲坐标变换©【深蓝具身智能】编译
空间位置点的齐次坐标(工程通用)
前面我们提到了,三维空间任意位置点笛卡尔坐标:
拓展为齐次坐标,默认补充最后一维分量 (行业通用规范,代表该物理量是空间位置点,具备平移属性):
方向向量的齐次坐标(关键区分)
空间方向向量无固定位置,平移操作不会改变向量朝向,因此方向向量的齐次坐标固定补充 :
三维方向向量对应齐次坐标:
齐次坐标归一化规则
齐次坐标具备比例等价特性,任意非零倍数的齐次坐标,可还原为同一个三维笛卡尔坐标。 若已知齐次坐标,归一化公式:
核心工程结论:具身智能、机器人、自动驾驶算法中,位置点固定 ,方向向量固定 ,严格区分两类物理量的变换特性。

核心推导:齐次变换矩阵(SE(3)标准形式)
我们的核心目标:将离散的「矩阵乘法+向量加法」刚体运动公式,改写为纯矩阵乘法形式,实现运动叠加。
齐次变换矩阵完整推导
原始刚体运动公式:
引入齐次坐标后,构造 4×4 方阵 ,使得变换满足:
代入齐次坐标展开可得:
其中 为三维零行向量。
按照矩阵乘法规则展开计算:
上层三维分量:
底层一维分量:
计算结果与原始刚体运动公式完全等价,由此推导出标准齐次变换矩阵:
这也是SE(3)三维特殊欧氏群的工程标准表达形式,是具身智能中位姿表征的核心载体。
基础拆分:纯旋转、纯平移齐次矩阵
齐次变换矩阵可拆解为两种基础变换,适配单一运动场景:
1. 纯旋转齐次矩阵(无平移)
仅改变物体姿态、不改变位置,对应SO(3)纯旋转运动。
2. 纯平移齐次矩阵(无旋转)
其中为3阶单位矩阵,仅改变物体位置、不改变姿态。
核心价值:连续运动矩阵叠加
假设刚体先后执行两次运动,对应变换矩阵为 、:
第一次变换:
第二次变换:
最终总变换可合并为单个矩阵:
无数次连续刚体运动,均可通过矩阵连乘统一叠加,彻底解决传统坐标分步计算的低效、误差问题。

齐次变换五大核心特性(工程必记)
-
运算统一性:彻底统一旋转、平移运算,所有刚体运动均为矩阵乘法,无加减混合运算;
-
运动可叠加性:多步连续变换可直接矩阵连乘,适配机器人多连杆、长轨迹运动场景;
-
物理区分性:位置点(ω=1)随变换旋转+平移,方向向量(ω=0)仅旋转不平移,完全贴合物理规律;
-
物理合法性:继承旋转矩阵正交约束,变换后物体无拉伸、扭曲,严格满足刚体特性;
-
理论兼容性:完美适配SE(3)李群、se(3)李代数体系,是高阶优化算法的底层载体。


具身智能全场景落地应用
齐次坐标与齐次变换不是纯理论公式,而是贯穿具身智能感知、定位、规划、控制、模型优化全链路的基础工具,所有三维刚体智能体的运行逻辑均基于此搭建。
针对每个具体的场景痛点,我们逐一拆解解决方案,并用简短代码展示核心逻辑。
机械臂运动学(正向/逆向)
机械臂拥有多根连杆与关节,每个关节都有独立局部坐标系。传统分步计算会累积巨大误差,无法实现末端精准抓取。

解决方案:
利用多级齐次变换矩阵连乘,从基座到末端执行器逐级做坐标变换,求解末端位姿(正向运动学);也可根据目标位姿反解关节角度(逆向运动学)。
import numpy as np# 构造齐次矩阵工具函数def make_T(R, t):return np.vstack([np.hstack([R, t[:, None]]), np.array([[0,0,0,1]])])# 关节变换矩阵T1 = make_T(R1, t1)T2 = make_T(R2, t2)# 总变换T_end = T2 @ T1# 齐次坐标列向量p_base = np.array([[x],[y],[z],[1]])p_end = T_end @ p_basexyz_end = p_end[:3, 0]
视觉感知与SLAM
相机、雷达、机器人本体分属不同坐标系,跨坐标系点云转换、位姿迭代计算繁琐,且SLAM后端需要可微运算用于梯度优化。

解决方案:
用4×4齐次矩阵表征相机外参、机器人位姿;SLAM中把SE(3)齐次矩阵映射为李代数做梯度优化,优化后再还原为齐次矩阵更新位姿。
import numpy as np# 示例:构造合法4×4相机外参SE(3)矩阵(替换为你实际标定的外参)R = np.eye(3) # 旋转矩阵示例(无旋转)t = np.array([1.2, 0.5, 3]) # 相机原点在世界的平移坐标# 拼接标准4×4齐次矩阵top = np.hstack([R, t.reshape(3,1)])bottom = np.array([[0,0,0,1]])SE3_matrix = np.vstack([top, bottom])# 1. 相机到世界变换矩阵T_cam2world = np.array(SE3_matrix)# 2. 相机坐标系下三维点:u=x, v=y, d=深度zu, v, d = 0.1, -0.2, 1.5# 标准4×1齐次列向量(推荐写法,避免维度bug)point_cam = np.array([[u],[v],[d],[1]])# 3. 坐标变换:相机点 → 世界坐标系齐次点point_world_homo = T_cam2world @ point_cam# 提取世界坐标系纯三维XYZ坐标(去掉齐次w分量)point_world_xyz = point_world_homo[:3, 0]print("世界坐标系下三维坐标 XYZ:", point_world_xyz)
▲相机坐标系 → 世界坐标系坐标转换代码
已知相机在世界空间的位姿(外参 4×4 矩阵),同时已知某个三维物体点距离相机的三维位置与深度,通过齐次矩阵乘法,算出这个点在整个场景统一世界坐标系下的坐标。
自动驾驶位姿迭代
车辆需要实时更新车身位姿、迭代行驶轨迹,分步运算会导致定位延迟、轨迹偏差,影响行车安全。

解决方案:
车身每一时刻位姿用齐次矩阵表示,融合IMU、里程计数据连续更新变换矩阵;轨迹由一串齐次矩阵序列构成。
import numpy as npdef build_se3(R: np.ndarray, t: np.ndarray) -> np.ndarray:"""构造标准4×4 SE(3)齐次变换矩阵"""top = np.hstack([R, t.reshape(3, 1)])bottom = np.array([[0, 0, 0, 1]])return np.vstack([top, bottom])# ========== 1. 初始化车身全局位姿(世界→车身) ==========# 初始旋转、初始世界坐标R_init = np.eye(3)t_init = np.array([10.0, 20.0, 0.0])SE3_matrix = build_se3(R_init, t_init)T_car = np.array(SE3_matrix)# ========== 2. 构造短时运动增量T_delta(旧车身→新车身) ==========# 增量:向前平移2m,微小左转R_delta = np.array([[0.996, -0.087, 0],[0.087, 0.996, 0],[0, 0, 1]])t_delta = np.array([2.0, 0, 0])delta_SE3_matrix = build_se3(R_delta, t_delta)T_delta = np.array(delta_SE3_matrix)# ========== 3. 位姿迭代更新 ==========# 变换顺序:先旧全局位姿,再叠加车身局部运动增量T_car = T_delta @ T_car# 提取更新后的车辆世界坐标与旋转car_pos_world = T_car[:3, 3]car_rot_world = T_car[:3, :3]print("更新后车辆世界XYZ坐标:", car_pos_world)print("更新后车身旋转矩阵:\n", car_rot_world)
▲里程计位姿更新逻辑
具身智能大模型端到端优化
SE(3)齐次矩阵存在正交约束,无法直接在深度学习中做无约束梯度下降优化。

解决方案:
将SE(3)齐次矩阵映射为无约束的 se(3) 李代数,在神经网络中优化动作增量;再通过指数映射还原为合法齐次矩阵,控制智能体执行动作。
import numpy as npfrom scipy.spatial.transform import Rotationdef SE3_to_se3(T: np.ndarray) -> np.ndarray:"""SE(3) 4×4矩阵 → se(3) 6维李代数向量 [ωx,ωy,ωz, vx,vy,vz]"""R = T[:3, :3]t = T[:3, 3]# 旋转矩阵转角轴ωomega = Rotation.from_matrix(R).as_rotvec()xi = np.hstack([omega, t])return xidef se3_to_SE3(xi: np.ndarray) -> np.ndarray:"""se(3) 6维向量 → SE(3) 4×4齐次矩阵"""omega = xi[:3]v = xi[3:]# 角轴转回旋转矩阵R = Rotation.from_rotvec(omega).as_matrix()# 拼接标准SE3矩阵top = np.hstack([R, v.reshape(3,1)])bottom = np.array([[0,0,0,1]])T = np.vstack([top, bottom])return T# 1. 初始车身SE3位姿矩阵(你前面里程计代码的T_car)T_pose = np.array([[1,0,0,2],[0,1,0,1],[0,0,1,0],[0,0,0,1]])# SE3 → se3se3_pose = SE3_to_se3(T_pose)# 2. 神经网络优化位姿(模拟网络输出修正后的李代数)# model = 训练好的深度网络# se3_new = model(se3_pose)# 模拟网络修正:平移x方向+0.5se3_new = se3_pose + np.array([0,0,0, 0.5,0,0])# 3. se3转回可计算的SE3矩阵T_new = se3_to_SE3(se3_new)print("优化后新的SE3位姿矩阵:\n", T_new)
▲深度学习位姿优化标准
链路总结:当前齐次位姿(SE(3)) → 线性优化(se(3)) → 生成新齐次位姿 → 物理执行。

一个“+1”的升维,统一了刚体运动描述的全部规则
回顾专栏此前的内容: 李群是理论规则, 李代数是优化工具,四元数是轻量化存储方案。
而本文的齐次坐标与齐次变换,则是这一切能够被写进代码的前提:
没有齐次变换矩阵,SE(3)上的微分运算便没有数值载体,流形上的梯度下降也无从落地。
齐次变换不是什么高深理论,它基础到几乎每一个位姿变量都长成 4×4 矩阵的模样。但恰恰是这种“基础性”,构成了具身智能空间计算不可动摇的工程底座。
在具身智能的语境下,智能体在物理世界中的每一次感知、每一次决策、每一次动作,都对应着一个齐次变换矩阵的连续作用。
至此,本专栏关于三维刚体运动描述的底层数学框架已搭建完成。下一篇我们继续强化学习的内容梳理~
完整学习机器人学中的数学基础知识➡️深蓝学院《机器人学基础》课程
同系统专栏,推荐阅读:
编辑|小小怪博士
审编|具身君
扫码添加阿蓝,选择想要加入的交流群即可
(按照提交顺序邀请,请尽早选择)
👇
