勇哥注:
抓取与放下MU,就是本节要讨论的话题。
这个话题还比较多,本节讨论最简单的基于碰撞算法的方式。
(一)Fixer组件
这个组件,简单的说就是把要抓取的物体去掉物理属性,可以配合动力学,跟随夹爪一起运动。
这个效果就像是你的MU物体突然变成了夹爪的子物体。
Fixer有一个检测区域,这个检测有两种方式,一是碰撞检测,二是射线投影。
检测区域一旦有效,则这个MU的 Physics (物理) 和 Gravity (重力) 将关闭,MU将跟随运动部件一起运动。
如果一个MU被一个Fixer作用时,而另一个Fixer也和这个MU碰撞了,则MU将移交到后者的Fixer,
这个机制可被用来制作换手交接物料的情况。
Fixer有一个属性叫 Bloack Handing Over或者Signal Block Handing Over设置为true,
可以防止这种切换行为(至少2022以后的版本才有这个属性,勇哥演示的版本还没有)。
另外请别MU放到图层g4a MU。
把添加了Kinematic和Drive、Fixer的对象放到g4a Sensor层。
勇哥经过实验,发现这个是关键,否则你会发现MU取不起来,Fixer不起作用。
下面是Fixer的属性面板:
Use Raycast
Fixer有一个检测区域,这个检测有两种方式,一是碰撞检测,二是射线投影。这里勾选后就是启用后者算法。
Limit to Tags
限制标签。
fixer可以限制为仅对某些 MU 做出反应。在此列表中,可以添加这些MU标签。
Fix MU
勾选这个即可固定住MU,MU将跟随运动部件一起运动
程序实际上也可以通过PLC信号来做这件事,这时候不用勾选此项。
Align and fix on min distance
对齐并固定最小距离。
如果设置为 true,则仅当到固定轴点的距离不再减小时,进入的部分才是固定的。
例如,这可用于在传输表面上精确对齐零件
这项不是太明白,猜测可能是这样的:
夹爪如果以碰撞方式算法夹取拉带上的物料,那不能在碰到物料的时候就固定住mu,
因为这个时候如果固定,那还有一小段距离没走完,
那这样会带着物料穿过拉带(因为此时物理效果已经取消了,当然可以穿过),
因此应该在运动完成后启用fix。
Release on collision non MU
非 MU 的碰撞体进入 Fixer 区域时,将释放 Fixer。
这种情况下,让Fixer不起作用。
Align MU
当 MU 固定时,将 MU 枢轴点与 Fixer 枢轴点对齐。
此项暂时不太明白有什么意义。
Show Status
显示状态。
红色(不固定)和绿色(固定)。
One Bit fix
如果不勾,则需要两个plc信号来分别控制fix和释放fix。
如果勾了些项,则只用一个plc信号来控制。给第一次是fix,给第二次是释放fix。
(图1)
MUS Fixed
这是个列表,当一个MU被fix的时候,就会出现在此列表里面。
(二)一个使用碰撞器方式的取放的例子
场景用了4个Cube构建,如下图:
(图2)
工程列表如下:
(图3)
下面详细说下工程的编辑。
(1)先把Mu添加Source组件。
Max Number M Us置为1,这样就不会复制多个Cube。
注意不需要对Mu对象添加MU组件的,它是自动产生的。这个在勇哥前几篇已经说过。
(图4)
CAD下面放了2个Cube,用来模拟由多个部分构成的一个机械零件。
实际的CAD图,一个夹爪可能有几十个零件构成。
你得让game4automation知道哪一堆东西是需要一起运动的。
你不可能去动CAD对象的结构的,你只能用一个Group组件来告诉game4automation这堆东西是一起的。
因此我们对CAD添加Group组件。
如果想往组里添加对象,需要使用菜单中的SelectionWindow工具。
+,- 先选择对象,按+就是增加,按-就是减去。
++, -- 这个你需要在一个根对象上使用,++就是把这个根下全部对象变成一组,--就是减去。
Hide就是可以显示隐藏这个组的对象的显示。
(图5)
使用这个工具,你可以不改变CAD文件的结构,任意往你的head组添加对象。
这些对象就会一起运动。
从下图就可以看到,凡是添加到head组的对象,都会标记所在组的组名。
这个head组,将用在gipper1上添加的一个叫kinematic组件上面。
(图6)
当你点播放后,你会注意到添加了Group组件的那CAD消失了。
如下图这样。
(图7)
但是,这并不是意味着隐藏了这个组的全部对象,而是添加了Group组件的对象和它的子对象在工程列表中消失了。
所以,虽然这个Group理论上添加到哪个对象上都可以,但是最好添加到CAD零件那个对象上面。
(2)添加kinematic组件
这个组件的参数解释见:http://www.skcircle.com/?id=2565
这个例子中,kineMatic组件我们设置的参数如下图所示:
这个组件最重要的功能就是这个Integrate Group,勾选后,我们要在Group Name中填写之前定义的Group的名字。
这个组名字只能手填,没法选择。
Group Name Prefix 这个是谜之参数,它的字面意思是“组名前缀”,但实际上这里可不是要你填字符串,而是要选择场景中的对象。
显然这个参数的作用并非是字面意思。
勇哥估计它是用于Group对象的复用,假设一个场景中,几个地方都用到了这个叫head的Group,
可能通过个Group Name Prefix的不同,就能识别出不同的作用域。
(图8)
Group组件中也有一个Group Name Prefix,如果我故意让它的值和上面kinematic组件的Group Name Prefix不一样,
你会发现播放后异常了。
原来两者必须要一样,至于两者都是CAD,或者都是testpick,貌似就无所谓了,都可以。
关键在于两者要一致。
(图9)
这样看来,Group Name Prefix这个名字前缀要求一样,这不还是字面意思嘛,这跟手工输入两个一样的名字有何不同?
这样如果要复用的话,就搞不了?
所以勇哥的猜想好像也不对,这个参数还是个谜之参数。
另外注意一点,你可以在Group中和kinematic中同时都不用设置这个Group Name Prefix,也是可以的。
这个面板中那个按钮"Focus Group" 还有点意思,它的作用是让相机拉近对着这个Group的对象,就像万花从中拉近只看一朵花那样。
2024.11.26勇哥注:
关于kinematic的未解之谜已经破解了,见下面的贴子
game4automation教程(十五)再次深入理解kinematic组件
http://www.skcircle.com/?id=2575
(3)添加Drive
这个没什么好讲的。
(图10)
(4)添加Fixer组件
这个组件的作用在本文开始就已经讨论过了。
设置如下:
(图11)
(5)添加Box Collider组件
这个是必须的。这配合Fixer组件,形成依靠碰撞方式完成fix MU。
你得勾选 Is Trigger。然后手工调整一下碰撞体的位置。就是下图中那个绿框的大小与位置。
它应该能碰得到那个MU物体就可以了。
(图12)
你可能会想,Fixer是不是应该有个属性指定这个Box Collider,不然两者怎么发生关系呢?
(图13)
实际上这是不用的,因为Box Collider和Fixer是附加在一个对象上的。
(6)添加plc out信号
什么都不改。
(图14)
把它拖放到Fixer组件的Fixer Fix上面去。
接下来就是要用plc来编制测试动作了。
如果只是想自动动起来做演示,可以不用plc,而是利用Sequence组件。
这里勇哥给kinematic添加Sequence,内容如下:
1. 先从当前位置向下走850, 速度300,走到位了,通知Fixer组件把物料固定住
2. 然后向上走-850,速度300
3. 通知Fixer组件,物料放掉
(图15)
你得先把运动方向的光标置为向下,这个需要你用鼠标指定。
否则对于第一步来说,运控是不可能知道哪个方向是上哪个是下。
(图16)
现在可以播放了。
你会看到下降完成后抓住了物料,上升到顶位时会松开物料,它会掉下来。
然后反复这个过程。
(图17)
从画面上看,kineMatic组件还有一个未解之谜,就是那个粉红色的Gizmo,它的形状不匹配Group的内容。
虽然对于Group内容的全部mesh它都有显示,但是那个粉色的Gizmo,我并不知道如何才能让它适配Group内容的大小。
研究半天都没地方可以设置这个。
干脆把这个工程重做几次,后来勇哥终于摸索出办法了。
原来我们需要先在Kinematic组件里Move Center,即移动轴心点的位置。
这里我把轴放在Group对象(这个group由两个cube构成)的一个面的中心位置。
然后再设置Integrate Group,这个时候game4automation就会自动识别出这个Group的Gizmo了,也就是Group所有对象的mesh(网格)。
(图18)
如果不成功,可以试着在Group中和kinematic中同时都不用设置那个Group Name Prefix。
有时候又可以了。
所以这里还是有秘密在里面,没完全搞清楚。
来张动图:
(图19)
最后说一个可能出现的问题。
就是Source产生的那个mu,有可能会穿透地板。
(图20)
(如图所示,官方的演示程序也有这种问题)
首先,
就是你那个Source不是自动生成了一个MU对象吗。
你选中他,会发现,它自动加了一个MU组件,一个Rigidbody组件,但是可能没有自动加上Box Collider组件。
(图21)
没这个Box Collider组件话,当松开MU掉下来的时候,它就直接穿过了地板了。
为啥有时候会没自动添加这个Box Collider组件呢?
经检查,是因为Cube自己添加了Box Collider组件,这个其实是不需要的。
因为Source生成的MU对象中,会自动添加Box Collider组件,你要是在Box中添加了,那生成的MU对象中就没有了Box Collider。
因为不可能在父对象和子对象中同时添加Box Collider。(注意我们是在Mu上面添加Source的)
这样弄了后,自动生成的MU上面就正常了。但是在播放后,这个生产的MU还是会穿透地板。
(图22)
(播放后,在项目列表中的这个就是被source组件复制出来的mu)
(图23)
(播放后,这个Cube其实是source复制出来的mu,已经不是你在场景上摆放的那个cube了)
(图24)
(可以到看,复制出来的MU-1,它已经有物理和碰撞检测两个组件了,理论上是不可能穿透地板的)
这又是为何?真是百思不得其解。
最后反复折腾,发现就是本文开篇说的图层问题。
自动生成MU-1,它的图层生成在了Default上面,而不是g4a MU上面。
像下面这样就可以了。
(图25)
Generate On Layer 就是字面意思,生成的mu生在哪个图层。
然后重新播放,你再去点生成的那个MU-1,它的图层就会是在g4a MU,而不在是在default了。
但是为啥之前做的项目,什么都一模一样的,我也没有去改这个Generate On Layer,但是也工作正常呢?
我想这只能解释成操作的先后次序有什么不一样的地方。
game4automation有可能会跟据操作顺序的信息,置了某些缺省值。
瞎猜的,以后再确认这一点。
经过这个问题的折腾,倒是对game4automation的组件的一些机制有了更深入的了解了。
勇哥注:2025/1/25
经过反复次的测试,关于mu穿透地板的问题,有了新的见解。
就是不同电脑的性能会影响到此问题。
在上面的教程中,我们是在MU对象上没有添加BoxCollection和RigidBody组件的。
这样Source组件会在生成MU对象时采用缺省的BoxCollection和RigidBody组件。
这样的话,我们就没有机会对这两个组件做参数指定了。
因此我们可以直接在MU对象上添加这两个组件,并定位好指定参数,主要是碰撞算法的指定,
可以选择更精密但耗cpu性能的算法。
(图26)
然后你会发现MU穿透地板的问题就解决了。
当然前面说的图层问题,也是一个关键点,请同时要注意。
下面是勇哥编的新的测试例子。
注意我并没有在CAD这一层上加Group。这一点是解决为啥kinematic的Gizmo框为啥并不是紧贴group对象,而是一个很大的box的问题。
即(图17)所示的现象。
(图28)
新例子的效果:
本例子源码下载:

