齐次坐标变换

Posted 走过_冬天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了齐次坐标变换相关的知识,希望对你有一定的参考价值。

齐次坐标

在二维平面内,我们用一对坐标值(x,y)来表示一个点在平面内的确切位置,或者说是用一个向量(x,y)来标定一个点的位置。

假如变换前的点的坐标为(x,y),变换后的点坐标为(x*,y *),这个变换过程可以写成如下矩阵形式:

这种用三维向量表示二维向量,或者一般而言,用一个 n+1维的向量表示一个 n 维向量的方法称为齐次坐标表示法。

n 维向量的变换是在 n+1 维的空间进行的,变换后的 n 维结果是被反投回到特定维空间内而得到的。

为什么要采用齐次坐标

在笛卡尔坐标系内,向量(x,y)是高于 z=0 平面上的点,而向量(x,y,1)是位于 z=1 的等高平面上的点。

对于图形来说,没有实质性的差别,但是却给后面的矩阵运算提供了可行性和方便性。

采用了齐次坐标表示法,就可以统一的把二维线性变换表示为如下所示的规格化形式:

对于一个图形,可以用顶点表来描述图形的几何关系,用连边表来描述图形的拓扑关系。所以对图形的变化,最后转变成,只是要变化图形的顶点表。

平移变换

平移是指将 P 点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程。

齐次坐标计算形式如下:

平移是一种不产生变形而移动物体的刚体变换,即物体上的每个点移动相同数量的坐标。

比例变换


齐次坐标计算形式如下:

缩放系数Sx,Sy可赋予任何正整数。值小于1,则会缩小物体的尺寸。值大于1,则会放大物体。都指定为1,物体尺寸就不会改变。

(1)Sx = Sy 比例

(2)Sx <> Sy 比例

当 Sx = Sy 时,比例变换成为整体比例变换,用以下矩阵进行计算:

对称变换

对称变换也称为反射变化或镜像变换,变换后的图形是原图形关于某一轴线或原点的镜像。


关于x轴对称

关于y轴对称

旋转变换




错切变换

在图形学的应用中,有时需要产生弹性物体的变形处理,这就要用到错切变换。

变换矩阵中的非对角线元素大都为0,若变换矩阵中的非对角元素不为0,则意味着 x,y 同时对图形的变换起作用。也就是说,变换矩阵中非对角线元素起着把图形沿 x 方向或 y 方向错切的作用。

x 值或 y 值越小,错切量越小。x 值或 y 值越大,错切量越大。其变换矩阵为:

沿x方向错切

复合变换

复合变换是指图形做一次以上的几何变换,变换结果是每次的变换矩阵相乘。

从另一方面看,任何一个复杂的几何变换都可以看做是基本几何变换的组合形式。

二维复合平移变换

P 点经过两次连续平移后,其变换矩阵可以写成:

二维复合比例变换

P 点经过两个连续比例变换后,其变换矩阵可写成:

二维复合旋转变换

P 点经过两个连续旋转变换后,其变换矩阵可写成:

坐标系之间的变换

图形变换经常需要从一个坐标系变换到另外一个坐标系。

相对任意参考点的二维几何变换

二维变换矩阵



看了网上一大堆讲解,坐标变换公式,看起来都挺有道理的,就没找到一篇能举个实例。本人数学基础一般,还是无法确定公式这样用是不是用对了,所以只好用最原始的方法,手工绘制了一个坐标系,参照坐标系比较计算结果和实际结果。

Matlab示例


代码:

%已知里程计坐标系3个点odom_a,odom_b,odom_c,在odom_a中观察到点p1。
odom_a = [3,1,0]; p1=[-9,-4,0];
odom_b = [-1, 2,pi/4];
odom_c = [-2,-2,pi/2];
%求点p相对点odom_B,odom_C的坐标p1b,p1c?

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 解:
%     | cos(th) -sin(th) x |
% M=  | sin(th) cos(th)  y |
%     | 0       0        1 |

Ma2o = [cos(odom_a(1,3)),-sin(odom_a(1,3)), odom_a(1,1);
        sin(odom_a(1,3)), cos(odom_a(1,3)), odom_a(1,2);
        0,0,1];
Mb2o = [cos(odom_b(1,3)),-sin(odom_b(1,3)), odom_b(1,1);
        sin(odom_b(1,3)), cos(odom_b(1,3)), odom_b(1,2);
        0,0,1];
Mc2o = [cos(odom_c(1,3)),-sin(odom_c(1,3)), odom_c(1,1);
        sin(odom_c(1,3)), cos(odom_c(1,3)), odom_c(1,2);
        0,0,1];
    
%p1a为p1点的齐次坐标表示
p1a = [p1(1,1);p1(1,2);1];                      %[-9,-4,1]
p1b = inv(Mb2o) * Ma2o * p1a;					%[-5*sqrt(2), 0,1]
p1b_th = p1(1,3) + (odom_a(1,3) - odom_b(1,3)); %-pi/4

p1c = inv(Mc2o) * Ma2o * p1a;					%[-1,4,1]
p1c_th = p1(1,3) + (odom_a(1,3) - odom_c(1,3)); %-pi/2

%验证,
%假设在odom_a中观察到点p2,
p2=[-4,-7,-pi/2];

%p1a为p2点的齐次坐标表示
p2a = [p2(1,1); p2(1,2); 1];                    %[-4,-7,1]
p2b = inv(Mb2o) * Ma2o * p2a;                   %[-8/sqrt(2), -8/sqrt(2),1]
p2b_th = p2(1,3) + (odom_a(1,3) - odom_b(1,3)); %-3*pi/4

p2c = inv(Mc2o) * Ma2o * p2a;                   %[-4,-1,1]
p2c_th = p2(1,3) + (odom_a(1,3) - odom_c(1,3)); %-pi
    

总结

1、如果机器人在全局坐标系下有A,B三个点。然后在A点观察到一个目标p,p是机器人坐标系下的点。问机器人到达B坐标点时,点p相对于机器人的位置?

假设pa为点p在A点观察到的坐标,Ma2o为点a在全局坐标的表示,
那么
p2o = Ma2o * pa------------------(1)
p2o就表示点a在全局坐标的表示,那机器人到达B坐标点时,点p相对于机器人的位置为p2b
p2b = inv(Mb2o) * Ma2o * pa ------------------(2)

这里inv(Mb2o)可以这么理解,
假设机器人到达B坐标点时,点p相对于机器人的位置为pb,那么有
p2o = Mb2o * pb ------------------(3)
由于点p在全局坐标中只有一个点,机器人在A,B点观察到的都是同一个点,所以(1)=(3),于是有
Ma2o * pa = Mb2o * pb;
根据矩阵乘法移项,得到
pb = (Mb2o)^-1 * Ma2o * pa;
其中pb即为需要求解的值,Matlab中矩阵的逆为inv(Mb2o) = (Mb2o)^-1。

如果你有那更好的方法和加快齐次坐标理解的方法和资料,欢迎在下方留言,感谢!

以上是关于齐次坐标变换的主要内容,如果未能解决你的问题,请参考以下文章

三维变换之斜投影透视投影

齐次坐标变换

OpenGL知识点梳理3----变换与坐标系统

齐次变换

[3Dmath]切变

MATLAB点云处理(二十一):点云旋转平移(详细解读!)