From 7ac42a2b80c850307cb9df1c1b0d918b349e7843 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Wed, 18 Jun 2025 10:35:01 +0800 Subject: [PATCH 01/13] update --- .../LoopbackCommunicationAdapter.java | 22 ------------------- opentcs-common/build.gradle | 2 ++ .../traffic/common/ContourAlgorithm.java | 4 ---- .../servicewebapi/v1/VehicleHandler.java | 12 ++++++++++ .../vehicles/DefaultVehicleController.java | 3 +++ 5 files changed, 17 insertions(+), 26 deletions(-) diff --git a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java index 4588c56..a923801 100644 --- a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java +++ b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java @@ -439,28 +439,6 @@ public class LoopbackCommunicationAdapter getProcessModel().setState(Vehicle.State.EXECUTING); Step step = command.getStep(); - Vehicle newVehicle = vehicleService.fetchObject(Vehicle.class, getProcessModel().getName()); - List>> allocatedResources = newVehicle.getAllocatedResources(); - - //使用副本更新车辆模型,防止异常情况 - List>> copiedResources = new ArrayList<>(allocatedResources); - copiedResources.clear(); - - if (step.getSourcePoint() != null) { - //下发起点不为空 - Point point = objectService.fetchObject(Point.class, step.getSourcePoint().getName()); - Set> resource = new HashSet<>(); - resource.add(point.getReference()); - copiedResources.add(resource); - } - if (step.getPath() != null) { - Path path = objectService.fetchObject(Path.class, step.getPath().getName()); - Set> resource = new HashSet<>(); - resource.add(path.getReference()); - copiedResources.add(resource); - } - newVehicle.withAllocatedResources(copiedResources); - if (step.getPath() == null) { actionExec(command); } else { diff --git a/opentcs-common/build.gradle b/opentcs-common/build.gradle index 1f9c0b8..f64821b 100644 --- a/opentcs-common/build.gradle +++ b/opentcs-common/build.gradle @@ -35,6 +35,8 @@ dependencies { implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' //JTS implementation 'org.locationtech.jts:jts-core:1.18.2' + // https://mvnrepository.com/artifact/org.locationtech.jts.io/jts-io-common +// implementation("org.locationtech.jts.io:jts-io-common:1.20.0") } processResources.doLast { diff --git a/opentcs-common/src/main/java/org/opentcs/traffic/common/ContourAlgorithm.java b/opentcs-common/src/main/java/org/opentcs/traffic/common/ContourAlgorithm.java index e81077b..843c713 100644 --- a/opentcs-common/src/main/java/org/opentcs/traffic/common/ContourAlgorithm.java +++ b/opentcs-common/src/main/java/org/opentcs/traffic/common/ContourAlgorithm.java @@ -41,10 +41,6 @@ public class ContourAlgorithm { }; -// new BezierCurve() - - - return true; } diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java index c36e908..c554f95 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java @@ -86,6 +86,18 @@ public class VehicleHandler { throw new ObjectUnknownException("postReceiveCallback Unknown vehicle: " + name); } +// String adapterName = "org.opentcs.virtualvehicle.LoopbackCommunicationAdapterDescription"; +// VehicleCommAdapterDescription newAdapter +// = vehicleService.fetchAttachmentInformation(vehicle.getReference()) +// .getAvailableCommAdapters() +// .stream() +// .filter(description -> description.getClass().getName().equals(adapterName)) +// .findAny() +// .orElseThrow( +// () -> new IllegalArgumentException("Unknown vehicle driver class name: " + adapterName) +// ); +// vehicleService.attachCommAdapter(vehicle.getReference(), newAdapter); + //将数据更新到线程安全的集合中,防止线程阻塞 AdapterManage.setAdapterStatus(name); if (type == 1) { //上报agv详细信息 diff --git a/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java b/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java index 2df4348..3da86bb 100644 --- a/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java +++ b/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java @@ -849,6 +849,7 @@ public class DefaultVehicleController ); if (Objects.equals(evt.getPropertyName(), VehicleProcessModel.Attribute.POSITION.name())) { + System.out.println("Position changed updateVehiclePosition"); updateVehiclePosition((String) evt.getNewValue()); } else if (Objects.equals( @@ -1002,9 +1003,11 @@ public class DefaultVehicleController vehicle.getName(), point ); + System.out.println("update position updatePositionWithoutOrder 999999"); updatePositionWithoutOrder(point); } else { + System.out.println("update position updatePositionWithOrder 0000"); updatePositionWithOrder(point); } } From b870caa0e5eddc54d23a7ceb27bbc0671a2396c3 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Wed, 18 Jun 2025 13:31:50 +0800 Subject: [PATCH 02/13] update --- .../drivers/vehicle/VehicleProcessModel.java | 17 ++++++++++++ .../LoopbackCommunicationAdapter.java | 26 ++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/opentcs-api-base/src/main/java/org/opentcs/drivers/vehicle/VehicleProcessModel.java b/opentcs-api-base/src/main/java/org/opentcs/drivers/vehicle/VehicleProcessModel.java index 0c169df..8f8c210 100644 --- a/opentcs-api-base/src/main/java/org/opentcs/drivers/vehicle/VehicleProcessModel.java +++ b/opentcs-api-base/src/main/java/org/opentcs/drivers/vehicle/VehicleProcessModel.java @@ -91,6 +91,14 @@ public class VehicleProcessModel { * The vehicle's current bounding box. */ private BoundingBox boundingBox; + /** + * 当前车辆级别 + */ + private Vehicle.IntegrationLevel integrationLevel; + /** + * 载货状态 + */ + private Boolean loadState; /** * Creates a new instance. @@ -661,6 +669,7 @@ public class VehicleProcessModel { @Nonnull Vehicle.IntegrationLevel level ) { + integrationLevel = level; getPropertyChangeSupport().firePropertyChange( Attribute.INTEGRATION_LEVEL_CHANGE_REQUESTED.name(), null, @@ -668,6 +677,14 @@ public class VehicleProcessModel { ); } + /** + * 获取车辆级别 + * @return 车辆级别 + */ + public Vehicle.IntegrationLevel getIntegrationLevel() { + return integrationLevel; + } + /** * Notifies observers that the vehicle would like to have its current transport order withdrawn. * diff --git a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java index a923801..834fdf4 100644 --- a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java +++ b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java @@ -823,8 +823,16 @@ public class LoopbackCommunicationAdapter getProcessModel().setPosition(params.getPoint().toString()); //更新最终经过点 } + Pose oldPose = getProcessModel().getPose(); LAST_POSE = new Pose(new Triple(Math.round(params.getX() * 1000), Math.round(params.getY() * 1000), 0), params.getAngle()); - getProcessModel().setPose(LAST_POSE); + + if (oldPose.getPosition() == null) { //姿态为空,更新 + getProcessModel().setPose(LAST_POSE); + } else if (oldPose.getPosition().getX() != Math.round(params.getX() * 1000) + || oldPose.getPosition().getY() != Math.round(params.getY() * 1000) + || oldPose.getOrientationAngle() != params.getAngle()) { //姿态有变化,更新 + getProcessModel().setPose(LAST_POSE); + } } else { //最后经过点为0,应该是车辆丢失定位或重启过。todo 可能需要自动找点 } @@ -834,13 +842,19 @@ public class LoopbackCommunicationAdapter } //更新电量 - getProcessModel().setEnergyLevel(Math.round(params.getPower() * 100)); + if (getProcessModel().getEnergyLevel() != Math.round(params.getPower() * 100)) { + getProcessModel().setEnergyLevel(Math.round(params.getPower() * 100)); + } //更新车辆等级 - getProcessModel().integrationLevelChangeRequested(integrationLevel); + if (!Objects.equals(getProcessModel().getIntegrationLevel(), integrationLevel)) { + getProcessModel().integrationLevelChangeRequested(integrationLevel); + } //更新车辆状态 - getProcessModel().setState(vehicleState); + if (!Objects.equals(getProcessModel().getState(), vehicleState)) { + getProcessModel().setState(vehicleState); + } //更新载货状态 loadState = params.getCargo_status() == 1 ? LoadState.FULL : LoadState.EMPTY; @@ -851,6 +865,10 @@ public class LoopbackCommunicationAdapter return serialNum; } + /** + * 处理车辆动作执行状态 + * @param agvActionStatus 车辆动作执行状态对象 + */ private void handleActionStatus(AgvActionStatus agvActionStatus) { if (agvActionStatus.getStatus()) { ACTION_STATUS = false; From 5bcba189ef4a175c56326d3f9428fd85f0fb0e11 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Fri, 20 Jun 2025 16:19:39 +0800 Subject: [PATCH 03/13] update --- .../opentcs/virtualvehicle/LoopbackCommunicationAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java index 834fdf4..c378a1e 100644 --- a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java +++ b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java @@ -818,9 +818,9 @@ public class LoopbackCommunicationAdapter //更新车辆姿态 if (params.getPoint() != 0) { - LAST_PASSED_POINT = params.getPoint().toString(); //记录最终经过点 +// LAST_PASSED_POINT = params.getPoint().toString(); //记录最终经过点 if (!Objects.equals(getProcessModel().getPosition(), params.getPoint().toString())) { - getProcessModel().setPosition(params.getPoint().toString()); //更新最终经过点 + initVehiclePosition(params.getPoint().toString()); //更新最终经过点 } Pose oldPose = getProcessModel().getPose(); From 9121b1985abc63a08e6c8acf939e729e2d7bf3c5 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Fri, 20 Jun 2025 16:21:15 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kernel/vehicles/DefaultVehicleController.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java b/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java index 3da86bb..a8d90f4 100644 --- a/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java +++ b/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java @@ -849,7 +849,6 @@ public class DefaultVehicleController ); if (Objects.equals(evt.getPropertyName(), VehicleProcessModel.Attribute.POSITION.name())) { - System.out.println("Position changed updateVehiclePosition"); updateVehiclePosition((String) evt.getNewValue()); } else if (Objects.equals( @@ -1003,11 +1002,9 @@ public class DefaultVehicleController vehicle.getName(), point ); - System.out.println("update position updatePositionWithoutOrder 999999"); updatePositionWithoutOrder(point); } else { - System.out.println("update position updatePositionWithOrder 0000"); updatePositionWithOrder(point); } } @@ -1035,6 +1032,14 @@ public class DefaultVehicleController Point currentVehiclePosition = originalCommand.getStep().getDestinationPoint(); Deque>> allocatedResources = commandProcessingTracker.getAllocatedResources(); + +// KernelApplicationConfiguration.VehicleResourceManagementType vehicleResourceManagementType +// = configuration.vehicleResourceManagementType(); +// System.out.println("vehicleResourceManagementType: " + vehicleResourceManagementType); +// +// long length = commAdapter.getProcessModel().getBoundingBox().getLength(); +// System.out.println("vehicle_length: " + length); + switch (configuration.vehicleResourceManagementType()) { case LENGTH_IGNORED: while (!allocatedResources.peek().contains(currentVehiclePosition)) { From 51bbac640544e90e7882ff18ab9313b111e6d7d5 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Fri, 20 Jun 2025 16:45:33 +0800 Subject: [PATCH 05/13] update --- .../communication/http/service/ExecuteMove.java | 2 +- .../main/java/org/opentcs/manage/AdapterManage.java | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteMove.java b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteMove.java index 004dbad..a500f6f 100644 --- a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteMove.java +++ b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteMove.java @@ -177,7 +177,7 @@ public class ExecuteMove extends BaseService { */ private static Integer getDrivePose(org.opentcs.data.model.Path path) { String drivePost = path.getProperties().get(LoopbackAdapterConstants.AGV_DRIVE_POSE); - System.out.println("getDrivePose drivePost: " + drivePost); +// System.out.println("getDrivePose drivePost: " + drivePost); int pose = 0; if (drivePost == null) { diff --git a/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java b/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java index 9d62f7e..6b92260 100644 --- a/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java +++ b/opentcs-common/src/main/java/org/opentcs/manage/AdapterManage.java @@ -84,18 +84,17 @@ public class AdapterManage { if (currentTime - value.getTime() > AUTO_CLOSE_TIME) { //当前时间减去记录时间大于阈值,自动关闭通讯适配器 kernel.disableAdapter(key); - agvStatus.setStatus(AdapterStatus.DISABLE); +// agvStatus.setStatus(AdapterStatus.DISABLE); + adapterStatusMap.remove(key); + LOG.info("disable the adapter: {}", key); } else { //通讯适配器当前状态为关闭,设置状态为开启时才会进入 kernel.enableAdapter(key); agvStatus.setStatus(AdapterStatus.ENABLE); + //更新记录数据 + adapterStatusMap.put(key, agvStatus); + LOG.info("enable the adapter: {}", key); } - - LOG.info("update the adapter: {} status: {}", key, value); - - //更新记录数据 - adapterStatusMap.put(key, agvStatus); -// LOG.info("adapterStatusMap end name: {}", key); }); } From 2be7b938c25a4ac6a3033ac18991e76d491833ca Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Mon, 23 Jun 2025 20:23:48 +0800 Subject: [PATCH 06/13] update --- .../v1/binding/PostTransportOrderInfoRequestTo.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java new file mode 100644 index 0000000..8b70503 --- /dev/null +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java @@ -0,0 +1,4 @@ +package org.opentcs.kernel.extensions.servicewebapi.v1.binding; + +public class PostTransportOrderInfoRequestTo { +} From 6d96ea6891790e2e964428340b5c9fbc1507c21c Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Tue, 24 Jun 2025 09:59:47 +0800 Subject: [PATCH 07/13] update --- .../v1/TransportOrderHandler.java | 47 ++++++++++++ .../servicewebapi/v1/V1RequestHandler.java | 44 ++++++++++-- .../servicewebapi/v1/VehicleHandler.java | 72 +++++++++++++++++++ .../PostTransportOrderInfoRequestTo.java | 39 ++++++++++ .../vehicles/DefaultVehicleController.java | 4 +- 5 files changed, 198 insertions(+), 8 deletions(-) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java index 56e108d..6f3897a 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java @@ -32,6 +32,7 @@ import org.opentcs.kernel.extensions.servicewebapi.KernelExecutorWrapper; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetOrderSequenceResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetTransportOrderResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostOrderSequenceRequestTO; +import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderInfoRequestTo; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.posttransportorder.Destination; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.shared.Property; @@ -59,6 +60,52 @@ public class TransportOrderHandler { this.executorWrapper = requireNonNull(executorWrapper, "executorWrapper"); } + /** + * 根据WMS任务创建订单序列和运输订单 + * @param sequenceName 序列名称 + * @param vehicleName 车辆名称 + * @param type 订单类型 + * @param destinations 位置信息 + * @return 创建的订单 + */ + public List createWmsTask(String sequenceName, String vehicleName, String type, List destinations){ + + //构建订单序列对象 + PostOrderSequenceRequestTO postOrderSequenceRequestTO = new PostOrderSequenceRequestTO(); + postOrderSequenceRequestTO.setIncompleteName(false); + postOrderSequenceRequestTO.setType(type); + postOrderSequenceRequestTO.setIntendedVehicle(vehicleName); + postOrderSequenceRequestTO.setFailureFatal(true); + //根据传入name,创建订单序列 + this.createOrderSequence(sequenceName, postOrderSequenceRequestTO); + + //构建订单对象 + PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO(); + postTransportOrderRequestTO.setIncompleteName(true); + postTransportOrderRequestTO.setDispensable(false); + postTransportOrderRequestTO.setDeadline(Instant.now()); + postTransportOrderRequestTO.setIntendedVehicle(vehicleName); +// postTransportOrderRequestTO.setPeripheralReservationToken(""); + postTransportOrderRequestTO.setWrappingSequence(sequenceName); + postTransportOrderRequestTO.setType(type); + + List orders = new ArrayList<>(); + + //根据传入点位创建订单 + for (PostTransportOrderInfoRequestTo destination : destinations) { + List destinationsList = new ArrayList<>(); + Destination newDestination = new Destination(); + newDestination.setLocationName(destination.getLocationName()); + newDestination.setOperation(destination.getOperation()); + destinationsList.add(newDestination); + postTransportOrderRequestTO.setDestinations(destinationsList); + TransportOrder order = this.createOrder("", postTransportOrderRequestTO); + orders.add(order); + } + + return orders; + } + public TransportOrder createOrder(String name, PostTransportOrderRequestTO order) throws ObjectUnknownException, ObjectExistsException, diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java index 3e45486..7711b25 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java @@ -4,6 +4,7 @@ package org.opentcs.kernel.extensions.servicewebapi.v1; import static java.util.Objects.requireNonNull; +import com.alibaba.fastjson.JSON; import jakarta.inject.Inject; import java.util.List; import java.util.concurrent.ExecutionException; @@ -16,13 +17,12 @@ import org.opentcs.kernel.extensions.servicewebapi.RequestHandler; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetOrderSequenceResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetPeripheralAttachmentInfoResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetPeripheralJobResponseTO; -import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetTransportOrderResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetVehicleAttachmentInfoResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PlantModelTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostOrderSequenceRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostPeripheralJobRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTopologyUpdateRequestTO; -import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderRequestTO; +import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderInfoRequestTo; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PutVehicleAllowedOrderTypesTO; @@ -370,14 +370,44 @@ public class V1RequestHandler IllegalArgumentException, IllegalStateException { response.type(HttpConstants.CONTENT_TYPE_APPLICATION_JSON_UTF8); + + //解析data + String type = JSON.parseObject(request.body()).getString("type"); + String destinations = JSON.parseObject(request.body()).getString("destinations"); + List dataList = JSON.parseArray(destinations, PostTransportOrderInfoRequestTo.class); + + //获取路由成本最低的车辆 + String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint(), dataList.getLast().getPoint()); + System.out.println("handlePostTransportOrder: " + executeVehicle); + + //定制逻辑 return jsonBinder.toJson( - GetTransportOrderResponseTO.fromTransportOrder( - transportOrderHandler.createOrder( - request.params(":NAME"), - jsonBinder.fromJson(request.body(), PostTransportOrderRequestTO.class) - ) + transportOrderHandler.createWmsTask( + request.params(":NAME"), + executeVehicle, + type, + dataList ) ); +// return jsonBinder.toJson( +// transportOrderHandler.getTransportOrders( +// transportOrderHandler.createWmsTask( +// request.params(":NAME"), +// executeVehicle, +// type, +// dataList +// ) +// ) +// ); + +// return jsonBinder.toJson( +// GetTransportOrderResponseTO.fromTransportOrder( +// transportOrderHandler.createOrder( +// request.params(":NAME"), +// jsonBinder.fromJson(request.body(), PostTransportOrderRequestTO.class) +// ) +// ) +// ); } private Object handlePutTransportOrderIntendedVehicle(Request request, Response response) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java index c554f95..da00aa5 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java @@ -28,6 +28,7 @@ import org.opentcs.data.model.Vehicle.EnergyLevelThresholdSet; import org.opentcs.data.order.Route; import org.opentcs.drivers.vehicle.VehicleCommAdapterDescription; import org.opentcs.drivers.vehicle.management.VehicleAttachmentInformation; +import org.opentcs.drivers.vehicle.management.VehicleProcessModelTO; import org.opentcs.kernel.extensions.servicewebapi.KernelExecutorWrapper; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetVehicleResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesRequestTO; @@ -111,6 +112,77 @@ public class VehicleHandler { } } + /** + * 获取执行成本最低车辆 + * @param sourcePoint 起点 + * @param destinationPoint 目标点 + * @return 车辆名称 + */ + public String getExecuteVehicle(String sourcePoint, String destinationPoint) { + +// System.out.println("sourcePoint: " + sourcePoint + " destinationPoint: " + destinationPoint); + + //获取所有车辆 + Set vehicles = vehicleService.fetchObjects(Vehicle.class); + //设置终点 + List destinationPointList = List.of(destinationPoint); + //记录最低路由成本 + long costs = 0; + //返回的车辆名称 + String vehicleName = null; + + for (Vehicle vehicle : vehicles) { + VehicleProcessModelTO vehicleProcessModelTO = vehicleService.fetchProcessModel(vehicle.getReference()); + boolean commAdapterEnabled = vehicleProcessModelTO.isCommAdapterEnabled(); + + //校验车辆:通讯适配器、状态、集成级别 todo 可能需要改,无空闲车辆可能也要分配车辆 + if ( + !commAdapterEnabled || + vehicle.getState() != Vehicle.State.IDLE || + vehicle.getIntegrationLevel() != Vehicle.IntegrationLevel.TO_BE_UTILIZED + ) { + //车辆不能执行任务直接获取下台车辆 + continue; + } + + PostVehicleRoutesRequestTO postVehicleRoutesRequestTO = new PostVehicleRoutesRequestTO(destinationPointList); + postVehicleRoutesRequestTO.setSourcePoint(sourcePoint); + Map, Route> vehicleRoutes = this.getVehicleRoutes(vehicle.getName(), postVehicleRoutesRequestTO); + +// System.out.println("getExecuteVehicle vehicleRoutes: " + vehicleRoutes); + + for (Map.Entry, Route> entry : vehicleRoutes.entrySet()) { + TCSObjectReference key = entry.getKey(); + Route value = entry.getValue(); + +// System.out.println("getExecuteVehicle point: " + key); +// System.out.println("getExecuteVehicle route: " + value); +// System.out.println("getExecuteVehicle route costs: " + value.getCosts()); + + //判断成本值是否合规(为空或小于0不合规) + if (value == null || value.getCosts() < 0) { + continue; + } + + //比较成本,取成本低车辆名称 + if (vehicleName == null || costs > value.getCosts()) { + //记录数据 + costs = value.getCosts(); + vehicleName = vehicle.getName(); + } + } + } + + if (vehicleName == null) { + throw new IllegalArgumentException("无可用车辆"); +// throw new IllegalArgumentException("No vehicle available."); + } + + //todo 无空闲车辆可能需要创建一个无车辆订单序列 + + return vehicleName; + } + /** * Find all vehicles orders and filters depending on the given parameters. * diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java index 8b70503..688b6c5 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/binding/PostTransportOrderInfoRequestTo.java @@ -1,4 +1,43 @@ package org.opentcs.kernel.extensions.servicewebapi.v1.binding; public class PostTransportOrderInfoRequestTo { + + private String locationName; + + private String point; + + private String operation; + + public String getLocationName() { + return locationName; + } + + public void setLocationName(String locationName) { + this.locationName = locationName; + } + + public String getPoint() { + return point; + } + + public void setPoint(String point) { + this.point = point; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + @Override + public String toString() { + return "PostTransportOrderInfoRequestTo{" + + "locationName='" + locationName + '\'' + + ", point='" + point + '\'' + + ", operation='" + operation + '\'' + + '}'; + } } diff --git a/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java b/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java index a8d90f4..ba03efd 100644 --- a/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java +++ b/opentcs-kernel/src/main/java/org/opentcs/kernel/vehicles/DefaultVehicleController.java @@ -1052,11 +1052,13 @@ public class DefaultVehicleController case LENGTH_RESPECTED: // Free resources allocated for executed commands, but keep as many as needed for the // vehicle's current length. + long vehicleLeghtRadius = 3700 / 2; //车辆长度半径 + BoundingBox boundingBox = commAdapter.getProcessModel().getBoundingBox().withLength(vehicleLeghtRadius); //长度有问题 int freeableResourceSetCount = ResourceMath.freeableResourceSetCount( SplitResources.from(allocatedResources, Set.of(currentVehiclePosition)) .getResourcesPassed(), - commAdapter.getProcessModel().getBoundingBox().getLength() + boundingBox.getLength() ); for (int i = 0; i < freeableResourceSetCount; i++) { Set> oldResources = allocatedResources.poll(); From 84066c7dfdadaa576ec089731e5d2d9534268492 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Tue, 24 Jun 2025 11:37:53 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kernel/extensions/servicewebapi/JsonBinder.java | 8 +++++++- .../servicewebapi/v1/V1RequestHandler.java | 12 +----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/JsonBinder.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/JsonBinder.java index 9b8635c..924cc9b 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/JsonBinder.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/JsonBinder.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.io.IOException; +import java.util.HashMap; /** * Binds JSON strings to objects and vice versa. @@ -59,9 +60,14 @@ public class JsonBinder { public String toJson(Object object) throws IllegalStateException { try { + HashMap wrapper = new HashMap<>(); + wrapper.put("data", object); + wrapper.put("code", 200); + wrapper.put("message", "success"); + return objectMapper .writerWithDefaultPrettyPrinter() - .writeValueAsString(object); + .writeValueAsString(wrapper); } catch (JsonProcessingException exc) { throw new IllegalStateException("Could not produce JSON output", exc); diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java index 7711b25..2e26d97 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java @@ -292,7 +292,7 @@ public class V1RequestHandler vehicleHandler.postReceiveCallback( request.body() ); - return ""; + return jsonBinder.toJson(""); } private Object handlePostDispatcherTrigger(Request request, Response response) @@ -389,16 +389,6 @@ public class V1RequestHandler dataList ) ); -// return jsonBinder.toJson( -// transportOrderHandler.getTransportOrders( -// transportOrderHandler.createWmsTask( -// request.params(":NAME"), -// executeVehicle, -// type, -// dataList -// ) -// ) -// ); // return jsonBinder.toJson( // GetTransportOrderResponseTO.fromTransportOrder( From 3e546985f2d10ad8607b9e66b4fef71bedaab940 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Tue, 24 Jun 2025 20:21:42 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E7=82=B9=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../virtualvehicle/LoopbackCommunicationAdapter.java | 2 +- .../communication/http/dto/kc/action/RequestAction.java | 4 ++++ .../opentcs/communication/http/service/ExecuteAction.java | 6 +++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java index c378a1e..f7597cd 100644 --- a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java +++ b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java @@ -471,7 +471,7 @@ public class LoopbackCommunicationAdapter ACTION_STATUS = true; //下发动作 - ExecuteAction.sendCmd(getProcessModel().getName(), command.getOperation(), getSerialNum()); + ExecuteAction.sendCmd(getProcessModel().getName(), getProcessModel().getPosition(), command.getOperation(), getSerialNum()); //进入阻塞 while (ACTION_STATUS) { diff --git a/opentcs-common/src/main/java/org/opentcs/communication/http/dto/kc/action/RequestAction.java b/opentcs-common/src/main/java/org/opentcs/communication/http/dto/kc/action/RequestAction.java index 1e96494..20b08db 100644 --- a/opentcs-common/src/main/java/org/opentcs/communication/http/dto/kc/action/RequestAction.java +++ b/opentcs-common/src/main/java/org/opentcs/communication/http/dto/kc/action/RequestAction.java @@ -12,5 +12,9 @@ public class RequestAction { * 动作 */ private String action; + /** + * 当前位置 + */ + private String point; } diff --git a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java index 7c1f176..255d101 100644 --- a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java +++ b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java @@ -11,9 +11,12 @@ public class ExecuteAction extends BaseService { /** * 下发动作到平台 + * @param vehicleName 车辆名称 + * @param point 当前位置 * @param action 动作 + * @param serialNum 序列号 */ - public static void sendCmd(String vehicleName, String action, Integer serialNum) { + public static void sendCmd(String vehicleName, String point, String action, Integer serialNum) { String url = getUrl(vehicleName); @@ -24,6 +27,7 @@ public class ExecuteAction extends BaseService { RequestAction requestAction = new RequestAction(); requestAction.setAction(action); + requestAction.setPoint(point); BaseRequestTo baseRequestTo = new BaseRequestTo( 4, From bb878f6dc86bce88a5ec35d754599ac7f8a16296 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Tue, 24 Jun 2025 20:22:30 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v1/TransportOrderHandler.java | 46 ++++++--------- .../servicewebapi/v1/V1RequestHandler.java | 32 ++++++---- .../servicewebapi/v1/VehicleHandler.java | 59 +++++++++---------- 3 files changed, 66 insertions(+), 71 deletions(-) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java index 6f3897a..f5930ec 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java @@ -62,48 +62,36 @@ public class TransportOrderHandler { /** * 根据WMS任务创建订单序列和运输订单 - * @param sequenceName 序列名称 + * @param orderName 订单名称 * @param vehicleName 车辆名称 * @param type 订单类型 * @param destinations 位置信息 * @return 创建的订单 */ - public List createWmsTask(String sequenceName, String vehicleName, String type, List destinations){ + public TransportOrder createWmsTask(String orderName, String vehicleName, String type, List destinations){ - //构建订单序列对象 - PostOrderSequenceRequestTO postOrderSequenceRequestTO = new PostOrderSequenceRequestTO(); - postOrderSequenceRequestTO.setIncompleteName(false); - postOrderSequenceRequestTO.setType(type); - postOrderSequenceRequestTO.setIntendedVehicle(vehicleName); - postOrderSequenceRequestTO.setFailureFatal(true); - //根据传入name,创建订单序列 - this.createOrderSequence(sequenceName, postOrderSequenceRequestTO); - - //构建订单对象 - PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO(); - postTransportOrderRequestTO.setIncompleteName(true); - postTransportOrderRequestTO.setDispensable(false); - postTransportOrderRequestTO.setDeadline(Instant.now()); - postTransportOrderRequestTO.setIntendedVehicle(vehicleName); -// postTransportOrderRequestTO.setPeripheralReservationToken(""); - postTransportOrderRequestTO.setWrappingSequence(sequenceName); - postTransportOrderRequestTO.setType(type); - - List orders = new ArrayList<>(); - - //根据传入点位创建订单 + //订单目标点结构体 + List destinationsList = new ArrayList<>(); for (PostTransportOrderInfoRequestTo destination : destinations) { - List destinationsList = new ArrayList<>(); Destination newDestination = new Destination(); newDestination.setLocationName(destination.getLocationName()); newDestination.setOperation(destination.getOperation()); destinationsList.add(newDestination); - postTransportOrderRequestTO.setDestinations(destinationsList); - TransportOrder order = this.createOrder("", postTransportOrderRequestTO); - orders.add(order); } - return orders; + //构建订单对象 + PostTransportOrderRequestTO postTransportOrderRequestTO = new PostTransportOrderRequestTO(); + postTransportOrderRequestTO.setIncompleteName(false); + postTransportOrderRequestTO.setDispensable(false); + postTransportOrderRequestTO.setDeadline(Instant.now()); + if (vehicleName != null) { + postTransportOrderRequestTO.setIntendedVehicle(vehicleName); + } + postTransportOrderRequestTO.setType(type); + postTransportOrderRequestTO.setDestinations(destinationsList); + + //创建运输订单 + return this.createOrder(orderName, postTransportOrderRequestTO); } public TransportOrder createOrder(String name, PostTransportOrderRequestTO order) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java index 2e26d97..6d798f9 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java @@ -11,6 +11,7 @@ import java.util.concurrent.ExecutionException; import org.opentcs.access.KernelRuntimeException; import org.opentcs.data.ObjectExistsException; import org.opentcs.data.ObjectUnknownException; +import org.opentcs.data.order.TransportOrder; import org.opentcs.kernel.extensions.servicewebapi.HttpConstants; import org.opentcs.kernel.extensions.servicewebapi.JsonBinder; import org.opentcs.kernel.extensions.servicewebapi.RequestHandler; @@ -292,7 +293,8 @@ public class V1RequestHandler vehicleHandler.postReceiveCallback( request.body() ); - return jsonBinder.toJson(""); + return ""; +// return jsonBinder.toJson(""); } private Object handlePostDispatcherTrigger(Request request, Response response) @@ -377,19 +379,25 @@ public class V1RequestHandler List dataList = JSON.parseArray(destinations, PostTransportOrderInfoRequestTo.class); //获取路由成本最低的车辆 - String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint(), dataList.getLast().getPoint()); - System.out.println("handlePostTransportOrder: " + executeVehicle); + String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint()); - //定制逻辑 - return jsonBinder.toJson( - transportOrderHandler.createWmsTask( - request.params(":NAME"), - executeVehicle, - type, - dataList - ) + //创建订单 + TransportOrder wmsTask = transportOrderHandler.createWmsTask( + request.params(":NAME"), + executeVehicle, + type, + dataList ); + //尝试立即将订单分配给意向车辆 + if (executeVehicle != null) { + //todo 有问题需要延时或者分配车辆时过滤已绑定订单的意向车辆 + orderDispatcherHandler.tryImmediateAssignment(request.params(":NAME")); + } + + //构建响应json + return jsonBinder.toJson(wmsTask); + // return jsonBinder.toJson( // GetTransportOrderResponseTO.fromTransportOrder( // transportOrderHandler.createOrder( @@ -449,7 +457,7 @@ public class V1RequestHandler ExecutionException { transportOrderHandler.putOrderSequenceComplete(request.params(":NAME")); response.type(HttpConstants.CONTENT_TYPE_TEXT_PLAIN_UTF8); - return ""; + return jsonBinder.toJson(""); } private Object handlePostImmediateAssignment(Request request, Response response) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java index da00aa5..c54f8d0 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/VehicleHandler.java @@ -69,7 +69,7 @@ public class VehicleHandler { * 接收平台异步回调处理 */ public void postReceiveCallback(Object data) { - System.out.println("jsonObject-----ssss: " + data.toString()); +// System.out.println("jsonObject-----ssss: " + data.toString()); //截取平台响应的字符串 String jsonStr; @@ -87,17 +87,21 @@ public class VehicleHandler { throw new ObjectUnknownException("postReceiveCallback Unknown vehicle: " + name); } -// String adapterName = "org.opentcs.virtualvehicle.LoopbackCommunicationAdapterDescription"; -// VehicleCommAdapterDescription newAdapter -// = vehicleService.fetchAttachmentInformation(vehicle.getReference()) -// .getAvailableCommAdapters() -// .stream() -// .filter(description -> description.getClass().getName().equals(adapterName)) -// .findAny() -// .orElseThrow( -// () -> new IllegalArgumentException("Unknown vehicle driver class name: " + adapterName) -// ); -// vehicleService.attachCommAdapter(vehicle.getReference(), newAdapter); + VehicleProcessModelTO vehicleProcessModelTO = vehicleService.fetchProcessModel(vehicle.getReference()); + if (!vehicleProcessModelTO.isCommAdapterEnabled()) { + //未开启通讯适配器,手动选择通讯适配器开启 + String adapterName = "org.opentcs.virtualvehicle.LoopbackCommunicationAdapterDescription"; + VehicleCommAdapterDescription newAdapter + = vehicleService.fetchAttachmentInformation(vehicle.getReference()) + .getAvailableCommAdapters() + .stream() + .filter(description -> description.getClass().getName().equals(adapterName)) + .findAny() + .orElseThrow( + () -> new IllegalArgumentException("Unknown vehicle driver class name: " + adapterName) + ); + vehicleService.attachCommAdapter(vehicle.getReference(), newAdapter); + } //将数据更新到线程安全的集合中,防止线程阻塞 AdapterManage.setAdapterStatus(name); @@ -114,13 +118,10 @@ public class VehicleHandler { /** * 获取执行成本最低车辆 - * @param sourcePoint 起点 * @param destinationPoint 目标点 * @return 车辆名称 */ - public String getExecuteVehicle(String sourcePoint, String destinationPoint) { - -// System.out.println("sourcePoint: " + sourcePoint + " destinationPoint: " + destinationPoint); + public String getExecuteVehicle(String destinationPoint) { //获取所有车辆 Set vehicles = vehicleService.fetchObjects(Vehicle.class); @@ -135,30 +136,28 @@ public class VehicleHandler { VehicleProcessModelTO vehicleProcessModelTO = vehicleService.fetchProcessModel(vehicle.getReference()); boolean commAdapterEnabled = vehicleProcessModelTO.isCommAdapterEnabled(); - //校验车辆:通讯适配器、状态、集成级别 todo 可能需要改,无空闲车辆可能也要分配车辆 + //校验车辆:通讯适配器状态、车辆状态、集成级别、订单 if ( !commAdapterEnabled || vehicle.getState() != Vehicle.State.IDLE || - vehicle.getIntegrationLevel() != Vehicle.IntegrationLevel.TO_BE_UTILIZED + vehicle.getIntegrationLevel() != Vehicle.IntegrationLevel.TO_BE_UTILIZED || + vehicle.getTransportOrder() != null ) { //车辆不能执行任务直接获取下台车辆 continue; } + //获取车辆当前位置设置为起点 + String sourcePoint = vehicle.getCurrentPosition().getName(); + PostVehicleRoutesRequestTO postVehicleRoutesRequestTO = new PostVehicleRoutesRequestTO(destinationPointList); postVehicleRoutesRequestTO.setSourcePoint(sourcePoint); Map, Route> vehicleRoutes = this.getVehicleRoutes(vehicle.getName(), postVehicleRoutesRequestTO); -// System.out.println("getExecuteVehicle vehicleRoutes: " + vehicleRoutes); - for (Map.Entry, Route> entry : vehicleRoutes.entrySet()) { - TCSObjectReference key = entry.getKey(); +// TCSObjectReference key = entry.getKey(); Route value = entry.getValue(); -// System.out.println("getExecuteVehicle point: " + key); -// System.out.println("getExecuteVehicle route: " + value); -// System.out.println("getExecuteVehicle route costs: " + value.getCosts()); - //判断成本值是否合规(为空或小于0不合规) if (value == null || value.getCosts() < 0) { continue; @@ -173,12 +172,12 @@ public class VehicleHandler { } } - if (vehicleName == null) { - throw new IllegalArgumentException("无可用车辆"); -// throw new IllegalArgumentException("No vehicle available."); - } - //todo 无空闲车辆可能需要创建一个无车辆订单序列 + if (vehicleName == null) { + //无空闲车辆需要创建订单无意向车辆订单 +// throw new IllegalArgumentException("无可用车辆"); + return ""; + } return vehicleName; } From 64adb38fed9b9ad91be8e79a9dc4e5b4be5fa287 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Thu, 26 Jun 2025 11:55:07 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opentcs/virtualvehicle/LoopbackCommunicationAdapter.java | 3 ++- .../communication/http/dto/kc/action/RequestAction.java | 4 ++++ .../org/opentcs/communication/http/service/ExecuteAction.java | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java index f7597cd..e13f821 100644 --- a/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java +++ b/opentcs-commadapter-loopback/src/main/java/org/opentcs/virtualvehicle/LoopbackCommunicationAdapter.java @@ -471,7 +471,7 @@ public class LoopbackCommunicationAdapter ACTION_STATUS = true; //下发动作 - ExecuteAction.sendCmd(getProcessModel().getName(), getProcessModel().getPosition(), command.getOperation(), getSerialNum()); + ExecuteAction.sendCmd(command.getTransportOrder().getName(), getProcessModel().getName(), getProcessModel().getPosition(), command.getOperation(), getSerialNum()); //进入阻塞 while (ACTION_STATUS) { @@ -871,6 +871,7 @@ public class LoopbackCommunicationAdapter */ private void handleActionStatus(AgvActionStatus agvActionStatus) { if (agvActionStatus.getStatus()) { +// System.out.println("handleActionStatus: ======"); ACTION_STATUS = false; } } diff --git a/opentcs-common/src/main/java/org/opentcs/communication/http/dto/kc/action/RequestAction.java b/opentcs-common/src/main/java/org/opentcs/communication/http/dto/kc/action/RequestAction.java index 20b08db..2544a0e 100644 --- a/opentcs-common/src/main/java/org/opentcs/communication/http/dto/kc/action/RequestAction.java +++ b/opentcs-common/src/main/java/org/opentcs/communication/http/dto/kc/action/RequestAction.java @@ -8,6 +8,10 @@ import lombok.Data; @Data public class RequestAction { + /** + * 订单名称 + */ + private String order_name; /** * 动作 */ diff --git a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java index 255d101..d77b626 100644 --- a/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java +++ b/opentcs-common/src/main/java/org/opentcs/communication/http/service/ExecuteAction.java @@ -11,12 +11,13 @@ public class ExecuteAction extends BaseService { /** * 下发动作到平台 + * @param orderName 车辆名称 * @param vehicleName 车辆名称 * @param point 当前位置 * @param action 动作 * @param serialNum 序列号 */ - public static void sendCmd(String vehicleName, String point, String action, Integer serialNum) { + public static void sendCmd(String orderName, String vehicleName, String point, String action, Integer serialNum) { String url = getUrl(vehicleName); @@ -26,6 +27,7 @@ public class ExecuteAction extends BaseService { String time = now.format(formatter); RequestAction requestAction = new RequestAction(); + requestAction.setOrder_name(orderName); requestAction.setAction(action); requestAction.setPoint(point); From d60d6081ac0cda4cac97aa3efe60e8f298fe4e66 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Thu, 26 Jun 2025 17:14:20 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=88=86=E9=85=8D=E8=BD=A6=E8=BE=86=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v1/TransportOrderHandler.java | 10 ++--- .../servicewebapi/v1/V1RequestHandler.java | 45 +++++++++---------- .../phase/assignment/OrderAssigner.java | 18 ++++++-- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java index f5930ec..1ee2c32 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/TransportOrderHandler.java @@ -63,12 +63,12 @@ public class TransportOrderHandler { /** * 根据WMS任务创建订单序列和运输订单 * @param orderName 订单名称 - * @param vehicleName 车辆名称 +// * @param vehicleName 车辆名称 * @param type 订单类型 * @param destinations 位置信息 * @return 创建的订单 */ - public TransportOrder createWmsTask(String orderName, String vehicleName, String type, List destinations){ + public TransportOrder createWmsTask(String orderName, String type, List destinations){ //订单目标点结构体 List destinationsList = new ArrayList<>(); @@ -84,9 +84,9 @@ public class TransportOrderHandler { postTransportOrderRequestTO.setIncompleteName(false); postTransportOrderRequestTO.setDispensable(false); postTransportOrderRequestTO.setDeadline(Instant.now()); - if (vehicleName != null) { - postTransportOrderRequestTO.setIntendedVehicle(vehicleName); - } +// if (vehicleName != null) { +// postTransportOrderRequestTO.setIntendedVehicle(vehicleName); +// } postTransportOrderRequestTO.setType(type); postTransportOrderRequestTO.setDestinations(destinationsList); diff --git a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java index 6d798f9..0fd8408 100644 --- a/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java +++ b/opentcs-kernel-extension-http-services/src/main/java/org/opentcs/kernel/extensions/servicewebapi/v1/V1RequestHandler.java @@ -18,12 +18,14 @@ import org.opentcs.kernel.extensions.servicewebapi.RequestHandler; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetOrderSequenceResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetPeripheralAttachmentInfoResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetPeripheralJobResponseTO; +import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetTransportOrderResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.GetVehicleAttachmentInfoResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PlantModelTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostOrderSequenceRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostPeripheralJobRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTopologyUpdateRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderInfoRequestTo; +import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostTransportOrderRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesRequestTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PostVehicleRoutesResponseTO; import org.opentcs.kernel.extensions.servicewebapi.v1.binding.PutVehicleAllowedOrderTypesTO; @@ -373,31 +375,6 @@ public class V1RequestHandler IllegalStateException { response.type(HttpConstants.CONTENT_TYPE_APPLICATION_JSON_UTF8); - //解析data - String type = JSON.parseObject(request.body()).getString("type"); - String destinations = JSON.parseObject(request.body()).getString("destinations"); - List dataList = JSON.parseArray(destinations, PostTransportOrderInfoRequestTo.class); - - //获取路由成本最低的车辆 - String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint()); - - //创建订单 - TransportOrder wmsTask = transportOrderHandler.createWmsTask( - request.params(":NAME"), - executeVehicle, - type, - dataList - ); - - //尝试立即将订单分配给意向车辆 - if (executeVehicle != null) { - //todo 有问题需要延时或者分配车辆时过滤已绑定订单的意向车辆 - orderDispatcherHandler.tryImmediateAssignment(request.params(":NAME")); - } - - //构建响应json - return jsonBinder.toJson(wmsTask); - // return jsonBinder.toJson( // GetTransportOrderResponseTO.fromTransportOrder( // transportOrderHandler.createOrder( @@ -406,6 +383,24 @@ public class V1RequestHandler // ) // ) // ); + + //解析data + String type = JSON.parseObject(request.body()).getString("type"); + String destinations = JSON.parseObject(request.body()).getString("destinations"); + List dataList = JSON.parseArray(destinations, PostTransportOrderInfoRequestTo.class); + + //获取路由成本最低的车辆 +// String executeVehicle = vehicleHandler.getExecuteVehicle(dataList.getFirst().getPoint()); + + //创建订单 + TransportOrder wmsTask = transportOrderHandler.createWmsTask( + request.params(":NAME"), + type, + dataList + ); + + //构建响应json + return jsonBinder.toJson(wmsTask); } private Object handlePutTransportOrderIntendedVehicle(Request request, Response response) diff --git a/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/phase/assignment/OrderAssigner.java b/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/phase/assignment/OrderAssigner.java index e8244f8..7f79346 100644 --- a/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/phase/assignment/OrderAssigner.java +++ b/opentcs-strategies-default/src/main/java/org/opentcs/strategies/basic/dispatching/phase/assignment/OrderAssigner.java @@ -133,12 +133,12 @@ public class OrderAssigner { ); AssignmentState assignmentState = new AssignmentState(); - if (availableVehicles.size() < availableOrders.size()) { + if (availableVehicles.size() < availableOrders.size()) { //车数量 < 订单数 availableVehicles.stream() .sorted(vehicleComparator) .forEach(vehicle -> tryAssignOrder(vehicle, availableOrders, assignmentState)); } - else { + else { //车数量 >= 订单数 availableOrders.stream() .sorted(orderComparator) .forEach(order -> tryAssignVehicle(order, availableVehicles, assignmentState)); @@ -227,13 +227,25 @@ public class OrderAssigner { ) .collect(Collectors.partitioningBy(filterResult -> !filterResult.isFiltered())); +// // 调试输出:分组统计结果 +// System.out.println("Candidate groups: Passed=" + ordersSplitByFilter.get(Boolean.TRUE).size() + ", Filtered=" + ordersSplitByFilter.get(Boolean.FALSE).size()); +// +// // 调试输出:显示所有通过过滤的候选(排序前) +// List passedCandidates = ordersSplitByFilter.get(Boolean.TRUE).stream() +// .map(CandidateFilterResult::getCandidate) +// .collect(Collectors.toList()); +// +// passedCandidates.forEach(c -> System.out.println("passedCandidates - order: " + c.getTransportOrder() + ",vehicle:" + c.getVehicle() + ",Costs: " + c.getCompleteRoutingCosts())); + ordersSplitByFilter.get(Boolean.FALSE).stream() .map(CandidateFilterResult::toFilterResult) .forEach(filterResult -> assignmentState.addFilteredOrder(filterResult)); + ordersSplitByFilter.get(Boolean.TRUE).stream() .map(CandidateFilterResult::getCandidate) - .sorted(vehicleCandidateComparator) +// .sorted(vehicleCandidateComparator) 框架原本排序有问题,修改为按照路由成本排序 + .sorted(Comparator.comparingLong(AssignmentCandidate::getCompleteRoutingCosts)) .findFirst() .ifPresent(candidate -> assignOrder(candidate, assignmentState)); } From c8c91b12f43cab0f3adc99c4010ad4cd54e095b0 Mon Sep 17 00:00:00 2001 From: xuzhiheng <2543137953@qq.com> Date: Thu, 26 Jun 2025 17:16:28 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=970?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/opentcs/kernel/workingset/TransportOrderPoolManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/opentcs-kernel/src/main/java/org/opentcs/kernel/workingset/TransportOrderPoolManager.java b/opentcs-kernel/src/main/java/org/opentcs/kernel/workingset/TransportOrderPoolManager.java index e08d9fe..0b2e5f4 100644 --- a/opentcs-kernel/src/main/java/org/opentcs/kernel/workingset/TransportOrderPoolManager.java +++ b/opentcs-kernel/src/main/java/org/opentcs/kernel/workingset/TransportOrderPoolManager.java @@ -451,6 +451,7 @@ public class TransportOrderPoolManager throws ObjectUnknownException { TransportOrder order = getObjectRepo().getObject(TransportOrder.class, ref); // Make sure only orders in a final state are removed. + LOG.info("removeTransportOrder name: {}, state: {}", order.getName(), order.getState()); checkArgument( order.getState().isFinalState(), "Transport order %s is not in a final state.",