普吕克线
在 Plücker 坐标表示中,一条直线
l
‾
1
\underline{l}_1
l1可以用以下两个向量来表示:
l
‾
1
=
l
1
+
ϵ
m
1
\underline{l}_1 = l_1+ \epsilon m_1
l1=l1+ϵm1
- 方向向量 l 1 l_1 l1:表示直线的方向。
- 动量向量
m
1
m_1
m1:表示直线在空间中的位置特性,通常定义为:
m 1 = p l × l 1 m_1 = p_l \times l_1 m1=pl×l1
其中, p l p_l pl 是直线上任意一点的位置向量, × \times × 表示叉积。
点到直线的距离公式
对于一个点 p ∈ H p p \in \mathbb{H}_p p∈Hp 和一条直线 l ‾ 1 ∈ H p ∩ S 3 \underline{l}_1 \in \mathbb{H}_p \cap \mathbb{S}^3 l1∈Hp∩S3,点到直线的距离 d p , l 1 d_{p, l_1} dp,l1 可以表示为:
d p , l 1 = ∥ p × l 1 − m 1 ∥ d_{p, l_1} = \|p \times l_1 - m_1\| dp,l1=∥p×l1−m1∥
其中, m 1 m_1 m1 是直线上的一个动量向量(moment)。
使用 DQ Robotics 进行计算
以下是使用DQ Robotics来计算该距离的示例代码:
% Point coordinates
p = i_ + j_; % 定义点 p 的坐标
% Build the line
l1 = k_; % 定义直线方向,沿 z轴方向延伸
m1 = cross(i_, k_); % 计算动量向量 m1,经过x轴上 x = 1 点
l1_dq = l1 + E_ * m1; % 构建 Plücker 线的双四元数表示
% Calculate distance
d_p_l1 = norm(cross(p, l1) - m1)
在此示例中:
- 定义了一个点 p p p 的坐标为 i + j i+ j i+j,即(1,1,0)。
- 构建了直线 l 1 l_1 l1 和其方向向量 m 1 m_1 m1。
- 使用叉积计算点到直线的距离。
计算结果为:
d_p_l1 = 1
使用 DQ_Geometry 模块的专用函数
我们还可以使用 DQ_Geometry 模块中的专用函数 point_to_line_squared_distance
来计算距离:
d_p_l1 = sqrt(DQ_Geometry.point_to_line_squared_distance(p, l1_dq))
这个函数直接计算平方距离,然后通过平方根获得最终的距离。结果同样为1。
在控制机器人时,通常使用平方范数比直接使用范数更方便。
平方范数和范数都是度量向量大小的方式,但平方范数因为省去平方根,计算更简单,且在很多情况下可以有效替代范数,特别是在机器人控制和优化任务中。
- 范数 范数是向量长度或大小的度量。对于向量 v = [ v 1 , v 2 , … , v n ] \mathbf{v} = [v_1, v_2, \ldots, v_n] v=[v1,v2,…,vn],其 2-范数(Euclidean norm) 计算公式为:
∥ v ∥ = v 1 2 + v 2 2 + ⋯ + v n 2 \|\mathbf{v}\| = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2} ∥v∥=v12+v22+⋯+vn2
- 平方范数 平方范数是范数的平方,公式为:
∥ v ∥ 2 = v 1 2 + v 2 2 + ⋯ + v n 2 \|\mathbf{v}\|^2 = v_1^2 + v_2^2 + \cdots + v_n^2 ∥v∥2=v12+v22+⋯+vn2
- 两者的区别
计算简化:平方范数去掉了平方根,因此计算更简单。对于大多数优化或控制任务,计算平方根可能会带来不必要的复杂度,平方范数在计算效率上更有优势。
物理意义不变:平方范数在表示向量大小时虽然少了平方根,但在很多应用中可以等效替代范数,因为优化目标通常不关心绝对距离,而是关心相对大小。
- 在机器人控制中的应用 在机器人控制中,使用平方范数的好处包括:
效率高:例如在距离或误差度量中,直接使用平方范数可以避免计算平方根,提高运算效率。
优化问题:许多优化算法(如梯度下降)会使用平方范数来衡量误差,因为平方范数是连续可微的,而范数在零点可能不可导。
Plücker 坐标 中的直线表示,其中:
- 定义直线方向 ( l_1 ):
直线的方向向量被定义为 l 1 = k l_1 = k l1=k,这表示直线沿着 ( z ) 轴的正方向。
-
选择直线上一点 ( p ):
为了使用 Plücker 坐标表示直线,我们需要知道直线上的一个点 p l 1 p_{l1} pl1。在这个示例中,选择了点: p l 1 = i p_{l1} = {i} pl1=i,这表示点 p l 1 p_{l1} pl1位于 x x x轴正方向上的单位位置,即坐标为 ( 1 , 0 , 0 ) (1, 0, 0) (1,0,0)。
-
计算动量向量 ( m_1 ):
根据 Plücker 坐标的定义,动量向量 m 1 m_1 m1计算为:
m 1 = p l 1 × l 1 = i × k m_1 = p_{l1} \times l_1 = i \times k m1=pl1×l1=i×k
因此,在代码中有:m1 = cross(i_, k_);
计算叉积 i × k i \times k i×k :
i × k = − j i \times k = -j i×k=−j
所以:
m 1 = − j m_1 = -j m1=−j
这意味着动量向量 m 1 m_1 m1 指向 y y y轴的负方向。
为什么选择 p l 1 = i p_{l1} = i pl1=i
- 为了定义一条经过 x x x轴上 x = 1 点并沿 z轴方向延伸的直线。
- 通过计算 m 1 = p l 1 × l 1 = i × k m_1 = p_{l1} \times l_1 = i \times k m1=pl1×l1=i×k,我们得到动量向量 m 1 m_1 m1,这与直线的位置和方向相关。