diff --git a/servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrMessageHandler.java b/servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrMessageHandler.java index 8db3623..c99173f 100644 --- a/servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrMessageHandler.java +++ b/servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrMessageHandler.java @@ -9,11 +9,14 @@ import com.galaxis.rcs.connector.cl2.receiveEntity.base.TaskModeChangeData; import com.galaxis.rcs.connector.cl2.receiveEntity.base.TaskStatusChangeData; import com.galaxis.rcs.connector.cl2.receiveEntity.base.TaskTypeChangeData; import lombok.extern.slf4j.Slf4j; +import org.clever.core.AppContextHolder; import org.clever.core.json.JsonWrapper; +import org.clever.data.redis.Redis; import org.eclipse.paho.mqttv5.common.MqttMessage; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; +import java.util.concurrent.ConcurrentHashMap; @Slf4j @Service @@ -35,11 +38,20 @@ public class AmrMessageHandler { private static final TypeReference> typeRef20150Message = new TypeReference>() {}; private static final TypeReference> typeRef20200Message = new TypeReference>() {}; private static final TypeReference> typeRef20250Message = new TypeReference>() {}; + + private static final Redis redis = AppContextHolder.getBean("defaultRedis", Redis.class, true); + + private static final ConcurrentHashMap agvStatusMap = new ConcurrentHashMap<>(); public static void handleAgvRobotStatusMessage(MqttMessage message) { byte[] messageData = message.getPayload(); String json = new String(messageData, StandardCharsets.UTF_8); JsonWrapper jw = new JsonWrapper(json); int id = jw.asInt("id"); + int agvId = jw.asInt("content", "VehicleId"); + if (!agvStatusMap.containsKey(agvId)) { + agvStatusMap.put(agvId, new AmrStatusAndInfo(agvId + "")); + } + AmrStatusAndInfo agvStatusAndInfo = agvStatusMap.get(agvId); /* * 消息标识 @@ -61,7 +73,7 @@ public class AmrMessageHandler { AmrMessage amrMessage = null; switch (id) { case 20010: - amrMessage = JacksonGenericUtils.parse(json, typeRef20010Message); + AmrMessage taskCompletedMessage = JacksonGenericUtils.parse(json, typeRef20010Message); break; case 20011: { int EventId = jw.asInt("content", "EventId"); @@ -97,16 +109,30 @@ public class AmrMessageHandler { amrMessage = JacksonGenericUtils.parse(json, typeRef20050Message); break; case 20060: - amrMessage = JacksonGenericUtils.parse(json, typeRef20060Message); + AmrMessage statusMessage = JacksonGenericUtils.parse(json, typeRef20060Message); + agvStatusAndInfo.agvSOC = statusMessage.content.CurBattery.SOC; + agvStatusAndInfo.agvBatteryVoltage = statusMessage.content.CurBattery.Voltage; +// agvStatusAndInfo.agvChargingStatus = statusMessage.content.CurBattery.ChargingStatus; + agvStatusAndInfo.agvChargingCurrent = statusMessage.content.CurBattery.ChargingCurrent; + agvStatusAndInfo.agvDischargingCurrent = statusMessage.content.CurBattery.DischargingCurrent; + agvStatusAndInfo.agvBatteryTemperature = statusMessage.content.CurBattery.Temperature; + agvStatusAndInfo.x = statusMessage.content.X; + agvStatusAndInfo.y = statusMessage.content.Y; + agvStatusAndInfo.orientation = statusMessage.content.CurOrientation; + if (statusMessage.content.VehicleId == 32) { + log.info("Received message: " + json); + } break; case 20100: - amrMessage = JacksonGenericUtils.parse(json, typeRef20100Message); + AmrMessage heartbeatMessage = JacksonGenericUtils.parse(json, typeRef20100Message); + // if (amrMessage.content instanceof AmrHeartbeatMessage) { // AmrHeartbeatMessage msg = (AmrHeartbeatMessage) amrMessage.content; // if (msg.VehicleId == 102) { // log.info("Received message: " + json); // } // } + break; case 20147: amrMessage = JacksonGenericUtils.parse(json, typeRef20147Message); @@ -132,5 +158,4 @@ public class AmrMessageHandler { } } - } diff --git a/servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrStatusAndInfo.java b/servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrStatusAndInfo.java index 216872f..c253f5b 100644 --- a/servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrStatusAndInfo.java +++ b/servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrStatusAndInfo.java @@ -1,5 +1,10 @@ package com.galaxis.rcs.communication.amrCommunication; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor public class AmrStatusAndInfo { // agvId 车唯一标识 public String agvId; @@ -31,4 +36,8 @@ public class AmrStatusAndInfo { public double z; // agv当前方向 public double orientation; + + public AmrStatusAndInfo(String agvId) { + this.agvId = agvId; + } } diff --git a/servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2Connector.java b/servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2Connector.java index 54a2dc8..64edd48 100644 --- a/servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2Connector.java +++ b/servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2Connector.java @@ -3,19 +3,50 @@ package com.galaxis.rcs.connector.cl2; public interface Cl2Connector { // RCS发往CL2的指令 - // 0 运输 - public int transport(); + /** + * 移动 robotMove + * @param executorId 机器人设备ID + * @param startWayPoint 起点Id, WayPointId + * @param endWayPoint 终点ID, WayPointId + * @param armRotation number类型,货叉/机械臂,相对于头的角度, 逆时针为正 + */ + void robotMove(String executorId, String startWayPoint, String endWayPoint, double armRotation); - // 1 接货 - public int pickup(); + /** + * 旋转 robotRotate + * @param executorId 机器人编号 + * @param worldRotation 转动身体到世界角度 90 度 + */ + void robotRotation(String executorId, double worldRotation); - // 2 卸货 - public int unload(); + /** + * 取货 robotLoad + * @param executorId 机器人编号 + * @param rackItem 货架ID + * @param bay 列 + * @param level 层 + * @param cell 格 + * @param storeBarCode 地标二维码编号 + * @param boxItem 容器ID + */ + void robotLoad(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode, String boxItem); - // 3 充电 - public int charge(); + /** + * 放货 robotUnload + * @param executorId 机器人编号 + * @param rackItem 货架ID + * @param bay 列 + * @param level 层 + * @param cell 格 + * @param storeBarCode 地标二维码编号 + */ + void robotUnload(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode); - // 4:提升移载取货或卸货 - public int lift(); + /** + * 充电 robotCharge + * @param executorId 机器人编号 + * @param chargerItem 充电桩ID + */ + void robotCharger(String executorId, String chargerItem); } diff --git a/servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2ConnectorImp.java b/servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2ConnectorImp.java index 274a99a..7a674d0 100644 --- a/servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2ConnectorImp.java +++ b/servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2ConnectorImp.java @@ -1,4 +1,29 @@ package com.galaxis.rcs.connector.cl2; -public class Cl2ConnectorImp { +public class Cl2ConnectorImp implements Cl2Connector { + @Override + public void robotMove(String executorId, String startWayPoint, String endWayPoint, double armRotation) { + // 获取车当前位置 + + } + + @Override + public void robotRotation(String executorId, double worldRotation) { + + } + + @Override + public void robotLoad(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode, String boxItem) { + + } + + @Override + public void robotUnload(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode) { + + } + + @Override + public void robotCharger(String executorId, String chargerItem) { + + } } diff --git a/servo/src/main/java/com/galaxis/rcs/connector/cl2/VirtualCl2Connector.java b/servo/src/main/java/com/galaxis/rcs/connector/cl2/VirtualCl2Connector.java index d00e4e4..28177cc 100644 --- a/servo/src/main/java/com/galaxis/rcs/connector/cl2/VirtualCl2Connector.java +++ b/servo/src/main/java/com/galaxis/rcs/connector/cl2/VirtualCl2Connector.java @@ -7,27 +7,27 @@ package com.galaxis.rcs.connector.cl2; public class VirtualCl2Connector implements Cl2Connector { @Override - public int transport() { - return 0; + public void robotMove(String executorId, String startWayPoint, String endWayPoint, double armRotation) { + } @Override - public int pickup() { - return 0; + public void robotRotation(String executorId, double worldRotation) { + } @Override - public int unload() { - return 0; + public void robotLoad(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode, String boxItem) { + } @Override - public int charge() { - return 0; + public void robotUnload(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode) { + } @Override - public int lift() { - return 0; + public void robotCharger(String executorId, String chargerItem) { + } } diff --git a/servo/src/main/java/com/galaxis/rcs/connector/cl2/sendEntity/Cmd10010.java b/servo/src/main/java/com/galaxis/rcs/connector/cl2/sendEntity/AmrTaskMessage.java similarity index 94% rename from servo/src/main/java/com/galaxis/rcs/connector/cl2/sendEntity/Cmd10010.java rename to servo/src/main/java/com/galaxis/rcs/connector/cl2/sendEntity/AmrTaskMessage.java index 257f98b..fddedb8 100644 --- a/servo/src/main/java/com/galaxis/rcs/connector/cl2/sendEntity/Cmd10010.java +++ b/servo/src/main/java/com/galaxis/rcs/connector/cl2/sendEntity/AmrTaskMessage.java @@ -2,7 +2,7 @@ package com.galaxis.rcs.connector.cl2.sendEntity; import java.util.List; -public class Cmd10010 { +public class AmrTaskMessage { // 作业序号 UInt32 public long SeqNo; // 作业类型 UInt8 0:运输 1:接货 2:卸货 3:充电 4:提升移栽取货或卸货 5:滚筒取货或卸货(双向作业) @@ -36,13 +36,13 @@ public class Cmd10010 { // 目标货位朝向 UInt8 朝向定义与充电桩朝向相同。 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向 public short GoodsSlotDirection; // 多机构^[1]^的拣货模式 UInt8[3] 数组形式,意义同"PickMode" - public short[] MPickMode; + public List MPickMode; // 多机构^[1]^的目标货位高度 UInt16[3] 单位:mm - public int[] MGoodsSlotHeight; + public List MGoodsSlotHeight; // 多机构^[1]^的目标货位朝向 UInt8[3] 朝向定义与充电桩朝向相同。 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向 - public short[] MGoodsSlotDirection; + public List MGoodsSlotDirection; // 多机构的目标货箱ID String[3] 仅做校验使用(仅接货用) - public String[] MStorageRacksNo; + public List MStorageRacksNo; // 滚筒1 运动操作 对于左右滚动的双滚筒机型,此滚筒为靠近车头的滚筒。 对于前后滚动的双滚筒机型,此滚筒为车身左侧的滚筒。 UInt8 0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作 public short Roll1Motion; // 滚筒2 运动操作 对于左右滚动的双滚筒机型,此滚筒为靠近车尾的滚筒。 对于前后滚动的双滚筒机型,此滚筒为车身右侧的滚筒。 对于单滚筒机型,此参数无意义。 UInt8 0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作 @@ -60,11 +60,11 @@ public class Cmd10010 { // 滚筒2目标货物数量 对于单滚筒机型,此参数无意义。 UInt16 1~N public int Roll2GoodsQuantity; // 多滚筒运动模式 UInt8[6] 数组形式,0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作 - public short[] MRollMotion; + public List MRollMotion; // 多滚筒对接的站台朝向 UInt8[6] 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向 - public short[] MRollStationDirection; + public List MRollStationDirection; // 多滚筒目标货物数量 UInt16[6] 数组形式,意义同"RollGoodsQuantity" - public int[] MRollGoodsQuantity; + public List MRollGoodsQuantity; // 是否仅执行任务的准备部分 bool 默认为false,仅执行该动作的准备部分,如仅进行导航,调整托盘高度等,但不进行取放货操作 public boolean Preparing; // 货架标识 uint32 车根据货架类型查询尺寸进行避障 diff --git a/servo/src/main/java/com/yvan/logisticsMonitor/dashboard/DashboardManager.java b/servo/src/main/java/com/yvan/logisticsMonitor/dashboard/DashboardManager.java index 6e685fc..62321a6 100644 --- a/servo/src/main/java/com/yvan/logisticsMonitor/dashboard/DashboardManager.java +++ b/servo/src/main/java/com/yvan/logisticsMonitor/dashboard/DashboardManager.java @@ -3,28 +3,29 @@ package com.yvan.logisticsMonitor.dashboard; import com.galaxis.rcs.connector.cl2.Cl2Connector; public class DashboardManager implements Cl2Connector { + @Override - public int transport() { - return 0; + public void robotMove(String executorId, String startWayPoint, String endWayPoint, double armRotation) { + } @Override - public int pickup() { - return 0; + public void robotRotation(String executorId, double worldRotation) { + } @Override - public int unload() { - return 0; + public void robotLoad(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode, String boxItem) { + } @Override - public int charge() { - return 0; + public void robotUnload(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode) { + } @Override - public int lift() { - return 0; + public void robotCharger(String executorId, String chargerItem) { + } }