Plücker直线_ 用两个三维向量描述一条空间直线

一、Plücker 直线表示

为什么不只用两个端点表示三维直线?

最直观的表示方法,是用三维直线上的两个点 (\mathbf A,\mathbf B) 表示一条线。

但在运动估计中,**端点可能不可见、会被遮挡,**或者随着视角变化无法稳定对应。我们真正关心的是这条直线本身,而不是两个特定端点。

Plücker 直线表示中的两个三维向量通常写成:

L=(d,m) \boxed{\mathcal{L}=(\mathbf d,\mathbf m)} L=(d,m)

其中:

  • d\mathbf dd:直线的方向向量,描述直线朝哪个方向延伸。
  • m\mathbf mm:直线的矩向量(moment),描述这条直线相对于坐标原点的位置关系。

最关键的是:d\mathbf dd 描述方向,m\mathbf mm 则把直线的位置编码进去。 它不是直线上某个点的坐标,也不是直线到原点的距离。

1. 先用几何直觉理解 m\mathbf mm

假设空间中有一条直线,取直线上任意一点 p\mathbf pp,方向向量为 d\mathbf dd,那么矩向量定义为:

m=p×d \boxed{\mathbf m=\mathbf p\times\mathbf d} m=p×d

这里的 ×\times× 表示三维向量叉乘。

几何直觉:方向向量描述直线的朝向;位置向量与方向向量的叉积,编码直线相对于原点的位置。

为什么叉乘可以描述位置?

叉乘的模长满足:

∥m∥=∥p∥∥d∥sin⁡θ \|\mathbf m\|=\|\mathbf p\|\|\mathbf d\|\sin\theta ∥m∥=∥p∥∥d∥sinθ

其中 θ\thetaθ 是 p\mathbf pp 与 d\mathbf dd 的夹角。

由于 p\mathbf pp 可以分解成沿直线方向和垂直直线方向的两部分,沿方向的部分对叉乘没有贡献,因此:

∥m∥=∥d∥⋅dist⁡(O,L)⏟原点到直线的距离 \|\mathbf m\|=\|\mathbf d\|\cdot \underbrace{\operatorname{dist}(O,\mathcal L)}_{\text{原点到直线的距离}} ∥m∥=∥d∥⋅原点到直线的距离 dist(O,L)

这里假设 d\mathbf dd 不一定是单位向量。

因此,当 d\mathbf dd 是单位向量时:

∣m∣=dist⁡(O,L) \boxed{\\|\mathbf m\\|=\operatorname{dist}(O,\mathcal L)} ∣m∣=dist(O,L)

注意,m\mathbf mm 的模长能够表示距离,但它本身是一个有方向的三维向量,包含的信息比单纯的距离更多。

2. 举个具体的三维数值例子

假设一条直线经过点:

p=120 \mathbf p= \begin{bmatrix} 1\\2\\0 \end{bmatrix} p= 120

方向向量为:

d=001 \mathbf d= \begin{bmatrix} 0\\0\\1 \end{bmatrix} d= 001

这表示直线平行于 ZZZ 轴,经过 (1,2,0)(1,2,0)(1,2,0)。

计算矩向量:

m=p×d \mathbf m=\mathbf p\times\mathbf d m=p×d

按照叉乘公式:

m=pydz−pzdypzdx−pxdzpxdy−pydx=2−10 \mathbf m= \begin{bmatrix} p_y d_z-p_z d_y\\ p_z d_x-p_x d_z\\ p_x d_y-p_y d_x \end{bmatrix} = \begin{bmatrix} 2\\-1\\0 \end{bmatrix} m= pydz−pzdypzdx−pxdzpxdy−pydx = 2−10

因此,这条直线的 Plücker 表示为:

d=001,m=2−10 \boxed{ \mathbf d= \begin{bmatrix}0\\0\\1\end{bmatrix}, \qquad \mathbf m= \begin{bmatrix}2\\-1\\0\end{bmatrix} } d= 001 ,m= 2−10

这个结果怎么理解?

  • d=(0,0,1)T\mathbf d=(0,0,1)^Td=(0,0,1)T:直线沿 ZZZ 轴方向。
  • m=(2,−1,0)T\mathbf m=(2,-1,0)^Tm=(2,−1,0)T:编码这条直线在 XYXYXY 平面中的偏移关系。
  • ∥m∥=22+(−1)2=5\|\mathbf m\|=\sqrt{2^2+(-1)^2}=\sqrt5∥m∥=22+(−1)2 =5 :原点到该直线的最短距离。

由于直线平行于 ZZZ 轴,它在 XYXYXY 平面上的投影是点 (1,2)(1,2)(1,2),所以原点到直线的距离就是:

12+22=5 \sqrt{1^2+2^2}=\sqrt5 12+22 =5

两种计算结果一致。

3. 为什么不直接用直线上一点 p\mathbf pp,还要引入 m\mathbf mm?

因为一条直线上有无穷多个点。

同一条直线可以写成:

p(λ)=p+λd \mathbf p(\lambda)=\mathbf p+\lambda\mathbf d p(λ)=p+λd

其中 λ\lambdaλ 是任意实数。

如果换一个点 p′=p+λd\mathbf p'=\mathbf p+\lambda\mathbf dp′=p+λd,则:

m′=p′×d =(p+λd)×d =p×d+λ(d×d) =p×d =m \begin{aligned} \mathbf m' &=\mathbf p'\times\mathbf d\\\ &=(\mathbf p+\lambda\mathbf d)\times\mathbf d\\\ &=\mathbf p\times\mathbf d+ \lambda(\mathbf d\times\mathbf d)\\\ &=\mathbf p\times\mathbf d\\\ &=\mathbf m \end{aligned} m′ =p′×d=(p+λd)×d=p×d+λ(d×d)=p×d=m

因为任何向量与自身的叉积都是零。

这就是矩向量的一个重要性质:沿着同一条直线更换取点位置,m\mathbf mm 不变。

因此,(d,m)(\mathbf d,\mathbf m)(d,m) 不依赖于你选择直线上的哪个点,能更加紧凑、统一地表示一条空间直线。

4. 在事件相机和 VIO 中,为什么要用 Plücker 表示?

事件相机的线特征可以通过不同时刻的事件观测得到。结合相机运动信息,可以将图像中的线观测与三维空间中的直线联系起来。

使用 Plücker 表示时:

  • d\mathbf dd 表示空间线的方向。
  • m\mathbf mm 表示空间线相对于坐标原点的位置。
  • 两个向量可以方便地参与三维几何约束、坐标变换和运动估计。

另外,Plücker 坐标有一个约束:

dTm=0 \boxed{\mathbf d^\mathsf T\mathbf m=0} dTm=0

因为:

dTm=dT(p×d)=0 \mathbf d^\mathsf T\mathbf m =\mathbf d^\mathsf T(\mathbf p\times\mathbf d)=0 dTm=dT(p×d)=0

也就是说,方向向量和矩向量相互垂直。

需要注意,d\mathbf dd 和 m\mathbf mm 不是完全独立的六个自由参数:它们满足上述约束,而且 Plücker 坐标整体乘以同一个非零系数仍然表示同一条几何直线。因此,一条空间直线实际只有 4 个自由度。

最后可以记住这句话:

Plücker 表示中的 m=p×d\mathbf m=\mathbf p\times\mathbf dm=p×d,本质上是用"位置向量与方向向量的叉积",消除直线上取点的任意性,从而把空间直线相对于坐标原点的位置编码进一个三维向量中。

二、为什么Plücker直线有 4 个自由度?

这里说的 Plücker 直线有 4 个自由度,指的是:在三维空间中,确定一条无限长的直线,需要 4 个独立参数。

注意,不是说 Plücker 表示只有 4 个数字。它实际用两个三维向量表示:

L=(d,m) \mathcal L=(\mathbf d,\mathbf m) L=(d,m)

其中:

  • d=(dx,dy,dz)\mathbf d=(d_x,d_y,d_z)d=(dx,dy,dz):直线方向向量,3 个数。
  • m=(mx,my,mz)\mathbf m=(m_x,m_y,m_z)m=(mx,my,mz):直线力矩向量,3 个数。

总共是 6 个数,但只有 4 个自由度。原因是存在两个约束。

1. 第一个约束:方向向量与力矩向量垂直

力矩向量定义为:

m=p×d \mathbf m=\mathbf p\times\mathbf d m=p×d

其中 p\mathbf pp 是直线上的任意一点。

叉乘的性质决定了,m\mathbf mm 一定垂直于 d\mathbf dd,因此:

d⊤m=0 \boxed{\mathbf d^\top\mathbf m=0} d⊤m=0

展开就是:

dxmx+dymy+dzmz=0 d_xm_x+d_ym_y+d_zm_z=0 dxmx+dymy+dzmz=0

这是一条独立的标量约束,因此自由度减少 1 个:

6−1=5 6-1=5 6−1=5

2. 第二个约束:整体尺度不影响直线

假设将两个向量同时乘以任意非零常数 kkk:

d′=kd,m′=km \mathbf d'=k\mathbf d,\qquad \mathbf m'=k\mathbf m d′=kd,m′=km

它们表示的仍然是同一条几何直线。

例如,方向向量:

d=(1,2,0) \mathbf d=(1,2,0) d=(1,2,0)

和

d′=(2,4,0) \mathbf d'=(2,4,0) d′=(2,4,0)

指向相同的方向。如果力矩向量也同时乘以 2,整组 Plücker 坐标依然描述同一条直线。

所以,6 个数中还有一个整体尺度自由度不代表新的几何信息。

再减去 1 个自由度:

6−1−1=4 \boxed{6-1-1=4} 6−1−1=4

3. 这 4 个自由度具体是哪四个?

可以从更直观的几何角度理解。

自由度 1、2:直线的方向

  • 水平方位角 α\alphaα:直线朝哪个水平方向。
  • 仰角 β\betaβ:直线相对水平面的倾斜程度。

一个三维方向的单位向量可以写成:

d=cos⁡βcos⁡αcos⁡βsin⁡αsin⁡β \mathbf d= \begin{bmatrix} \cos\beta\cos\alpha\\ \cos\beta\sin\alpha\\ \sin\beta \end{bmatrix} d= cosβcosαcosβsinαsinβ

方向确定后,还剩下直线在空间中具体位于哪里。

自由度 3、4:直线的位置

给定直线方向后,可以用直线上距离原点最近的点 q\mathbf qq 描述其位置。

由于 q\mathbf qq 必须垂直于方向 d\mathbf dd:

q⊤d=0 \mathbf q^\top\mathbf d=0 q⊤d=0

q\mathbf qq 原本有 3 个坐标,但受到一个约束,因此只有 2 个独立参数。

这两个参数描述直线相对原点的横向偏移。

因此,4 个自由度可以总结为:

几何含义 自由度
直线方向的方位角 1
直线方向的仰角 1
直线位置的第一个独立参数 1
直线位置的第二个独立参数 1
合计 4

这里的"位置"不包含沿直线方向选择哪个点的自由度,因为沿同一条直线移动选取的点,不会改变这条无限长直线本身。

4. 运动估计算法

在 运动估计算法中,Plücker 表示的意义就在于:

  • d\mathbf dd 描述三维线的方向。
  • m\mathbf mm 描述三维线相对于坐标原点的位置关系。
  • 相机运动会改变这条线在相机坐标系中的表示。
  • 多个时刻的事件观测提供约束,帮助恢复直线参数与相机运动。

因此,虽然 Plücker 坐标写成 6 个数,但实际优化时不能把它们当成 6 个完全独立的未知量,否则可能引入冗余或违反直线约束。

最简洁的回答: 三维直线有 4 个自由度:方向需要 2 个参数,空间位置需要 2 个参数。Plücker 用 6 个数表示它,但由于方向与力矩满足 d⊤m=0\mathbf d^\top\mathbf m=0d⊤m=0,并且整体尺度不影响直线,最终只有 6−1−1=46-1-1=46−1−1=4 个自由度。

相关推荐
小道士写程序1 小时前
Rust 中的字符串与切片(String 与 &str)
算法
Tisfy1 小时前
LeetCode 3863.将一个字符串排序的最小操作次数:分类讨论(一次遍历)——简单易懂版
算法·leetcode·字符串·题解·分类讨论
Young Doro1 小时前
从平衡表征到最小充分因果表征:端到端神经网络因果效应估计
算法
0+1112 小时前
算法 --递归
算法·leetcode
打工仔折腾 AI2 小时前
介入式脑机接口的跨尺度解码与闭环调控:从算法落地到后端工程实践
人工智能·后端·python·深度学习·算法·ai agent 实战
凤山老林2 小时前
授权模型只会RBAC?深入 ABAC 授权模型,实现权限判断做成策略引擎
大数据·数据库·算法
海绵宝宝转agent3 小时前
2026-10-21学习笔记
笔记·学习·算法
Dxy12393102163 小时前
ShardingSphere 自定义分片算法:BINARY(16) UUIDv7 哈希分片实现
算法·哈希算法
罗湖老棍子14 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环