diff --git a/src/main/java/com/iflytop/gd/app/model/bo/Point3D.java b/src/main/java/com/iflytop/gd/app/model/bo/Point3D.java index e0b4e6b..fc2f6ee 100644 --- a/src/main/java/com/iflytop/gd/app/model/bo/Point3D.java +++ b/src/main/java/com/iflytop/gd/app/model/bo/Point3D.java @@ -1,14 +1,16 @@ package com.iflytop.gd.app.model.bo; -import lombok.Getter; +import lombok.Data; -@Getter +@Data public class Point3D { - private final Double x; - private final Double y; - private final Double z; + private Double x; + private Double y; + private Double z; + public Point3D() { + } public Point3D(Double x, Double y, Double z) { this.x = x; this.y = y; diff --git a/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java b/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java index fa88bd8..4c5a68b 100644 --- a/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java +++ b/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java @@ -4,10 +4,8 @@ import cn.hutool.json.JSONObject; import com.iflytop.gd.app.core.DeviceState; import com.iflytop.gd.app.model.bo.CraftsStep; import com.iflytop.gd.app.model.bo.Point3D; -import com.iflytop.gd.common.cmd.CommandFuture; -import com.iflytop.gd.common.cmd.DeviceCommandBundle; -import com.iflytop.gd.common.cmd.DeviceCommandGenerator; import com.iflytop.gd.common.enums.HeatModuleId; +import com.iflytop.gd.common.enums.data.DevicePositionCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -19,6 +17,7 @@ import org.springframework.stereotype.Service; public class CraftsStepService { private final DeviceCommandService deviceCommandService; private final DeviceCommandUtilService deviceCommandUtilService; + private final DevicePositionService devicePositionService; /** * 执行单个工艺步骤 @@ -44,38 +43,46 @@ public class CraftsStepService { * 添加溶液 */ private boolean addLiquid(String heatId, JSONObject params) throws Exception { - //TODO 判断加液区是否空闲 - DeviceState.getInstance().waitLiquidIdle();//等待加液区空闲 - //TODO 判断托盘电机是否升起 - //升起托盘 HeatModuleId heatModuleId = HeatModuleId.valueOf(heatId); - double heaterMotorMoveUpPosition = 0.0; //TODO 加热位抬升托盘位置 从数据库中获取 - deviceCommandUtilService.heaterMotorMove(heatModuleId, heaterMotorMoveUpPosition); + + //等待加液区空闲 + DeviceState.getInstance().waitLiquidIdle();//等待加液区空闲 + + double heaterMotorMoveUp = devicePositionService.getPosition(DevicePositionCode.trayLift).getDistance(); //获取加热位抬升托盘位置 + deviceCommandUtilService.heaterMotorMove(heatModuleId, heaterMotorMoveUp);//抬升加热位托盘 //TODO 判断托盘是否有拍子 - //将机械臂移动至托盘上方 - Point3D aboveTrayPoint3D = new Point3D(0.0, 0.0, 0.0);//TODO 托盘上方点位 从数据库中获取 - deviceCommandUtilService.gantryMove(aboveTrayPoint3D); - //下降机械臂使夹爪可以夹住拍子 - double aboveTrayCapPosition = 0.0;//TODO 下降机械臂使夹爪可以夹住拍子的位置 从数据库中获取 - deviceCommandUtilService.gantryXMove(aboveTrayCapPosition); - //夹住拍子 - double clawClampPosition = 0.0;//TODO 夹拍子收紧度 从数据库中获取 - deviceCommandUtilService.clawClamp(clawClampPosition); - //机械臂提升至安全高度 - double gantryCarryCapUpSafePosition = 0.0;//TODO 机械臂携带拍子的安全高度位置 从数据库中获取 - deviceCommandUtilService.gantryZMove(gantryCarryCapUpSafePosition); - //下降拍子存放区1个位置 - deviceCommandUtilService.capMotorMove(-1); - //将机械臂移动至拍子存放区上方 - //下降机械臂 - //松开夹爪 - //将机械臂移动至托盘上方 - //下降机械臂使夹爪可以夹住托盘 - //机械臂提升至安全位置 - //移动机械臂至加液区 - //下降机械臂将托盘与试管落入加液区 - //松开夹爪 - //提升机械臂至安全高度 + Point3D heatAreaCapClawPointPoint3D = deviceCommandUtilService.getHeatAreaCapClawPointPoint3D(heatModuleId);//获取托盘上方点位 + deviceCommandUtilService.gantryMove(heatAreaCapClawPointPoint3D);//将机械臂移动至拍子上方 + double clawCapPick = devicePositionService.getPosition(DevicePositionCode.clawCapPick).getDistance(); //拍子夹取距离 + deviceCommandUtilService.clawMove(clawCapPick);//将夹爪张开 + double clawDescendDistance = devicePositionService.getPosition(DevicePositionCode.clawDescendDistance).getDistance();//获取下降机械臂使夹爪可以夹住的距离 + deviceCommandUtilService.gantryZMove(clawDescendDistance); //下降机械臂使夹爪可以夹住拍子 + double clawCapGrip = devicePositionService.getPosition(DevicePositionCode.clawCapGrip).getDistance(); //获取拍子夹紧距离 + deviceCommandUtilService.clawMove(clawCapGrip);//将夹爪收紧 + double capSafetyHeight = devicePositionService.getPosition(DevicePositionCode.capSafetyHeight).getDistance();//获取移动拍子的安全高度 + deviceCommandUtilService.gantryZMoveBy(capSafetyHeight);//机械臂提升至移动拍子的安全高度 + deviceCommandUtilService.capMotorMove(-1); //下降拍子存放区1个位置 + Point3D capStorageCapClawPoint = devicePositionService.getPosition(DevicePositionCode.capStorageCapClawPoint).getPoint3D();//将机械臂移动至拍子存放区上方; + Point3D capStorageCapClawPointSafetyHeight = new Point3D(capStorageCapClawPoint.getX(), capStorageCapClawPoint.getY(), capStorageCapClawPoint.getZ() + capSafetyHeight);//拍子存放区上方加上移动拍子的安全高度 + deviceCommandUtilService.gantryMove(capStorageCapClawPointSafetyHeight);//移动机械臂至拍子存放区上方加上拍子的安全高度 + deviceCommandUtilService.gantryZMoveBy(capSafetyHeight);//下降机械臂,使拍子落入存放区 + deviceCommandUtilService.clawMove(clawCapPick); //松开夹爪,放开拍子 + deviceCommandUtilService.gantryZMoveBy(capStorageCapClawPoint.getZ());//将机械臂抬升至托盘上方 + Point3D heatAreaTrayClaw = deviceCommandUtilService.getHeatAreaTrayClawPoint3D(heatModuleId);//获取指定托盘上方点位 + deviceCommandUtilService.gantryMove(heatAreaTrayClaw);//将机械臂移动至托盘上方 + double clawTrayPick = devicePositionService.getPosition(DevicePositionCode.clawTrayPick).getDistance();//获取夹爪托盘夹取距离 + deviceCommandUtilService.clawMove(clawTrayPick);//将夹爪张开 + deviceCommandUtilService.gantryZMove(clawDescendDistance); //下降机械臂使夹爪可以夹住托盘 + double clawTrayGrip = devicePositionService.getPosition(DevicePositionCode.clawTrayGrip).getDistance();//获取夹爪托盘夹紧距离 + deviceCommandUtilService.clawMove(clawTrayGrip);//将夹爪收紧 + double traySafetyHeight = devicePositionService.getPosition(DevicePositionCode.traySafetyHeight).getDistance();//获取移动托盘的安全高度 + deviceCommandUtilService.gantryZMoveBy(traySafetyHeight);//机械臂提升至移动托盘的安全高度 + Point3D liquidAreaTrayPoint = devicePositionService.getPosition(DevicePositionCode.liquidAreaTrayPoint).getPoint3D();//获取加液区托盘夹爪点 + Point3D liquidAreaTrayPointSafetyHeight = new Point3D(liquidAreaTrayPoint.getX(),liquidAreaTrayPoint.getY(), liquidAreaTrayPoint.getZ() + traySafetyHeight);//加液区托盘点位上方加上移动托盘的安全高度 + deviceCommandUtilService.gantryMove(liquidAreaTrayPointSafetyHeight);//移动机械臂至加液区托盘点位上方加上移动托盘的安全高度 + deviceCommandUtilService.gantryZMoveBy(traySafetyHeight);//下降机械臂将托盘与试管落入加液区 + deviceCommandUtilService.clawMove(clawTrayPick);//松开夹爪,放下托盘 + deviceCommandUtilService.gantryZMoveBy(clawDescendDistance); //for 根据工艺配置添加溶液 //加液机械臂移动至第N个试管 //启动x加液泵添加m毫升溶液 @@ -95,12 +102,16 @@ public class CraftsStepService { * 加热 */ private boolean heating(String heatId, JSONObject params) { + //if 判断加液区是否有托盘 //将机械臂移动至加液区托盘上方 //下降机械臂使夹爪可以夹住托盘 //夹住托盘 //将托盘提升至安全高度 //将机械臂移动至加热区上方 + + DeviceState.getInstance().setLiquidIdleTrue();//释放加液区等待 + //下降机械臂使托盘与试管落入加热区 //将机械臂提升至安全高度 //移动机械臂至拍子存放区上方 diff --git a/src/main/java/com/iflytop/gd/app/service/DeviceCommandUtilService.java b/src/main/java/com/iflytop/gd/app/service/DeviceCommandUtilService.java index 81cccac..2fc40cb 100644 --- a/src/main/java/com/iflytop/gd/app/service/DeviceCommandUtilService.java +++ b/src/main/java/com/iflytop/gd/app/service/DeviceCommandUtilService.java @@ -1,10 +1,12 @@ package com.iflytop.gd.app.service; import com.iflytop.gd.app.model.bo.Point3D; +import com.iflytop.gd.app.model.entity.DevicePosition; import com.iflytop.gd.common.cmd.CommandFuture; import com.iflytop.gd.common.cmd.DeviceCommandBundle; import com.iflytop.gd.common.cmd.DeviceCommandGenerator; import com.iflytop.gd.common.enums.HeatModuleId; +import com.iflytop.gd.common.enums.data.DevicePositionCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -16,6 +18,7 @@ import java.util.concurrent.TimeUnit; @RequiredArgsConstructor public class DeviceCommandUtilService { private final DeviceCommandService deviceCommandService; + private final DevicePositionService devicePositionService; /** * 龙门架机械臂移动到指定点 @@ -58,9 +61,36 @@ public class DeviceCommandUtilService { } /** - * 收紧夹爪 + * 龙门架机械臂X轴相对移动到指定点 */ - public void clawClamp(double position) throws Exception { + public void gantryXMoveBy(double position) throws Exception { + DeviceCommandBundle gantryXMoveDeviceCommand = DeviceCommandGenerator.gantryXMoveBy(position); + CommandFuture gantryXMoveDeviceCommandFuture = deviceCommandService.sendCommand(gantryXMoveDeviceCommand); + commandWait(gantryXMoveDeviceCommandFuture); + } + + /** + * 龙门架机械臂Y轴相对移动到指定点 + */ + public void gantryYMoveBy(double position) throws Exception { + DeviceCommandBundle gantryXMoveDeviceCommand = DeviceCommandGenerator.gantryYMoveBy(position); + CommandFuture gantryXMoveDeviceCommandFuture = deviceCommandService.sendCommand(gantryXMoveDeviceCommand); + commandWait(gantryXMoveDeviceCommandFuture); + } + + /** + * 龙门架机械臂Z轴相对移动到指定点 + */ + public void gantryZMoveBy(double position) throws Exception { + DeviceCommandBundle gantryXMoveDeviceCommand = DeviceCommandGenerator.gantryZMoveBy(position); + CommandFuture gantryXMoveDeviceCommandFuture = deviceCommandService.sendCommand(gantryXMoveDeviceCommand); + commandWait(gantryXMoveDeviceCommandFuture); + } + + /** + * 移动夹爪 + */ + public void clawMove(double position) throws Exception { DeviceCommandBundle deviceCommand = DeviceCommandGenerator.clawMove(position); CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(deviceCommand); commandWait(deviceCommandFuture); @@ -68,6 +98,7 @@ public class DeviceCommandUtilService { /** * 调整拍子升降电机位置 + * * @param num 1为上升1格,-1为下降1格 */ public void capMotorMove(int num) throws Exception { @@ -102,4 +133,38 @@ public class DeviceCommandUtilService { CompletableFuture.allOf(responseFutures) .get(120, TimeUnit.SECONDS); } + + /////////////////////////////////////////////////获取位置 + + /** + * 获取指定加热区托盘夹爪点位 + */ + public Point3D getHeatAreaTrayClawPoint3D(HeatModuleId heatModuleId) { + DevicePosition devicePosition = switch (heatModuleId) { + case heat_module_01 -> devicePositionService.getPosition(DevicePositionCode.heatArea1TrayClawPoint); + case heat_module_02 -> devicePositionService.getPosition(DevicePositionCode.heatArea2TrayClawPoint); + case heat_module_03 -> devicePositionService.getPosition(DevicePositionCode.heatArea3TrayClawPoint); + case heat_module_04 -> devicePositionService.getPosition(DevicePositionCode.heatArea4TrayClawPoint); + case heat_module_05 -> devicePositionService.getPosition(DevicePositionCode.heatArea5TrayClawPoint); + case heat_module_06 -> devicePositionService.getPosition(DevicePositionCode.heatArea6TrayClawPoint); + }; + return devicePosition.getPoint3D(); + } + + + /** + * 获取指定加热区拍子夹爪点位 + */ + public Point3D getHeatAreaCapClawPointPoint3D(HeatModuleId heatModuleId) { + DevicePosition devicePosition = switch (heatModuleId) { + case heat_module_01 -> devicePositionService.getPosition(DevicePositionCode.heatArea1CapClawPoint); + case heat_module_02 -> devicePositionService.getPosition(DevicePositionCode.heatArea2CapClawPoint); + case heat_module_03 -> devicePositionService.getPosition(DevicePositionCode.heatArea3CapClawPoint); + case heat_module_04 -> devicePositionService.getPosition(DevicePositionCode.heatArea4CapClawPoint); + case heat_module_05 -> devicePositionService.getPosition(DevicePositionCode.heatArea5CapClawPoint); + case heat_module_06 -> devicePositionService.getPosition(DevicePositionCode.heatArea6CapClawPoint); + }; + return devicePosition.getPoint3D(); + } + } diff --git a/src/main/java/com/iflytop/gd/common/enums/data/DevicePositionCode.java b/src/main/java/com/iflytop/gd/common/enums/data/DevicePositionCode.java index c560ee9..2e522ba 100644 --- a/src/main/java/com/iflytop/gd/common/enums/data/DevicePositionCode.java +++ b/src/main/java/com/iflytop/gd/common/enums/data/DevicePositionCode.java @@ -8,109 +8,158 @@ import lombok.Getter; @Getter public enum DevicePositionCode { /** - * 托盘夹取位置 + * 试管间距距离 */ - trayPick(DevicePositionType.DISTANCE, "托盘夹取位置"), + testTubeSpacing(DevicePositionType.DISTANCE, "试管间距距离"), /** - * 托盘夹紧位置 + * 夹爪托盘夹取距离 */ - trayGrip(DevicePositionType.DISTANCE, "托盘夹紧位置"), + clawTrayPick(DevicePositionType.DISTANCE, "夹爪托盘夹取距离"), /** - * 加液区原点 + * 夹爪托盘夹紧距离 */ - liquidAreaOrigin(DevicePositionType.POINT_3D, "加液区原点"), + clawTrayGrip(DevicePositionType.DISTANCE, "夹爪托盘夹紧距离"), /** - * 加热区1原点 + * 夹爪试管夹取距离 */ - heatArea1Origin(DevicePositionType.POINT_3D, "加热区1原点"), + clawTestTubePick(DevicePositionType.DISTANCE, "夹爪试管夹取距离"), /** - * 加热区2原点 + * 夹爪试管夹紧距离 */ - heatArea2Origin(DevicePositionType.POINT_3D, "加热区2原点"), + clawTestTubeGrip(DevicePositionType.DISTANCE, "夹爪试管夹紧距离"), + /** + * 夹爪拍子夹取距离 + */ + clawCapPick(DevicePositionType.DISTANCE, "夹爪拍子夹取距离"), + + /** + * 夹爪拍子夹紧距离 + */ + clawCapGrip(DevicePositionType.DISTANCE, "夹爪拍子夹紧距离"), + + /** + * 开门距离 + */ + doorOpen(DevicePositionType.DISTANCE, "开门距离"), + + /** + * 关门距离 + */ + doorClose(DevicePositionType.DISTANCE, "关门距离"), + + /** + * 托盘抬升距离 + */ + trayLift(DevicePositionType.DISTANCE, "托盘抬升距离"), + + /** + * 托盘下降距离 + */ + trayLower(DevicePositionType.DISTANCE, "托盘下降距离"), + + /** + * 夹爪夹取下降距离 + */ + clawDescendDistance(DevicePositionType.DISTANCE, "夹爪夹取下降距离"), /** - * 加热区3原点 + * 移动拍子安全高度 */ - heatArea3Origin(DevicePositionType.POINT_3D, "加热区3原点"), + capSafetyHeight(DevicePositionType.DISTANCE, "移动拍子安全高度"), + /** - * 加热区4原点 + * 移动托盘安全高度 */ - heatArea4Origin(DevicePositionType.POINT_3D, "加热区4原点"), + traySafetyHeight(DevicePositionType.DISTANCE, "移动托盘安全高度"), + /** - * 加热区5原点 + * 移动试管安全高度 */ - heatArea5Origin(DevicePositionType.POINT_3D, "加热区5原点"), + testTubeSafetyHeight(DevicePositionType.DISTANCE, "移动试管安全高度"), + + ////////////////////////点 /** - * 加热区6原点 + * 拍子存放区拍子夹爪点 */ - heatArea6Origin(DevicePositionType.POINT_3D, "加热区6原点"), + capStorageCapClawPoint(DevicePositionType.POINT_3D, "拍子存放区拍子夹爪点"), /** - * 试管间距 + * 加液区托盘夹爪点 */ - testTubeSpacing(DevicePositionType.DISTANCE, "试管间距"), + liquidAreaTrayPoint(DevicePositionType.POINT_3D, "加液区托盘夹爪点"), /** - * 试管夹取位置 + * 加热区1托盘夹爪点 */ - testTubePick(DevicePositionType.DISTANCE, "试管夹取位置"), + heatArea1TrayClawPoint(DevicePositionType.POINT_3D, "加热区1托盘夹爪点"), /** - * 试管夹紧位置 + * 加热区2托盘夹爪点 */ - testTubeGrip(DevicePositionType.DISTANCE, "试管夹紧位置"), + heatArea2TrayClawPoint(DevicePositionType.POINT_3D, "加热区2托盘夹爪点"), /** - * 拍子相对原点位置 + * 加热区3托盘夹爪点 */ - capRelativeToOrigin(DevicePositionType.POINT_3D, "拍子相对原点位置"), + heatArea3TrayClawPoint(DevicePositionType.POINT_3D, "加热区3托盘夹爪点"), /** - * 拍子夹取位置 + * 加热区4托盘夹爪点 */ - capPick(DevicePositionType.DISTANCE, "拍子夹取位置"), + heatArea4TrayClawPoint(DevicePositionType.POINT_3D, "加热区4托盘夹爪点"), /** - * 拍子夹紧位置 + * 加热区5托盘夹爪点 */ - capGrip(DevicePositionType.DISTANCE, "拍子夹紧位置"), + heatArea5TrayClawPoint(DevicePositionType.POINT_3D, "加热区5托盘夹爪点"), /** - * 拍子存放区位置 + * 加热区6托盘夹爪点 */ - capStorage(DevicePositionType.POINT_3D, "拍子存放区位置"), + heatArea6TrayClawPoint(DevicePositionType.POINT_3D, "加热区6托盘夹爪点"), /** - * 拍子相对原点位置 + * 加热区1拍子夹爪点 */ - capRelativePosition(DevicePositionType.POINT_3D, "拍子相对原点位置"), + heatArea1CapClawPoint(DevicePositionType.POINT_3D, "加热区1拍子夹爪点"), /** - * 托盘相对原点位置 + * 加热区2拍子夹爪点 */ - trayRelativeToOrigin(DevicePositionType.POINT_3D, "托盘相对原点位置"), + heatArea2CapClawPoint(DevicePositionType.POINT_3D, "加热区2拍子夹爪点"), /** - * 试管相对原点位置 + * 加热区3拍子夹爪点 */ - testTubeRelativeToOrigin(DevicePositionType.POINT_3D, "试管相对原点位置"), + heatArea3CapClawPoint(DevicePositionType.POINT_3D, "加热区3拍子夹爪点"), /** - * 开门位置 + * 加热区4拍子夹爪点 */ - doorOpen(DevicePositionType.DISTANCE, "开门位置"), + heatArea4CapClawPoint(DevicePositionType.POINT_3D, "加热区4拍子夹爪点"), /** - * 关门位置 + * 加热区5拍子夹爪点 */ - doorClose(DevicePositionType.DISTANCE, "关门位置"); + heatArea5CapClawPoint(DevicePositionType.POINT_3D, "加热区5拍子夹爪点"), + + /** + * 加热区6拍子夹爪点 + */ + heatArea6CapClawPoint(DevicePositionType.POINT_3D, "加热区6拍子夹爪点"), + + /** + * 拍子存放区夹爪点 + */ + capStorageClawPoint(DevicePositionType.POINT_3D, "拍子存放区夹爪点"); + private final DevicePositionType type; private final String name;