齐次坐标的分析

一、齐次坐标的理解

“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR。

  • 向量

    对于一个向量 v ⃗ \vec{v} v 以及基 o a b c oabc oabc,可以找到一组坐标 ( v 1 , v 2 , v 3 ) (v_1,v_2,v_3) (v1,v2,v3),使得
    (1) v ⃗ = v 1 a ⃗ + v 2 b ⃗ + v 3 c ⃗ \vec{v} = v_1\vec{a}+v_2\vec{b}+v_3\vec{c}\tag{1} v =v1a +v2b +v3c (1)

  • 而对于一个点 p p p,则可以找到一组坐标 ( p 1 , p 2 , p 3 ) (p_1,p_2,p_3) (p1,p2,p3),使得
    (2) p − o = p 1 a ⃗ + p 2 b ⃗ + p 3 c ⃗ p-o = p_1\vec{a}+p_2\vec{b}+p_3\vec{c}\tag{2} po=p1a +p2b +p3c (2)

从上面对向量和点的描述,可以看出为了在坐标系中表示一个点,可把点的位置看作是对这个基的原点 o o o所进行的一个位移,即一个向量 p – o p – o po(有的书中把这样的向量叫做位置向量,起始于坐标原点的特殊向量)。

参考向量的描述形式,修改点的描述方程:
(3) p = o + p 1 a ⃗ + p 2 b ⃗ + p 3 c ⃗ p =o + p_1\vec{a}+p_2\vec{b}+p_3\vec{c}\tag{3} p=o+p1a +p2b +p3c (3)
(1)(3)是坐标系下向量和点的描述方式,这里可以看出,虽然都是用代数分量的形式表达向量和点,但描述一个点比一个向量需要额外的信息。如果写出一个代数分量(1, 4, 7),我们无法分辨其是向量或者点。

我们现在把(1)(3)写成矩阵的形式:
v ⃗ = [ v 1 v 2 v 3 0 ] × [ a b c o ] p = [ v 1 v 2 v 3 1 ] × [ a b c o ] \vec{v} =\begin{bmatrix} v_1&v_2&v_3&0 \end{bmatrix}\times \begin{bmatrix} a\\b\\c\\o \end{bmatrix}\\ p = \begin{bmatrix} v_1&v_2&v_3&1 \end{bmatrix}\times \begin{bmatrix} a\\b\\c\\o \end{bmatrix} v =[v1v2v30]×abcop=[v1v2v31]×abco
这里 ( a , b , c , o ) T (a,b,c,o)^T (a,b,c,o)T是坐标基矩阵,右边的列向量分别是向量 v ⃗ \vec{v} v 和点 p p p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:

  • 三维坐标下向量的第4个代数分量是0
  • 三维坐标下点的第4个代数分量是1

像这种这种用4个代数分量表示三维几何概念的方式即为一种齐次坐标表示。

下面为在普通坐标(Ordinary Coordinate)和齐次坐标(Homogeneous Coordinate)之间进行转换:

  • 普通坐标转换到齐次坐标
    • 点: ( x , y , z ) → ( x , y , z , 1 ) (x,y,z)\rightarrow (x,y,z,1) (x,y,z)(x,y,z,1)
    • 向量: ( x , y , z ) → ( x , y , z , 0 ) (x,y,z)\rightarrow (x,y,z,0) (x,y,z)(x,y,z,0)
  • 齐次坐标转换到普通坐标
    • 点: ( x , y , z , 1 ) → ( x , y , z ) (x,y,z,1)\rightarrow (x,y,z) (x,y,z,1)(x,y,z)
    • 向量: ( x , y , z , 0 ) → ( x , y , z ) (x,y,z,0)\rightarrow (x,y,z) (x,y,z,0)(x,y,z)

二、齐次坐标在变换中的应用

在欧氏变换中一般有两种操作:旋转和平移。如果我们想要将向量 a ⃗ \vec{a} a 进行一个标准的欧氏变换,一般是先用旋转矩阵 R R R进行旋转,然后再用向量 t t t进行平移,结果为:
a ′ = R ∗ a + t {a}'= R*a + t a=Ra+t
在单次变换下这种操作没有问题,但在连续的欧氏变换下,会有多次连续的旋转和平移,假设我们对向量 a ⃗ \vec{a} a 进行了两次欧氏变换,分别为 R 1 , t 1 R_1, t_1 R1,t1 R 2 , t 2 R_2,t_2 R2t2,分别得到:
b = R 1 ∗ a + t 1 c = R 2 ∗ b + t 2 b = R_1*a + t_1\\ c = R_2*b + t_2 b=R1a+t1c=R2b+t2
最终变换结果为
c = R 2 ∗ ( R 1 ∗ a + t 1 ) + t 2 c=R_2*(R_1*a+t_1)+t_2 c=R2(R1a+t1)+t2
显然,这样的变换在经过多次后会变的越来越复杂,造成这一问题的原因为上述表达方式并不是一个线性的变换关系,平移 t t t为加法。

此时使用齐次坐标,可以将加法转化为乘法,方便地表达平移:

  • 非齐次下的平移变换:
    [ u ′ v ′ ] = [ u + t u v + t v ] \begin{bmatrix} u'\\v' \end{bmatrix} = \begin{bmatrix} u+t_u\\v+t_v \end{bmatrix} [uv]=[u+tuv+tv]

  • 齐次下的平移变换:
    [ u ′ v ′ 1 ] = [ 1 0 t u 0 1 t v 0 0 1 ] [ u v 1 ] \begin{bmatrix} u'\\v'\\1 \end{bmatrix} = \begin{bmatrix} 1&0&t_u\\0&1&t_v\\0&0&1 \end{bmatrix} \begin{bmatrix} u\\v\\1 \end{bmatrix} uv1=100010tutv1uv1

采用齐次后的坐标变换为:
[ a ′ 1 ] = [ R t 0 1 ] [ a 1 ] = T [ a 1 ] \begin{bmatrix} a'\\1 \end{bmatrix} = \begin{bmatrix} R&t\\0&1 \end{bmatrix} \begin{bmatrix} a\\1 \end{bmatrix}= T\begin{bmatrix} a\\1 \end{bmatrix} [a1]=[R0t1][a1]=T[a1]
采用齐次后旋转和平移可以用一个矩阵 T T T来表示,该矩阵称为变换矩阵(transform matrix),这样欧氏变换就变成了线性关系,进行多次欧氏变换只需要连乘变换矩阵即可。

参考

关于齐次坐标的理解

齐次坐标的理解

从零开始一起学习SLAM | 为什么要用齐次坐标?

你可能感兴趣的:(运动控制,视觉学习)