齐次坐标
在二维平面内,我们用一对坐标值(x,y)来表示一个点在平面内的确切位置,或者说是用一个向量(x,y)来标定一个点的位置。
为什么要采用齐次坐标
在笛卡尔坐标系内,向量(x,y)是高于 z=0 平面上的点,而向量(x,y,1)是位于 z=1 的等高平面上的点。
对于图形来说,没有实质性的差别,但是却给后面的矩阵运算提供了可行性和方便性。
平移变换
比例变换

齐次坐标计算形式如下:

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

复合变换
复合变换是指图形做一次以上的几何变换,变换结果是每次的变换矩阵相乘。
从另一方面看,任何一个复杂的几何变换都可以看做是基本几何变换的组合形式。
二维复合平移变换
二维复合旋转变换
坐标系之间的变换
二维变换矩阵


看了网上一大堆讲解,坐标变换公式,看起来都挺有道理的,就没找到一篇能举个实例。本人数学基础一般,还是无法确定公式这样用是不是用对了,所以只好用最原始的方法,手工绘制了一个坐标系,参照坐标系比较计算结果和实际结果。
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相对于机器人的位置?
这里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。
如果你有那更好的方法和加快齐次坐标理解的方法和资料,欢迎在下方留言,感谢!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198790.html原文链接:https://javaforall.net
