齐次坐标变换

齐次坐标变换齐次坐标在二维平面内 我们用一对坐标值 x y 来表示一个点在平面内的确切位置 或者说是用一个向量 x y 来标定一个点的位置 假如变换前的点的坐标为 x y 变换后的点坐标为 x y 这个变换过程可以写成如下矩阵形式 这种用三维向量表示二维向量 或者一般而言 用一个 n 1 维的向量表示一个 n 维向量的方法称为齐次坐标表示法 n 维向量的变换是在 n 1 维的空间进

齐次坐标

在二维平面内,我们用一对坐标值(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

(0)
上一篇 2026年3月26日 下午2:28
下一篇 2026年3月26日 下午2:28


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号