AGV小车、机械臂协同作业实战05-opentcs 订单详解

运输订单由 类的实例表示TransportOrder,描述了车辆要执行的过程。通常,此过程是将货物从一个地点实际运输到另一个地点。然而,
TransportOrder也可以仅描述车辆到目的地位置的移动以及要执行的可选车辆操作。

以下所有都是 openTCS 中“运输订单”的示例,即使实际上没有运输任何东西:

  • 将货物从某处运输到另一处的经典订单:
  1. 移动到位置“A”并在那里执行“装载货物”操作。

  2. 移动到位置“B”并在那里执行“卸载货物”操作。

  • 操纵运输或固定货物
  1. 移动到位置“A”并在那里执行“钻孔”操作。

  2. 移动到位置“B”并在那里执行“锤子”操作。

  • 将车辆移至停车位置的命令:
  1. 移动到点“Park 01”(不执行任何特定操作)。

  2. 给车辆电池充电的命令:

  • 移动到“充电站”位置并在那里执行“给电池充电”操作。

运输订单的生命周期

  1. 创建运输订单时,其初始状态为RAW

  2. 用户/客户端设置传输顺序的参数,这些参数应该影响传输过程。这些参数可以是例如运输订单的最后期限、应该处理运输订单的车辆或一组通用的、通常是项目特定的属性。

  3. 传输命令被激活,即参数设置完成。其状态设置为ACTIVE

    扫描二维码关注公众号,回复: 16864794 查看本文章
  4. 内核的路由器检查传输顺序的目的地之间的路由是否可能。如果是,则其状态更改为DISPATCHABLE。如果无法进行路由,则运输订单将被标记为UNROUTABLE并且不再进行任何进一步处理。

  5. 内核的调度程序检查是否满足执行运输订单的所有要求以及是否有车辆可用于处理它。只要有任何要求尚未满足或没有车辆可以执行,运输订单就会等待。

  6. 内核的调度程序将运输订单分配给车辆进行处理。其状态更改为BEING_PROCESSED

  • 如果正在处理的运输订单被撤回(由客户/用户),则其状态首先更改为 ,WITHDRAWN同时车辆执行已发送给它的任何订单。然后传输订单的状态更改为FAILED。它不会被进一步处理。

  • 如果运输订单的处理因任何原因失败,则会被标记为FAILED并且不再进行进一步处理。

  • 如果车辆成功处理整个运输订单,则标记为 FINISHED

  1. 最终,经过一段较​​长的时间或当内核的订单池中积累了太多处于最终状态的传输订单时,内核会删除该传输订单。

以下状态机直观地展示了此生命周期:

在这里插入图片描述
订单的生命周期:
→ RAW:初始化状态
→ACTIVE:被激活
→DISPATCHABLE / UNROUTABLE:如果可以到达,状态更改为等待派发,如果目的地无法到达,状态更改为不可路由。
→BEING_PROCESSED:正在执行状态。
→WITHDRAWN:如果废弃了更改为废弃状态,
→FAILED:订单运行过程中失败,置为失败。
→FINISHED:订单结束

运输订单的结构和处理

运输订单是通过调用创建的TransportOrderService.createTransportOrder()。 TransportOrderCreationTO作为其参数,它期望包含要访问的目的地序列以及车辆应该在那里执行的操作的实例。

内核将每个都包装Destination在一个新创建的DriveOrder实例中。这些DriveOrder本身由内核按照TransportOrder给定的顺序包装在一个新创建的实例中,如下图所示:
在这里插入图片描述

一旦将 TransportOrder分配给车辆,就会为其每 秒 计算 Dispatchera 。然后将这些轨迹 存储在相应的任务驱动中。RouteDriveOrderRouteDriveOrder

在这里插入图片描述

一旦车辆(驾驶员)能够处理 对应的任务 ,其DriveOrder单个任务就会映射到点位上 。这些包含车辆驾驶员到达最终目的地并在那里执行所需操作所需的所有信息StepRouteMovementCommandMovementCommand
在这里插入图片描述

要将行驶的部分路线的 MovementCommand一点点发送给车辆驾驶员。内核就需要将 MovementCommands 提前发送车辆驱动程序正常运行所需的数量。这样做是为了保持对所有车辆使用的路径/资源的细粒度控制。车辆驾驶员可以MovementCommand通过调整其命令队列容量来设置其提前获得的最大数量。

一旦 DriveOrder完成,Route下一个DriveOrder就会映射到MovementCommands。一旦最后DriveOrder一个TransportOrder完成,整体TransportOrder也完成了。

如何创建运输订单

  1. 创建车辆应该行驶的目的地列表
    每个目的地都由工厂模型中目的地位置的名称以及车辆应该在那里执行的操作来描述:
List<DestinationCreationTO> destinations
    = List.of(
        new DestinationCreationTO("Some location", "Some operation")
    );
  1. 创建一个运输订单
    根据需要将尽可能多的目的地放入列表中。然后创建一个运输订单描述,其中包含新运输订单的名称和目的地列表
TransportOrderCreationTO orderTO
    = new TransportOrderCreationTO("MyTransportOrder", destinations);

订单名称不填,表示订单的全名由内核生成。(如果您不这样做,则需要确保上面给出的运输订单的名称是唯一的)
如下:

orderTO = orderTO.withIncompleteName(true);

(可选)为运输订单设置更多参数,例如设置订单的截止日期或为其分配特定车辆:

orderTO = orderTO
    .withIntendedVehicleName("Some vehicle")
    .withDeadline(Instant.now().plus(1, ChronoUnit.HOURS));

如何创建将车辆发送到某个点而不是某个位置的运输订单?

创建一个包含指向某个点的单个目的地的列表,用作Destination.OP_MOVE要执行的操作:

List<DestinationCreationTO> destinations
    = List.of(
        new DestinationCreationTO("Some point", Destination.OP_MOVE)
    );

使用新运输订单的名称和(单元素)目的地列表创建运输订单描述:

TransportOrderCreationTO orderTO
    = new TransportOrderCreationTO("MyTransportOrder", destinations)
        .withIntendedVehicleName("Some vehicle")
        .withIncompleteName(true);

如何使用订单序列

单序列可用于强制单个车辆按给定顺序处理多个运输订单。的 API 文档中描述了使用订单序列的一些规则OrderSequence,但以下是您通常会执行的操作。首先,创建订单序列描述,并提供名称:

OrderSequenceCreationTO sequenceTO
    = new OrderSequenceCreationTO("MyOrderSequence");

可选地,表示序列的全名应由内核生成。(如果不这样做,则需要确保上面给出的订单序列的名称是唯一的。)

sequenceTO = sequenceTO.withIncompleteName(true);

(可选)设置序列的失败致命标志:

sequenceTO = sequenceTO.withFailureFatal(true);

获取一个TransportOrderService(请参阅获取服务对象)并要求它使用给定的描述创建订单序列:

TransportOrderService transportOrderService = getATransportOrderService();
OrderSequence orderSequence
    = transportOrderService.createOrderSequence(sequenceTO);

像往常一样创建运输订单的描述,但通过设置包装序列的名称withWrappingSequence()以将运输订单与订单序列相关联。然后,使用创建运输订单TransportOrderService。

TransportOrderCreationTO orderTO
    = new TransportOrderCreationTO(
        "MyOrder",
        List.of(
            new DestinationCreationTO("Some location", "Some operation")
        )
    )
        .withIncompleteName(true)
        .withWrappingSequence(orderSequence.getName());

transportOrderService.createTransportOrder(orderTO);

根据需要创建更多订单并将其添加到订单序列中。最后,设置订单序列的完整标志以指示不会再向其中添加更多运输订单:

transportOrderService.markOrderSequenceComplete(
    orderSequence.getReference()
);

只要序列尚未标记为完成并完全完成,为其第一个订单选择的车辆将与该序列绑定。在整个序列完成之前,它不会处理任何不属于同一序列的订单。

一旦序列的完成标志被设置并且属于它的所有传输指令都被处理,其完成标志将由内核设置。

如何撤回运输订单?

要撤回运输订单,请获取DispatcherService(请参阅获取服务对象)并要求其撤回订单,并提供对其的引用:

DispatcherService dispatcherService = getADispatcherService();
dispatcherService.withdrawByTransportOrder(someOrder.getReference(), true);

第二个参数指示车辆是否应该完成已分配给它的运动 ( false) 或立即中止 ( true)。

如何通过车辆参考撤回运输订单

要撤回特定车辆当前正在处理的运输订单,请获取DispatcherService(请参阅获取服务对象)并要求其撤回订单,并提供对车辆的引用:

DispatcherService dispatcherService = getADispatcherService();
dispatcherService.withdrawByVehicle(curVehicle.getReference(), true);

第二个参数指示车辆是否应该完成已分配给它的运动 ( false) 或立即中止 ( true)。

翻译过来的,等后面熟悉了再改正。

猜你喜欢

转载自blog.csdn.net/hai411741962/article/details/132980272