![ABB工业机器人进阶编程与应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/794/44819794/b_44819794.jpg)
1.4.4 左乘与右乘
由1.1.1节所知,机器人的姿态数据可以由3×3的旋转矩阵表示,位姿可由4×4的齐次矩阵表示。矩阵的乘法不满足交换律,即矩阵A×B通常不等于B×A。
由1.1.4小节所知,姿态数据A右乘一个姿态数据B得到新的姿态C(C=A×B),相当于姿态A绕着自身旋转了姿态B得到新姿态数据C,参考坐标系为姿态A,如图1-53所示。
而姿态数据A左乘一个姿态数据B得到新的姿态C(C=B×A),相当于姿态A绕着姿态A参考的坐标系方向(w0)旋转了姿态B得到新姿态数据C,参考坐标系为姿态w0,如图1-54所示。
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_56_1.jpg?sign=1739629646-u1gZTLe8H7JJ8RGFUzMfR0zmKSljJdve-0-635439b13907f324b22819d426bc3681)
图1-53 姿态数据的右乘
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_56_2.jpg?sign=1739629646-VWmIR9IVtlPQQKztyezxiZiF9ljIue2H-0-741c9093cce8ebbea6b92ae9cd55a89b)
图1-54 姿态数据的左乘
使用工具MyTool,在工件坐标系workobject_1下记录原始点位p3000[见图1-55(a)]。使用姿态数据右乘相当于使用了RelTool(p3000,0,0,0\Rx:=rx\Ry:=ry\Rz:=rz)的效果(注:RelTool的旋转顺序为x-y-z),即绕原有点位p3000的姿态旋转。执行以下代码,机器人最终的姿态如图1-55(b)所示。
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_56_3.jpg?sign=1739629646-zGM8BCOLUbrK0Lf5VLRNdnMfSPcPTHCL-0-576e3aefeedb38abfe3972b2089d3760)
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_56_4.jpg?sign=1739629646-2L2PdGJ1kyf9ujUYoXglcEwWbhR2PJwp-0-2f0ef448ea8f0668473198ec74245e62)
图1-55 姿态数据的右乘
使用姿态左乘,相当于把workobject_1的原点平移到p3000位置(x-y-z),p3000的姿态绕着平移到p3000后的workobject_1的姿态旋转。执行以下代码,机器人最终的姿态如图1-56(b)所示。
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_56_5.jpg?sign=1739629646-8pZssavAm29nTaThc7oNkqD2su7Un7B2-0-03b796d14ff9090b7577cb05279f7b55)
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_57_1.jpg?sign=1739629646-l6a38wAbaIIcxJbgpyT45un2qc6tMA1V-0-401b50a3310e2575c3e062bc68c90490)
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_57_2.jpg?sign=1739629646-g4f5RnTXG6ubPmUSBPCCDwUDYTTD0hHH-0-98f52915dd5d869703ba0225a1c09f7e)
图1-56 姿态数据的左乘
机器人当前的TCP如图1-57(a)所示,此时TCP的z方向沿着抓手方向(与工件产品平行),TCP的x方向垂直于工件产品表面。
通过外设(激光测距等设备),可得知当前工件设备绕自身旋转了一定角度(如10°),如图1-57(b)所示。
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_57_3.jpg?sign=1739629646-7vBe6Etp4k9rMdWV3cNTsH0vMgxHDxAq-0-92b58afbb6a9f4f4c43c10400ecec33a)
图1-57 机器人当前的TCP和工件设备绕自身旋转一定角度
希望机器人能调整自身姿态,使得抓手与旋转10°后的产品平行,并沿着产品方向前进100mm。此时即可使用姿态的左乘调整姿态(令图1-58中原始位姿的tx、ty、tz绕着与Base坐标系平行的一个坐标系的z轴旋转10°),再使用RelTool沿着工具方向前进,具体实现如以下代码所示。
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_57_4.jpg?sign=1739629646-x0OWS3qrTzxeKK5OMKaOUWJM690P2OUT-0-c2587c69eb767d0932f9dbe110e69856)
图1-58 机器人的原始位姿
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_58_1.jpg?sign=1739629646-FnI8FtnChyLvbebQkyPkLFmV87Aeg37F-0-a68b6110b92e77dc93d79b5c677db86b)
综上,可以编写如下基于工具/工件坐标系的偏移和旋转函数:
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_58_2.jpg?sign=1739629646-qkQOha6qqNf4l7Sc0FHeJycxWU20UhBz-0-972477dc1efaa02f1b98f45180ddd7ff)
若选择参考tool,则实现方式采用RAPID标准的RelTool指令;若选择参考wobj,则先沿着wobj平移,再绕着wobj的姿态方向旋转,使用参考wobj,效果同在示教器中使用重定位,参考坐标系为“工件坐标系”,如图1-59所示。
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_58_3.jpg?sign=1739629646-ydJP4bIo1vMN72KWgFvGhe4luWocKszi-0-5797d8f5e1f6ed5b23cafe3aedb6c32f)
图1-59 重定位参考坐标系为工件坐标系
同理,在使用PoseMult函数时也存在左乘与右乘的区别。右乘为绕着当前坐标系先平移后旋转(如图1-60所示,位姿A先沿着坐标系A平移到A′,再绕着A′旋转得到位姿C,即C=A×B)。PoseMult左乘则为位姿A绕着参考的固定坐标系(位姿w0)的原点先旋转位姿B中的姿态数据,再沿着原有参考坐标系(w0)平移位姿数据B中的位置部分,得到新位姿C(C=B×A),如图1-61所示。
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_59_1.jpg?sign=1739629646-Avrvb2MEceGRIYVhwRs1mDivftkTou8T-0-0f45e2136d70e9e4010de56b9966ef2e)
图1-60 位姿数据的右乘
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_59_2.jpg?sign=1739629646-XJ39udqQ8V0BhnIWk9MuuPEBBmX2Qs0K-0-ea2487348fd893ab1769c0f086f33ded)
图1-61 位姿数据的左乘
使用工具MyTool,在工件坐标系workobject_1下记录原始点位p3000[见图1-62(a)]。使用p3000中的位姿数据右乘位姿数据pose1([[30,0,0],OrientZYX(45,0,0)]),即先沿着p3000原始姿态的x方向平移30,得到图1-63中的x1、y1、z1,再绕x1、y1、z1的z轴旋转45°得到x2、y2、z2。执行以下代码,机器人最终的姿态如图1-62(b)所示。
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_59_3.jpg?sign=1739629646-TTkDqigQRtfW63raVMgxXpMIrghDc4K0-0-dc18cd2c124ce85604ef9c6d8ced9e83)
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_59_4.jpg?sign=1739629646-6d1nme5RPhTWkaNVWdaKTj0zCz1XQPdo-0-0c84ff3cf95283e67a7d0dba21c5b493)
图1-62 位姿数据的右乘
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_59_5.jpg?sign=1739629646-A6z37gp2fW5R8oKIAx4Ahs1JHuB2qF5k-0-126f4f8ab18fb96d33d50f1e1238ee08)
图1-63 位姿数据的右乘
使用工具MyTool,在工件坐标系workobject_1下记录原始点位p3000[见图1-64(a)]。使用p3000中的位姿数据左乘位姿数据pose1([[30,0,0],OrientZYX(90,0,0)]),即p3000绕着参考坐标系workobject1的原点的z轴旋转90°,得到图1-65中的位姿1,再将位姿1沿着workobject1的x方向平移30得到图1-65中的位姿2,即最终位姿。执行以下代码,机器人最终的姿态如图1-64(b)所示。
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_60_1.jpg?sign=1739629646-biR7RNaLIRfbknRnxUAPp0ZYShJpUCY6-0-662e9f674207afde48efc27f9db66a35)
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_60_2.jpg?sign=1739629646-cMTfZ5kvnH6Is6AwZkgj4SfqWVqGtfwy-0-aff5b0f717515139be7b11d3d9380abf)
图1-64 位姿数据的左乘
![](https://epubservercos.yuewen.com/315336/23950325101463306/epubprivate/OEBPS/Images/43597_60_3.jpg?sign=1739629646-GaN8xQYbDzTgdYAgQIQsuXO5cbetomAM-0-ba86ddc6c19297d41e1289bcc2cf6c02)
图1-65 位姿数据的左乘