Browse Source

小车任务接口

master
yuliang 6 months ago
parent
commit
7ab46b9068
  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.TaskStatusChangeData;
import com.galaxis.rcs.connector.cl2.receiveEntity.base.TaskTypeChangeData; import com.galaxis.rcs.connector.cl2.receiveEntity.base.TaskTypeChangeData;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.clever.core.AppContextHolder;
import org.clever.core.json.JsonWrapper; import org.clever.core.json.JsonWrapper;
import org.clever.data.redis.Redis;
import org.eclipse.paho.mqttv5.common.MqttMessage; import org.eclipse.paho.mqttv5.common.MqttMessage;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j @Slf4j
@Service @Service
@ -35,11 +38,20 @@ public class AmrMessageHandler {
private static final TypeReference<AmrMessage<AmrOnlineMessage>> typeRef20150Message = new TypeReference<AmrMessage<AmrOnlineMessage>>() {}; 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<AmrOfflineMessage>> typeRef20200Message = new TypeReference<AmrMessage<AmrOfflineMessage>>() {};
private static final TypeReference<AmrMessage<AmrExceptionMessage>> typeRef20250Message = new TypeReference<AmrMessage<AmrExceptionMessage>>() {}; 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) { public static void handleAgvRobotStatusMessage(MqttMessage message) {
byte[] messageData = message.getPayload(); byte[] messageData = message.getPayload();
String json = new String(messageData, StandardCharsets.UTF_8); String json = new String(messageData, StandardCharsets.UTF_8);
JsonWrapper jw = new JsonWrapper(json); JsonWrapper jw = new JsonWrapper(json);
int id = jw.asInt("id"); 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; AmrMessage<?> amrMessage = null;
switch (id) { switch (id) {
case 20010: case 20010:
amrMessage = JacksonGenericUtils.parse(json, typeRef20010Message); AmrMessage<AmrTaskCompletedMessage> taskCompletedMessage = JacksonGenericUtils.parse(json, typeRef20010Message);
break; break;
case 20011: { case 20011: {
int EventId = jw.asInt("content", "EventId"); int EventId = jw.asInt("content", "EventId");
@ -97,16 +109,30 @@ public class AmrMessageHandler {
amrMessage = JacksonGenericUtils.parse(json, typeRef20050Message); amrMessage = JacksonGenericUtils.parse(json, typeRef20050Message);
break; break;
case 20060: 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; break;
case 20100: case 20100:
amrMessage = JacksonGenericUtils.parse(json, typeRef20100Message); AmrMessage<AmrHeartbeatMessage> heartbeatMessage = JacksonGenericUtils.parse(json, typeRef20100Message);
// if (amrMessage.content instanceof AmrHeartbeatMessage) { // if (amrMessage.content instanceof AmrHeartbeatMessage) {
// AmrHeartbeatMessage msg = (AmrHeartbeatMessage) amrMessage.content; // AmrHeartbeatMessage msg = (AmrHeartbeatMessage) amrMessage.content;
// if (msg.VehicleId == 102) { // if (msg.VehicleId == 102) {
// log.info("Received message: " + json); // log.info("Received message: " + json);
// } // }
// } // }
break; break;
case 20147: case 20147:
amrMessage = JacksonGenericUtils.parse(json, typeRef20147Message); 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; package com.galaxis.rcs.communication.amrCommunication;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class AmrStatusAndInfo { public class AmrStatusAndInfo {
// agvId 车唯一标识 // agvId 车唯一标识
public String agvId; public String agvId;
@ -31,4 +36,8 @@ public class AmrStatusAndInfo {
public double z; public double z;
// agv当前方向 // agv当前方向
public double orientation; 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 { public interface Cl2Connector {
// RCS发往CL2的指令 // 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; 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 { public class VirtualCl2Connector implements Cl2Connector {
@Override @Override
public int transport() { public void robotMove(String executorId, String startWayPoint, String endWayPoint, double armRotation) {
return 0;
} }
@Override @Override
public int pickup() { public void robotRotation(String executorId, double worldRotation) {
return 0;
} }
@Override @Override
public int unload() { public void robotLoad(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode, String boxItem) {
return 0;
} }
@Override @Override
public int charge() { public void robotUnload(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode) {
return 0;
} }
@Override @Override
public int lift() { public void robotCharger(String executorId, String chargerItem) {
return 0;
} }
} }

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; import java.util.List;
public class Cmd10010 { public class AmrTaskMessage {
// 作业序号 UInt32 // 作业序号 UInt32
public long SeqNo; public long SeqNo;
// 作业类型 UInt8 0:运输 1:接货 2:卸货 3:充电 4:提升移栽取货或卸货 5:滚筒取货或卸货(双向作业) // 作业类型 UInt8 0:运输 1:接货 2:卸货 3:充电 4:提升移栽取货或卸货 5:滚筒取货或卸货(双向作业)
@ -36,13 +36,13 @@ public class Cmd10010 {
// 目标货位朝向 UInt8 朝向定义与充电桩朝向相同。 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向 // 目标货位朝向 UInt8 朝向定义与充电桩朝向相同。 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向
public short GoodsSlotDirection; public short GoodsSlotDirection;
// 多机构^[1]^的拣货模式 UInt8[3] 数组形式,意义同"PickMode" // 多机构^[1]^的拣货模式 UInt8[3] 数组形式,意义同"PickMode"
public short[] MPickMode; public List<Short> MPickMode;
// 多机构^[1]^的目标货位高度 UInt16[3] 单位:mm // 多机构^[1]^的目标货位高度 UInt16[3] 单位:mm
public int[] MGoodsSlotHeight; public List<Integer> MGoodsSlotHeight;
// 多机构^[1]^的目标货位朝向 UInt8[3] 朝向定义与充电桩朝向相同。 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向 // 多机构^[1]^的目标货位朝向 UInt8[3] 朝向定义与充电桩朝向相同。 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向
public short[] MGoodsSlotDirection; public List<Short> MGoodsSlotDirection;
// 多机构的目标货箱ID String[3] 仅做校验使用(仅接货用) // 多机构的目标货箱ID String[3] 仅做校验使用(仅接货用)
public String[] MStorageRacksNo; public List<String> MStorageRacksNo;
// 滚筒1 运动操作 对于左右滚动的双滚筒机型,此滚筒为靠近车头的滚筒。 对于前后滚动的双滚筒机型,此滚筒为车身左侧的滚筒。 UInt8 0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作 // 滚筒1 运动操作 对于左右滚动的双滚筒机型,此滚筒为靠近车头的滚筒。 对于前后滚动的双滚筒机型,此滚筒为车身左侧的滚筒。 UInt8 0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作
public short Roll1Motion; public short Roll1Motion;
// 滚筒2 运动操作 对于左右滚动的双滚筒机型,此滚筒为靠近车尾的滚筒。 对于前后滚动的双滚筒机型,此滚筒为车身右侧的滚筒。 对于单滚筒机型,此参数无意义。 UInt8 0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作 // 滚筒2 运动操作 对于左右滚动的双滚筒机型,此滚筒为靠近车尾的滚筒。 对于前后滚动的双滚筒机型,此滚筒为车身右侧的滚筒。 对于单滚筒机型,此参数无意义。 UInt8 0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作
@ -60,11 +60,11 @@ public class Cmd10010 {
// 滚筒2目标货物数量 对于单滚筒机型,此参数无意义。 UInt16 1~N // 滚筒2目标货物数量 对于单滚筒机型,此参数无意义。 UInt16 1~N
public int Roll2GoodsQuantity; public int Roll2GoodsQuantity;
// 多滚筒运动模式 UInt8[6] 数组形式,0:不控制(无动作) 1:从货架上取货 2:将货物放到货架上 3:仅调整托盘高度(不进行取放货操作) 4:调整车身货物(仅供调试,RCS勿发送此命令) 5:仅调整载货台到取货高度,但是不动作 6:仅调整载货台到放货高度,但是不动作 // 多滚筒运动模式 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: 未知方向 // 多滚筒对接的站台朝向 UInt8[6] 0: X轴正向 1: Y轴正向 2: X轴负向 3: Y轴负向 15: 未知方向
public short[] MRollStationDirection; public List<Short> MRollStationDirection;
// 多滚筒目标货物数量 UInt16[6] 数组形式,意义同"RollGoodsQuantity" // 多滚筒目标货物数量 UInt16[6] 数组形式,意义同"RollGoodsQuantity"
public int[] MRollGoodsQuantity; public List<Integer> MRollGoodsQuantity;
// 是否仅执行任务的准备部分 bool 默认为false,仅执行该动作的准备部分,如仅进行导航,调整托盘高度等,但不进行取放货操作 // 是否仅执行任务的准备部分 bool 默认为false,仅执行该动作的准备部分,如仅进行导航,调整托盘高度等,但不进行取放货操作
public boolean Preparing; public boolean Preparing;
// 货架标识 uint32 车根据货架类型查询尺寸进行避障 // 货架标识 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; import com.galaxis.rcs.connector.cl2.Cl2Connector;
public class DashboardManager implements Cl2Connector { public class DashboardManager implements Cl2Connector {
@Override @Override
public int transport() { public void robotMove(String executorId, String startWayPoint, String endWayPoint, double armRotation) {
return 0;
} }
@Override @Override
public int pickup() { public void robotRotation(String executorId, double worldRotation) {
return 0;
} }
@Override @Override
public int unload() { public void robotLoad(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode, String boxItem) {
return 0;
} }
@Override @Override
public int charge() { public void robotUnload(String executorId, String rackItem, int bay, int level, int cell, String storeBarCode) {
return 0;
} }
@Override @Override
public int lift() { public void robotCharger(String executorId, String chargerItem) {
return 0;
} }
} }

Loading…
Cancel
Save