前篇的流水线应用,使用了事件来通知各个设备的协调工作,缺点是代码不太容易理解,导致不好调试。因此本篇写了一个简单使用布尔判断条件来执行手臂、手爪运行的任务。
1. 机械臂IK函数修改
本例使用的是Kuka机械臂,因为姿态不同,解算函数相比较前篇稍微修改了一点。
S_Axis_1和S_Axis_2两个关节之间的有一个位置偏差,在计算时,将旋转的Sita_3弧度位置加在 S_Axis_1的位置上,就能得到S_Axis_2的新位置:
var newplace = Quaternion.Euler(0, sita_3 - 90, 0)*L;
Vector3 newBase = Base.position + newplace;
机械臂的脚本各节点的设置如下,按对应名称拖入。这里只实现了3个旋转轴:
2. 旋转关节控制:
旋转关节依旧按前篇,重写Transform的Rotate方法,使用DoTween实现旋转动画
3. 机械臂动作判断条件
本例主要是使用3个布尔值判断机械臂的当前状态:抓取工件、放置工件、回零。每一个动作结束后都将布尔值取反。虽然麻烦,但是比较容易理解。
4. 工件设置
机械臂抓取的工件需要放入指定层中,在传感器的脚本中会检测相应的层(这里设置的层号是7,层名是“Loader")
Physics.Linecast(emitter.position, receiver.position, out RaycastHit hit, LayerMask.GetMask("Loader"));
5. 各个对象间相互调用的设置
本例比较简单粗暴,所有需要被调用的节点都设置为公共变量public将对象拖入,因此设置时需要都检查一遍:
(1)机械臂需要调用手爪:
(2)手爪需要调用机械臂及手爪的两个手指
(3)传感器需要通知机械臂和传送带的Engine
6. 其他需要注意的:
(1)传送带的引擎设置,EnginePower为0时传送带停止
(2)传感器上加了一个碰撞器,目前场景中没有使用,但也可以作为一种触发机械臂移动的方法。