声明:

本文最早发布于2022-03-18,转载请注明出处

若有疑问请第一时间在评论区或者私信作者交流

前言:

最近需要完成一个作业,即程序实现《机器人学导论》中的齐次变换矩阵,并实现空间变换的动态效果。经过细致推敲,作者在愉快地交上作业后便留下了此文,用于交流和学习。本文主要内容来自于作业报告(原因是作者懒,不想改太多),涉及齐次变换矩阵的介绍和Matlab程序的设计思路。总而言之,谨以此文来进行记录和学习交流。

作业要求

作业的要求就是将上面的过程给动态化。不过为了让程序更具备一般性,我们仅考虑局部坐标系\left[ \boldsymbol{n},\boldsymbol{o},\boldsymbol{a} \right]的变换情况,而不会特别的去考虑P点该怎么计算。因为一但知道变换后的局部坐标系的位置和姿态,便可以很轻易的计算出P点的坐标。

先放一个最终的动态效果图

 正文

先介绍下齐次变换矩阵

 齐次变换矩阵F主要分成两部分,第一部分是一个3*3的矩阵,代表了局部坐标系的坐标轴的正向方向,其由三个单位方向向量组成。

第二部分则代表局部坐标系原点在全局坐标系中的坐标。至于矩阵的第4行,可以简单地理解为向量的长度(其实这并不准确,不过这里不再赘述,因为不是重点)

1.平移效果的实现

在齐次变换矩阵 F 中,\left[ p_x,p_y,p_z \right] 的实际含义便是局部参考系的原点在全局坐标系中的坐标。此外,我们知道,单纯平移操作并不会改变局部坐标轴\left[ \boldsymbol{n},\boldsymbol{o},\boldsymbol{a} \right]的方向(即没有旋转),而是仅仅改变P点相当于全局坐标系的坐标\left[ p_x,p_y,p_z \right]

那么,只要设置一个变量用于储存P点的坐标,然后在每次平移后,按P点的位置来绘制局部坐标系即可。

平移的Matlab核心代码(部分),这里我们仅用图片的方式呈现一种思路。

2.旋转效果的实现

 在理论计算中,旋转效果的实现依赖于旋转矩阵(实际上这是一种线性变换,空间的映射)。例如若是绕X轴旋转\theta度,计算过程如下图所示:

 其中P_{xyz}^{'}为P在全局坐标系中的坐标,P_{noa}为P点在局部坐标系中的坐标,而Rot\left( x,\theta \right)代表绕X轴旋转角度\theta

遵循同样的思路,我们不关注P点前后的计算结果,因为程序实现比较复杂。重点的关注对象是旋转矩阵以及其内部隐含的信息。回到齐次矩阵F,其组成除了原点\left[ p_x,p_y,p_z \right]外,还有局部坐标轴矩阵\left[ \boldsymbol{n},\boldsymbol{o},\boldsymbol{a} \right]。分析矩阵,便可以知道局部坐标轴\left[ \boldsymbol{n},\boldsymbol{o},\boldsymbol{a} \right]的朝向。

下图是一个齐次变换矩阵的实例

 单位方向向量\boldsymbol{n}=\left[ n_x,n_y,n_z \right]在矩阵T中对应的便是\left[ 1,0,0 \right],其代表局部坐标系的其中一个坐标轴\boldsymbol{n}=\left[ n_x,n_y,n_z \right] 在全局参考系的X、Y和Z轴上的分量分别为1、0和0。更具体地说,便是该坐标轴和全局参考系中的X轴同方向(注意,比例因子为0,代表无穷远,加上方向便是坐标轴)。

将矩阵\boldsymbol{n}=\left[ n_x,n_y,n_z \right]和旋转矩阵进行左乘,便可以得到旋转之后的矩阵局部坐标系矩阵\left[ \boldsymbol{n}',\boldsymbol{o}',\boldsymbol{a}' \right]。我们只需要解读每一次旋转后矩阵的信息,便可以实现想要的旋转效果。特别地,由于计算精度的误差,我们这里只采用90度旋转,其正余弦值在-1,1和0之间变动。

常见的旋转矩阵如下:

 

 旋转效果的核心代码为:

 最终实现效果在开头已经给出。

结语

最近一直在实现一种编程思路,将代码封装成各个模块便可以像搭积木一样实现不同的过程。这次也是这样处理。例如这次是这样实现三个操作的。

感兴趣的朋友可以关注博客,不定期更新。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐