package com.zy.common.utils;
|
|
import com.zy.asrs.utils.Utils;
|
import com.zy.common.model.NavigateNode;
|
import com.zy.common.model.NyShuttleOperaResult;
|
import com.zy.common.model.enums.NavigationMapType;
|
import com.zy.core.model.command.NyShuttleHttpCommand;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 牛眼四向车操作工具类
|
* 此工具类只要作用于获取小车的各类命令List,移动命令、搬运货物命令、复位命令等。如命令为移动命令,还将返回行走路径List
|
*/
|
public class NyShuttleOperaUtils {
|
|
/**
|
* 计算并获取小车从起点——中间点——目标点之间搬运货物动作命令
|
* @param shuttleNo 小车号
|
* @param wrkNo 工作号
|
* @param startPoint 起点(小车当前位置)
|
* @param targetPoint 目标点(货物目标位置)
|
*/
|
public static NyShuttleOperaResult getShuttleTransportCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint) {
|
//行走路径
|
ArrayList<NavigateNode> nodes = new ArrayList<>();
|
//命令集合
|
ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
|
|
//计算起点到目标点命令
|
NyShuttleOperaResult result = getStartToTargetCommands(shuttleNo, wrkNo, startPoint, targetPoint, NavigationMapType.DFX.id);
|
if (result == null) {
|
//计算结果必须不为空,否则计算失败
|
return null;
|
}
|
nodes.addAll(result.getNodes());
|
//起点位置下发一条顶升命令将货物进行搬运
|
commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, true));
|
commands.addAll(result.getCommands());//起点到目标点移动命令
|
//当小车行走到目标点后,需要下发一条下降命令将货物放置
|
commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, false));
|
return result(commands, nodes);
|
}
|
|
/**
|
* 计算并获取小车从起点——中间点——目标点之间搬运货物动作命令
|
* @param shuttleNo 小车号
|
* @param wrkNo 工作号
|
* @param startPoint 起点(小车当前位置)
|
* @param middlePoint 中间点(货物位置)
|
* @param targetPoint 目标点(货物目标位置)
|
*/
|
public static NyShuttleOperaResult getShuttleTransportCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String middlePoint, String targetPoint) {
|
//行走路径
|
ArrayList<NavigateNode> nodes = new ArrayList<>();
|
//命令集合
|
ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
|
|
if (!startPoint.equals(middlePoint)) {//起点和中间点不一致,需要计算起点到中间点路径
|
//计算起点到中间点命令
|
NyShuttleOperaResult result1 = getStartToTargetCommands(shuttleNo, wrkNo, startPoint, middlePoint, NavigationMapType.NORMAL.id);
|
if (result1 == null) {
|
//计算结果必须不为空,否则计算失败
|
return null;
|
}
|
nodes.addAll(result1.getNodes());
|
commands.addAll(result1.getCommands());
|
}
|
|
//计算中间点到目标点命令
|
NyShuttleOperaResult result2 = getStartToTargetCommands(shuttleNo, wrkNo, middlePoint, targetPoint, NavigationMapType.DFX.id);
|
if (result2 == null) {
|
//计算结果必须不为空,否则计算失败
|
return null;
|
}
|
nodes.addAll(result2.getNodes());
|
//当小车行走到中间点后,需要下发一条顶升命令将货物进行搬运
|
commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, true));
|
commands.addAll(result2.getCommands());//中间点到目标点移动命令
|
//当小车行走到目标点后,需要下发一条下降命令将货物放置
|
commands.add(NyHttpUtils.getPalletLiftCommand(shuttleNo, wrkNo, false));
|
return result(commands, nodes);
|
}
|
|
/**
|
* 获取起点到目标点行走命令
|
*/
|
public static NyShuttleOperaResult getStartToTargetCommands(Integer shuttleNo, Integer wrkNo, String startPoint, String targetPoint, Integer mapType) {
|
//计算起点到目标点行走节点
|
List<NavigateNode> calc = NavigateUtils.calc(startPoint, targetPoint, mapType, Utils.getShuttlePoints(shuttleNo, Utils.getLev(startPoint)));
|
if (calc == null) {
|
return null;
|
}
|
|
//命令集合
|
ArrayList<NyShuttleHttpCommand> commands = new ArrayList<>();
|
|
//获取分段路径
|
ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc);
|
//将每一段路径分成command指令
|
for (ArrayList<NavigateNode> nodes : data) {
|
//开始路径
|
NavigateNode startPath = nodes.get(0);
|
//目标路径
|
NavigateNode targetPath = nodes.get(nodes.size() - 1);
|
//获取移动命令
|
NyShuttleHttpCommand moveCommand = NyHttpUtils.getMoveCommand(shuttleNo, wrkNo, startPath, targetPath);
|
moveCommand.setNodes(nodes);//将行走节点添加到每一步命令中
|
commands.add(moveCommand);
|
}
|
|
return result(commands, calc);
|
}
|
|
//返回结果集
|
public static NyShuttleOperaResult result(List<NyShuttleHttpCommand> commands, List<NavigateNode> nodes) {
|
return new NyShuttleOperaResult(commands, nodes);
|
}
|
|
}
|