Browse Source

Merge remote-tracking branch 'origin/master'

master
修宁 6 months ago
parent
commit
92b44eab2f
  1. 33
      servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrMessageHandler.java
  2. 9
      servo/src/main/java/com/galaxis/rcs/communication/amrCommunication/AmrStatusAndInfo.java
  3. 51
      servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2Connector.java
  4. 27
      servo/src/main/java/com/galaxis/rcs/connector/cl2/Cl2ConnectorImp.java
  5. 20
      servo/src/main/java/com/galaxis/rcs/connector/cl2/VirtualCl2Connector.java
  6. 16
      servo/src/main/java/com/galaxis/rcs/connector/cl2/sendEntity/AmrTaskMessage.java
  7. 21
      servo/src/main/java/com/yvan/logisticsMonitor/dashboard/DashboardManager.java

33
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<AmrMessage<AmrOnlineMessage>> typeRef20150Message = new TypeReference<AmrMessage<AmrOnlineMessage>>() {};
private static final TypeReference<AmrMessage<AmrOfflineMessage>> typeRef20200Message = new TypeReference<AmrMessage<AmrOfflineMessage>>() {};
private static final TypeReference<AmrMessage<AmrExceptionMessage>> typeRef20250Message = new TypeReference<AmrMessage<AmrExceptionMessage>>() {};
private static final Redis redis = AppContextHolder.getBean("defaultRedis", Redis.class, true);
private static final ConcurrentHashMap<Integer, AmrStatusAndInfo> 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<AmrTaskCompletedMessage> 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<AmrStatusMessage> 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<AmrHeartbeatMessage> 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 {
}
}
}

9
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;
}
}

51
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);
}

27
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) {
}
}

20
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) {
}
}

16
servo/src/main/java/com/galaxis/rcs/connector/cl2/sendEntity/Cmd10010.java → 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<Short> MPickMode;
// 多机构^[1]^的目标货位高度 UInt16[3] 单位:mm
public int[] MGoodsSlotHeight;
public List<Integer> MGoodsSlotHeight;
// 多机构^[1]^的目标货位朝向 UInt8[3] 朝向定义与充电桩朝向相同。 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向
public short[] MGoodsSlotDirection;
public List<Short> MGoodsSlotDirection;
// 多机构的目标货箱ID String[3] 仅做校验使用(仅接货用)
public String[] MStorageRacksNo;
public List<String> 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<Short> MRollMotion;
// 多滚筒对接的站台朝向 UInt8[6] 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向
public short[] MRollStationDirection;
public List<Short> MRollStationDirection;
// 多滚筒目标货物数量 UInt16[6] 数组形式,意义同"RollGoodsQuantity"
public int[] MRollGoodsQuantity;
public List<Integer> MRollGoodsQuantity;
// 是否仅执行任务的准备部分 bool 默认为false,仅执行该动作的准备部分,如仅进行导航,调整托盘高度等,但不进行取放货操作
public boolean Preparing;
// 货架标识 uint32 车根据货架类型查询尺寸进行避障

21
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) {
}
}

Loading…
Cancel
Save