diff --git a/src/src/main/java/com/my/graphiteDigesterBg/MyApplication.java b/src/src/main/java/com/my/graphiteDigesterBg/MyApplication.java index db6f4e5..6ccf2ab 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/MyApplication.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/MyApplication.java @@ -1,118 +1,9 @@ package com.my.graphiteDigesterBg; -import org.opencv.core.*; -import org.opencv.highgui.HighGui; -import org.opencv.imgcodecs.Imgcodecs; -import org.opencv.imgproc.Imgproc; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; - -import java.util.ArrayList; -import java.util.List; - @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } - - private static void test() { - System.load("D:/ProgramFiles/OpenCV/opencv/build/java/x64/opencv_java490.dll"); - var srcImg = Imgcodecs.imread("D:/image.png"); - HighGui.imshow("preview", srcImg); - HighGui.waitKey(100); - - // resize to 800x800 - var size = new Size(800, 800); - var resizedImg = new Mat(800, 800, CvType.CV_8UC3); - Imgproc.resize(srcImg, resizedImg, size); - var resizedSrcImg = resizedImg.clone(); - - // slots - var leftOffset = 100; - var topOffset = 100; - var xDistance = 200; - var yDistance = 200; - int radius = 80; - int thickness = 5; - List slotContours = new ArrayList<>(); - Scalar color = new Scalar(0, 0, 255); - for ( var i=0; i<16; i++) { - var centerX = leftOffset + (i%4)*xDistance; - var centerY = topOffset + (i/4)*yDistance; - Point center = new Point(centerX, centerY); - Imgproc.circle(resizedImg, center, radius, color, thickness); - - List pointsList = new ArrayList<>(); - for (int angle = 0; angle <= 360; angle += 10) { - double x = center.x + radius * Math.cos(Math.toRadians(angle)); - double y = center.y + radius * Math.sin(Math.toRadians(angle)); - pointsList.add(new Point(x, y)); - } - - // Convert List to MatOfPoint - MatOfPoint matOfPoint = new MatOfPoint(); - matOfPoint.fromList(pointsList); - slotContours.add(matOfPoint); - } - HighGui.imshow("preview", resizedImg); - HighGui.waitKey(100); - - var grayImg = new Mat(); - Imgproc.cvtColor(resizedSrcImg, grayImg, Imgproc.COLOR_BGR2GRAY); - HighGui.imshow("preview", grayImg); - HighGui.waitKey(100); - - var blurImg = new Mat(); - Imgproc.blur(grayImg, blurImg, new org.opencv.core.Size(30, 30)); - HighGui.imshow("preview", blurImg); - HighGui.waitKey(100); - - var wbImg = new Mat(); - Imgproc.threshold(blurImg, wbImg, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU); - HighGui.imshow("preview", wbImg); - HighGui.waitKey(100); - - List contours = new ArrayList<>(); - Imgproc.findContours(wbImg, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); - - var resultImg = new Mat(800, 800, CvType.CV_8UC3); - // 绘制轮廓 - var contourColor = new Scalar(255, 255, 255); - for ( var contour : contours ) { - Imgproc.drawContours(resultImg, List.of(contour), -1, contourColor, 3); - HighGui.imshow("preview", resultImg); - HighGui.waitKey(100); - } - - List errorSlotIndexList = new ArrayList<>(); - var slotContourColor = new Scalar(0, 0, 255); - var slotContoursErrorColor = new Scalar(0, 255, 255); - for ( var index=0; index<16; index++ ) { - var slotContour = slotContours.get(index); - var isErrorSlot = false; - Rect slotRect = Imgproc.boundingRect(slotContour); - - for ( var contour : contours ) { - Rect contourRect = Imgproc.boundingRect(contour); - if ( slotRect.contains(contourRect.tl()) && slotRect.contains(contourRect.br()) ) { - errorSlotIndexList.add(index); - isErrorSlot = true; - break; - } - } - - if ( isErrorSlot ) { - Imgproc.drawContours(resultImg, List.of(slotContour), -1, slotContoursErrorColor, 3); - } else { - Imgproc.drawContours(resultImg, List.of(slotContour), -1, slotContourColor, 3); - } - HighGui.imshow("preview", resultImg); - HighGui.waitKey(100); - } -// System.out.println("error slot index list: " + errorSlotIndexList); - - HighGui.imshow("preview", resultImg); - HighGui.waitKey(100); - } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/move/MoveMoveTubeRackFromHeatPlateToLiquidPlate.java b/src/src/main/java/com/my/graphiteDigesterBg/move/MoveMoveTubeRackFromHeatPlateToLiquidPlate.java index 2ac9f95..043e415 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/move/MoveMoveTubeRackFromHeatPlateToLiquidPlate.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/move/MoveMoveTubeRackFromHeatPlateToLiquidPlate.java @@ -4,7 +4,7 @@ import com.my.graphiteDigesterBg.diframe.DiTaskMoveBase; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActServo; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; - +import java.util.List; public class MoveMoveTubeRackFromHeatPlateToLiquidPlate extends DiTaskMoveBase { // slot index public Integer slotIndex; @@ -21,12 +21,12 @@ public class MoveMoveTubeRackFromHeatPlateToLiquidPlate extends DiTaskMoveBase { String key = "HeatingPlateMotorSlotCover_" + this.slotIndex; DiActServo slotCoverServo = this.getActuator(key, DiActServo.class); - // 加热盘转盘移动到取放架位置 - heatPlateMotor.moveTo("HeatPlateSlot", this.slotIndex); - // 打开试管架盖 - slotCoverServo.moveTo("HeatPlateSlotCoverOpen"); - // 搬运上升到顶部 - transUdMotor.moveTo("TransUdMotorTop"); + this.execute(List.of( + () -> heatPlateMotor.moveTo("HeatPlateSlot", this.slotIndex), // 加热盘转盘移动到取放架位置 + () -> slotCoverServo.moveTo("HeatPlateSlotCoverOpen"), // 打开试管架盖 + () -> transUdMotor.moveTo("TransUdMotorTop") // 搬运上升到顶部 + )); + // 搬运移动到加热取架位置 transLrMotor.moveTo("TransLrMotorHeatPlateSlot"); // 搬运下降到取架位置 @@ -35,23 +35,25 @@ public class MoveMoveTubeRackFromHeatPlateToLiquidPlate extends DiTaskMoveBase { transferClipServo.moveTo("TransClipServoRackClip"); // 搬运上升到顶部 transUdMotor.moveTo("TransUdMotorTop"); - // 搬运移动到加液取放架位置 - transLrMotor.moveTo("TransLrMotorLiquid"); - // 加液转盘移动到取放位置 - liquidPlateMotor.moveTo("LiquidPlatePlaceTubeRack"); + + this.execute(List.of( + () -> transLrMotor.moveTo("TransLrMotorLiquid"), // 搬运移动到加液取放架位置 + () -> liquidPlateMotor.moveTo("LiquidPlatePlaceTubeRack") // 加液转盘移动到取放位置 + )); + // 搬运下降到放架位置 transUdMotor.moveTo("TransUdMotorLiquidDepth"); // 关闭试管架夹爪 transferClipServo.moveTo("TransClipServoClose"); // 搬运上升到顶部 transUdMotor.moveTo("TransUdMotorTop"); - // 关闭试管架盖 - slotCoverServo.moveTo("HeatPlateSlotCoverClose"); - // 搬运移动到就绪位置 - transLrMotor.moveTo("TransLrMotorStandby"); - // 加热盘移动到就绪位置 - heatPlateMotor.moveTo("HeatPlateStandby"); - liquidPlateMotor.moveTo("LiquidPlateStandby"); + + this.execute(List.of( + () -> slotCoverServo.moveTo("HeatPlateSlotCoverClose"), // 关闭试管架盖 + () -> transLrMotor.moveTo("TransLrMotorStandby"), // 搬运移动到就绪位置 + () -> heatPlateMotor.moveTo("HeatPlateStandby"), // 加热盘转盘移动到就绪位置 + () -> liquidPlateMotor.moveTo("LiquidPlateStandby") // 加液转盘移动到就绪位置 + )); // 更新试管架位置 var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlot.java b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlot.java index 26f7fbf..3a4f640 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlot.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlot.java @@ -27,7 +27,7 @@ public class ResHeatingTubeRackSlot { // is slot locked private Boolean isLocked; // is heating - public Boolean isHeating; + public Boolean isHeating = false; // task uuid public String taskUuid; // manager