前篇的流水线应用,使用了事件来通知各个设备的协调工作,缺点是代码不太容易理解,导致不好调试。因此本篇写了一个简单使用布尔判断条件来执行手臂、手爪运行的任务。

 1. 机械臂IK函数修改

  本例使用的是Kuka机械臂,因为姿态不同,解算函数相比较前篇稍微修改了一点。

unity设置机械臂旋转轴_unity设置机械臂旋转轴

 

unity设置机械臂旋转轴_unity设置机械臂旋转轴_02

   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个旋转轴:

unity设置机械臂旋转轴_unity_03

  2. 旋转关节控制:

  旋转关节依旧按前篇,重写Transform的Rotate方法,使用DoTween实现旋转动画

unity设置机械臂旋转轴_旋转动画_04

  3. 机械臂动作判断条件

  本例主要是使用3个布尔值判断机械臂的当前状态:抓取工件、放置工件、回零。每一个动作结束后都将布尔值取反。虽然麻烦,但是比较容易理解。

unity设置机械臂旋转轴_机械臂_05

  4. 工件设置

  机械臂抓取的工件需要放入指定层中,在传感器的脚本中会检测相应的层(这里设置的层号是7,层名是“Loader")

unity设置机械臂旋转轴_unity设置机械臂旋转轴_06

Physics.Linecast(emitter.position, receiver.position, out RaycastHit hit, LayerMask.GetMask("Loader"));

  5. 各个对象间相互调用的设置

  本例比较简单粗暴,所有需要被调用的节点都设置为公共变量public将对象拖入,因此设置时需要都检查一遍:

  (1)机械臂需要调用手爪:

unity设置机械臂旋转轴_unity_07

   (2)手爪需要调用机械臂及手爪的两个手指

unity设置机械臂旋转轴_c#_08

   (3)传感器需要通知机械臂和传送带的Engine

unity设置机械臂旋转轴_unity_09

   6. 其他需要注意的:

  (1)传送带的引擎设置,EnginePower为0时传送带停止

unity设置机械臂旋转轴_unity_10

   (2)传感器上加了一个碰撞器,目前场景中没有使用,但也可以作为一种触发机械臂移动的方法。

unity设置机械臂旋转轴_unity设置机械臂旋转轴_11