1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,向量的旋转,变换,西南交通大学,基础的,2-D,绕原点旋转,在,2-D,的迪卡尔坐标系中,一个位置向量的旋转公式可以由三角函数的几何意义推出。比如上图所示是位置向量,R,逆时针旋转角度,B,前后的情况。在左图中,我们有关系:,x,0,=|R|*,cosA,y,0,=|R|*,sinA,=,cosA,=x,0,/|R|,sinA,=y,0,/|R|,下图中,,x,1,=|R|*,cos,(,A+B,),y,1,=|R|*sin,(,A+B,),其中(,x,1,,,y,1,)就是(,x,0,,,y,0,)旋转角
2、B,后得到的点,也就是位置向量,R,最后指向的点。,x,1,=|R|*,cos,(,A+B,),y,1,=|R|*sin,(,A+B,),我们展开,cos,(,A+B,)和,sin,(,A+B,),得到,x,1,=|R|*,(,cosAcosB-sinAsinB,),y,1,=|R|*,(,sinAcosB+cosAsinB,),现在把,cosA,=x,0,/|R|,sinA,=y,0,/|R|,代入上面的式子,得到,x,1,=|R|*,(,x,0,*cosB/|R|-y,0,*,sinB,/|R|,),y,1,=|R|*,(,y,0,*cosB/|R|+x,0,*,sinB,/|R|,),
3、x,1,=x,0,*,cosB,-y,0,*,sinB,y,1,=x,0,*,sinB,+y,0,*,cosB,现在我要把这个旋转公式写成矩阵的形式即:,2-D,旋转变换矩阵:,平面旋转矩阵,平移部分,平移不是线性的,不能表示为与,22,矩阵相乘的形式。例如要从点,(2,1),开始,将其旋转,90,度,在,x,方向将其平移,3,个单位,在,y,方向将其平移,4,个单位。可通过先使用矩阵乘法再使用矩阵加法来完成此操作。,i,P,1,B,1,1,0,x,y,P,i,B,i,补充部分,平移部分,平移不是线性的,不能表示为与,22,矩阵相乘的形式。例如要从点,(2,1),开始,将其旋转,90,度,在
4、x,方向将其平移,3,个单位,在,y,方向将其平移,4,个单位。可通过先使用矩阵乘法再使用矩阵加法来完成此操作。,后面跟一平移(与,12,矩阵相加)的线性变换(与,22,矩阵相乘)称为,仿射变换,。放射变换(先乘后加)可以通过乘以一个,3*3,的矩阵来实现,若要使其起作用,平面上的点必须存储于具有虚拟第三坐标的,13,矩阵中。通常的方法是使所有的第三坐标等于,1,。例如,矩阵,2 1 1,代表点,(2,1),。例如与单个,33,矩阵相乘的仿射变换(旋转,90,度;在,x,方向上平移,3,个单位,在,y,方向上平移,4,个单位):,在前面的示例中,点,(2,1),映射到了点,(2,6),。其中
5、33,矩阵的第三列包含数字,0,,,0,,,1,。对于仿射变换的,33,矩阵都是这样的。重要的数字是列,1,和列,2,中的,6,个数字。矩阵左上角的,22,部分表示变换的线性部分,第,3,行中的前两项表示平移。,在使用,3*3,的矩阵做仿射变换时候,表示点的矩阵变成了一个,1*3,矩阵,这个矩阵中的最后一个值必须设置成,1,。对于,3*3,矩阵,其最后一列的值是多少是没有关系的,因为他们不会影响结果中的前两列。不过如上,经常将他们设置为,0,,,0,,,1,。这一列对于坐标转换的结果并没有任何影响,但是他们是必须的,因为矩阵相乘必须满足“相乘的两个矩阵第一个矩阵的列数必须与第二个矩阵的行数相
6、同”。,平面或空间里的每个线性变换(这里就是旋转变换)都对应一个矩阵,叫做变换矩阵。对一个点实施线性变换就是通过乘上该线性变换的矩阵完成的。,把顶点和矩阵相乘,就会发现矩阵的某些项,扮演着为顶点变换(平移、旋转、缩放)提供参数的作用。(前人总结出来,填哪些那些项能得到平移矩阵,/,缩放矩阵,/,旋转矩阵)比如平移矩阵,你自己拿一个顶点和它相乘,算一遍,就会发现它化简到最后一步时的算式,和顶点平移算式是一样的。旋转、缩放也是如此。,那么为什么还要和矩阵相乘?直接用平移算式、旋转算式、缩放算式不就行了?,不行 因为靠矩阵来计算可以减少计算量。,一个顶点要进行多次变换,比如平移后旋转再平移之后再缩放,用简单算式得算,4,遍,矩阵只要算一遍。,原理就是公式:(顶点,矩阵,A,),矩阵,B=,顶点,(矩阵,A,矩阵,B,),即,矩阵接合律的推广,。(矩阵一般不遵守分配律,所以顶点变换有先后顺序,一个顶点平移再旋转,和旋转再平移,得到的位置不同)即:,很容易地进行组合变换以及逆变换。,机器人中可能很多关节都进行同一套变换。用简单算式,,n,个变换对,m,个顶点,就得算,nm,遍。把,n,个变换做成矩阵,用矩阵乘法接合到一起,那最后,m,个顶点,每个只要同矩阵做一次乘运算,就可以得到变换后的位置。计算量大大降低,