补全具身智能L0级必备知识:齐次坐标与齐次变换

640.gif

一个“+1”的升维,统一了刚体运动描述的全部规则

大家好,这里是【深蓝具身智能】。

本文出自我们公众号开设的新专栏——《具身智能基础》

这是本栏目下的第五篇文章,补全具身智能L0级必备知识,来聊聊【齐次坐标与齐次变换】,全文近 6000 字,建议收藏阅读。


💙订阅《具身智能基础》专栏

你的订阅和收藏,将支持我们把这件事持续做下去

具身智能的本质,是让AI智能体扎根三维物理世界,完成感知、定位、规划、控制的全闭环。

不管是自动驾驶车辆的行驶轨迹、人形机器人的肢体运动,还是无人机的空间姿态调控、机械臂的抓取作业,背后都在重复一件事:

三维空间刚体的坐标变换

可能大家这里会有产生疑问了:描述三维空间点与刚体运动,直接使用普通三维笛卡尔坐标即可,为什么机器人、自动驾驶、具身智能领域的工程代码与学术研究几乎清一色全部使用齐次坐标与齐次变换?

此前我们详细介绍了李群、李代数、四元数等刚体姿态表征工具,我们可以通过下图厘清几者之间的关系:

640.webp

简单说:笛卡尔坐标是“原始描述”,齐次变换是“工程转换器”,李群李代数是“理论优化器”,四元数是“轻量化载体”。

没有齐次变换,后续所有刚体建模、轨迹规划、深度学习可微优化都无法落地

这正是这次分享想要回答的核心。
坐标定义、数学推导、工程特性与全场景落地(代码实现方向)四个维度,补全具身智能体空间运动建模的L0级必备知识——齐次坐标与齐次变换。

01.webp

为何刚体运动需要“升维思考”?

在三维笛卡尔坐标系中,我们描述空间点位置、刚体运动的公式非常直观,但这套体系存在一个致命硬伤,也是所有工程场景抛弃纯笛卡尔坐标的核心原因:

我们定义:三维空间任意点坐标为三维旋转矩阵为 ,属于SO(3)),平移向量为

:三维欧式空间里任意一个空间点的笛卡尔坐标向量

刚体完整运动(旋转+平移)的原始公式为:

这个公式看似简单,实则存在核心问题:运算不统一

旋转是矩阵乘法,平移是向量加法,两种运算割裂,无法统一为矩阵运算。

这就导致:多次连续的刚体运动,无法直接通过矩阵连乘叠加,只能分步计算

640 (1).webp

三维空间的刚体的三自由度移动和三自由度转动描述©【深蓝具身智能】编译

单次变换场景下,分步计算尚可使用,但在具身智能复杂任务中,该缺陷会被无限放大,直接导致工程失效,以下是几个典型场景

  • 机械臂多连杆运动

机械臂存在数十个连杆与关节,每一级关节都要做一次旋转+平移变换。若分步计算,每一步都会引入计算误差,多级叠加后末端执行器偏差会达到厘米甚至分米级,无法完成精准抓取;

  • SLAM 实时建图与定位

机器人每帧位姿都需要基于上一帧连续变换,分步运算会大幅增加计算耗时,无法满足实时定位的毫秒级要求,同时误差持续累积导致轨迹漂移;

  • 自动驾驶轨迹迭代

车辆需要不断更新车身位姿与规划轨迹,割裂的运算会拖慢决策速度,影响行车安全性;

  • 神经网络端到端优化

深度学习要求运算全程可微,“乘法+加法”混合形式会破坏梯度反向传播的连续性,无法用于仿真训练与模型优化。

普通笛卡尔坐标运算低效、误差累积、不支持可微计算,完全无法适配复杂连续的运动场景。

为了解决「旋转平移运算割裂、连续运动无法叠加」的核心痛点,引入了齐次坐标,通过升维的方式,统一所有刚体运动运算规则。

02.webp

通俗解读+数学定义:什么是齐次坐标?

齐次坐标的核心逻辑非常简单:将n维空间的坐标,升维为n+1维坐标,用升维代价换取运算统一

针对三维空间,就是将3维笛卡尔坐标,拓展为4维齐次坐标。

640 (2).webp

坐标变换©【深蓝具身智能】编译

空间位置点的齐次坐标(工程通用)

前面我们提到了,三维空间任意位置点笛卡尔坐标:


拓展为齐次坐标,默认补充最后一维分量 (行业通用规范,代表该物理量是空间位置点,具备平移属性):

图片

 方向向量的齐次坐标(关键区分)

空间方向向量无固定位置,平移操作不会改变向量朝向,因此方向向量的齐次坐标固定补充 

三维方向向量对应齐次坐标:

齐次坐标归一化规则

齐次坐标具备比例等价特性,任意非零倍数的齐次坐标,可还原为同一个三维笛卡尔坐标。 若已知齐次坐标,归一化公式:


核心工程结论:具身智能、机器人、自动驾驶算法中,位置点固定 ,方向向量固定 ,严格区分两类物理量的变换特性。

03.webp

核心推导:齐次变换矩阵(SE(3)标准形式)

我们的核心目标:将离散的「矩阵乘法+向量加法」刚体运动公式,改写为纯矩阵乘法形式,实现运动叠加。

齐次变换矩阵完整推导

原始刚体运动公式:

引入齐次坐标后,构造 4×4 方阵 ,使得变换满足:

代入齐次坐标展开可得:

其中  为三维零行向量。

按照矩阵乘法规则展开计算:

上层三维分量:

底层一维分量:

计算结果与原始刚体运动公式完全等价,由此推导出标准齐次变换矩阵

这也是SE(3)三维特殊欧氏群的工程标准表达形式,是具身智能中位姿表征的核心载体。

基础拆分:纯旋转、纯平移齐次矩阵

齐次变换矩阵可拆解为两种基础变换,适配单一运动场景:

1. 纯旋转齐次矩阵(无平移)

仅改变物体姿态、不改变位置,对应SO(3)纯旋转运动。

2. 纯平移齐次矩阵(无旋转)

其中为3阶单位矩阵,仅改变物体位置、不改变姿态。

核心价值:连续运动矩阵叠加

假设刚体先后执行两次运动,对应变换矩阵为 

第一次变换:

第二次变换:

最终总变换可合并为单个矩阵:

无数次连续刚体运动,均可通过矩阵连乘统一叠加,彻底解决传统坐标分步计算的低效、误差问题。

04.webp

齐次变换五大核心特性(工程必记)

  1. 运算统一性:彻底统一旋转、平移运算,所有刚体运动均为矩阵乘法,无加减混合运算;

  2. 运动可叠加性:多步连续变换可直接矩阵连乘,适配机器人多连杆、长轨迹运动场景;

  3. 物理区分性:位置点(ω=1)随变换旋转+平移,方向向量(ω=0)仅旋转不平移,完全贴合物理规律;

  4. 物理合法性:继承旋转矩阵正交约束,变换后物体无拉伸、扭曲,严格满足刚体特性;

  5. 理论兼容性:完美适配SE(3)李群、se(3)李代数体系,是高阶优化算法的底层载体。

640 (3).webp

05.webp

具身智能全场景落地应用

齐次坐标与齐次变换不是纯理论公式,而是贯穿具身智能感知、定位、规划、控制、模型优化全链路的基础工具,所有三维刚体智能体的运行逻辑均基于此搭建。

针对每个具体的场景痛点,我们逐一拆解解决方案,并用简短代码展示核心逻辑。

机械臂运动学(正向/逆向)

机械臂拥有多根连杆与关节,每个关节都有独立局部坐标系。传统分步计算会累积巨大误差,无法实现末端精准抓取。

640 (4).webp

解决方案:

利用多级齐次变换矩阵连乘,从基座到末端执行器逐级做坐标变换,求解末端位姿(正向运动学);也可根据目标位姿反解关节角度(逆向运动学)。

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[:30]
二自由度机械臂坐标转换
先用旋转、平移参数构造两个关节的 4×4 齐次变换矩阵,矩阵相乘得到基座到末端的总变换;
再输入基座下的空间点,通过总矩阵一步算出该点在机械臂末端的三维坐标。
全程只用矩阵乘法统一旋转 + 平移运算。

视觉感知与SLAM

相机、雷达、机器人本体分属不同坐标系,跨坐标系点云转换、位姿迭代计算繁琐,且SLAM后端需要可微运算用于梯度优化。

640 (5).webp

解决方案:

用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 矩阵),同时已知某个三维物体点距离相机的三维位置与深度,通过齐次矩阵乘法,算出这个点在整个场景统一世界坐标系下的坐标。

自动驾驶位姿迭代

车辆需要实时更新车身位姿、迭代行驶轨迹,分步运算会导致定位延迟、轨迹偏差,影响行车安全。

640 (6).webp

解决方案:

车身每一时刻位姿用齐次矩阵表示,融合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(31)])    bottom = np.array([[0001]])    return np.vstack([top, bottom])# ========== 1. 初始化车身全局位姿(世界→车身) ==========# 初始旋转、初始世界坐标R_init = np.eye(3)t_init = np.array([10.020.00.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.0870],                    [0.0870.9960],                    [0,     0,      1]])t_delta = np.array([2.000])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[:33]car_rot_world = T_car[:3, :3]print("更新后车辆世界XYZ坐标:", car_pos_world)print("更新后车身旋转矩阵:\n", car_rot_world)

里程计位姿更新逻辑

保存车辆当前在全局世界坐标系下的 4×4 位姿矩阵;通过传感器算出一帧内车辆自身的微小相对运动增量;矩阵左乘增量,迭代更新车辆全局位置与姿态,实现实时定位。

具身智能大模型端到端优化

SE(3)齐次矩阵存在正交约束,无法直接在深度学习中做无约束梯度下降优化。

640 (7).webp

决方案:

将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[:33]    # 旋转矩阵转角轴ω    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,00.5,0,0])# 3. se3转回可计算的SE3矩阵T_new = se3_to_SE3(se3_new)print("优化后新的SE3位姿矩阵:\n", T_new)

▲深度学习位姿优化标准

链路总结:当前齐次位姿(SE(3)) → 线性优化(se(3)) → 生成新齐次位姿 → 物理执行

06.webp

一个“+1”的升维,统一了刚体运动描述的全部规则

回顾专栏此前的内容: 李群是理论规则 李代数是优化工具,四元数是轻量化存储方案

而本文的齐次坐标与齐次变换,则是这一切能够被写进代码的前提

没有齐次变换矩阵,SE(3)上的微分运算便没有数值载体,流形上的梯度下降也无从落地。

齐次变换不是什么高深理论,它基础到几乎每一个位姿变量都长成 4×4 矩阵的模样。但恰恰是这种“基础性”,构成了具身智能空间计算不可动摇的工程底座。

在具身智能的语境下,智能体在物理世界中的每一次感知、每一次决策、每一次动作,都对应着一个齐次变换矩阵的连续作用。

至此,本专栏关于三维刚体运动描述的底层数学框架已搭建完成。下一篇我们继续强化学习的内容梳理~

完整学习机器人学中的数学基础知识➡️深蓝学院《机器人学基础》课程

同系统专栏,推荐阅读:

编辑|小小怪博士

审编|具身君

【深蓝学院】技术交流群

 

💪致力于帮助各位朋友「打破隐形的墙」,共建一个更自由、更有深度、更有价值的交流生态社区!在各大企业工作的,可以相互内推,互通有无;在学校读研读博的,可以交流想法,携手合作。

扫码添加阿蓝,选择想要加入的交流群即可

(按照提交顺序邀请,请尽早选择)

👇

image.png