首先,明确一下:
组合方式ZDY:在RM65B机械臂的上位机,也就是示教器中,直接显示的是平移向量(tx,ty,tz)与欧拉角(rx,ry,rz),这两个数值,(tx,ty,tz)是基坐标系A下末端坐标系B原点的三维坐标,(rx,ry,rz)是基坐标系A的三个轴与末端坐标系的三个轴的夹角。那么由基坐标系A到末端坐标系B,应当是先沿着基坐标系A自身的三轴平移(tx,ty,tz),再绕着基坐标系A自身的三轴旋转(rx,ry,rz),这样基坐标系A变换完就会与末端坐标系B重合。也就是说,由基坐标系A到末端坐标系B的变换是“先平移后旋转”(至于旋转顺序不用管,因为后续再多个位姿矩阵相乘时,位姿矩阵运算是不反应旋转顺序的,依据旋转矩阵得到的欧拉角,不管以什么顺序旋转,只要能转到最终重合就行了。)
之后以(tx,ty,tz)与(rx,ry,rz)来构造平移矩阵TAB=(tx,ty,tz)与旋转矩阵RAB=R(rz)×R(ry)×R(rx),正常我们是直接组合,得到:
MAB=[[RAB,TAB],
[0, 1]]
包括我们在后续的其他转换中得到的位姿矩阵MBC,比如利用kabsch(SVD)的代码解算点集B对应坐标系B到点集C对应坐标系C的旋转矩阵与平移向量时,计算出来的也都是:平移向量为坐标系B下坐标系C的原点三维坐标,旋转矩阵对应坐标B与坐标系C的相对三轴夹角,之后通过先平移后旋转,就能让B与C两个坐标系重合。
这里引发了一个问题:
对于坐标系A中的一个点pa(xa,ya,za),如果将其转换到坐标系B当中,应该是按照如下式计算:
pb(xb,yb,zb)=MAB*pa=RAB*pa+TAB
按照上面这个式子,是不是发现一个问题,RAB是先作用于pa,之后再加上TAB,也就是说这里变成了“先旋转后平移”,与之前矩阵构造时的“先平移旋转”不一样了。
因此,按照正确的计算应当是:
pb(xb,yb,zb)=RAB*(pa+TAB),这样才是正确的,我们也可以都以矩阵乘法形式来做,先不旋转,即旋转矩阵是单位阵,之后再单独旋转,即平移向量均为0,变为:
M(TAB)=[[1,0,0,tx],
[0,1,0,ty],
[0,0,1,tz],
[0,0,0,1]]
M(RAB)=[[RAB,0],
[0, 1]]
pb=pa*M(TAB)*M(RAB)
这样的转换才能符合,“先沿着基坐标系A自身的三轴平移(tx,ty,tz),再绕着基坐标系A自身的三轴旋转(rx,ry,rz)后,使得基坐标系A与末端坐标系B重合”的原则。
因此,我们在矩阵乘法运算过程中,均以“组合方式ZDY”得到的位姿矩阵来计算,并没有问题,并且最终得到的矩阵,它其中的平移向量与旋转矩阵,也是“先平移后旋转”,因为它们代表的都是一个坐标系下另一个坐标系原点的三维坐标,以及两个坐标系的三轴夹角。
举例来说:
按照“组合方式ZDY”得到MAB与MBC,则MAC=MAB*MBC,则MAC的TAC为A坐标系下C坐标系的原点的三维坐标,MAC的RAC对应的欧拉角是A坐标系与C坐标系的三轴夹角;A坐标系需要先以TAC沿着自身的三轴平移,再以RAC对应的欧拉角绕着自身的三轴旋转,使得A坐标系与C坐标系重合。
那么,这样解释清楚之后,我们回到最开始那个问题,
如果按照pb(xb,yb,zb)=MAB*pa=RAB-(X1-Y1-Z1)*pa+TAB-(X1-Y1-Z1),是先旋转后平移。
也就是A坐标系先绕自身的三轴X1-Y1-Z1旋转RAB对应的欧拉角,转动完成后,由于旋转会改变三轴的指向,因此,会得到三个新轴X2-Y2-Z2,并且这三个新轴的指向与B坐标系(X3-Y3-Z3)的三轴指向一致。
所以,重点来了,如果还按照坐标系A对应在X1-Y1-Z1三轴指向下的TAB-(X1-Y1-Z1)来平移旋转后的新坐标系A-(X2-Y2-Z2),显然是不对的;正确的做法应当是按照A的(X2-Y2-Z2)新坐标系下B-(X3-Y3-Z3)的原点的三维坐标来进行平移。
那么沿着新坐标系A-(X2-Y2-Z2)的平移向量要如何算出来呢?
解算公式应当是:TAB-(X2-Y2-Z2) = [RAB-(X1-Y1-Z1)]的逆矩阵 * TAB-(X1-Y1-Z1)
由于RAB-(X1-Y1-Z1)是正交矩阵,所以[RAB-(X1-Y1-Z1)]的逆矩阵=[RAB-(X1-Y1-Z1)]的转置
最终应当是:
pb(xb,yb,zb)=MAB*pa
=[RAB-(X1-Y1-Z1)] * pa + [RAB-(X1-Y1-Z1)]的转置 * TAB-(X1-Y1-Z1)
综合上述分析来看,如果以后我们得到了,1坐标系下2坐标系原点的三维坐标,即平移向量T1,以及“旋转前”A坐标系与B坐标系的夹角对应的旋转矩阵R1,则1坐标系1点转到2坐标系下,该过程在计算时要么是:
p2 = R1*(p1+T1) = p1 * [[E,T1],[0,1]] * [[R1, 0],[0,1]]
或者是:
p2 = R1 * p1 + R1转置 * T1
并且在多刚体坐标系累乘转换计算中,不用担心,只要你构造的方式是统一的,即都是“组合方式ZDY”得到的矩阵,可以放心大胆的运算,只是心里要明白,它是先平移后旋转构造的,计算时不能直接 Rp+T ,要转换一下,不然得到的结果和实际值肯定不一样。
此外,更直观来说,多次刚体位姿变换后由累乘得到的矩阵M0N,可直接看作:
由0坐标系到N坐标系的位姿变换矩阵,M0N的平移向量是0坐标系下N坐标系原点的三维坐标,M0N旋转矩阵对应的欧拉角是0坐标系与N坐标的三轴夹角,并且“先按照平移向量由0坐标系平移到N坐标系,使得二者的原点重合;再绕0坐标系三轴旋转对应的角度,使得0坐标系与N坐标系的三轴完全重合且指向完全一致”,这样才是“先平移后旋转”的真谛。
转换方式ZDY:
按照上述“组合方式ZDY”得到的矩阵MAB,相对应的由B坐标系到A坐标系的MBA计算如下:
MBA=MAB逆矩阵=MAB转置=
[[RAB转置,-RAB转置 * TAB],
[0, 1]]
那么由此得到的,MBA的平移向量还是B坐标系下A坐标系原点的三维坐标吗?MBA拆开的旋转矩阵与平移向量还是符合“组合方式ZDY”的原则吗?
答案是肯定的。
我们可以反过来看,RAB转置 * TAB是坐标系A由XA1-YA1-ZA1先旋转到新轴XA2-YA2-ZA2之后,得到的沿新轴XA2-YA2-ZA2的指向平移到B坐标系的平移向量,这里有一个关键点:就是在旋转之后XA2-YA2-ZA2与B坐标系的XB-YB-ZB的三轴指向是完全一致的,所以反过来,由B坐标系沿XB-YB-ZB的三轴指向平移到A坐标系的XA2-YA2-ZA2,对应的平移向量TBA就是取(RAB转置 * TAB)的负值,即“TBA=-RAB转置 * TAB”,而相应的RBA=RAB逆矩阵=RBA转置。
总结上述分析,就是由“先平移后旋转”即组合方式ZDY得到的矩阵MAB,其对应的MBA也依然符合“先平移后旋转”即组合方式ZDY的原则,并且其MAB与MBA可以按照转换方式ZDY直接计算得到。
所得到的MBA对应的平移向量与旋转矩阵,依然是B坐标系下A坐标系的原点三维坐标,以及“旋转前”B坐标系相对于A坐标系的三轴夹角。
多刚体转换方式ZDY:
按照以上的转换方式,多个坐标系的连续转换,保险起见,最准确的计算应当是:
由A按照先平移后旋转到B,再由B先平移后旋转到C,依次类推..到N,最终得到由A到N。
最后,总结一句话:
只要M01 M12 M23 M34等是按照 “原坐标系0下原坐标系1原点的三维坐标=平移向量,原坐标系0与原坐标系1的三轴夹角对应矩阵=旋转矩阵”,这种方式构造的,那么坐标系转换,也就是矩阵的累乘运算:
M01 * M12 * M23 * M34.....=M0N
最终的M0N不用怀疑,它的旋转矩阵对应欧拉角就是原坐标系0与原坐标系N的三轴夹角,它的平移向量就是由原坐标系0下原坐标系N原点的三维坐标。并且由MN0=M0N逆矩阵,得到的MN0也也并依据如此。
进一步的,我结合DEEPSEEK解决了我之前的疑惑,对pa由A坐标系移动到B坐标系,关键在于左乘还是右乘,这决定了是先旋转后平移还是先平移后旋转: