三维向量的叉积
两个向量的叉积是一个向量,它具有以下特性和几何意义:
1. 定义
假设两个三维向量
a
\mathbf{a}
a 和
b
\mathbf{b}
b,它们的叉积(或向量积)定义为:
c
=
a
×
b
\mathbf{c} = \mathbf{a} \times \mathbf{b}
c=a×b
其计算公式为:
c
=
∣
i
j
k
a
x
a
y
a
z
b
x
b
y
b
z
∣
=
i
(
a
y
b
z
−
a
z
b
y
)
−
j
(
a
x
b
z
−
a
z
b
x
)
+
k
(
a
x
b
y
−
a
y
b
x
)
c=∣ijkaxayazbxbybz∣=i(aybz−azby)−j(axbz−azbx)+k(axby−aybx)
c=∣ijkaxayazbxbybz∣=i(aybz−azby)−j(axbz−azbx)+k(axby−aybx)
c = ∣ i j k a x a y a z b x b y b z ∣ = i ( a y b z − a z b y ) − j ( a x b z − a z b x ) + k ( a x b y − a y b x ) \mathbf{c} = \begin{vmatrix} \mathbf{i} & \mathbf{j} & \mathbf{k} \\ a_x & a_y & a_z \\ b_x & b_y & b_z \end{vmatrix} = \mathbf{i}(a_y b_z - a_z b_y) - \mathbf{j}(a_x b_z - a_z b_x) + \mathbf{k}(a_x b_y - a_y b_x) c= iaxbxjaybykazbz =i(aybz−azby)−j(axbz−azbx)+k(axby−aybx)
其中 i , j , k \mathbf{i}, \mathbf{j}, \mathbf{k} i,j,k 是单位向量。
- a = ( a x , a y , a z ) \mathbf{a} = (a_x, a_y, a_z) a=(ax,ay,az)
- b = ( b x , b y , b z ) \mathbf{b} = (b_x, b_y, b_z) b=(bx,by,bz)
- c = ( c x , c y , c z ) \mathbf{c} = (c_x, c_y, c_z) c=(cx,cy,cz)
2. 几何意义
- 方向:
c \mathbf{c} c 的方向垂直于 a \mathbf{a} a 和 b \mathbf{b} b 所在的平面(符合右手定则)。- 右手定则:
如果右手的四指从 a \mathbf{a} a 的方向弯向 b \mathbf{b} b 的方向,则大拇指的方向就是 a × b \mathbf{a} \times \mathbf{b} a×b 的方向。
- 右手定则:
- 大小:
∣ c ∣ = ∣ a × b ∣ = ∣ a ∣ ∣ b ∣ sin θ |\mathbf{c}| = |\mathbf{a} \times \mathbf{b}| = |\mathbf{a}| |\mathbf{b}| \sin\theta ∣c∣=∣a×b∣=∣a∣∣b∣sinθ,
其中 θ \theta θ 是 a \mathbf{a} a 和 b \mathbf{b} b 之间的夹角。- sin θ = 0 \sin\theta = 0 sinθ=0 时( a \mathbf{a} a 和 b \mathbf{b} b 平行或反平行),叉积为零向量。
- sin θ = 1 \sin\theta = 1 sinθ=1 时( a \mathbf{a} a 和 b \mathbf{b} b 垂直),叉积大小最大。
3. 物理意义
- 垂直向量:
叉积 a × b \mathbf{a} \times \mathbf{b} a×b 得到的向量 c \mathbf{c} c 是垂直于 a \mathbf{a} a 和 b \mathbf{b} b 的平面法向量。 - 平行四边形面积:
∣ a × b ∣ |\mathbf{a} \times \mathbf{b}| ∣a×b∣ 的大小等于由 a \mathbf{a} a 和 b \mathbf{b} b 作为邻边构成的平行四边形的面积。
4. 性质
-
反对称性:
a × b = − ( b × a ) \mathbf{a} \times \mathbf{b} = -(\mathbf{b} \times \mathbf{a}) a×b=−(b×a) -
分配律:
a × ( b + c ) = ( a × b ) + ( a × c ) \mathbf{a} \times (\mathbf{b} + \mathbf{c}) = (\mathbf{a} \times \mathbf{b}) + (\mathbf{a} \times \mathbf{c}) a×(b+c)=(a×b)+(a×c) -
与标量的关系:
如果 k k k 是标量:
( k a ) × b = k ( a × b ) (k\mathbf{a}) \times \mathbf{b} = k(\mathbf{a} \times \mathbf{b}) (ka)×b=k(a×b) -
与自身的叉积:
a × a = 0 \mathbf{a} \times \mathbf{a} = \mathbf{0} a×a=0
因为任何向量与自身平行, sin θ = 0 \sin\theta = 0 sinθ=0。因为任何向量与自身平行, sin θ = 0 \sin\theta = 0 sinθ=0。
5. 在实际应用中的例子
-
法向量计算:
在计算一个平面或三角形的法向量时,用叉积得到垂直于平面的向量。 -
力矩:
力矩 τ \mathbf{\tau} τ 是力 F \mathbf{F} F 关于旋转轴的位置向量 r \mathbf{r} r 的叉积:
τ = r × F \mathbf{\tau} = \mathbf{r} \times \mathbf{F} τ=r×F
力矩的大小与力、作用点到旋转轴的距离,以及它们的夹角有关。力矩的大小与力、作用点到旋转轴的距离,以及它们的夹角有关。
-
角动量:
角动量 L \mathbf{L} L 是位置向量 r \mathbf{r} r 和动量 p \mathbf{p} p 的叉积:
L = r × p \mathbf{L} = \mathbf{r} \times \mathbf{p} L=r×p
总结
两个向量的叉积产生了一个垂直于原向量所在平面的向量,其大小反映了这两个向量围成的平行四边形的面积。它是描述向量间几何关系的有力工具,广泛用于物理和计算机图形学等领域。
向量到平面的投影
计算一个向量到某一个平面的投影向量,涉及到向量投影和正交分解的概念。假设我们有一个向量 v \mathbf{v} v,需要将它投影到一个平面 Π \Pi Π 上,平面的法向量为 n \mathbf{n} n。
公式推导
1. 向量的分解
将向量 v \mathbf{v} v 分解为:
- 平行于法向量 n \mathbf{n} n 的分量: v ∥ \mathbf{v}_\parallel v∥
- 平行于平面 Π \Pi Π 的分量(即投影向量): v ⊥ \mathbf{v}_\perp v⊥
v = v ∥ + v ⊥ \mathbf{v} = \mathbf{v}_\parallel + \mathbf{v}_\perp v=v∥+v⊥
2. 计算平行于法向量的分量
平行于法向量
n
\mathbf{n}
n 的分量是
v
\mathbf{v}
v 在
n
\mathbf{n}
n 方向上的投影:
v
∥
=
v
⋅
n
∥
n
∥
2
n
\mathbf{v}_\parallel = \frac{\mathbf{v} \cdot \mathbf{n}}{\|\mathbf{n}\|^2} \mathbf{n}
v∥=∥n∥2v⋅nn
3. 计算投影向量
投影向量
v
⊥
\mathbf{v}_\perp
v⊥ 是
v
\mathbf{v}
v 减去平行分量:
v
⊥
=
v
−
v
∥
\mathbf{v}_\perp = \mathbf{v} - \mathbf{v}_\parallel
v⊥=v−v∥
将
v
∥
\mathbf{v}_\parallel
v∥ 代入上式:
v
⊥
=
v
−
v
⋅
n
∥
n
∥
2
n
\mathbf{v}_\perp = \mathbf{v} - \frac{\mathbf{v} \cdot \mathbf{n}}{\|\mathbf{n}\|^2} \mathbf{n}
v⊥=v−∥n∥2v⋅nn
4. 最终结果
v 投影 = v ⊥ = v − v ⋅ n ∥ n ∥ 2 n \mathbf{v}_\text{投影} = \mathbf{v}_\perp = \mathbf{v} - \frac{\mathbf{v} \cdot \mathbf{n}}{\|\mathbf{n}\|^2} \mathbf{n} v投影=v⊥=v−∥n∥2v⋅nn
向量投影示意图
若需要进一步可视化,我可以绘制一张图展示 v \mathbf{v} v 在平面上的投影关系。
示例计算
假设:
- v = ( 3 , 4 , 5 ) \mathbf{v} = (3, 4, 5) v=(3,4,5)
- 平面法向量 n = ( 0 , 0 , 1 ) \mathbf{n} = (0, 0, 1) n=(0,0,1)
步骤:
-
计算点积 v ⋅ n \mathbf{v} \cdot \mathbf{n} v⋅n:
v ⋅ n = 3 ⋅ 0 + 4 ⋅ 0 + 5 ⋅ 1 = 5 \mathbf{v} \cdot \mathbf{n} = 3 \cdot 0 + 4 \cdot 0 + 5 \cdot 1 = 5 v⋅n=3⋅0+4⋅0+5⋅1=5 -
计算法向量的模长平方 ∣ n ∣ 2 |\mathbf{n}|^2 ∣n∣2:
∥ n ∥ 2 = 0 2 + 0 2 + 1 2 = 1 \|\mathbf{n}\|^2 = 0^2 + 0^2 + 1^2 = 1 ∥n∥2=02+02+12=1 -
计算平行分量 v ∥ \mathbf{v}_\parallel v∥:
v ∥ = 5 1 ( 0 , 0 , 1 ) = ( 0 , 0 , 5 ) \mathbf{v}_\parallel = \frac{5}{1}(0, 0, 1) = (0, 0, 5) v∥=15(0,0,1)=(0,0,5) -
计算投影向量 v ⊥ \mathbf{v}_\perp v⊥:
v ⊥ = v − v ∥ = ( 3 , 4 , 5 ) − ( 0 , 0 , 5 ) = ( 3 , 4 , 0 ) \mathbf{v}_\perp = \mathbf{v} - \mathbf{v}_\parallel = (3, 4, 5) - (0, 0, 5) = (3, 4, 0) v⊥=v−v∥=(3,4,5)−(0,0,5)=(3,4,0)
最终结果:
v
投影
=
(
3
,
4
,
0
)
\mathbf{v}_\text{投影} = (3, 4, 0)
v投影=(3,4,0)
PFH (Point Feature Histogram) 是一种常用的三维点云特征描述子,专门用于点云中的关键点描述和特征提取。它是一种基于几何关系的描述子,用于捕获点云局部几何特征。PFH 描述子广泛应用于三维点云的配准、物体识别和分类等任务中。
PFH 的基本概念
PFH 描述子通过计算目标点与其邻域点的几何关系,生成一个高维直方图来表示该点的局部特征。它包含了以下步骤:
- 邻域搜索:
对目标点查找其邻域内的所有点(通常通过半径搜索或 k 近邻搜索)。 - 局部坐标系定义:
对于目标点 p i p_i pi 和其邻域中的每一个点 p j p_j pj,定义一个局部坐标系来描述两点之间的几何关系。 - 几何特征计算:
在局部坐标系中,计算两点之间的几何特征,主要包括:- α \alpha α (alpha): 描述点对之间的角度偏差;
- ϕ \phi ϕ (phi): 法向量的角度关系;
- θ \theta θ (theta): 点对向量与法向量的夹角。
- 特征直方图构建:
将计算得到的几何特征 ( α , ϕ , θ \alpha, \phi, \theta α,ϕ,θ) 分别量化为直方图的不同维度。最后将这些直方图组合成一个高维直方图,作为目标点的描述子。
PFH 描述子的公式
对于每对点 ( p i , p j ) (p_i, p_j) (pi,pj),定义以下几何关系:
- 向量定义:
- d = p j − p i \mathbf{d} = \mathbf{p}_j - \mathbf{p}_i d=pj−pi,为两点之间的方向向量。
- n i , n j \mathbf{n}_i, \mathbf{n}_j ni,nj 为点 p i , p j p_i, p_j pi,pj 的法向量。
- 几何特征:
- α = arctan ( n j ⋅ ( d × n i ) d ⋅ n i ) \alpha = \arctan \left( \frac{\mathbf{n}_j \cdot (\mathbf{d} \times \mathbf{n}_i)}{\mathbf{d} \cdot \mathbf{n}_i} \right) α=arctan(d⋅ninj⋅(d×ni))
- ϕ = arccos ( n i ⋅ d ) \phi = \arccos (\mathbf{n}_i \cdot \mathbf{d}) ϕ=arccos(ni⋅d)
- θ = arccos ( n i ⋅ n j ) \theta = \arccos (\mathbf{n}_i \cdot \mathbf{n}_j) θ=arccos(ni⋅nj)
- 直方图构建: 将这些几何特征投影到直方图中,生成固定维度的特征描述子。
PFH 描述子几何特征详解
在 PFH(Point Feature Histogram)描述子中, α , ϕ , θ \alpha, \phi, \theta α,ϕ,θ 是用来描述点对 ( p i , p j ) (p_i, p_j) (pi,pj) 之间局部几何关系的三个核心参数。它们通过点云位置和法向量的相对关系,捕获点云局部的几何结构。
符号定义
- p i , p j \mathbf{p}_i, \mathbf{p}_j pi,pj:两点的位置向量。
- n i , n j \mathbf{n}_i, \mathbf{n}_j ni,nj:两点对应的法向量。
- d = p j − p i \mathbf{d} = \mathbf{p}_j - \mathbf{p}_i d=pj−pi:两点之间的方向向量。
以下是三个特征的逐项解析:
1. α \alpha α:
α = arctan ( n j ⋅ ( d × n i ) d ⋅ n i ) \alpha = \arctan \left( \frac{\mathbf{n}_j \cdot (\mathbf{d} \times \mathbf{n}_i)}{\mathbf{d} \cdot \mathbf{n}_i} \right) α=arctan(d⋅ninj⋅(d×ni))
- 几何意义:
α \alpha α 描述了法向量 n j \mathbf{n}_j nj 和 d \mathbf{d} d 方向向量之间的扭转关系,是对三者的空间交互关系的一个度量。 - 分子
n
j
⋅
(
d
×
n
i
)
\mathbf{n}_j \cdot (\mathbf{d} \times \mathbf{n}_i)
nj⋅(d×ni):
- 计算 d × n i \mathbf{d} \times \mathbf{n}_i d×ni,即方向向量 d \mathbf{d} d 和法向量 n i \mathbf{n}_i ni 的叉积,得到一个垂直于 d \mathbf{d} d 和 n i \mathbf{n}_i ni 平面的向量。
- 点积 n j ⋅ ( d × n i ) \mathbf{n}_j \cdot (\mathbf{d} \times \mathbf{n}_i) nj⋅(d×ni) 计算 n j \mathbf{n}_j nj 在该平面垂直方向上的投影,从而衡量 n j \mathbf{n}_j nj 与该平面的偏离程度。
- 分母
d
⋅
n
i
\mathbf{d} \cdot \mathbf{n}_i
d⋅ni:
- 表示方向向量 d \mathbf{d} d 在法向量 n i \mathbf{n}_i ni 上的投影。
- 分母用来对分子归一化,确保 α \alpha α 的取值范围符合 arctan \arctan arctan 的定义域。
- 关键点:
α \alpha α 的正负与值大小反映了 n j \mathbf{n}_j nj 在 n i \mathbf{n}_i ni 和 d \mathbf{d} d 所定义的平面中的相对旋转角度。
2. ϕ \phi ϕ:
ϕ = arccos ( n i ⋅ d ) \phi = \arccos (\mathbf{n}_i \cdot \mathbf{d}) ϕ=arccos(ni⋅d)
- 几何意义:
ϕ \phi ϕ 是 n i \mathbf{n}_i ni 和 d \mathbf{d} d 之间的夹角,表示法向量 n i \mathbf{n}_i ni 与方向向量 d \mathbf{d} d 的对齐程度。 - 公式推导:
- n i ⋅ d = ∣ n i ∣ ∣ d ∣ cos ϕ \mathbf{n}_i \cdot \mathbf{d} = |\mathbf{n}_i| |\mathbf{d}| \cos\phi ni⋅d=∣ni∣∣d∣cosϕ,点积直接给出了夹角的余弦值。
- 通过 arccos \arccos arccos 得到角度 ϕ \phi ϕ。
- 取值范围:
- ϕ ∈ [ 0 , π ] \phi \in [0, \pi] ϕ∈[0,π]。
- 当 ϕ = 0 \phi = 0 ϕ=0 时, n i \mathbf{n}_i ni 和 d \mathbf{d} d 完全平行。
- 当 ϕ = π / 2 \phi = \pi/2 ϕ=π/2 时, n i \mathbf{n}_i ni 和 d \mathbf{d} d 正交。
- 当 ϕ = π \phi = \pi ϕ=π 时, n i \mathbf{n}_i ni 和 d \mathbf{d} d 完全反向。
3. θ \theta θ:
θ = arccos ( n i ⋅ n j ) \theta = \arccos (\mathbf{n}_i \cdot \mathbf{n}_j) θ=arccos(ni⋅nj)
- 几何意义:
θ \theta θ 是 n i \mathbf{n}_i ni 和 n j \mathbf{n}_j nj 之间的夹角,描述两点法向量的方向差异。 - 公式推导:
- n i ⋅ n j = ∣ n i ∣ ∣ n j ∣ cos θ \mathbf{n}_i \cdot \mathbf{n}_j = |\mathbf{n}_i| |\mathbf{n}_j| \cos\theta ni⋅nj=∣ni∣∣nj∣cosθ。
- 通过 arccos \arccos arccos 计算夹角 θ \theta θ。
- 取值范围:
- θ ∈ [ 0 , π ] \theta \in [0, \pi] θ∈[0,π]。
- 当 θ = 0 \theta = 0 θ=0 时, n i \mathbf{n}_i ni 和 n j \mathbf{n}_j nj 方向完全一致。
- 当 θ = π / 2 \theta = \pi/2 θ=π/2 时, n i \mathbf{n}_i ni 和 n j \mathbf{n}_j nj 正交。
- 当 θ = π \theta = \pi θ=π 时, n i \mathbf{n}_i ni 和 n j \mathbf{n}_j nj 方向完全相反。
三者的关系与直方图构建
- 三角参数的物理意义:
这三个参数从不同角度描述了点对 ( p i , p j ) (p_i, p_j) (pi,pj) 的几何关系:- α \alpha α:捕获法向量与方向向量之间的旋转信息。
- ϕ \phi ϕ:描述法向量 n i \mathbf{n}_i ni 与方向向量 d \mathbf{d} d 的夹角。
- θ \theta θ:衡量两个点的法向量之间的角度差异。
- 直方图构建:
- 对每个点对 ( p i , p j ) (p_i, p_j) (pi,pj) 计算上述三种特征。
- 将三种特征分别量化到直方图的不同维度中,最终得到一个高维直方图。
直观解释
可以将 α , ϕ , θ \alpha, \phi, \theta α,ϕ,θ 看作是对局部几何关系的“全面体检”:
- α \alpha α 检查法向量如何绕着方向向量旋转;
- ϕ \phi ϕ 检查方向向量在法向量的方向上有多大的偏移;
- θ \theta θ 检查法向量之间是否一致。
它们结合起来,完整描述了点对之间的空间几何关系。
PFH 的特性
- 高维度: PFH 描述子的维度较高(125 维),因为它对每个点对的几何关系都进行精确建模。这使得 PFH 能够捕获更详细的局部信息。
- 鲁棒性: PFH 对噪声和点云稀疏程度具有较好的鲁棒性,但其计算复杂度较高。
- 对点对几何关系的建模: PFH 考虑了邻域中每对点的几何关系,这使得它可以捕获更多的信息,但也导致了较高的计算复杂度。
PFH 的优缺点
优点:
- 丰富信息: PFH 捕获了邻域点之间的所有几何关系,信息量丰富。
- 高鲁棒性: 对于复杂的局部几何形状,PFH 描述子表现出色。
缺点:
- 高计算复杂度: 由于考虑了邻域中每对点的关系,PFH 的计算复杂度为 O ( n 2 ) O(n^2) O(n2)。
- 高维度: PFH 的高维度可能会导致存储和匹配上的性能问题。
FPFH (Fast PFH)
由于 PFH 的计算复杂度较高,提出了一种加速版本 FPFH (Fast Point Feature Histogram)。
FPFH 不再计算邻域中所有点对的几何关系,而是通过分层的方法,只计算目标点与邻域点的几何关系,再结合邻域点的 PFH 特征进行加权组合,从而降低计算复杂度到
O
(
n
)
O(n)
O(n)。
PFH 的应用场景
- 点云配准:
使用 PFH 描述子匹配关键点,完成不同点云的对齐。 - 物体识别:
对三维点云中的物体进行特征提取,用于物体分类和识别。 - 局部特征分析:
PFH 描述子可以描述点云局部的几何特性,用于三维形状分析。
示例代码
以下是一个计算点云 PFH 描述子的简要示例:
#include <pcl/io/pcd_io.h>
#include <pcl/features/pfh.h>
#include <pcl/features/normal_3d.h>
typedef pcl::PointXYZ PointT;
int main() {
// 读取点云
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
pcl::io::loadPCDFile("cloud.pcd", *cloud);
// 计算法向量
pcl::NormalEstimation<PointT, pcl::Normal> ne;
ne.setInputCloud(cloud);
pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
ne.setSearchMethod(tree);
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
ne.setRadiusSearch(0.05); // 半径搜索
ne.compute(*normals);
// 计算 PFH 描述子
pcl::PFHEstimation<PointT, pcl::Normal, pcl::PFHSignature125> pfh;
pfh.setInputCloud(cloud);
pfh.setInputNormals(normals);
pfh.setSearchMethod(tree);
pcl::PointCloud<pcl::PFHSignature125>::Ptr pfh_features(new pcl::PointCloud<pcl::PFHSignature125>);
pfh.setRadiusSearch(0.1); // 设置搜索半径
pfh.compute(*pfh_features);
std::cout << "PFH features computed: " << pfh_features->size() << std::endl;
return 0;
}
为什么PFH特征是旋转不变的?
PFH特征通过对局部几何形状的描述来表示每个点的特征,它不仅依赖于点的位置,还依赖于点与其邻域内其他点的几何关系,具体包括法向量和点之间的角度信息。旋转不变性来源于PFH的计算方式,它利用了点云中每个点的局部几何关系,而不依赖于点云的绝对位置和方向。
PFH特征的核心步骤包括:
- 法向量计算:PFH首先计算每个点的法向量,这对于描述点云的局部形状至关重要。
- 计算角度信息:PFH通过计算邻域内点与目标点的相对角度,考虑了法向量与其他点之间的关系。这些角度信息本质上是旋转不变的,因为它们只是描述了点之间的几何关系,而不受全局旋转的影响。
因此,即使点云在空间中被旋转,PFH特征也能保持不变。这使得PFH特征特别适用于处理在不同角度下捕获的点云数据,保证了特征的稳健性和一致性。
总结
PFH特征对旋转具有不变性,这使得它在处理3D点云数据时,尤其是在物体识别和配准任务中非常有用。