【机器人学与计算机视觉基础】(二) 二维空间位姿描述
位置与姿态描述2 二维空间位姿描述讨论2维空间通常要用到笛卡儿坐标系,笛卡儿坐标系是以xxx轴和yyy轴为正交轴的坐标系,通常绘制成xxx轴水平、yyy轴竖直,两轴的交点称为原点。在笛卡尔坐标系中,平行于坐标轴的单位向量x^\hat{x}x^和y^\hat{y}y^表示。一个点用其在xxx轴和yyy轴上的坐标(x,y)(x,y)(x,y)表示,或者写成向量:p=xx^+yy^\boldsymbo
文章目录
【机器人学与计算机视觉基础】(一)位置与姿态描述 1 位姿的抽象符号表示
(二) 二维空间位姿描述
讨论2维空间通常要用到笛卡儿坐标系,笛卡儿坐标系是以 x x x轴和 y y y轴为正交轴的坐标系,通常绘制成 x x x轴水平、 y y y轴竖直,两轴的交点称为原点。在笛卡尔坐标系中,平行于坐标轴的单位向量 x ^ \hat{x} x^和 y ^ \hat{y} y^表示。一个点用其在 x x x轴和 y y y轴上的坐标 ( x , y ) (x,y) (x,y)表示,或者写成向量:
p = x x ^ + y y ^ \boldsymbol{p}=x \hat{\boldsymbol{x}}+y \hat{\boldsymbol{y}} p=xx^+yy^

在上图中的一个坐标系 { B } \{B\} {B},我们希望用参照系 { A } \{A\} {A}来描述它。可以清楚地看到, { B } \{B\} {B}的原点可以被向量 t = ( x , y ) t =( x,y) t=(x,y)所取代,其姿态可以由 θ \theta θ表示。
因此,位姿的一个具体表示就是三维向量 A ξ B ∼ ( x , y , θ ) ^{A} \xi_{B} \sim(x, y, \theta) AξB∼(x,y,θ),我们使用符号~表示这两种表示是等价的。遗憾的是,这种表示方法不方便位姿合成,因为 ( x 1 , y 1 , θ 1 ) ⊕ ( x 2 , y 2 , θ 2 ) \left(x_{1}, y_{1}, \theta_{1}\right) \oplus\left(x_{2}, y_{2}, \theta_{2}\right) (x1,y1,θ1)⊕(x2,y2,θ2)两边的位姿都是复杂的三角函数。所以,我们将使用一种不同的方法来表示旋转。
该方法是考虑一个任意点 Р Р Р相对于每个坐标系的向量,并确定 A p ^Ap Ap和 B p ^Bp Bp之间的关系。
再次回到上图,我们将问题分成两部分:旋转,然后平移。
2.1 旋转
先只考虑旋转的情况,我们创建一个新坐标系 { V } \{V\} {V},其坐标轴平行于坐标系 { A } \{A\} {A}的轴,但其原点与坐标系 { B } \{B\} {B}的原点重合,如下图所示。点 P P P可以分别看作在 { V } \{V\} {V}或 { B } \{B\} {B}坐标系中的点。
我们可以将点 P P P用 { V } \{V\} {V}中定义坐标轴的单位向量表示为
v p = V x x ^ V + V y y ^ V = ( x ^ V y ^ V ) ( V x V y ) \begin{aligned}^v{p} &={ }^{V} x \hat{x}_{V}+{ }^{V} y \hat{y}_{V} \\&=\left(\begin{array}{ll}\hat{x}_{V} & \hat{y}_{V}\end{array}\right)\left(\begin{array}{l}^V{x} \\^V{y}\end{array}\right)\end{aligned} vp=Vxx^V+Vyy^V=(x^Vy^V)(VxVy)
上式被写作一个行向量和一个列向量的点积。
坐标系 { B } \{B\} {B}|可以用它的两个正交轴表示,这里用两个单位向量代表:
x ^ B = cos θ x ^ V + sin θ y ^ V y ^ B = − sin θ x ^ V + cos θ y ^ V \begin{array}{l}\hat{x}_{B}=\cos \theta \hat{x}_{V}+\sin \theta \hat{y}_{V} \\\hat{y}_{B}=-\sin \theta \hat{x}_{V}+\cos \theta \hat{y}_{V}\end{array} x^B=cosθx^V+sinθy^Vy^B=−sinθx^V+cosθy^V
分解为矩阵形式:
( x ^ B y ^ B ) = ( x ^ V y ^ V ) ( cos θ − sin θ sin θ cos θ ) \left(\begin{array}{lll}\hat{x}_{B} & \hat{y}_{B}\end{array}\right)=\begin{array}{ll}(\hat{x}_{V} & \hat{y}_{V})\end{array}\left(\begin{array}{cc}\cos \theta & -\sin \theta \\\sin \theta & \cos \theta\end{array}\right) (x^By^B)=(x^Vy^V)(cosθsinθ−sinθcosθ)
P P P在坐标系 { B } \{B\} {B}中表示为:
B p = B x x ^ B + B y y ^ B = ( x ^ B y ^ B ) ( B x B y ) { }^{B} p={ }^{B} x \hat{x}_{B}+{ }^{B} y \hat{y}_{B}=\left(\begin{array}{ll}\hat{x}_{B} & \hat{y}_{B}\end{array}\right)\left(\begin{array}{l}^B{{x}} \\^B{{y}}\end{array}\right) Bp=Bxx^B+Byy^B=(x^By^B)(BxBy)
根据上面两个式子,可以得到:
B p = ( x ^ V y ^ V ) ( cos θ − sin θ sin θ cos θ ) ( B x B y ) { }^{B} p=(\begin{array}{lll}\hat{x}_{V} & \left.\hat{y}_{V}\right)\end{array}\left(\begin{array}{cc}\cos \theta & -\sin \theta \\\sin \theta & \cos \theta\end{array}\right)\left(\begin{array}{c}^B{x} \\^B{y}\end{array}\right) Bp=(x^Vy^V)(cosθsinθ−sinθcosθ)(BxBy)
再对照
V p = V x x ^ V + V y y ^ V = ( x ^ V y ^ V ) ( V x V y ) \begin{aligned}^V{p} &={ }^{V} x \hat{x}_{V}+{ }^{V} y \hat{y}_{V} \\&=\left(\begin{array}{ll}\hat{x}_{V} & \hat{y}_{V}\end{array}\right)\left(\begin{array}{l}^V{x} \\^V{y}\end{array}\right)\end{aligned} Vp=Vxx^V+Vyy^V=(x^Vy^V)(VxVy)
可以发现上面两个式子中同一个点 p p p都由单位向量 ( x ^ V , y ^ V ) (\hat{x}_V,\hat{y}_V) (x^V,y^V)表示,故其右边的系数也应该相同。即:
( V x V y ) = ( cos θ − sin θ sin θ cos θ ) ( B x B y ) \left(\begin{array}{c}^V{x} \\^V{y}\end{array}\right)=\left(\begin{array}{cc}\cos \theta & -\sin \theta \\\sin \theta & \cos \theta\end{array}\right)\left(\begin{array}{c}^B{x} \\^B{y}\end{array}\right) (VxVy)=(cosθsinθ−sinθcosθ)(BxBy)
上式描述了点如何通过坐标系旋转从坐标系 { B } \{B\} {B}变换到坐标系 { V } \{V\} {V}。这种类型的矩阵被称为旋转矩阵,记作 V R B ^VR_B VRB
( V x V y ) = V R B ( B x B y ) \left(\begin{array}{c}^V{x} \\^V{y}\end{array}\right)=^V{R_{B}}\left(\begin{array}{c}^B{x} \\^B{y}\end{array}\right) (VxVy)=VRB(BxBy)
旋转矩阵有一些特殊的属性:
- 正规化(标准正交):每列都是单位向量且相互正交
- 行列式为+1:一个向量被旋转矩阵变换后的长度是不变的
- 逆矩阵和转置矩阵相同 R − 1 = R T R^{-1}=R^T R−1=RT,因此有:
( B x B y ) = ( V R B ) − 1 ( V x V y ) = ( V R B ) T ( V x V y ) = B R V ( V x V y ) \left(\begin{array}{c}^Bx \\^B{y}\end{array}\right)=\left({ }^{V} R_{B}\right)^{-1}\left(\begin{array}{c}^V{x} \\^V{y}\end{array}\right)=\left({ }^{V} R_{B}\right)^{T}\left(\begin{array}{l}^V{x} \\^V{y}\end{array}\right)={ }^{B} R_{V}\left(\begin{array}{c}^V{x} \\^V{y}\end{array}\right) (BxBy)=(VRB)−1(VxVy)=(VRB)T(VxVy)=BRV(VxVy)
我们注意到,该矩阵的求逆就是将矩阵的上、下标交换位置,并可以得出恒等式
R ( − θ ) = R ( θ ) T \boldsymbol{R}(-\boldsymbol{\theta})=\boldsymbol{R}(\boldsymbol{\theta})^{\mathrm{T}} R(−θ)=R(θ)T
这里我们可以观察到:我们描述一个旋转的时候,不是用代表旋转角度的一个标量,而是用了一个有4个元素的2×2矩阵。但这4个元素并不是独立的,矩阵的每一列都是一个单位的大小,这提供了两个约束,列与列之间还都是正交的,这提供了另一种约束。4个元素加上3个约束,这样还是只剩下1个真正独立的值。
旋转矩阵是一个非最小化表示的典型例子,虽然这种表示有一些缺点,诸如需要增加内存等,但它具备的优势更加突出,如可复合性。
2.2 平移
接下来讨论坐标系原点的平移
![]() |
![]() |
由于坐标系 { V } \{V\} {V}与坐标系 { A } \{A\} {A}是平行的,所以平移量可以直接相加。
( A x A y ) = ( V x V y ) + ( x y ) = ( cos θ − sin θ sin θ cos θ ) ( B x B y ) + ( x y ) = ( cos θ − sin θ x sin θ cos θ y ) ( B x B y 1 ) \begin{aligned}\left(\begin{array}{l}^A{x} \\^A{y}\end{array}\right) &=\left(\begin{array}{l}^V{x} \\^V{y}\end{array}\right)+\left(\begin{array}{l}x \\y\end{array}\right) \\&=\left(\begin{array}{cc}\cos \theta & -\sin \theta \\\sin \theta & \cos \theta\end{array}\right)\left(\begin{array}{l}^B{x} \\^B{y}\end{array}\right)+\left(\begin{array}{l}x \\y\end{array}\right) \\&=\left(\begin{array}{cc}\cos \theta & -\sin \theta & x \\\sin \theta & \cos \theta & y\end{array}\right)\left(\begin{array}{c}^B{x} \\^B{y} \\1\end{array}\right)\end{aligned} (AxAy)=(VxVy)+(xy)=(cosθsinθ−sinθcosθ)(BxBy)+(xy)=(cosθsinθ−sinθcosθxy) BxBy1
或简写成:
( A x A y 1 ) = ( A R B t 0 1 × 2 1 ) ( B x B y 1 ) \left(\begin{array}{c}^A{x} \\^A{y} \\1\end{array}\right)=\left(\begin{array}{ll}^A{R_{B}} & t \\0_{1 \times 2} & 1\end{array}\right)\left(\begin{array}{l}^B{x} \\^B{y} \\1\end{array}\right)
AxAy1
=(ARB01×2t1)
BxBy1
其中, t = ( x , y ) t =(x,y) t=(x,y)代表坐标系的平移变换,而坐标系旋转变换用 A R B ^AR_B ARB表示。因为 { A } \{A\} {A}和 { V } \{V\} {V}的轴是平行的,所以 A R B = V R B ^AR_B= ^VR_B ARB=VRB。将 P P P点的坐标向量用齐次形式表达为
A p ~ = ( V R B t 0 1 × 2 1 ) B p ~ = A T B B p ~ \begin{aligned}{ }^{A} \tilde{p} &=\left(\begin{array}{ll}{ }^{V} \boldsymbol{R}_{B} & \boldsymbol{t} \\\boldsymbol{0}_{1 \times 2} & 1\end{array}\right){ }^{B} \tilde{\boldsymbol{p}} \\&={ }^{A} \boldsymbol{T}_{B}{ }^{B} \tilde{\boldsymbol{p}}\end{aligned} Ap~=(VRB01×2t1)Bp~=ATBBp~
A T B ^AT_B ATB称为齐次转换矩阵。这个矩阵有一个非常特殊的结构,并且属于特殊的二维欧几里得群,即 T ∈ S E ( 2 ) ⊂ R 3 × 3 T \in S E(2) \subset \mathbb{R}^{3 \times 3} T∈SE(2)⊂R3×3
背景材料:一个向量 ( x , y ) (x, y) (x,y)可以写成齐次形式 p ~ ∈ P , p ~ = ( x 1 , x 2 , x 3 ) \tilde{p} \in \mathbb{P}, \tilde{p}=\left(x_{1}, x_{2}, x_{3}\right) p~∈P,p~=(x1,x2,x3),其中 x = x 1 / x 3 , y = x 2 / x 3 , x 3 ≠ 0 x=x_{1} / x_{3}, y=x_{2} / x_{3}, x_{3} \neq 0 x=x1/x3,y=x2/x3,x3=0。这里齐次向量的维度增加了一个,在平面上的点就用三维向量表示。为了将点转换为齐次形式,我们通常会附加一个1,变为 p ˉ = ( x , y , 1 ) \bar{p}=(x, y, 1) pˉ=(x,y,1)。字母上的波浪线表示该向量是齐次形式的。
齐次向量具有一个重要的属性,即 p ~ \tilde{p} p~等价于入 λ p ~ , ∀ λ ≠ 0 \lambda \tilde{p}, \forall \lambda \neq 0 λp~,∀λ=0,记作 p ~ ≃ λ p ~ \tilde{p} \simeq \lambda \tilde{p} p~≃λp~。这意味着 p ~ \tilde{p} p~在平面中代表相同的点,而与比例系数无关。
A T B ^AT_B ATB代表了相对位姿:
ξ ( x , y , θ ) ∼ ( cos θ − sin θ x sin θ cos θ y 0 0 1 ) \xi(x, y, \theta) \sim\left(\begin{array}{ccc}\cos \theta & -\sin \theta & x \\\sin \theta & \cos \theta & y \\0 & 0 & 1\end{array}\right) ξ(x,y,θ)∼
cosθsinθ0−sinθcosθ0xy1
相对位姿 ξ \xi ξ的一种具体表示是 ξ ∼ T ∈ S E ( 2 ) \xi \sim T \in S E(2) ξ∼T∈SE(2)。
对应于【机器人学与计算机视觉基础】(一)位置与姿态描述 1 位姿的抽象符号表示 中提到的代数运算规则,有:
T 1 ⊕ T 2 ↦ T 1 T 2 \boldsymbol{T}_{1} \oplus \boldsymbol{T}_{2} \mapsto \boldsymbol{T}_{1} \boldsymbol{T}_{2} T1⊕T2↦T1T2
T 1 T 2 = ( R 1 t 1 0 1 × 2 1 ) ( R 2 t 2 0 1 × 2 1 ) = ( R 1 R 2 t 1 + R 1 t 2 0 1 × 2 1 ) T_{1} T_{2}=\left(\begin{array}{cc}R_{1} & t_{1} \\0_{1 \times 2} & 1\end{array}\right)\left(\begin{array}{cc}R_{2} & t_{2} \\0_{1 \times 2} & 1\end{array}\right)=\left(\begin{array}{cc}R_{1} R_{2} & t_{1}+R_{1} t_{2} \\0_{1 \times 2} & 1\end{array}\right) T1T2=(R101×2t11)(R201×2t21)=(R1R201×2t1+R1t21)
这是标准的矩阵乘法。
ξ ⊕ 0 = ξ ↦ T I = T \xi \oplus 0=\xi\mapsto T I=T ξ⊕0=ξ↦TI=T
其中 I I I为单位矩阵。
ξ ⊖ ξ = 0 ↦ T T − 1 = I \xi \ominus \xi=0\mapsto T T^{-1}=I ξ⊖ξ=0↦TT−1=I
这意味着
⊖ T ↦ T − 1 \ominus \boldsymbol{T} \mapsto \boldsymbol{T}^{-1} ⊖T↦T−1
且:
T − 1 = ( R t 0 1 × 2 1 ) − 1 = ( R T − R T t 0 1 × 2 1 ) \boldsymbol{T}^{-1}=\left(\begin{array}{cc}\boldsymbol{R} & \boldsymbol{t} \\\boldsymbol{0}_{1 \times 2} & 1\end{array}\right)^{-1}=\left(\begin{array}{cc}\boldsymbol{R}^{T} & -\boldsymbol{R}^{T} \boldsymbol{t} \\\boldsymbol{0}_{1 \times 2} & 1\end{array}\right) T−1=(R01×2t1)−1=(RT01×2−RTt1)
对于点 p ~ ∈ P 2 \tilde{p} \in \mathbb{P}^{2} p~∈P2,有 T ⋅ p ~ ↦ T p ~ \boldsymbol{T} \cdot \tilde{\boldsymbol{p}} \mapsto T \tilde{\boldsymbol{p}} T⋅p~↦Tp~,这是一个标准的矩阵-向量积。
下面我们将使用MATLAB机器人工具箱(关注微信公众号二进制人工智能回复robot获取)展示一些具体数值化的例子。用函数se2创建一个齐次变换
T1=se2(1,2,30*pi/180)
T1 =
0.8660 -0.5000 1.0000
0.5000 0.8660 2.0000
0 0 1.0000
代表(1,2)的平移和30度的旋转。
相对世界坐标系,我们可以将变换用绘图函数绘制如下:
trplot2(T1,'frame','1','color','b');
axis([0,5,0,5]);
绘图函数中的参数规定该坐标系标签为 { 1 } \{1\} {1},且绘制成蓝色。
我们再绘制另一个平移(2,1),零旋转的位姿。在图中用红色绘制出来
T2=se2(2,1,0);
hold on
trplot2(T2,'frame','2','color','r');

现在,我们将两个相对位姿复合
T3=T1*T2;
trplot2(T3,'frame','3','color','g');

我们可以看到复合中,坐标系{2}的平移(2,1)是相对于坐标系{1}的。
要注意的是,最终坐标系{3}相对于世界坐标系的平移量并不是(3,3),因为它是相对于旋转后的坐标系{1}再平移的。
复合运算的不可逆性可用以下例子证明:
T4=T2*T1;
trplot2(T4,'frame','4','color','c');

可以看出坐标系{4}和坐标系{3}是不同的。
现在我们相对于世界坐标系定义一个点(3,2),并把它标到图中
P=[3;2];
plot_point(P,'*');

确定该点相对于坐标系{1}的坐标:
由
0 p = 0 ξ 1 ⋅ 1 p { }^{0} \boldsymbol{p}={ }^{0} \xi_{1} \cdot{ }^{1} \boldsymbol{p} 0p=0ξ1⋅1p
得到:
1 p = 1 ξ 0 ⋅ 0 p = ( 0 ξ 1 ) − 1 ⋅ 0 p { }^{1} \boldsymbol{p}={ }^{1} \xi_{0} \cdot{ }^{0} \boldsymbol{p}=\left({ }^{0} \xi_{1}\right)^{-1} \cdot{ }^{0} \boldsymbol{p} 1p=1ξ0⋅0p=(0ξ1)−1⋅0p
P1=inv(T1)*[P;1] % [P,1]:附加一个1将欧几里得点转换为齐次形式
P1 =
1.7321
-1.0000
1.0000
对齐次形式进行反变换,变为欧几里得坐标点
h2e(inv(T1)*e2h(P))
ans =
1.7321
-1.0000
这里又变回了欧几里得坐标点结果。辅助函数e2h将欧几里得坐标点转换为齐次形式,而h2e则进行逆转换。更简洁的表达方式可写成
上面更加简洁的表达可写成:
homtrans(inv(T1),P)
ans =
1.7321
-1.0000
THE END.
感谢阅读。
更多推荐
所有评论(0)