在unity上整了一个机器人位姿正解,unity的左手系带来了一定的麻烦。
坐标系设置:为了减少对Unity内坐标系的更改,DH参数正解时直接将y轴和z轴对调,就成了右手系,可以应用各种右手系的参数,后续要将计算结果转为Unity内左手系的话,对调回来就行。
位移和Scale这样操作是没有任何问题的,右手系的(1,0,1)放到unity里面就是(1,1,0),(a,b,c)转换下就是(a,c,b)。但是要表达旋转就比较麻烦,用欧拉角涉及到一个顺序的问题,相当麻烦,用四元数稍微好点,但是四元数在左右手系下也有所不同。
目前采用的方法如下:
首先在右手系下,把旋转矩阵转换为四元数表达:
其中ε0123在右手系四元数里分别对应xyzw。这样计算出xyzw之后,再将其转为左手系:
也就是只需要把z和y对调,然后w取相反数就行,从直觉上很好理解,由于左右手系角度的增量方向相反,左手系顺时针为正,右手系逆时针为正(轴垂直纸面向外),而w一定程度表示了旋转的角度,二者反一下就行了。实际上取(-x,-z,-y,w)也是一样的效果。
但是四元数存在一个没法表达绝对值≥180°的问题,超过180的好弄,减360就行,但等于180度也会出问题。好在工程上不要求什么绝对的等于,设置一个角度绝对值上限为179.99999就可以了。