Physically Embodied Gaussian Splatting: A Visually Learnt and Physically Grounded 3D Representation for Robotics

文章概括

引用:

@inproceedings{abou2024physically,
  title={Physically embodied gaussian splatting: A visually learnt and physically grounded 3d representation for robotics},
  author={Abou-Chakra, Jad and Rana, Krishan and Dayoub, Feras and Suenderhauf, Niko},
  booktitle={8th Annual Conference on Robot Learning},
  year={2024}
}
Abou-Chakra, J., Rana, K., Dayoub, F. and Suenderhauf, N., 2024. Physically embodied gaussian splatting: A visually learnt and physically grounded 3d representation for robotics. In 8th Annual Conference on Robot Learning.

主页:
原文:
代码、数据和视频:

系列文章:
请在 《 《 文章 》 》 专栏中查找



宇宙声明!


引用解析部分属于自我理解补充,如有错误可以评论讨论然后改正!



ABSTRACT

为了使机器人能够稳健地理解并与物理世界交互,拥有一种综合性的表示方式是极其有益的——该表示方式同时建模几何结构、物理规律以及视觉观测,并为感知、规划和控制算法提供信息支持。 我们提出了一种新颖的双重“Gaussian-Particle(高斯–粒子)”表示来建模物理世界,该表示方式同时能够
(i)对未来状态进行预测性仿真,以及
(ii)在动态环境中根据视觉观测进行在线修正。

我们的表示由粒子(particles)构成,这些粒子用于刻画世界中物体的几何属性,并且可以与基于粒子的物理系统结合使用,以预测物理上合理的未来状态。 附着在这些粒子上的,是用于表示视觉状态的三维高斯(3D Gaussians),它们通过splatting(泼溅)过程从任意视角渲染图像,从而刻画系统的视觉状态。 通过比较预测图像与实际观测图像,我们的方法生成一种称为**“视觉力(visual forces)”的信号,在遵循已知物理约束**的前提下,对粒子的位置进行修正。 通过将预测性的物理建模与连续的、由视觉驱动的修正机制相结合,我们的统一表示能够在推理当前状态与未来状态的同时,与真实世界保持同步。 我们在二维与三维目标跟踪任务以及光度重建质量方面对该方法进行了验证。 相关视频可见:https://embodied-gaussians.github.io/


1 INTRODUCTION

真实世界受许多已被充分理解的物理先验所支配——物质不能占据同一空间,场景由刚体与可变形物体构成,重力作用于所有物体,机器人具有已知的运动学结构。 将这些先验知识纳入世界表示中,可以对系统随时间的演化方式施加约束,从而强制其遵循物理定律。 然而,大多数表示方式,例如点云、图像 [1] 或潜在描述符 [2, 3, 4],都无法显式地编码并对这些物理先验进行推理。 因此,这类表示在预测未来状态时,缺乏关键的物理约束。

基于粒子的物理仿真器 [5, 6, 7] 能够优雅地刻画机器人场景中常见且已知的物理先验,并支持动力学的前向仿真。 这使得它们在物理世界建模中具有很强的吸引力。 为了在机器人场景中使用这些仿真器,我们提出了一种方法,利用 RGBD 观测初始化粒子,并且仅依赖真实世界中的 RGB 观测,对随时间累积的误差进行周期性校正。

为了通过视觉反馈实现连续的状态校正,我们为粒子引入了视觉属性,使得可以计算用于修正状态的校正力。 近期研究表明,三维高斯表示 [8, 9] 是一种可微、高效且表达能力强的视觉状态表示方式,能够从任意视角渲染图像。 我们的贡献在于,将这些高斯与粒子进行耦合。 借助这种双重 Gaussian-Particle 表示,我们可以利用物理系统对未来状态进行仿真。 同时,我们还可以通过渲染所附着的高斯,来预测对应的视觉外观。 将真实观测与渲染图像进行比较,可计算得到光度损失(photometric loss),该损失驱动高斯的运动,并进一步生成 “视觉力”,用于修正其所附着粒子的位姿。 因此,我们的主要贡献包括:
(i)一种新颖的双重 Gaussian-Particle 表示,以统一的方式刻画几何、物理与视觉外观;
(ii)一种利用 RGBD 数据与实例分割图 对该表示进行初始化的方法;
(iii)一种基于视觉反馈、用于实时修正粒子状态的方法。

我们的系统整体框架如图 1 所示。


在这里插入图片描述图 1:来自真实世界实验的示意图,展示了可用的物理先验 (1)、双重 Gaussian-Particle 表示 (2)、预测得到的世界视觉状态 (3),以及由于渲染状态与相机图像 (4) 之间的视觉差异而产生并施加的校正“视觉力” (5)。



2 PRELIMINARIES

我们的方法建立在 Position-Based Dynamics(位置约束动力学,PBD)[5, 6]Gaussian Splatting(高斯泼溅)[8] 之上。 本节将分别概述这两个组成部分,而下一节将详细介绍我们如何在机器人场景中将它们进行有机结合

0. 你先抓住全局:这篇预备知识在搭一个什么“系统结构”?

你可以把系统想成两条并行流水线:

0.1 物理世界线(Physics / PBD)

  • 世界里没有“网格”“刚体引擎那种复杂接触求解”。
  • 只有一堆 粒子(particles),每个粒子有位置、速度、半径、质量等。
  • “物体”不是一个整体,而是“很多粒子组成的集合”。
  • 每一小步时间里:先让粒子按力学预测动一下,然后用一堆约束把它们“纠正回合理状态”(不穿地、不互相穿、不散架)。

0.2 视觉世界线(Rendering / 3DGS)

  • 世界的“外观”不是三角网格贴图,而是一堆 3D 高斯(3D Gaussians)
  • 相机一来,就把这些高斯投影到屏幕上做“泼溅”叠加,得到像素颜色。
  • 关键:这个渲染过程是 可微的,也就是说你可以定义损失(比如渲染图像 vs 真图像),然后把梯度传回去更新高斯参数。

所以这段 Preliminaries 的使命是: 告诉你两套“表示 + 计算”的基本单元分别是什么,以及它们如何被更新。

Particle-Based Physics Simulation PBD 是一种非常适合机器人应用的物理仿真技术,该类应用对实时性鲁棒性有较高要求。 在我们的表述中,PBD 作用于具有朝向的粒子。每个粒子 i i i 由以下属性定义:位置 p i ∈ R 3 p_i \in \mathbb{R}^3 piR3、速度 v i ∈ R 3 v_i \in \mathbb{R}^3 viR3、朝向 q i ∈ S 3 q_i \in \mathbb{S}^3 qiS3、角速度 ω i ∈ R 3 \omega_i \in \mathbb{R}^3 ωiR3、外力 f i ∈ R 3 f_i \in \mathbb{R}^3 fiR3、半径 r i ∈ R + r_i \in \mathbb{R}^+ riR+ 以及质量 m i ∈ R + m_i \in \mathbb{R}^+ miR+。 粒子可以属于某个形状 S j S_j Sj,因此还具有一个额外属性,即其静止参考位置 p ˉ i \bar{p}_i pˉi

1. PBD 到底是什么?一句话版本

传统动力学:解的是“力 → 加速度 → 速度 → 位置”,会有很硬的数值稳定性问题。
PBD(Position-Based Dynamics) 反过来:

我不直接解力学方程的精确结果,我先“猜”粒子会去哪,然后用约束把位置“拉回正确范围”。

所以 PBD 特别适合机器人实时场景:

  • 你宁愿它 稳定、不卡死、实时,也不追求“物理上绝对精确”。这就是文中说的 实时性、鲁棒性。[5,6]

2. PBD 的“模型表示”:什么叫“具有朝向的粒子”?

每个粒子 i i i 有一堆属性(你看到的那一长串):

  • 位置 p i ∈ R 3 p_i\in\mathbb{R}^3 piR3:粒子中心点在哪
  • 速度 v i ∈ R 3 v_i\in\mathbb{R}^3 viR3:下一步会往哪走多快
  • 朝向 q i ∈ S 3 q_i\in\mathbb{S}^3 qiS3:用四元数表示旋转(避免万向节锁)
  • 角速度 ω i ∈ R 3 \omega_i\in\mathbb{R}^3 ωiR3:转得多快
  • 外力 f i f_i fi:比如重力、外部推力
  • 半径 r i r_i ri:粒子当成球,大小是多少
  • 质量 m i m_i mi:越大越“难被推走”
  • 如果粒子属于某个形状(shape) S j S_j Sj,还有 静止参考位置 p ˉ i \bar p_i pˉi: 这是“它本来应该在物体内部的哪个位置”。形状匹配就靠它把结构拉回去。

直觉: p ˉ i \bar p_i pˉi 就像“骨架的标准姿势 / 模板坐标”。物体怎么动都行,但粒子之间相对结构要尽量像模板。

PBD 框架的核心在于一系列约束条件,这些约束决定了仿真的行为。 这些约束被定义为作用于粒子位置的代价函数,用于确保仿真过程符合期望的物理属性。 PBD 约束的一般形式为代价函数 C ( p 0 , … , p n , μ r ) ∈ R + C(\mathbf{p}_0,\dots,\mathbf{p}_n,\mu_r)\in\mathbb{R}^+ C(p0,,pn,μr)R+, 其中 μ r \mu_r μr松弛因子。 在每个仿真时间步中,这些约束通过 Jacobi 求解器进行最小化。 该求解器通过迭代方式,累积所需的位置变化 Δ p \Delta p Δp,以在局部满足约束条件,从而更新粒子位置。 通常,所需的位置变化由下式给出:

Δ p i = − μ r w i C ∑ j w j ∣ ∇ p j C ∣ 2 ⋅ ∇ p i C where  w i = 1 m i ( 1 ) \Delta p_i = -\mu_r w_i \frac{C}{\sum_j w_j |\nabla_{p_j} C|^2} \cdot \nabla_{p_i} C \quad \text{where } w_i = \frac{1}{m_i} \quad (1) Δpi=μrwijwjpjC2CpiCwhere wi=mi1(1)

3. PBD 的“核心计算结构”:约束(constraint) + Jacobi 迭代

3.1 约束是什么?

PBD 不说“这一步受了多少力”,而说:
我希望满足一些几何/物理规则,比如:

  • 不能穿地
  • 不能互相穿透(碰撞)
  • 同一个物体的粒子不能散架(保持形状)

这些规则用一个“代价/约束函数”表示:
C ( p 0 , … , p n , μ r ) ∈ R + C(\mathbf{p}_0,\dots,\mathbf{p}_n,\mu_r)\in\mathbb{R}^+ C(p0,,pn,μr)R+

这里 μ r \mu_r μr松弛因子(relaxation):

  • 太小:纠正得慢,可能软趴趴
  • 太大:纠正太猛,可能抖或不稳定 它本质就是“每次修正走多大一步”。

3.2 为什么需要迭代?Jacobi 求解器在干嘛?

一个时间步里通常有多条约束同时要满足。比如你一边碰撞、一边要保持结构、一边还不能穿地。 所以做法是:

  • 反复多轮迭代
  • 每一轮对每个约束计算“我应该把粒子往哪里推一点”
  • 把这些推的量累积起来,更新粒子位置
    这就是文里说的:累积位置变化 Δ p \Delta p Δp,局部满足约束

Jacobi 的味道是:

  • 同一轮里,每个粒子的修正用的是“上一轮/当前估计”的位置
  • 更容易并行(GPU 友好),但可能比 Gauss-Seidel 收敛慢一点 对实时很友好。

4. 公式(1) 到底在说什么?(最容易卡的点之一)

公式(1): Δ p i = − μ r w i C ∑ j w j ∣ ∇ p j C ∣ 2 ⋅ ∇ p i C where  w i = 1 m i ( 1 ) \Delta p_i = -\mu_r w_i \frac{C}{\sum_j w_j |\nabla_{p_j} C|^2} \cdot \nabla_{p_i} C \quad \text{where } w_i = \frac{1}{m_i} \quad (1) Δpi=μrwijwjpjC2CpiCwhere wi=mi1(1)

把它拆成“傻瓜版”的几块:

  1. ∇ p i C \nabla_{p_i}C piC:往哪推?
  • 这是约束对粒子位置的梯度。
  • 梯度方向告诉你:如果我移动 p i p_i pi C C C 怎么变。
  • 我们要让 C C C 变小(最好到0),所以要沿着“降低 C C C 的方向”推。
  • 前面的负号就是“往下降方向”。
  1. C C C:推多少?
  • C C C 越大,说明违反约束越严重,就该推得越多。
  1. w i = 1 / m i w_i=1/m_i wi=1/mi:谁更容易被推?
  • 质量大 m i m_i mi w i w_i wi 小 → 不容易动
  • 质量小 → 更容易被推
    这符合常识:重的更稳。
  1. 分母 ∑ j w j ∣ ∇ p j C ∣ 2 \sum_j w_j|\nabla_{p_j}C|^2 jwjpjC2:做尺度归一化
  • 约束可能涉及多个粒子(比如碰撞约束涉及 i 和 j)
  • 分母相当于把“整体推的量”分配得合理,避免因为梯度尺度不同导致推过头。
  1. μ r \mu_r μr:松弛因子
  • 控制每次迭代修正的步长(收敛速度 vs 稳定性权衡)。

直觉总结:
违反越严重( C C C大)→ 推得越多;越轻( m m m小)→ 越容易被推;推的方向由梯度决定。

在我们的系统中,我们使用了地面约束、碰撞约束和形状约束。它们相关的 ∆ p ∆p p 如下所示:

PBD 的地面约束用于防止粒子穿透由 ( n , d ) (n,d) (n,d) 定义的地平面:

Δ p i ground = C ground ( p i ; n , d ) ⋅ n , C ground ( p i ; n , d ) = min ⁡ ( n T p i + d − r i , 0 ) ( 2 ) \Delta p_i^{\text{ground}} = C_{\text{ground}}(p_i;n,d)\cdot n, \quad C_{\text{ground}}(p_i;n,d) = \min(n^T p_i + d - r_i, 0) \quad (2) Δpiground=Cground(pi;n,d)n,Cground(pi;n,d)=min(nTpi+dri,0)(2)

5. 这篇里用了三类约束:地面、碰撞、形状(结构保持)

5.1 地面约束(式2):不许穿地

Δ p i ground = C ground ( p i ; n , d ) ⋅ n , C ground ( p i ; n , d ) = min ⁡ ( n T p i + d − r i , 0 ) ( 2 ) \Delta p_i^{\text{ground}} = C_{\text{ground}}(p_i;n,d)\cdot n, \quad C_{\text{ground}}(p_i;n,d) = \min(n^T p_i + d - r_i, 0) \quad (2) Δpiground=Cground(pi;n,d)n,Cground(pi;n,d)=min(nTpi+dri,0)(2)

你把地面当成一个平面:法向量 n n n,偏移 d d d

  • n T p i + d n^Tp_i+d nTpi+d 相当于“粒子中心到平面的有符号距离”(沿法向量)
  • 再减去半径 r i r_i ri 是因为粒子是球:球心离地太近也算穿透
  • 如果结果是负的,说明穿进去了 → 用 min ⁡ ( ⋅ , 0 ) \min(\cdot,0) min(,0) 把“穿透深度”取出来
  • 然后乘以 n n n:沿着法向量把粒子推出地面

卡点:为什么是 min ⁡ ( . . . , 0 ) \min(...,0) min(...,0)
因为只有穿透(负)才需要修正;没穿透(正)就修正量为0。

PBD 的碰撞约束作用于粒子对 i i i j j j,用于建模碰撞行为:

Δ p i col = w i w i + w j p i − p j ∥ p i − p j ∥ C col ( p i , p j ) , C col ( p i , p j ) = min ⁡ ( ∥ p i − p j ∥ − r i − r j , 0 ) ( 3 ) \Delta p_i^{\text{col}} = \frac{w_i}{w_i + w_j} \frac{p_i - p_j}{\|p_i - p_j\|} C_{\text{col}}(p_i,p_j), \quad C_{\text{col}}(p_i,p_j) = \min(\|p_i - p_j\| - r_i - r_j, 0) \quad (3) Δpicol=wi+wjwipipjpipjCcol(pi,pj),Ccol(pi,pj)=min(pipjrirj,0)(3)

5.2 碰撞约束(式3):两个粒子别重叠

Δ p i col = w i w i + w j p i − p j ∥ p i − p j ∥ C col ( p i , p j ) , C col ( p i , p j ) = min ⁡ ( ∥ p i − p j ∥ − r i − r j , 0 ) ( 3 ) \Delta p_i^{\text{col}} = \frac{w_i}{w_i + w_j} \frac{p_i - p_j}{\|p_i - p_j\|} C_{\text{col}}(p_i,p_j), \quad C_{\text{col}}(p_i,p_j) = \min(\|p_i - p_j\| - r_i - r_j, 0) \quad (3) Δpicol=wi+wjwipipjpipjCcol(pi,pj),Ccol(pi,pj)=min(pipjrirj,0)(3)

  • ∣ p i − p j ∣ |p_i-p_j| pipj 是球心距离

  • r i + r j r_i+r_j ri+rj 是两个球刚好接触时的距离

  • 如果球心距离更小 → 重叠 → ∣ p i − p j ∣ − r i − r j |p_i-p_j|-r_i-r_j pipjrirj 为负

  • min ⁡ ( ⋅ , 0 ) \min(\cdot,0) min(,0) 取出穿透深度

  • 方向 p i − p j ∣ p i − p j ∣ \frac{p_i-p_j}{|p_i-p_j|} pipjpipj:从 j 指向 i 的单位向量,把 i 往外推

  • 系数 w i w i + w j \frac{w_i}{w_i+w_j} wi+wjwi:按质量反比分配修正

    • 谁更轻谁动得更多(更合理)

最后,为了确保属于同一物体的一组粒子在仿真过程中保持其结构,我们采用了形状匹配(shape matching)算法,其详细说明见文献 [7, 10]。 简而言之,形状匹配算法需要为每个形状 S S S 计算如下矩阵:

A S = ∑ i ∈ S 1 5 m i R i + p i p ˉ i T − M c S c ˉ S T A_S = \sum_{i\in S} \frac{1}{5}{m_i} R_i + p_i \bar{p}_i^T - M c_S \bar{c}_S^T AS=iS51miRi+pipˉiTMcScˉST

c S = ∑ i ∈ S m i p i M , c ˉ S = ∑ i ∈ S m i p ˉ i M , M = ∑ i ∈ S m i ( 4 ) c_S = \frac{\sum_{i\in S} m_i p_i}{M}, \quad \bar{c}_S = \frac{\sum_{i\in S} m_i \bar{p}_i}{M}, \quad M = \sum_{i\in S} m_i \quad (4) cS=MiSmipi,cˉS=MiSmipˉi,M=iSmi(4)

其中 R i ∈ S O ( 3 ) R_i \in \mathbf{SO}(3) RiSO(3) 是四元数 q i q_i qi 对应的旋转矩阵形式。 矩阵 A S A_S AS 可被分解为 R S S R_S S RSS,由此得到用于维持结构的粒子位置变化:

Δ p i shape = k S [ R S ( p ˉ i − c ˉ S ) + c S − p i ] ( 5 ) \Delta p_i^{\text{shape}} = k_S \big[ R_S(\bar{p}_i - \bar{c}_S) + c_S - p_i \big]\quad (5) Δpishape=kS[RS(pˉicˉS)+cSpi](5)

其中 k S k_S kS 是该形状的刚度参数。 形状匹配算法既可用于刚体,也可用于可变形物体。 刚体由单一形状构成。 而可变形物体则由多个形状构成,每个形状由一个粒子及其邻域粒子组成。

5.3 形状匹配(式4-5):物体别散架(最关键的“结构算法”)

作者用的是经典的 shape matching,[7,10]。它在 PBD 里很重要,因为:

  • 只靠碰撞/地面约束只能避免穿透
  • 但同一物体内部的粒子会“像一团沙子一样散掉”
  • shape matching 给它一个“整体结构的拉回力”(但仍然稳定)

5.3.1 它到底在干嘛?

一句话:

计算一个“最像刚体变换的旋转 R S R_S RS”,让当前粒子集合尽量对齐到参考形状,然后把每个粒子往那个目标位置拉回去。

5.3.2 式(4):先算质心,再算一个矩阵 A S A_S AS

c S = ∑ i ∈ S m i p i M , c ˉ S = ∑ i ∈ S m i p ˉ i M , M = ∑ i ∈ S m i ( 4 ) c_S=\frac{\sum_{i\in S}m_ip_i}{M},\quad \bar c_S=\frac{\sum_{i\in S}m_i\bar p_i}{M},\quad M=\sum_{i\in S}m_i\quad(4) cS=MiSmipi,cˉS=MiSmipˉi,M=iSmi(4)

  • c S c_S cS:当前形状 S 的质心
  • c ˉ S \bar c_S cˉS:参考形状(静止模板)的质心
  • 用质量加权:重的点更影响整体

然后算 A S A_S AS(你可以把它理解成“把参考形状对齐到当前形状的相关性矩阵”): 它综合了当前点和参考点的对应关系,用来求一个最合适的旋转。

卡点:为什么要“去质心”?
因为我们要分离“平移”和“旋转”。先把两坨点都搬到各自质心附近,再去找最合适的旋转。

5.3.3 A S A_S AS 分解得到 R S R_S RS(旋转)

文中说 A S A_S AS 可分解成 R S S R_S S RSS。 你可以把这理解成:

  • A S A_S AS 提取一个纯旋转 R S R_S RS(最刚体的部分)
  • 剩下的 S S S 是尺度/形变相关的部分 这一步在 shape matching 里常见:目标是拿到最能解释当前形状的旋转。

5.3.4 式(5):把每个粒子拉回“目标位置”

Δ p i shape = k S [ R S ( p ˉ i − c ˉ S ) + c S − p i ] ( 5 ) \Delta p_i^{\text{shape}}=k_S\big[R_S(\bar p_i-\bar c_S)+c_S-p_i\big]\quad(5) Δpishape=kS[RS(pˉicˉS)+cSpi](5)

括号里那一坨是“目标位置 - 当前实际位置”:

  • 参考点相对参考质心: p ˉ i − c ˉ S \bar p_i-\bar c_S pˉicˉS

  • 乘旋转 R S R_S RS:把参考形状转到当前形状的朝向

  • 再加当前质心 c S c_S cS:把它放回世界里的正确位置 于是得到“这个粒子如果保持结构,应该在的位置”

  • 减掉当前 p i p_i pi:得到需要修正的方向和距离

  • k S k_S kS:刚度(硬不硬)

    • k S = 1 k_S=1 kS=1:强力拉回,接近刚体
    • 小一点:更软,可变形

重要理解:shape matching 不是逐条边/弹簧那种约束,而是“整体对齐”的方法,所以稳定、便宜,很适合实时。[7,10]

5.3.5 刚体 vs 可变形:一个形状还是多个形状?

  • 刚体:整物体用一个 shape(一个集合 S),整体保持结构
  • 可变形:多个 shape(每个粒子 + 邻域形成一个局部 shape)
    这样局部能保持,整体允许不同局部之间相对形变

对于 PBD 和形状匹配算法的示例实现,请读者参阅 [11]。在本工作中,我们基于 Warp [12] 的 PBD 实现,并对其进行扩展以加入形状匹配算法。 在实验中,每一步物理仿真大约耗时 5 ms。 有关 PBD 的更多细节可见补充材料

6. 实现层面作者在说什么?(Warp + 5ms)

作者说他们基于 Warp [12] 的 PBD 实现,并扩展加入 shape matching;每步仿真大约 5ms。 你要读懂的重点是:

  • Warp 是 GPU 友好、面向物理计算的框架
  • 所以整套 PBD + shape matching 能跑到实时级别 这给后面“机器人场景里边做边看边优化”提供了速度保障。

Gaussian Splatting 高斯泼溅 [8] 作为一种强大的渲染技术,能够利用一组离散的三维高斯来刻画视觉世界的状态。 每个高斯 i i i 由以下参数描述:位置 g i ∈ R 3 g_i\in\mathbb{R}^3 giR3、朝向 R i ∈ S O ( 3 ) R_i\in \mathbf{SO}(3) RiSO(3)、尺度 s i ∈ R 3 s_i\in\mathbb{R}^3 siR3、不透明度 α i ∈ R + \alpha_i\in\mathbb{R}^+ αiR+ 以及颜色 c i ∈ R 3 c_i\in\mathbb{R}^3 ciR3

7. 3D Gaussian Splatting 是什么?一句话版本

传统渲染:三角网格 + 光栅化/体渲染。
3DGS:用很多个“会发光/有颜色/有透明度”的 3D 高斯小团 来表示场景。 相机看过去时:把每个高斯投影到屏幕上变成 2D 椭圆斑点,然后按深度做透明度叠加,得到像素颜色。[8]


8. 3DGS 的“模型表示”:一个高斯有哪些参数?

每个高斯 i i i 有:

  • 位置 g i ∈ R 3 g_i\in\mathbb{R}^3 giR3:中心在哪
  • 朝向 R i ∈ S O ( 3 ) R_i\in\mathbf{SO}(3) RiSO(3):椭球朝哪个方向
  • 尺度 s i ∈ R 3 s_i\in\mathbb{R}^3 siR3:在三个主轴方向上多大
  • 不透明度 α i \alpha_i αi(或文中写的不透明度相关参数):有多“挡光”
  • 颜色 c i ∈ R 3 c_i\in\mathbb{R}^3 ciR3:RGB

直觉:一个高斯就是一个“半透明的彩色椭球烟雾团”。

给定一个视角,其相对于世界坐标系的变换记为 V ∈ S E ( 3 ) V\in \mathbf{SE}(3) VSE(3),并定义从三维世界到该视角屏幕空间的投影函数为 π ( x ) \pi(\mathbf{x}) π(x),那么像素坐标 u u u处的颜色可以通过如下方式计算:先按高斯在视角空间中的 z z z 坐标从小到大对其排序,然后使用式(6)中的泼溅(splatting)公式进行计算。

C rgb ( u ) = ∑ i ∈ N c i α i ( u ) ∏ j = 1 i − 1 ( 1 − α j ( u ) ) ( 6 ) C_{\text{rgb}}(\mathrm{u}) = \sum_{i\in\mathcal{N}} c_i \alpha_i(\mathrm{u}) \prod_{j=1}^{i-1}(1-\alpha_j(\mathrm{u})) \quad (6) Crgb(u)=iNciαi(u)j=1i1(1αj(u))(6)

α i ( u ) = a i e − g i ( u ) , g i ( u ) = x i T Σ i ′ − 1 x i , x i = u − π ( g i ) \alpha_i(\mathrm{u})=a_i e^{-g_i(\mathrm{u})},\quad g_i(\mathrm{u})=\mathrm{x}_i^T \Sigma_i^{'-1} \mathrm{x}_i,\quad \mathrm{x}_i=\mathrm{u}-\pi(g_i) αi(u)=aiegi(u),gi(u)=xiTΣi1xi,xi=uπ(gi)

Σ i ′ = J V Σ i V T J T \Sigma_i^{'} = \mathrm{J} \mathrm{V} \Sigma_i \mathrm{V}^T \mathrm{J}^T Σi=JVΣiVTJT 表示高斯 i i i 在投影到该视角的屏幕空间之后的协方差,其中 J \mathbf{J} J 是投影函数 π ( x ) \pi(\mathbf{x}) π(x) 的雅可比矩阵,而 Σ i = R i diag ( s i 2 ) R i T \Sigma_i = R_i \text{diag}(s_i^2) R_i^T Σi=Ridiag(si2)RiT。关于该过程的完整细节,请参阅文献 [8]。

9. 从 3D 到 2D:为什么要投影协方差 Σ i ′ \Sigma'_i Σi?(最容易卡的点之二)

渲染时你不直接在3D里“画椭球”,而是要在屏幕上画一个 2D 椭圆斑点。 斑点形状由“投影后的协方差”决定:

  • 3D 里的协方差: Σ i = R i d i a g ( s i 2 ) R i T \Sigma_i=R_i\mathrm{diag}(s_i^2)R_i^T Σi=Ridiag(si2)RiT 这表示椭球在空间里的形状和朝向。

  • 经过相机位姿 V ∈ S E ( 3 ) V\in\mathbf{SE}(3) VSE(3) 变换到相机坐标,再通过投影 π \pi π 映射到屏幕。 为了在屏幕上得到正确的 2D 椭圆,需要用投影的雅可比 J \mathbf{J} J 做一阶近似传播:
    Σ i ′ = J , V , Σ i , V T J T \Sigma'_i=\mathbf{J},V,\Sigma_i,V^T\mathbf{J}^T Σi=J,V,Σi,VTJT

你把它理解成:

“3D 椭球经过相机和投影,被压扁成屏幕上的一个2D椭圆; Σ i ′ \Sigma'_i Σi 就是在屏幕上描述这个椭圆的形状矩阵。”[8]


10. 像素颜色怎么合成?式(6) 的真实含义(透明度前向合成)

式(6): C rgb ( u ) = ∑ i ∈ N c i α i ( u ) ∏ j = 1 i − 1 ( 1 − α j ( u ) ) ( 6 ) C_{\text{rgb}}(\mathrm{u}) = \sum_{i\in\mathcal{N}} c_i \alpha_i(\mathrm{u}) \prod_{j=1}^{i-1}(1-\alpha_j(\mathrm{u})) \quad (6) Crgb(u)=iNciαi(u)j=1i1(1αj(u))(6)

它是典型的 前向 alpha 合成(front-to-back compositing)

  1. 先按深度排序:离相机近的先处理(文里说按 z z z 从小到大)

  2. 对每个像素 u u u,每个高斯在该像素的贡献是:

    • 它的颜色 c i c_i ci
    • 乘它在该像素的“覆盖/不透明度” α i ( u ) \alpha_i(u) αi(u)(由高斯函数决定)
  3. 但如果前面已经有东西挡住了,后面的贡献会被削弱:

    • 透射项 ∏ j = 1 i − 1 ( 1 − α j ( u ) ) \prod_{j=1}^{i-1}(1-\alpha_j(u)) j=1i1(1αj(u))
    • 意思是“前面没被遮住的那部分光,还剩多少”

傻瓜版: 你从近到远往屏幕上叠半透明颜料。前面涂得越厚,后面越看不见。

α i ( u ) \alpha_i(u) αi(u) 由高斯形状给出: α i ( u ) = a i e − g i ( u ) , g i ( u ) = x i T Σ i ′ − 1 x i , x i = u − π ( g i ) \alpha_i(\mathrm{u})=a_i e^{-g_i(\mathrm{u})},\quad g_i(\mathrm{u})=\mathrm{x}_i^T \Sigma_i^{'-1} \mathrm{x}_i,\quad \mathrm{x}_i=\mathrm{u}-\pi(g_i) αi(u)=aiegi(u),gi(u)=xiTΣi1xi,xi=uπ(gi)

  • π ( g i ) \pi(g_i) π(gi) 是高斯中心投影到像素的位置
  • x i x_i xi 是当前像素到中心的偏移
  • 二次型 x T Σ ′ − 1 x x^T\Sigma'^{-1}x xTΣ1x 给出“离中心越远衰减越快,并且是椭圆形衰减”
  • a i a_i ai 控制强度(类似最大不透明度)

渲染方程并不仅限于颜色信息。 在我们的方法中,我们还为每个高斯关联一个分割标识 o i o_i oi(如 [9] 中所做的那样)。 但需要注意的是,这一设置仅用于我们的初始化方案,并不用于后续的预测步骤与校正步骤。 分割结果的渲染通过下式完成:

S ( u ) = ∑ i ∈ N o i   α i ( u ) ∏ j = 1 i − 1 ( 1 − α j ( u ) ) ( 7 ) S(\mathbf{u})=\sum_{i\in\mathcal{N}} o_i\,\alpha_i(\mathbf{u})\prod_{j=1}^{i-1}\bigl(1-\alpha_j(\mathbf{u})\bigr)\quad(7) S(u)=iNoiαi(u)j=1i1(1αj(u))(7)

该式表示像素坐标 u u u 处的分割渲染结果 S ( u ) S(u) S(u):将参与渲染的高斯集合 N \mathcal{N} N 中每个高斯的分割标识 o i o_i oi,按其在像素处的贡献 α i ( u ) \alpha_i(u) αi(u) 以及前面高斯的透射项 ∏ j = 1 i − 1 ( 1 − α j ( u ) ) \prod_{j=1}^{i-1}(1-\alpha_j(u)) j=1i1(1αj(u)) 进行加权累加。


11. 分割渲染式(7) 是干嘛的?为什么要给每个高斯一个 o i o_i oi

作者说:像 [9] 一样给每个高斯一个分割标识 o i o_i oi,并渲染出:
S ( u ) = ∑ i ∈ N o i   α i ( u ) ∏ j = 1 i − 1 ( 1 − α j ( u ) ) ( 7 ) S(\mathbf{u})=\sum_{i\in\mathcal{N}} o_i\,\alpha_i(\mathbf{u})\prod_{j=1}^{i-1}\bigl(1-\alpha_j(\mathbf{u})\bigr)\quad(7) S(u)=iNoiαi(u)j=1i1(1αj(u))(7)

注意它和式(6)一模一样,只是把“颜色 c i c_i ci”换成“标签/标识 o i o_i oi”。 目的:

  • 在初始化时,让高斯不仅拟合颜色,也拟合“这个像素属于哪个物体/区域”
  • 这样更容易把不同物体的高斯分开,避免一开始全糊成一团
  • 但作者强调:只用于初始化,后面预测/校正不用它

由于泼溅(splatting)过程是可微的,因此可以通过最小化一组真实图像与其对应的泼溅渲染结果之间的光度损失 L rgb L_{\text{rgb}} Lrgb,来学习定义三维高斯的各项属性,使其能够表示特定场景。 我们的初始化过程还会使用 L seg L_{\text{seg}} Lseg

L rgb = ∑ u ∣ C rgb ( u ) − C gt ( u ) ∣ and L seg = ∑ u ∣ S ( u ) − S gt ( u ) ∣ ( 9 ) L_{\text{rgb}} = \sum_\mathbf{u} |C_{\text{rgb}}(\mathbf{u})-C_{\text{gt}}(\mathbf{u})| \quad \text{and} \quad L_{\text{seg}} = \sum_\mathbf{u} |S(\mathbf{u})-S_{\text{gt}}(\mathbf{u})| \quad (9) Lrgb=uCrgb(u)Cgt(u)andLseg=uS(u)Sgt(u)(9)

12. 可微性到底意味着什么?损失(9)在干嘛?(最关键思想)

作者最后说:splatting 是可微的,所以能通过优化损失来“学习高斯属性”。

损失(9): L rgb = ∑ u ∣ C rgb ( u ) − C gt ( u ) ∣ and L seg = ∑ u ∣ S ( u ) − S gt ( u ) ∣ ( 9 ) L_{\text{rgb}} = \sum_\mathbf{u} |C_{\text{rgb}}(\mathbf{u})-C_{\text{gt}}(\mathbf{u})| \quad \text{and} \quad L_{\text{seg}} = \sum_\mathbf{u} |S(\mathbf{u})-S_{\text{gt}}(\mathbf{u})| \quad (9) Lrgb=uCrgb(u)Cgt(u)andLseg=uS(u)Sgt(u)(9)

你把它理解成最朴素的训练/拟合:

  • 我有真实图像 C gt ( u ) C_{\text{gt}}(u) Cgt(u)
  • 我用当前高斯渲染出 C rgb ( u ) C_{\text{rgb}}(u) Crgb(u)
  • 两者不一样就有误差
  • 因为渲染公式对高斯参数(位置、尺度、旋转、颜色、不透明度)都是可导的,[8] 所以可以算梯度: “哪个高斯该挪一点?哪个该变大?哪个颜色该偏一点?”
  • 用梯度下降把误差降下去 → 高斯云就越来越像真实场景

L seg L_{\text{seg}} Lseg 同理,只是用分割监督来帮助初始化分离结构。


13. 把两部分放在一起看:你现在其实已经读懂“模型+算法骨架”了

你现在可以用一句工程化的话概括这段预备知识:

  • 物理模型(PBD): 场景中的物体 = “有半径有质量的粒子集合”,每步用约束(地面/碰撞/形状匹配)通过 Jacobi 迭代修正位置,实时稳定。[5,6,7,10,11,12]

  • 视觉模型(3DGS): 场景外观 = “一堆带颜色和透明度的3D高斯椭球”,相机视角下投影成2D椭圆斑点,按深度做前向alpha合成得到像素颜色/分割;渲染可微,能用
    L rgb L_{\text{rgb}} Lrgb(以及初始化用的 L seg L_{\text{seg}} Lseg)优化高斯参数。[8,9]

下一节所谓“有机结合”,你可以提前预判它会怎么做:

PBD 让粒子动起来(真实可碰撞可保持结构),3DGS 让这些状态变成可比较的图像(可微),再用图像误差把模型反向校正。


3 METHOD

我们的方法构建了一个世界模型,该模型能够在实时速率下
(i)进行前向仿真,
(ii)通过物理先验进行正则化,以及
(iii)利用来自 3 个摄像头的视觉观测进行校正。

1)先把整篇方法一句话讲明白:它在干什么?

作者要做的是一个实时世界模型(world model): 你给它真实场景里 3 个摄像头的视觉观测(RGB/Depth + 只在初始化用的mask),它在后台实时维护一个“数字世界”,这个数字世界要做到三件事:

  1. 你推它一下,它能往前模拟(forward simulation):物体会掉落、碰撞、滚动、形变……(靠 PBD 粒子系统)
  2. 它不会乱飘乱炸,要“像物理”:也就是用物理先验当正则(地面/碰撞/形状保持等约束)
  3. 它能被相机纠正(correction):如果模拟和真实看到的不一致,用视觉误差把它拉回真实

直觉:这就是“边模拟边看相机,看到不对就改”,而且要实时跑得动。

该模型由两个紧密集成的表示构成:一组数量为 N N N 的粒子,用于表示物理世界并由 PBD 物理系统作用;以及 M M M 个高斯,通过高效的基于泼溅的渲染在视觉上描绘世界。 其关键创新在于引入了 “Gaussian–Particle(高斯–粒子)”键(bonds),以协同方式耦合这两种表示,从而在所建模环境的物理层面与视觉层面之间建立起一座桥梁。 一个键(bond)是一个刚性变换,用于将某个高斯与其父粒子连接起来。 在 第 3.1 节中,我们描述了如何初始化粒子、高斯以及它们之间的连接键。 在 第 3.2 节中,我们描述了如何利用摄像头观测,使仿真表示与真实世界保持同步。

2)这篇方法的核心结构:两个表示 + 一种“胶水”(bonds)

作者说世界模型由两套表示“紧密集成”组成:

A. 物理表示:粒子(Particles,数量 N N N

  • 粒子负责“物理”:位置、速度、质量、半径……交给 PBD 去更新
  • 物体 = 一堆粒子(刚体/软体都能用 shape matching 做结构保持)

B. 视觉表示:高斯(Gaussians,数量 M M M

  • 高斯负责“长什么样”:位置、颜色、不透明度、尺度、朝向……交给 3D Gaussian Splatting 渲染
  • 用高斯渲染出的图像可以和真实相机图像做对比,产生视觉损失

C. 关键创新:Gaussian–Particle “键”(bond)= 把两套世界粘在一起

这是你最该抓住的点:
粒子管物理,高斯管视觉,但它们必须表示“同一个世界”。 作者用 bond 做桥梁:

  • 每个高斯都认一个“父粒子”(最近的那个粒子)

  • bond 存的是一个刚性变换: 你可以把它理解成:

    “这个高斯相对它父粒子的固定相对位置/相对姿态”

于是系统就变成:

  • 粒子一动(物体在 PBD 里动了)
  • 高斯不需要自己乱飘,只要跟着父粒子通过 bond 变换更新位置
  • 渲染出的视觉世界就会和物理世界同步

最通俗的比喻:
粒子是“骨架/骨头”,高斯是“皮肤/纹理点”,bond 是“缝线”。骨头动了,皮肤跟着走。

3.1 Initialization

为了初始化粒子,我们利用深度数据和实例掩码,为每个物体计算一个宽松的三维包围盒。 所需的少量实例掩码由用户借助 Cutie [13](一种掩码标注工具)在几秒钟内、以极小的工作量生成;不过,这一过程在原则上也可以通过 VLM 或 SAM [14, 15, 16] 实现自动化。 实例信息与深度信息仅在初始化阶段需要。 这些包围盒被填充为均匀分布的球形高斯,其半径与最小的相关几何特征尺寸相匹配(约 4–7 mm)。 未投影到实例掩码中的高斯将被剔除。 通过结合以下两步来优化高斯的位置、颜色和不透明度: 一是使用 第 2 节中提到的 Jacobi 求解器,迭代求解碰撞约束与地面约束; 二是使用 Adam [17] 最小化光度与分割重建损失(式 (8))。 因此,在仅限于该阶段,高斯被视作同时充当粒子。 不透明度低于 0.3(经验设定)的高斯将被剔除,其尺寸被限制在大致不超过粒子尺寸的范围内。 粒子被初始化在剩余高斯的位置。 随后,属于同一物体的粒子之间通过 形状匹配约束(式 (2)) 进行连接。

用户还需要指明每个物体是刚体还是可变形体。 我们设想,在未来这一判定可以由 VLM 自动完成。 这些粒子构成了对物体几何形状的无碰撞、与地面对齐的近似表示,并填充了所观测到的形状。 尽管该方法尚未建模物体内部的空腔结构,但这一问题在未来可以通过引入基于深度的损失函数,或用更复杂的 三维初始化方案 替代当前的网格初始化来解决。

随后,我们在不再施加碰撞约束的情况下继续优化高斯,并允许其尺度发生变化。 我们还通过启用文献 [8] 中详细描述的致密化(densification)过程来引入新的高斯。 最终,每个高斯被绑定到最近的粒子,其相对于该粒子的位置被存储为一个键(bond)。 任何与最近粒子的距离超过阈值的高斯都会被丢弃。 该重建过程及其结果在图 2 中进行了可视化展示。 一个典型场景大约包含 一千个粒子和 一万个高斯。


在这里插入图片描述

3)图 2 的初始化流程:从真实数据搭起“粒子 + 高斯 + bond”

3.1 Initialization(初始化)到底在干嘛?

初始化的目标不是“完美重建”,而是做三件事:

  1. 给每个物体一个不会穿地、不会互相穿的“粗几何”
  2. 同时给它一个能渲染出差不多外观的 3DGS 高斯云
  3. 最后把高斯云到粒子上(bond),让后续“物理动 → 视觉跟着动”成立

下面开始对照图 2:


Step 1(图 2-1):从多相机深度得到初始点云

“Initialize pointcloud from posed cameras”

  • 场景里有 3 个相机(作者后面要用来校正)
  • 相机的位姿已知(posed cameras)
  • 用深度把每个相机看到的表面点投到 3D 世界坐标系
  • 合起来就是一个粗点云:告诉你“东西大概在哪里、长啥轮廓”

这一步只是给初始化提供“哪里有东西”的线索。


Step 2(图 2-2):用实例 mask 把点云分成每个物体,并算包围盒 BBox

“Segment points with masks and compute BBox”

  • 用户用 Cutie [13] 很快画几个实例 mask(每个物体一张 mask)
  • mask 和深度结合:你就能知道哪些 3D 点属于“杯子”、哪些属于“球”……
  • 对每个物体的 3D 点算一个宽松的 3D 包围盒(loose BBox)

这里“宽松”很重要: 因为点云可能缺一块(遮挡、噪声),bbox 不能卡得太死,否则会漏掉真实物体体积。

这也是作者说:mask/depth 只在初始化用。后面实时跟踪不想再依赖“有人一直标 mask”。


Step 3(图 2-3):用“球形高斯”把 BBox 填满,然后把不在 mask 里的删掉

“Fill BBox with spherical Gaussians and remove ones outside masks”

这是非常聪明也很工程化的一步:

3.1 先填满

  • 在 bbox 里均匀撒一堆“球形高斯”(spherical Gaussians)
  • 半径选成接近场景最小几何尺度:约 4–7mm

直觉: bbox 像一个空盒子,你先在里面塞很多“小球泡泡”,让它“有体素感”。

3.2 再剔除

  • 把这些高斯投影回相机图像
  • 如果某个高斯投影后 不落在实例 mask 里:说明它不属于这个物体 → 删掉

所以结果就是: 盒子里只留下“确实落在物体轮廓内”的高斯,变成物体的粗 3D 占据。


Step 4(图 2-4):同时做两类优化:物理可行 + 视觉重建

“Train with reconstruction loss and collision avoidance constraint”

这里是最容易卡住的点:作者在初始化阶段把“高斯”临时当成“粒子”用。

4.1 物理这边:Jacobi 解约束(地面 + 碰撞)

  • 用第 2 节的 PBD Jacobi 求解器

  • 迭代处理:

    • 地面约束:别穿桌面/地面
    • 碰撞约束:高斯球之间别互相穿

这一步的作用很直观:

让你刚才那堆“泡泡球”变成一个不自相交、摆在桌面上合理的粗几何。

4.2 视觉这边:Adam 最小化重建损失

  • 用 Adam [17] 优化高斯的:

    • 位置、颜色、不透明度(以及后面会放开尺度)
  • 损失来自:

    • 光度重建 L rgb L_{\text{rgb}} Lrgb
    • 分割重建 L seg L_{\text{seg}} Lseg
      (你前面给的式(9)那一套)

这一步的作用是:

让这些高斯不仅“物理上站得住”,还要“渲染出来像真的”。

4.3 为什么说“在这一阶段,高斯同时充当粒子”?

因为此时作者就是用高斯的中心/半径去做“物理占据体”,用碰撞/地面把它们推到合理位置。 也就是说:初始化阶段不需要两套点(粒子和高斯)各搞各的,先让高斯把粗几何站稳,然后再把粒子放到高斯上,省事、稳定。

4.4 经验剪枝(非常工程但很关键)

  • 不透明度 < 0.3 的删掉(经验阈值)

    • 含义:如果一个高斯在优化后仍然几乎透明,说明它对渲染没用/可能是噪声 → 删
  • 尺度限制不超过粒子尺寸

    • 防止某些高斯变得巨大会“糊一大片”,既不细致也会影响绑定与物理

Step 5(图 2-5):把粒子初始化在剩余高斯位置,并加 shape matching 约束

“Initialize particles at Gaussian locations and create shape constraints”

这一刻两套表示正式分家:

  1. 你已经得到一批“干净的高斯中心”
  2. 作者直接把 粒子放在这些高斯的位置上
  3. 同一物体的粒子之间用 形状匹配约束 连起来(保持结构)

5.1 这一步的核心意义

  • 粒子从此负责物理

  • shape matching 负责让“这一坨粒子像一个物体”,不散架

    • 刚体:整体像硬块
    • 软体:多个局部 shape,允许形变但不崩坏

5.2 用户要标注“刚体 or 可变形”

因为 shape matching 的连接方式/刚度设置/shape 分组策略会不同。 作者说未来可以用 VLM
自动判断,但现在需要用户给一下类别。


Step 6(图 2-6):继续训练高斯(不再做碰撞约束),densification,并建立 bond

“Continue training Gaussians and connect to nearest particles”

这一步最关键的是:从“初始化能站住” → 走向“视觉细节足够” + “绑定完成”

6.1 为什么“继续优化高斯时不再施加碰撞约束”?

因为碰撞约束会限制高斯彼此不能靠近,会妨碍视觉重建的细节表达。 后面高斯更像“外观点”,它们可以在表面很密、很贴近,没必要像物理球那样互相避让。 所以作者做了两件事:

  • 继续用 3DGS 的训练把外观拟合得更好

  • 允许尺度变化

  • 启用 [8] 的 densification

    在需要细节的地方自动加更多高斯,让纹理/边缘更清楚

6.2 绑定(bond)是怎么建的?

对每个高斯:

  1. 找最近的粒子(nearest particle)
  2. 计算这个高斯相对该粒子的刚性变换(至少相对位移,可能含局部旋转)
  3. 把这个相对变换存下来 = bond

并且做一个清理:

  • 如果某个高斯离最近粒子太远(超过阈值) → 丢弃
    含义:它已经不属于“物理物体附近的外观”,可能是噪声/背景/漂浮点

6.3 初始化后的规模

作者给了典型量级:

  • 约 1000 个粒子
  • 约 10000 个高斯

这也解释了“为什么要 bond”: 如果每一帧都用物理去更新 10000 个东西会很贵; 现在只更新 1000 个粒子(物理),10000 个高斯只做刚性跟随 + 渲染,效率很高。


4)你图 2 右侧 Results 在暗示什么?

右侧展示 Doll/Mug/Ball: 左边是真图,右边是用高斯重建出的“泡泡状”外观。
你会看到它不是网格,而是一堆高斯点云,但视觉上已经能表达大体几何与颜色分布。

这符合作者的目标:
不是追求完美三角网格,而是要可微、可渲染、可实时、还能和物理粒子耦合。


机器人以类似方式建模:利用其已知网格模型的渲染结果,并将其插入到每个场景中。 背景元素(在我们的实验中为一张白色桌子)仅使用高斯进行建模,并采用文献 [8] 中的常规训练流程。

5)机器人和背景怎么处理?(你最后两段)

5.1 机器人

  • 机器人本身的 CAD/网格是已知的
  • 作者用它的渲染结果把机器人“插入到场景模型里”
  • 换句话说:机器人不用重建,它是已知模型;但为了相机校正/遮挡一致,必须把机器人也放进渲染里

5.2 背景(白桌子)

  • 背景不需要物理(桌子不动)
  • 所以背景只用高斯建模,按 [8] 常规 3DGS 训练流程就行 这样最省算力:背景负责“看起来像”,不负责“会动会碰撞”。

3.2 Online Prediction and Correction

在初始化阶段完成之后,我们的方法结合 Position-Based Dynamics(PBD)高斯泼溅优化 来预测当前的表示状态。 我们的方法可以分解为两个阶段:预测阶段校正阶段。 这两个阶段按顺序依次执行,其流程如图 3 所示。

0. 你先记住这套系统的三样东西(结构骨架)

  1. 粒子(Particles):PBD 物理仿真真正更新的是粒子。粒子满足地面/碰撞/形状匹配等约束,所以它们的状态永远“物理可行”。
  2. 高斯(Gaussians):用来渲染RGB。每个高斯通过 bond 绑定到某个粒子(父粒子),平时跟着粒子刚性移动。
  3. bond(键):保证“高斯相对粒子的位置关系固定”。所以物体动起来时,高斯也跟着动,但不乱飞。

你要理解:*真实世界的“照片误差”不能直接拿来改粒子(粒子不可微/难优化),所以作者用高斯做“可微的中间层”。


在这里插入图片描述


Prediction PBD 物理系统以 30 Hz 的频率作用于系统中的粒子。 预测步骤包括以下过程: 首先,将与机器人相关的粒子设置为由正向运动学计算得到的位置; 然后,运行一次 PBD 物理仿真步,对粒子进行前向推进并求解物理约束(如第 2 节所述); 最后,将与粒子绑定的高斯以刚性方式移动到其新的预测位置。 在我们的系统中,该过程在 NVIDIA 3090 上大约耗时 5 ms,从而为后续的校正阶段预留 28 ms 的时间。

1. 整个在线循环是什么?(每秒30次)

系统以 30Hz 循环,也就是每33ms跑一轮。每轮分两段:

  • Prediction(预测):用物理推一步,给出“如果只靠物理,下一刻会在哪里”。
  • Correction(校正):用相机图像纠错,但纠错的结果不是直接搬动高斯,而是产出“外力”,让下一次PBD把粒子带回真实。

直觉: 预测=先按你认为的物理走;校正=看照片发现不对,用“外力”把它拉回去。


2. Prediction阶段(图3的1→2):物理推一步 + 高斯跟着走

图3-1:拿到最新观测(Get latest images and joint positions)

你需要两类输入:

  • 相机的RGB图像(校正阶段要用)
  • 机器人关节角/关节位置(预测阶段要用)

这里的关节角是关键:机器人不是靠“视觉猜姿态”,而是直接读编码器/控制器给的关节值。

图3-2:设置机器人粒子位置 + 跑一次PBD(Set robot joints and run PBD step)

这一步做两件事:

(A) 机器人部分怎么进物理系统?

作者说:把“机器人相关的粒子”设置为正向运动学(FK)算出来的位置。 意思是:机器人几何是已知的,关节角一来,机器人每个链接/关键点的位置就确定了。 所以机器人在物理里是“被驱动的”(kinematic),不是自由掉落的。

(B) 对整个系统跑一次PBD step

这一小步会:

  • 让物体粒子按速度/外力先预测位置
  • 然后用约束(地面/碰撞/形状匹配)迭代修正 得到物理上一致的新粒子位置(比如不穿桌面、不互相穿、物体不散架)

(C) 高斯怎么更新?

“最后,将与粒子绑定的高斯以刚性方式移动到新的预测位置。” 这句话你要翻译成一句更直白的工程话:

粒子动了 → 每个高斯用 bond 做刚体变换 → 得到高斯的新位置/朝向 → 这样渲染出来的画面就反映了物理预测的世界。

作者还给了时间:3090上预测约5ms,说明这一步非常快。

Correction 在完成物理预测之后,当前状态会从已知的相机视角进行渲染。 将渲染结果与相机接收到的图像进行比较,并通过优化高斯参数来降低光度重建损失。 需要注意的是,该优化过程仅依赖 RGB 数据。 所有高斯都允许以较低的学习率学习新的颜色不透明度。 这样可以通过调整高斯的颜色来解释由机器人或物体投射产生的阴影仅有附着在物体上的高斯被允许改变其位置和朝向。 在执行 5 次优化步骤之后(该次数经过调参以满足实时性约束),记录高斯的期望位置,并将所有高斯重置回优化开始前的原始位置。 高斯的期望位置与其原始位置之间的差值被用于计算一个施加到所连接粒子上的力。 该力定义为: f i = K p ∑ j o j ( g j − g j 0 ) f_i = K_p \sum_j o_j (g_j - g_j^0) fi=Kpjoj(gjgj0) 其中, g j g_j gj g j 0 g_j^0 gj0 分别表示与粒子 i i i 相连的高斯在优化后的最终位置和初始位置, o j o_j oj 为高斯的不透明度, K p K_p Kp 是需要调节的比例增益(在我们的实验中, K p = 60 K_p = 60 Kp=60 表现良好)。 因此,高斯从不在校正步骤中被直接移动。 相反,校正步骤用于生成作用在粒子上的外部校正力,这些力最终由物理系统进行求解。 在物理系统的调度下,粒子的运动会进一步带动与其绑定的高斯发生运动。 因此,系统始终不会处于物理上不可行的状态。 以这种方式移动高斯,可以确保它们始终相对于其绑定的粒子保持固定关系

3. Correction阶段(图3的3→5):把“看图的误差”变成“作用在粒子上的力”

这是你最容易卡住、也最关键的部分。我按图3一步步解释。

图3-3:只用RGB做5次Adam优化(Optimize Gaussians with RGB Loss)

预测完后,你有一份“现在世界应该长这样”的高斯状态(由物理预测给的)。 接着作者做:

  1. 用已知相机位姿从当前高斯状态渲染RGB(就是3DGS那套)
  2. 和真实相机RGB比,形成光度损失(photometric loss)
  3. 用 Adam 做 5步梯度下降,调整高斯参数让渲染图更像真实图

注意几个非常重要的限制(这就是作者防止系统乱掉的关键):

(A) 只依赖RGB(不靠深度)

文中明确说:优化过程仅依赖RGB。

  • 好处:现实中深度可能噪声大/缺失;RGB更稳定、更普适。
  • 坏处:会有歧义,但后面用“力+物理约束”来稳住。

(B) 哪些参数允许优化?

  • 所有高斯都允许用小学习率调整颜色不透明度

    • 目的:用颜色/透明度去解释光照变化、阴影(比如机器人遮挡导致暗一点,不一定要靠移动几何解释)
  • 只有附着在物体上的高斯才允许改位置和朝向

    • 背景/桌子的高斯不乱动 * 机器人本体一般也不靠这一步随便动(机器人姿态来自FK)

这一步你可以理解为: “我允许系统在视觉层面稍微挪动一些高斯,让渲染更像真图,但我不立刻把它当成真实世界已经动了。”

图3-4:从“高斯被优化挪动的位移”计算视觉力(Compute visual forces)

这里是整篇方法最核心的“桥梁技巧”。

关键操作:优化完以后,把高斯的位置记下来,然后把高斯复位

文中说得很清楚:

  • 做完5步优化后,记录高斯的“期望位置”(优化后的最终位置)
  • 然后把所有高斯重置回优化前的原始位置

你可能会问:为什么要重置?优化不是已经把它挪到更对的地方了吗? 原因是:如果你真的直接把高斯挪过去,可能出现两种灾难:

  1. 高斯跑进桌子里、穿过物体、穿过机器人——视觉对了但物理崩了
  2. 高斯和粒子的bond关系被破坏——下一步物理再动,高斯就不再“跟着骨架走”

所以作者的策略是:

优化只用来“告诉我应该往哪边拉”,但真正的移动必须由物理系统完成。

视觉力怎么计算?

作者把“位移”变成“外力”,施加到粒子上。公式: f i = K p ∑ j o j ( g j − g j 0 ) f_i=K_p\sum_jo_j(g_j-g_j^0) fi=Kpjoj(gjgj0)

逐项解释(非常傻瓜版但准确):

  • 粒子 i i i连接着一堆高斯 j j j(通过bond)

  • g j 0 g_j^0 gj0:优化前(预测后)的高斯位置

  • g j g_j gj:优化后(为了让渲染像真图)高斯想去的位置

  • ( g j − g j 0 ) (g_j-g_j^0) (gjgj0):这就是“视觉告诉你:这个高斯应该往哪挪多少”

  • o j o_j oj:不透明度当权重

    • 越不透明的高斯越“像实体表面”,更可信,力更大
    • 透明的点可能是噪声/漂浮点,不太可信,权重小
  • K p K_p Kp:比例增益(相当于把“位移”变成“力”的尺度),实验中 K p = 60 K_p=60 Kp=60效果好

你把它理解成:

很多高斯都在说“我想往这边走一点”,把这些建议按可信度加权求和,就得到对粒子应该施加的外力方向和大小。

图3-5:把视觉力加进PBD求解,并再次让高斯跟随粒子(Add visual forces to PBD simulator)

最后一步是闭环:

  1. 把刚才算出来的外力 f i f_i fi加到粒子上(当作外部校正力)

  2. 下一轮PBD step会在约束下处理这些力

    • 它会尽量让粒子朝力的方向动
    • 但绝不会穿地/穿模/散架(约束会把它拉回物理可行集合)
  3. 粒子动了,高斯再通过bond刚性跟随

  4. 下一帧渲染就更接近真实图

这就是作者那句核心结论的含义:

  • “高斯从不在校正步骤中被直接移动”
  • 校正只是产生外力,最终由物理系统决定怎么动
  • 所以系统始终物理可行,bond关系始终有效

4. 把整套算法写成“你能照着实现”的伪代码(超重要)

每个30Hz循环:

  1. 读取输入:RGB图 I t I_t It、机器人关节 q t q_t qt

  2. 预测

    • 用FK设置机器人粒子位置
    • PBD跑一步:得到粒子 P t p r e d P_t^{pred} Ptpred
    • 用bond把高斯更新到预测位置: G t 0 G_t^0 Gt0
  3. 校正(5步Adam)

    • 复制一份高斯参数 G ← G t 0 G \leftarrow G_t^0 GGt0 * for k in 1…5:

      • 渲染 I ^ ( G ) \hat I(G) I^(G)
      • 计算 L r g b ( I ^ , I t ) L_{rgb}(\hat I,I_t) Lrgb(I^,It)
      • Adam更新:允许颜色/不透明度(全体),位置/朝向(仅物体高斯)
    • 得到优化后高斯位置 G t o p t G_t^{opt} Gtopt

  4. 计算视觉力并复位高斯

    • 对每个粒子 i i i
      f i = K p ∑ j ∈ B ( i ) o j ( g j − g j 0 ) f_i=K_p\sum_{j\in\mathcal{B}(i)}o_j(g_j-g_j^0) fi=KpjB(i)oj(gjgj0)
    • 把高斯重置为 G t 0 G_t^0 Gt0(不直接用 G t o p t G_t^{opt} Gtopt去动世界)
  5. f i f_i fi加入PBD外力,进入下一轮循环


5. 最容易不解的的两个点

5.1:为什么优化后要把高斯重置回去?

因为优化是“视觉层面可微的临时位移”,不保证物理可行;必须把它转成外力,让PBD在约束下合法移动。

5.2:为什么力用 ( g j − g j 0 ) (g_j-g_j^0) (gjgj0),还要乘 o j o_j oj

( g j − g j 0 ) (g_j-g_j^0) (gjgj0)是“视觉希望移动的方向和量”; o j o_j oj是“这个高斯是不是实体表面”的可信度权重——越实的点越该推动粒子。


4 EXPERIMENTS

我们通过多项关键指标对所提出的系统进行了严格评估,以检验其在动态物体跟踪以及新视角下的光度重建方面的有效性。

Datasets 为评估我们的方法,我们同时使用了一个仿真数据集和一个真实数据集,二者均包含桌面场景。 仿真数据集(图 4)包含 25 个场景,用于突出不同的动态条件,包括:

单物体推动(5 个场景)、
多物体推动(5 个场景)、
物体拾取(5 个场景)、
物体推倒(5 个场景),
以及推动一根可变形绳索(5 个场景)。

真实数据集(图 5)同样包含 25 个场景,并呈现出类似的动态条件变化。 在真实世界实验中,物体上附着了 Aruco 标记。 这些标记用于通过结合 Aruco 检测、人工标注 以及 基于因子图的优化方法 [18] 来提取二维与三维的真实轨迹。 在两个数据集中,我们均使用 3 个摄像头来生成视觉力,另外 2 个摄像头仅用于评估。 这一多样化的实验设置使我们能够在一系列具有挑战性的场景下评估方法性能,涵盖刚体与可变形物体,以及单物体与多物体交互等情况。

Baselines 我们未能找到一个同时满足实时性、可校正性并且可作为世界模型的基线方法——因此,我们将本方法与那些分别具备跟踪能力或预测能力的基线进行比较。 我们强调,我们的主要贡献在于能够同时完成跟踪与预测。 因此,我们将本方法分别作为: 一个 三维跟踪器 与 Dynamic 3D Gaussians(D3DGS)[9] 对比; 一个 二维跟踪器 与 Cotracker [19] 对比; 以及一个 前向模型 与仅使用物理仿真器而不引入视觉力 [5] 的方法对比。

与我们的方法不同,D3DGS 通过辅助损失函数将物理先验直接引入到高斯优化过程中。 由于 D3DGS 无法在力作用于系统时预测高斯将如何演化,因此它无法像我们的方法一样作为世界模型使用。 此外,D3DGS 还要求在每一个时间步提供前景掩码。 在文献 [9] 中,这些掩码通过背景减除获得。 然而,我们发现,在仅使用 3 个摄像头且需满足严格实时性约束的条件下,该方法会导致灾难性的跟踪失败,如图 6 所示。 因此,为了使其具备可比性,我们对该基线进行了增强(记为 D3DGS*):为其提供人工标注的真实掩码,并强制与机器人相关的高斯按照机器人正向运动学进行运动,而非通过优化过程更新。 此外,我们发现 D3DGS 的辅助损失使其运行速度约为我们视觉训练迭代的一半;但我们假设可以通过优化使其速度与我们的方法相当,因此允许其执行 6 次训练迭代,以对齐我们 5 次训练迭代加 1 次物理仿真步的计算量。 我们方法的完整参数设置列于补充材料中。

Metrics 我们通过评估已知点在二维与三维轨迹上的平均误差来衡量方法性能。 我们还评估了从未见视角进行的前景光度重建质量(仅包含桌面上的物体)。 查询点的预测三维轨迹通过跟踪在初始时间步中与该点最近的高斯的坐标系来获得。 该过程与文献 [9] 中采用的方法一致。 将三维轨迹投影到各个摄像头中以获得二维轨迹,并使用其初始点作为输入来查询 Cotracker [19]。 轨迹误差被计算为在物体上采样的多个点,其真实轨迹与预测轨迹之间差异的平均值。

在这里插入图片描述
在这里插入图片描述

Results 图 4 和图 5 分别展示了仿真数据集与真实数据集中 25 个测试场景中的 5 个。 随时间变化的三维跟踪误差曲线表明,我们的方法能够稳定而鲁棒地跟踪场景中的物体。 表 1 和表 2 对各个场景下的评估指标进行了汇总。 除仿真的 Pickup(拾取)任务外,我们的方法在所有实验中均优于所有基线方法。 拾取任务属于高度动态的环境,其中我们所采用的物理先验与仿真场景中呈现的真实物理行为存在显著差异(参见网站上的视频)。 这突出了我们系统中一个符合预期的弱点:当物理先验与真实物理过程严重不匹配时,性能会下降。 尽管如此,如图 4 所示,我们的系统仍能够恢复并最终获取拾取任务的终态。 在其余 45/50 个实验中,物理先验显著提升了跟踪性能。 图 6 展示了定性结果。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


5 RELATED WORK

据我们所知,我们是首个提出一种同时由粒子与三维高斯构成的表示,用于在一个可校正的机器人世界模型中融合物理先验与视觉先验的工作。 然而,将基于粒子的物理系统与非高斯的视觉表示相结合,一直是其他一些工作的核心思想 [20, 21, 22, 23]。 此外,通过非物理框架的方式利用物理先验对高斯泼溅进行正则化的方法也已有探索 [9](即我们实验中使用的基线方法)。

ParticleNeRF [20] 使用由物理系统作用的粒子,并通过 Neural Radiance Field(NeRF)[24] 的形式从任意视角进行渲染。 这些粒子与潜在特征相关联,潜在特征可通过一个小型神经网络解码为辐射场。 尽管 ParticleNeRF 引入了基于粒子的物理系统(PBD),以在粒子位置层面结合物理约束并对 NeRF 的重建损失进行偏差建模,但其仅使用了碰撞约束,并未充分探索利用多种物理先验来正则化重建过程的思想。 部分由于 NeRF 表示本身较慢,且优化过程通常需要超过 10 个摄像头才能受到充分约束,ParticleNeRF 无法在具有实时性约束的真实机器人场景中部署。 相比之下,我们的工作使用速度更快的高斯泼溅来表示视觉世界,并且大量利用物理先验,从而仅需 3 个摄像头 即可实现视觉校正。

在外科机器人领域中,已有工作 [21, 22, 23] 使用 PBD 框架下的粒子,并结合来自观测点云的校正,来建模人体软组织。 相比之下,我们的方法更加通用、具备实时性,并且使用的是通过高速高斯泼溅获得的视觉反馈,而非点云或 SDF。

D3DGS [9] 将物理先验引入高斯优化过程,以正则化高斯的运动。 与我们的方法存在显著差异的是,D3DGS 中的物理先验并未通过物理系统被严格执行,而是通过向光度重建损失中加入辅助损失项来实现。 重要的是,这意味着 D3DGS 无法作为世界模型使用,因为它不能用于预测未来状态。 尽管如此,在提供真实掩码,或使用 20 个以上分布良好的摄像头 并给予优化过程充足收敛时间的情况下,D3DGS 仍表现出良好的跟踪与重建性能。 尽管这些条件在机器人场景中难以满足,这种纯视觉驱动的优化方法仍被我们作为基线,用于剥离我们系统中的视觉组件,并突出通过物理系统对优化过程进行约束的重要性。


6 LIMITATIONS AND CONCLUSIONS

我们的方法是在一个桌面场景中进行验证的,在该场景中可以大量利用物理先验。 将该方法扩展到开放世界场景的工作留待未来研究。 我们做出一个假设:预测状态与真实状态足够接近,从而使得视觉力能够有效发挥作用。 当建模中存在显著误差,使得物理系统累积误差的速度快于可被校正的速度时,这一假设将不再成立。 当机器人以非常快的速度移动物体时,就可能出现这种情况。 因此,有必要引入一种利用全局视觉信息进行闭环控制的方法——例如采用类似于 [25] 的系统。 我们预计,若采用结合学习得到的形状先验的、更为复杂的初始化流程,将具备更强的能力。 最后,一旦完成建模,我们的方法不会再改变物体的物理结构或物理参数。 因此,新的观测数据不会被用于纠正建模阶段产生的错误。 引入在线结构修正与系统辨识的机制,将能够扩展这一框架。

总而言之,我们提出了一种由粒子与三维高斯组成的混合表示,共同刻画世界的物理状态与视觉状态。 二者结合后,既可用于预测未来状态,又可利用观测数据对预测状态进行校正。 这种协同作用使其非常适合作为未来机器人研究中的世界模型。 该世界模型可进一步用于:为基于强化学习或模仿学习的策略提取物体状态,或通过模型预测控制(MPC) 来规划未来动作。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐