game4automation教程(三)Dirve组件,Drive Behavior组件,Logic Steps逻辑步骤,自定义Motion

勇哥注:

这节讨论一下运动相关的组件。Drive组件的应用,它用来定义轴;Drive Behavior组件更像是运动方式(算法);

Logic Steps逻辑步骤的功能可用于内测,即是不用plc,自己写逻辑测试动作。



(一)Drive组件


把游戏对象添加Driver组件后,就构建了运动轴。

Drive将沿定义的旋转轴或者线性轴移动游戏对象。

由于Driver不会向plc公开Signal接口,为此,除了游戏对象的Driver脚本之外,

还要添加Drive Behavior脚本,这个脚本包括特殊行为(如气缸或者位置控制驱动器),以及支持各种信号。


线性轴的运动方向始终根据驱动所连接的局部坐标系定义。

在旋转轴上,轴的旋转点是局部坐标系的中心点,围绕定义的轴旋转。

驱动器也可以连接到传输表面,这种情况下,驱动器仅移动传输表面上的MU。


对于线性驱动器,标准单位是毫米,而旋转驱动器则是度数。

速度的标准单位是毫米/秒,度/秒。

注意unity中的Transform中的则是米为单位。



Drive组件、Drive Behavior、PLC之间关系和信号传递。

如下图的描述。

image.png


Driver的属性面板

下面定义了两个Drive,GantryY移动时会带动GantryZ一起动,
而GantryZ仅使用局部坐标系,它根据GantryY的位置移动。

Drive的图标是个齿轮。

image.png

下面是Drive的属性面板。

image.png

image.png

Use Acceleration 加减速这个是个开关,会对Drive Behavior组件的某些类型发挥作用。

Move This Rigid Body on the Drive:

通常,线性或旋转驱动器在不使用 Unity PhysX 刚体的情况下移动,因为这样更稳定。

在某些情况下,可能需要移动 Physics Rigid-Body。

例如,如果带有零件的平台应该旋转,就会出现这种情况。要启用此功能,您必须启用此选项。


轴的方向的指定

当你选择GantryY的时候,会出现特殊的方向手柄。

勇哥标记了红色箭头所指的就是方向手柄,你可以点击灰色的方向,以切换轴运动的方向。

粉红色箭头表示正方向。对于旋转轴,您也可以通过单击粉红色箭头来更改方向。

或者,您可以使用热键更改行驶方向。通过按 SPACE,您可以反转当前所选 Drive 的方向。

通过按 TAB 键,您可以遍历所有 6 个可能的方向(3 个线性方向和 3 个旋转方向)。

image.png

这个运动方向的图标,受下面开关控制:

image.png


驱动器限制

可以定义驱动器的上限和下限。这些限制仅在有 JogForward 和 JogBackward 功能的驱动器上使用。

限制显示如下:

你得勾选use Limits。

这里勇哥故意把Upper Limit设置较大的值,你可以注意到正方向粉色箭头的长度就是这个2000。

限制这个东西就类似于运控卡中定义的软限位功能。


image.png

你可能想知道播放的的时候,位置如果超出了这个限位,是返回报错信息?还是到最大位置就不动了?

在模拟模式下,使用手柄,您可以在每个方向上以点动模式启动驱动器。

如果定义了驱动器限制,则驱动器将在其限制处停止。

此外,驱动器的当前位置会动态的以 mm 为单位显示。对于旋转轴,它以度为单位显示。

这里也可以用快捷键,按键1是往负方向,按键2是往正方向。

image.png




(二)Drive Behavior组件

Drive Behavior定义了Drive的详细的行为。

game4automation预定义了一些标准的驱动器行为。

所有的行为都是Driver_开头。

这个系列的组件如下图所示:

image.png


(1)Drive_Cylinder

圆柱运动的模型,我们通常可以使用它来模拟气缸。

它有一个最大和最小位置。移入与移出的速度以秒为单位,以TimeOut和TimeIn参数来定义。

还可以定义两个传感器,将气缸停在Max或者Min位置。

可以通过Behavior Signals下设置布尔值来手动控制。

可以PLC IO控制这个气缸。

image.png


(2)Drive_Simple

Simple Drive 仅由布尔值控制。可以控制它向前和向后行驶。

我们可以用它来模拟IO控制的电机。

下面是simple 驱动器的属性窗口:

image.png


3)Drive_DestinationMotor

目标电机类型,由目标位置和目标速度控制。

这一种类型比较类似于电缸,但却不是脉冲型驱动器。

设置目标速度和目标位置后,可以通过布尔值 Signal StartDrive 开始移动。

驱动器到达其目标位置后,Is At Destination 将设置为高电平。

image.png


4)Drive_FollowPosition

这是跟随位置类型,其中驱动器完全遵循 PLC 的当前提供位置。

这一种就是我们熟悉的脉冲型驱动器了。但是驱动器的速度由发送位置的频率来决定。

image.png


(5Drive_Gear

此行为模型可用于将两个驱动器连接在一起。

主驱动器将控制齿轮所连接的驱动器的位置。

这对于两个夹持手指非常有用,其中只有一个由气动模型控制,第二个则相应地跟随。

齿轮控制驱动器的位置公式为:

CurrentPosition = MasterDrive.CurrentPosition x GearFactor + Offset。

image.png


(5Drive_ContinousDestination

该驱动器不断尝试以给定的速度运动到目的地。

与 Drive_FollowPosition 不同,它可能需要一些时间才能到达目的地。一旦 SignalDestination 发生更改,

此驱动器始终开始驶向不同的目的地。

请注意,您需要在连接的驱动器中打开 UseAccelearation 才能使用加速度值。

这种类型的驱动器就PositionControl(位置控制)

实际上,这种类型就类似于运动控制卡的ptp运动的api发送脉冲的效果。

image.png


(5Drive_Speed

Drive_Speed 是通过速度控制驱动器。你不能直接控制位置。驱动器始终以给定的速度行驶。

正速度值表示前进方向。负速度值表示向后移动。

请注意,平滑加速不适用于此驱动器。如果要停止驱动器,则需要将速度设置为零。

这种类型的驱动器称为 SpeedControl。

此类型在运动控制卡里,也就是jog运动了。

image.png


(6)Drive_ErraticPosition

此驱动器仅用于测试目的。它不断移动到 MinPos 和 MaxPos 之间的随机位置。


(7)Drive_Sequence

这是一个动作序列。

这个是不建议再使用功能,而是使用新的 LogicStep 可视化编程,它更简单,为您提供更大的灵活性。


启动序列步骤

Drive_Sequence 行为允许定义简单的运动序列。

序列中的每个步骤都可以设置 Drive speed 和 Drive Destination。

该步骤在前一个步骤之后自动启动。如果在 Wait For Signal 中定义了 PLCSignal,

则在将 Signal 设置为 true 之前,Step 不会启动。


结束序列步骤

在 Wait After Step 中,可以定义一个时间(以秒为单位),该时间应在驱动器到达目的地后和开始下一步之前等待。

Finished 信号是可选的,可用于启动外部进程或 Drive_Sequences。步骤完成后,此信号将立即设置为 true

image.png

从它的属性面板可以看出,这一种就是运控卡的类似于连续插补、缓存区动作、前瞻等类似的功能。



(三)Logicsteps 逻辑步骤

使用 Logicsteps,您可以轻松创建一系列生产步骤,而无需连接 PLC,或者只是为了模拟您的过程。

包括驱动器、传感器和布尔信号的控制。可以使用多个预定义逻辑。

也可以定义用户定义的逻辑 以下章节介绍了可用的逻辑以及定义您自己的逻辑的方法。

Logicsteps 的主要优点是,无需编程或任何其他安装,即可非常容易定义一系列操作和条件。

image.png


要使用 logic steps,请添加一个空对象。然后,这些步骤将作为组件附加到此对象。

附加组件的顺序决定了步骤的使用顺序。您可以使用拖放来更改顺序。

如果您有多个进程,请为每个进程使用单独的空对象来定义顺序。这有助于您保持概览。

必须定义每个步骤,例如,开始驱动,等待物体到达传感器,停止驱动。

对于每个步骤,您可以定义一个唯一的名称。这有助于在序列中进行定向。

对于像 goto 和 jump 这样的 logic 步骤,必须有这些名称。

步骤中的另一个基本属性是 blocking 属性。如果 logic 具有此属性,则该 logic 是唯一正在运行的 logic 。

例如,“WaitforSensor”步骤会阻止所有其他步骤,直到传感器具有所需的值。

每个预定义的阻塞逻辑都包含一个进度条。

这样你就可以一眼看到它。非阻塞逻辑的执行时间为 0 时间。

image.png


当一个 logic step 附加到 game 对象时,scene menue 提供对所有 logic steps 的快速访问。

在菜单项 game4automation/AddComponent/Logicstep 下提供了另一种选择逻辑步骤的可能性。

image.png


Logic step Delay (逻辑阶跃延迟)在这里,您可以在运行时设置特定的延迟(以秒为单位)。该步骤还提供了一个进度条,该进度条由 Unity Fixed Update 更新。

image.png


逻辑步长 Drive to在此步骤中,您让驱动器移动到某个位置。该值以 mm 为单位指定。如果选择 relative,则定义的移动将添加到驱动器的当前位置。进度在元素中可视化。

                                 image.png

Logic step 设置信号 bool特定的 bool 信号设置为 true 或 false。


image.png

逻辑步骤 Start drive speed在此步骤中,将设置驱动器的速度。这允许您启动驱动器。如果速度设置为 0,则驱动器停止。如果为正值,则驱动器向前移动。负速度会导致向后移动。

image.png

逻辑步骤 Start drive to在此步骤中,您让驱动器移动到某个位置。该值以 mm 为单位指定。如果选择 relative,则定义的移动将添加到驱动器的当前位置。

image.png


逻辑步骤:等待目标上的驱动器停止每个操作,直到指定的驱动器到达其目标。


image.png

逻辑步长 Wait for sensor此步骤用于等待特定传感器。使用 “Wait for occupied” 复选框确定哪个传感器状态会触发该步骤。

image.png

逻辑步骤 跳转到信号根据定义的信号,您可以跳转到选定的 logic step。


image.png


如果当前可用的 logic steps 没有提供您需要的功能,您可以实现自己的 logic step。

为此,请在 logicsteps 文件夹中创建一个新的脚本文件。您的 user 类必须是 LogicStep 类型。下图显示了当前脚本的示例。

public class LogicStep_StartDriveSpeed : LogicStep   
{
       public Drive drive;
       public float Speed;
       protected new bool NonBlocking()       
       {           
         return true;       
       }       
       protected override void OnStarted()       
       {           
         if (drive != null)           
         {                
         drive.TargetSpeed = Mathf.Abs(Speed);               
         if (Speed > 0)               
         {                   
           drive.JogForward = true;                   
           drive.JogBackward = false;               
          }               
          if (Speed == 0)               
         {                   
            drive.JogForward = false;                   
            drive.JogBackward = false;               
          }               
         if (Speed < 0)               
         {                   
            drive.JogForward = false;                   
            drive.JogBackward = true;               
         }           
       }           
       NextStep();        
   }

主类 logicstep.cs 包含按定义序列处理多个步骤所需的基本函数。当到达最后一步时,序列将从第一步重新开始。

该类包含以下方法:

protected void NextStep() - 调用序列的下一步

public void StartStep() — 启动步骤

protected void Start() - 在运行时开始时启动序列


主类需要 logic step 实现以下方法:

protected new bool NonBlocking

protected override void OnStarted

方法 nextStep() 必须在每个 logic step 完成后调用。(参见示例第 34 行)


(四)面向开发人员的 Motion

FixedUpdates 的顺序

在为驱动器开发自定义行为模型时,了解 FixedUpdates 的顺序对于确保正确的行为和性能至关重要。

(1)物理更新周期:所有Drive行为计算和新Drive位置的设置都在 Unity 的物理更新周期内进行。

默认情况下,此周期设置为 20 毫秒,但可以根据性能和计算要求在 Unity 设置中进行调整。

(2)FixedUpdate Sequence:Unity 在每个物理周期内对所有脚本执行 FixedUpdate 方法。

但是,不能保证这些 FixedUpdates 的执行顺序。

这意味着一个脚本 (Script1) 中的 FixedUpdate 可以在另一个脚本 (Script2) 中的 FixedUpdate 之前或之后调用。

(3)依赖关系管理:对于依赖于其他组件(例如 Gears 或 CAM)的行为模型,必须按特定顺序计算依赖关系。

例如,主 Drive 应该在其依赖的 slave Drive 之前计算。此外,在更新主 Drive 的位置之前,

需要处理 master Drive 的行为模型。


为了确保顺序正确,每个 Drive 都会实现以下行为:

(1)Drive Behavior Execution:每个 Drive 调用实现该接口的所有附加驱动器行为。

CalcFixedUpdateIDriveBehavior

(2)行为模型计算:附加的行为模型可以修改 Drive 的公共属性来控制其状态或直接设置 Drive 的状态。

CurrentPosition

(3)位置更新:然后,驱动器会将其位置更新为 。CurrentPosition

(4)Subdrive Calculations:Drive 的所有 Subdrives 都将调用其 CalcFixedUpdate(见下文)。


子驱动器

某些 Drive 用作 master Drive 的子驱动器,例如在 Gear 或 CAM 的情况下。

为了确保行为正确,这些驱动器需要实现接口。

此外,在该方法期间,子驱动器必须调用 .此设置可确保子驱动器不运行自己的 FixedUpdate,

而是等待主驱动器调用 CalcFixedUpdate,如上所述。

IDriveBehaviorStartMasterDrive.AddSubDrive(thisDrive)


设置驱动器位置

如前所述,在 Drive 和 Drive Behavior Execution 循环中,Drive Behavior 可以设置 public 属性 。

由于所描述的顺序,此方法可确保正确更新位置。CurrentPositio


驱动器上还有一个可用的 public 方法。调用此方法时,Drive 将再次设置其位置,

即使该 Drive 的上述序列已在同一 FixedUpdate 周期中完成。SetPosition(float position)


重要提示:不建议直接调用。

最好使用附加到 Drive 的行为模型中的接口来实现逻辑。

此方法可确保驱动器位置更新以受控且可预测的方式进行,并遵循既定的 FixedUpdates 序列。

SetPositionIDriveBehavior


驱动器事件

Drive 有两个关键事件,您可以利用它们来挂接到其更新序列中:

(1)OnBeforeDriveCalculation 方法:此事件在 Drive 开始计算其行为模型并更新其位置之前触发。

这是在 Drive 的主要计算发生之前注入自定义逻辑或进行调整的理想点。

(2)OnAfterDriveCalculation 中:在 Drive 完成所有行为模型计算并更新其位置之后,

但在计算任何 SubDrive 之前,将调用此事件。

这允许您在主驱动器更新后立即进行进一步修改或执行操作,但仍在整个更新序列内。


通过使用这些事件,您可以有效地将自定义行为或调整集成到 Drive 的更新过程中。

image.png



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2024-11-18 22:09:46 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864