一、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 个自由度。