Esempio n. 1
0
def saveCurrentView(path):
    cam = Camera()
    dr = DieRecognizer()
    if (args.led):
        lm.setAllLeds()
    mm.setTopLed(cs.LED_TOP_BRIGHTNESS)
    image = cam.takePicture()
    cam.close()
    if (args.led):
        lm.clear()
    mm.setTopLed(cs.LED_TOP_BRIGHTNESS_OFF)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    image = dr.transformImage(image)
    dr.writeImage(image, "current_view.jpg", directory=path)
Esempio n. 2
0
 def btnTakeImage_clicked(self):
     with WaitCursor():
         self.addStatusText("taking image...", spacerLineBefore=True)
         if cs.ON_RASPI:
             if not cs.IMG_USE_WARPING:
                 cs.IMG_TL = [
                     self.spnImageTLX.value(),
                     self.spnImageTLY.value()
                 ]
                 cs.IMG_BR = [
                     self.spnImageBRX.value(),
                     self.spnImageBRY.value()
                 ]
                 dr = DieRecognizer()
                 cam = Camera()
                 lm.setAllLeds()
                 mm.setTopLed(cs.LED_TOP_BRIGHTNESS)
                 image = cam.takePicture()
                 cam.close()
                 lm.clear()
                 mm.setTopLed(cs.LED_TOP_BRIGHTNESS_OFF)
                 image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
                 transformedImage = dr.cropImage(image, cs.IMG_TL,
                                                 cs.IMG_BR)
                 markedImage = dr.markCropLines(image,
                                                cs.IMG_TL,
                                                cs.IMG_BR,
                                                isGray=True)
                 dr.writeImage(markedImage,
                               "marked.jpg",
                               directory=cs.WEB_DIRECTORY)
                 dr.writeImage(transformedImage,
                               "transformed.jpg",
                               directory=cs.WEB_DIRECTORY)
                 self.addStatusText("see full image at http://" +
                                    cm.clientIdentity["IP"] + "/image.html")
                 pixImageOriginal = QPixmap(
                     os.path.join(cs.WEB_DIRECTORY, "marked.jpg"))
                 pixImageProcessed = QPixmap(
                     os.path.join(cs.WEB_DIRECTORY, "transformed.jpg"))
                 self.lblImageOriginal.setPixmap(
                     pixImageOriginal.scaled(200, 200, Qt.KeepAspectRatio))
                 self.lblImageProcessed.setPixmap(
                     pixImageProcessed.scaled(350, 250, Qt.KeepAspectRatio))
             else:
                 self.addStatusText(
                     "Warping is specified for this camera. Changing settings is not possible.",
                     spacerLineBefore=True,
                     spacerLineAfter=True)
         else:
             time.sleep(3)
         self.addStatusText("image cropping finished. save settings?",
                            spacerLineAfter=True)
Esempio n. 3
0
 def btnTakePicture_clicked(self):
     with WaitCursor():
         self.addStatusText("take picture with settings: {}, {}, {}".format(
             cs.CAM_ISO, cs.CAM_SHUTTER_SPEED, cs.CAM_CONTRAST),
                            spacerLineBefore=True)
         self.addStatusText("waiting...")
         if cs.ON_RASPI:
             dr = DieRecognizer()
             lm.setAllLeds()
             mm.setTopLed(cs.LED_TOP_BRIGHTNESS)
             cam = Camera()
             image = cam.takePicture()
             cam.close()
             dieRollResult, processedImages = dr.getDieRollResult(
                 image, returnOriginalImg=True, markDie=True)
             image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
             dr.writeImage(image, "camera.jpg", directory=cs.WEB_DIRECTORY)
             dr.writeImage(processedImages[1],
                           "recognized.jpg",
                           directory=cs.WEB_DIRECTORY)
             self.addStatusText("see full images at http://" +
                                cm.clientIdentity["IP"] + "/camera.html")
             #lm.clear()
             mm.setTopLed(cs.LED_TOP_BRIGHTNESS_OFF)
             pixCameraOriginal = QPixmap(
                 os.path.join(cs.WEB_DIRECTORY, "camera.jpg"))
             pixCameraProcessed = QPixmap(
                 os.path.join(cs.WEB_DIRECTORY, "recognized.jpg"))
             self.lblCameraOriginal.setPixmap(
                 pixCameraOriginal.scaled(500, 500, Qt.KeepAspectRatio))
             self.lblCameraProcessed.setPixmap(
                 pixCameraProcessed.scaled(400, 400, Qt.KeepAspectRatio))
             app.processEvents()
         else:
             time.sleep(3)
         self.addStatusText("image recognition finished. save settings?",
                            spacerLineAfter=True)
Esempio n. 4
0
mm.moveToPos(cs.BEFORE_PICKUP_POSITION)
mm.waitForMovementFinished()

print("Test die roll ...")
dropoffPos = np.array((90, 7, 13))
mr.moveToDropoffPosition(dropoffPos)
time.sleep(cs.WAIT_BEFORE_ROLL_TIME)
mm.setFeedratePercentage(cs.FR_FAST_MOVES)
mm.rollDie()

print("Move to center ...")
mm.moveToPos(cs.BEFORE_PICKUP_POSITION, True)
mm.waitForMovementFinished()

print("Test camera ...")
cam = Camera()
dr = DieRecognizer()
image = cam.takePicture()
cam.close()
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = dr.transformImage(image)
dr.writeImage(image, "current_view.jpg", directory=cs.WEB_DIRECTORY)

print("Pickup die ...")
cs.STORE_IMAGES = True
cs.SHOW_DIE_RESULT_WITH_LEDS = True
#mr.pickupDie()
mr.searchForDie()
lm.clear()

print("Done!")
Esempio n. 5
0
import argparse
import time

from tor.base.DieRecognizer import DieRecognizer
from tor.client.Camera import Camera

parser = argparse.ArgumentParser()
parser.add_argument("-o", dest="outFilePath", default="image.jpg")
parser.add_argument("-t", dest="useTimestamp", action="store_true")
parser.add_argument("-c", dest="cropImage", action="store_true")
parser.add_argument("-d", dest="directory", default="")
args = parser.parse_args()

cam = Camera()
time.sleep(2)
dr = DieRecognizer()

image = cam.takePicture()
cam.close()

print("picture taken")

if args.cropImage:
    image = dr.cropToSearchableArea(image)

if args.useTimestamp:
    dr.writeImage(image, directory=args.directory)
    dr.writeRGBArray(image, directory=args.directory)
else:
    dr.writeImage(image, args.outFilePath, directory=args.directory)
    dr.writeRGBArray(image, args.outFilePath, directory=args.directory)
Esempio n. 6
0
if args.magnet:
    mm.setFeedratePercentage(300)
    mm.moveToPos(Position(120, 100, 100), True)
    mm.waitForMovementFinished()

    cm.loadMeshpoints()

    calibrateMeshpoints("M", cs.MESH_MAGNET, args.points)
    cm.saveMeshpoints("M", cs.MESH_MAGNET)

    exit(0)

if args.camera:
    finish = False
    dr = DieRecognizer()
    cm.loadSettings()
    lm.setAllLeds()
    mm.setTopLed(cs.LED_TOP_BRIGHTNESS)
    while not finish:
        cam = Camera()
        image = cam.takePicture()
        cam.close()
        dieRollResult, processedImages = dr.getDieRollResult(
            image, returnOriginalImg=True, markDie=True)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        dr.writeImage(image, "camera.jpg", directory=cs.WEB_DIRECTORY)
        dr.writeImage(processedImages[1],
                      "recognized.jpg",
                      directory=cs.WEB_DIRECTORY)
        print("http://" + cm.clientIdentity["IP"] + "/camera.html")
Esempio n. 7
0
### load custom settings from file and server
ccsModuleName = "tor.client.CustomClientSettings." + cm.clientIdentity[
    "Material"]
try:
    import importlib
    customClientSettings = importlib.import_module(ccsModuleName)
    print("Custom config file loaded.")
except:
    log.warning("No CustomClientSettings found.")

cm.loadSettings()
cm.loadMeshpoints()

log.setLevel(cs.LOG_LEVEL)

dr = DieRecognizer()
mm = MovementManager()
if not mm.hasCorrectVersion:
    log.warning(
        "Incompatible version of TOR-Marlin installed. TORClient will now quit."
    )
    exit(0)
mr = MovementRoutines(cm)

if cs.ON_RASPI:
    try:
        lm = LedManager()
    except:
        raise Exception("Could not create LedManager.")

####################
Esempio n. 8
0
    lm = LedManager()
    lm.test()
    for i in range(1, 7):
        lm.showResult(i)
        time.sleep(1)
    for i in [random.randint(1, 6) for x in range(1, 4)]:
        lm.showResult(i)
        time.sleep(1)
    lm.clear()

elif mode == 9:  # take picture and search dice dots
    from tor.base.DieRecognizer import DieRecognizer
    if cs.ON_RASPI:
        from tor.client.Camera import Camera
    #lm = LedManager()
    dr = DieRecognizer()
    if cs.ON_RASPI:
        cam = Camera()
        image = cam.takePicture()
        cam.close()
    else:
        image = dr.readDummyImage()
    print("analyze picture...")
    dieRollResult, processedImages = dr.getDieRollResult(
        image, returnOriginalImg=True)
    print("write image...")
    dr.writeImage(processedImages[1])
    print("result:", dieRollResult.result)
    #lm.showResult(dieRollResult.result)

elif mode == 10:  #leds
Esempio n. 9
0
 def __init__(self, cm=None):
     self.cm = cm
     self.mm = MovementManager()
     self.dr = DieRecognizer()
Esempio n. 10
0
class MovementRoutines:
    def __init__(self, cm=None):
        self.cm = cm
        self.mm = MovementManager()
        self.dr = DieRecognizer()

    def loadPoints(self):
        return np.concatenate((cs.MESH_BED, cs.MESH_RAMP))

    def relativeBedCoordinatesToPosition(self, px, py):
        p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 = self.loadPoints()
        #TODO: @David check the out of range logic. die was found correctly at y=1.002
        #      why is y < 0 allowed? is the calculation correct for py < 0?
        #      for now just clip
        minX = -0.1
        maxX = 1.1
        minY = -0.1
        maxY = 1.1
        if (px < minX or px > maxX or py < minY or py > maxY):
            log.warning(
                "Out of range in relativeBedCoordinatesToPosition: [x,y]=[{},{}]"
                .format(px, py))
            px = np.clip(px, minX, maxX)
            py = np.clip(py, minY, maxY)
        if (px < 0.5):
            x = (1 - py) * (p4[0] + px *
                            (p6[0] - p4[0])) + py * (p1[0] + px *
                                                     (p3[0] - p1[0]))
            y = (1 - 2 * px) * (p4[1] + py *
                                (p1[1] - p4[1])) + 2 * px * (p5[1] + py *
                                                             (p2[1] - p5[1]))
            z = (1 - 2 * px) * ((1 - py) * p4[2] + py * p1[2]) + 2 * px * (
                (1 - py) * p5[2] + py * p2[2])
        else:
            x = (1 - py) * (p6[0] + (1 - px) *
                            (p4[0] - p6[0])) + py * (p3[0] + (1 - px) *
                                                     (p1[0] - p3[0]))
            y = 2 * (1 - px) * (p5[1] + py *
                                (p2[1] - p5[1])) + (2 * px -
                                                    1) * (p6[1] + py *
                                                          (p3[1] - p6[1]))
            z = 2 * (1 - px) * (
                (1 - py) * p5[2] + py * p2[2]) + (2 * px - 1) * (
                    (1 - py) * p6[2] + py * p3[2])
        return Position(x, y, z)

    def searchForDie(self):
        #starting position
        '''
        1  2  3
        4  5  6
        --------
        7  8  9
        10 11 12
        M      M
        '''
        p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 = self.loadPoints()
        n_rows = 4  # rows per area
        self.mm.moveToPos(Position(p1[0], p1[1], 100), True)
        self.mm.moveToPos(Position(p1[0], p1[1], p1[2]), True)
        self.mm.waitForMovementFinished()
        #raster bottom
        # mesh left side
        x_mesh_l = np.linspace(p1[0], p4[0], n_rows)
        y_mesh_l = np.linspace(p1[1], p4[1], n_rows)
        z_mesh_l = np.linspace(p1[2], p4[2], n_rows)
        #mesh center
        x_mesh_c = np.linspace(p2[0], p5[0], n_rows)
        y_mesh_c = np.linspace(p2[1], p5[1], n_rows)
        z_mesh_c = np.linspace(p2[2], p5[2], n_rows)
        #mesh right side
        x_mesh_r = np.linspace(p3[0], p6[0], n_rows)
        y_mesh_r = np.linspace(p3[1], p6[1], n_rows)
        z_mesh_r = np.linspace(p3[2], p6[2], n_rows)

        self.mm.setFeedratePercentage(cs.FR_SEARCH_BED)
        for i in range(n_rows):
            if (i % 2 == 0):
                self.mm.moveToPos(
                    Position(x_mesh_l[i], y_mesh_l[i], z_mesh_l[i]), True)
                #self.mm.waitForMovementFinished()
                self.mm.moveToPos(Position(x_mesh_c[i], y_mesh_c[i],
                                           z_mesh_c[i]),
                                  True,
                                  useSlowDownEnd=False)
                #self.mm.waitForMovementFinished()
                self.mm.moveToPos(Position(x_mesh_r[i], y_mesh_r[i],
                                           z_mesh_r[i]),
                                  True,
                                  useSlowDownStart=False)
                self.mm.waitForMovementFinished()
            else:
                self.mm.moveToPos(
                    Position(x_mesh_r[i], y_mesh_r[i], z_mesh_r[i]), True)
                #self.mm.waitForMovementFinished()
                self.mm.moveToPos(Position(x_mesh_c[i], y_mesh_c[i],
                                           z_mesh_c[i]),
                                  True,
                                  useSlowDownEnd=False)
                #self.mm.waitForMovementFinished()
                self.mm.moveToPos(Position(x_mesh_l[i], y_mesh_l[i],
                                           z_mesh_l[i]),
                                  True,
                                  useSlowDownStart=False)
                self.mm.waitForMovementFinished()
        self.mm.moveToPos(
            Position(
                MovementManager.currentPosition.x,
                MovementManager.currentPosition.y +
                cs.CRITICAL_AREA_APPROACH_Y,
                MovementManager.currentPosition.z -
                cs.CRITICAL_AREA_APPROACH_Z), True)

        #### ramp ###
        if (cs.SEARCH_RAMP):
            #safely move away from ramp
            self.mm.moveToPos(
                Position(MovementManager.currentPosition.x,
                         MovementManager.currentPosition.y + 20, 100), True)
            self.mm.waitForMovementFinished()

            # mesh left side
            x_mesh_l = np.linspace(p7[0], p10[0], n_rows)
            y_mesh_l = np.linspace(p7[1], p10[1], n_rows)
            z_mesh_l = np.linspace(p7[2], p10[2], n_rows)
            #mesh center
            x_mesh_c = np.linspace(p8[0], p11[0], n_rows)
            y_mesh_c = np.linspace(p8[1], p11[1], n_rows)
            z_mesh_c = np.linspace(p8[2], p11[2], n_rows)
            #mesh right side
            x_mesh_r = np.linspace(p9[0], p12[0], n_rows)
            y_mesh_r = np.linspace(p9[1], p12[1], n_rows)
            z_mesh_r = np.linspace(p9[2], p12[2], n_rows)

            self.mm.setFeedratePercentage(cs.FR_SEARCH_RAMP)
            for i in range(n_rows):
                if (i % 2 == 0):
                    self.mm.moveToPos(
                        Position(x_mesh_l[i], y_mesh_l[i], z_mesh_l[i]), True)
                    self.mm.moveToPos(
                        Position(x_mesh_c[i], y_mesh_c[i], z_mesh_c[i]), True)
                    self.mm.moveToPos(
                        Position(x_mesh_r[i], y_mesh_r[i], z_mesh_r[i]), True)
                    self.mm.waitForMovementFinished()
                else:
                    self.mm.moveToPos(
                        Position(x_mesh_r[i], y_mesh_r[i], z_mesh_r[i]), True)
                    self.mm.moveToPos(
                        Position(x_mesh_c[i], y_mesh_c[i], z_mesh_c[i]), True)
                    self.mm.moveToPos(
                        Position(x_mesh_l[i], y_mesh_l[i], z_mesh_l[i]), True)
                    self.mm.waitForMovementFinished()

        self.mm.setFeedratePercentage(cs.FR_DEFAULT)
        self.mm.moveToPos(cs.AFTER_PICKUP_POSITION, True)
        self.mm.waitForMovementFinished()

    def pickupDieFromPosition(self, pos):
        log.debug("die position: {}".format(pos))
        self.mm.setFeedratePercentage(cs.FR_DEFAULT)
        self.mm.moveToPos(cs.BEFORE_PICKUP_POSITION, True)
        self.mm.waitForMovementFinished()

        pickupPos = self.relativeBedCoordinatesToPosition(pos.x, pos.y)
        if pickupPos.y > cs.RAMP_CRITICAL_Y:
            pickupPos.z += cs.EXTRA_Z_FOR_PICKUP
        log.debug("pickupPos: {}".format(pickupPos))
        #move to pick-up position
        if pickupPos.y < cs.RAMP_CRITICAL_Y:
            self.mm.moveCloseToRamp(pickupPos, segmented=True)
        else:
            self.mm.moveToPos(pickupPos, True)
        self.mm.waitForMovementFinished()
        time.sleep(cs.WAIT_ON_PICKUP_POS)
        #move away from pick-up position
        if pickupPos.y < cs.RAMP_CRITICAL_Y:
            self.mm.moveCloseToRamp(cs.AFTER_PICKUP_POSITION,
                                    segmented=True,
                                    moveto=False)
        else:
            self.mm.moveToPos(cs.AFTER_PICKUP_POSITION, True)
        self.mm.waitForMovementFinished()

    def takePicture(self, cam=None):
        if cam is None:
            cam = Camera()
        log.info("turn on top LED")
        self.mm.setTopLed(cs.LED_TOP_BRIGHTNESS)
        image = cam.takePicture()
        self.dr.writeImage(image, "test.jpg", directory=cs.WEB_DIRECTORY)
        log.info("turn off top LED")
        self.mm.setTopLed(cs.LED_TOP_BRIGHTNESS_OFF)
        cam.close()
        return image

    '''take a picture and locate the die'''

    def findDie(self, cam=None):
        image = self.takePicture(cam)
        dieRollResult, processedImages = self.dr.getDieRollResult(
            image, returnOriginalImg=True)
        return dieRollResult, processedImages

    '''
    take a picture and locate the die while homing is performed
    INFO: homing and camera can not be done in concurrent threads because both operations
    need to access the SKR board (G28 for homing and M42 for top LED)
    '''

    def findDieWhileHoming(self):
        log.info("do homing mode 2")
        self.mm.doHoming(mode=2)
        time.sleep(cs.WAIT_BEFORE_TAKE_PICTURE_WHILE_HOMING)
        cam = Camera(doWarmup=True)
        log.info("prepare camera: {}".format(cam))
        log.info("take picture while homing...")
        image = self.takePicture(cam)
        #log.info("image {}".format(image))
        log.info("do homing mode 3")
        self.mm.doHoming(mode=3)
        dieRollResult, processedImages = self.dr.getDieRollResult(
            image, returnOriginalImg=True)
        log.info("result: {}".format(dieRollResult))
        return dieRollResult, processedImages

    def pickupDieWhileHoming(self):
        dieRollResult, processedImages = self.findDieWhileHoming()
        self.mm.waitForMovementFinished()
        self.mm.moveToPosAfterHoming(cs.CENTER_TOP, True)
        if dieRollResult.found:
            self.pickupDieFromPosition(dieRollResult.position)
        return dieRollResult

    def pickupDie_takeImage(self, cam=None):
        dieRollResult = DieRollResult()
        if cs.USE_IMAGE_RECOGNITION:
            dieRollResult, processedImages = self.findDie(cam)
            log.info("result: {}".format(dieRollResult.result))
            if cs.STORE_IMAGES:
                directory = "found" if dieRollResult.found else "fail"
                self.dr.writeImage(processedImages[1], directory=directory)
                self.dr.writeImage(processedImages[0],
                                   directory=cs.WEB_DIRECTORY,
                                   fileName='current_view.jpg')
                self.dr.writeRGBArray(processedImages[0], directory=directory)
        return dieRollResult

    def pickupDie_pickup(self, dieRollResult, onSendResult=None):
        if dieRollResult.found:
            log.info("dieRollResult: {}".format(dieRollResult))
            if cs.SHOW_DIE_RESULT_WITH_LEDS:
                lm = LedManager()
                lm.showResult(dieRollResult.result)
            if onSendResult is not None:
                onSendResult(dieRollResult)
            self.pickupDieFromPosition(dieRollResult.position)
        else:
            log.info('Die not found, now searching...')
            self.searchForDie()

    def pickupDie(self, onSendResult=None, cam=None):
        dieRollResult = self.pickupDie_takeImage(cam)
        self.pickupDie_pickup(dieRollResult, onSendResult)
        return dieRollResult

    def getDropoffAdvancePosition(self, pos, stage=1):
        if stage == 1:
            p = Position(pos[0], pos[1] + cs.DROPOFF_ADVANCE_OFFSET_Y,
                         pos[2] + cs.DROPOFF_ADVANCE_OFFSET_Z)
        elif stage == 2:
            p = Position(pos[0], pos[1] + cs.DROPOFF_ADVANCE_OFFSET_Y2,
                         pos[2] + cs.DROPOFF_ADVANCE_OFFSET_Z2)
        return p

    def moveToDropoffPosition(self,
                              dropoffPos,
                              speedupFactor1=1,
                              speedupFactor2=1):
        self.mm.setFeedratePercentage(cs.FR_DEFAULT)
        if not isinstance(dropoffPos, Position):
            dropoffPos = Position(dropoffPos[0], dropoffPos[1], dropoffPos[2])
        dropoffAdvancePos = self.getDropoffAdvancePosition(dropoffPos, stage=1)
        dropoffAdvancePos2 = self.getDropoffAdvancePosition(dropoffPos,
                                                            stage=2)
        self.mm.moveToPos(dropoffAdvancePos, True)
        self.mm.setFeedratePercentage(cs.FR_DROPOFF_ADVANCE * speedupFactor1)
        self.mm.moveToPos(dropoffAdvancePos2, True)
        self.mm.setFeedratePercentage(cs.FR_DROPOFF_ADVANCE_SLOW *
                                      speedupFactor2)
        self.mm.moveToPos(dropoffPos, True)
        self.mm.waitForMovementFinished()
        self.mm.setFeedratePercentage(cs.FR_DEFAULT)

    def getDropoffPosByPercent(self, percent, invert=False):
        dropoffPos = cs.MESH_MAGNET[3, :]
        percent = np.clip(percent, 0.0, 1.0)
        if invert:
            px = np.clip(1 - percent, 0.0, 1.0)
        else:
            px = percent
        if px < 0.5:
            if not cs.USE_MAGNET_BETWEEN_P0P1:
                px = 1 - px
        elif not cs.USE_MAGNET_BETWEEN_P2P3:
            px = 1 - px

        if cs.ALWAYS_USE_PX >= 0 and cs.ALWAYS_USE_PX <= 3:
            #log.info("use fixed magnet point")
            dropoffPos = cs.MESH_MAGNET[cs.ALWAYS_USE_PX, :]
        else:
            if px < 0.5:
                dropoffPos = 2 * px * cs.MESH_MAGNET[1, :] + (
                    1 - 2 * px) * cs.MESH_MAGNET[0, :]
            else:
                dropoffPos = 2 * (px - 0.5) * cs.MESH_MAGNET[3, :] + 2 * (
                    1 - px) * cs.MESH_MAGNET[2, :]
        return dropoffPos

    def getDropoffPosByXCoordinate(self, x, invert=False):
        percent = x / cs.LX
        return self.getDropoffPosByPercent(percent, invert)

    def run(self, lastPickupX, onSendResult=None):
        # move to dropoff position
        dropoffPos = self.getDropoffPosByPercent(lastPickupX, invert=True)

        self.moveToDropoffPosition(dropoffPos)

        #TODO: why is this not working?
        #cam = Camera(doWarmup=False)

        # roll die
        time.sleep(cs.WAIT_BEFORE_ROLL_TIME)
        self.mm.rollDie()
        time.sleep(cs.DIE_ROLL_TIME / 2.0)
        self.mm.setFeedratePercentage(cs.FR_DEFAULT)
        self.mm.moveToPos(cs.CENTER_TOP, True)
        time.sleep(cs.DIE_ROLL_TIME / 2.0)

    def doQuickRoll(self):
        dropoffPos = self.getDropoffPosByPercent(0.1, invert=True)
        self.moveToDropoffPosition(dropoffPos)
        time.sleep(cs.WAIT_BEFORE_ROLL_TIME)
        self.mm.rollDie()
        time.sleep(cs.WAIT_BEFORE_ROLL_TIME)
        self.mm.setFeedratePercentage(cs.FR_DEFAULT)
        self.mm.moveToPos(cs.CENTER_TOP, True)

    def rollDie(self, dropoffPos):
        self.moveToDropoffPosition(dropoffPos)

        time.sleep(cs.WAIT_BEFORE_ROLL_TIME)
        self.mm.rollDie()
        time.sleep(cs.DIE_ROLL_TIME / 2.0)
        self.mm.setFeedratePercentage(cs.FR_DEFAULT)
        self.mm.moveToPos(cs.CENTER_TOP, True)
        self.mm.waitForMovementFinished()

    def getValidUserPosition(self, pos):
        validPos = Position(clamp(pos.x, 0, cs.LX), clamp(pos.y, 160, cs.LY),
                            clamp(pos.z, 50, 220))
        return validPos

    def performUserAction(self, action, steps):
        if action != "NONE":
            log.info("perform action: {},{}".format(action, steps))
        posFrom = self.mm.currentPosition
        posTo = None
        try:
            steps = int(steps)
        except ValueError:
            steps = 0
        if action == "DOWN":
            log.info("move down")
            posTo = posFrom + Position(0, 0, int(steps))
        elif action == "UP":
            log.info("move up")
            posTo = posFrom + Position(0, 0, -int(steps))
        elif action == "LEFT":
            log.info("move left")
            posTo = posFrom + Position(int(steps), 0, 0)
        elif action == "RIGHT":
            log.info("move right")
            posTo = posFrom + Position(-int(steps), 0, 0)
        elif action == "FRONT":
            log.info("move front")
            posTo = posFrom + Position(0, int(steps), 0)
        elif action == "BACK":
            log.info("move back")
            posTo = posFrom + Position(0, -int(steps), 0)
        elif action == "ROLL":
            log.info("roll die")
            self.mm.moveToPos(cs.AFTER_PICKUP_POSITION, True)
            dropoffPosPercent = int(steps)
            dropoffPos = self.getDropoffPosByPercent(
                1.0 - (dropoffPosPercent / 100.0), invert=False)
            #dropoffPos = cs.MESH_MAGNET[2]
            self.rollDie(dropoffPos)
            dieRollResult, processedImages = self.findDie()
            if dieRollResult.found:
                log.info("dieRollResult: {}".format(dieRollResult))
                self.cm.sendDieRollResult(dieRollResult, userGenerated=True)
            else:
                log.info("die not found...")
        else:
            #log.warning("Action {} not known.".format(action))
            time.sleep(0.7 * cs.ASK_EVERY_NTH_SECOND_FOR_JOB_USERMODE)
        if posTo is not None:
            validPos = self.getValidUserPosition(posTo)
            self.mm.moveToPos(validPos, True)
            self.mm.waitForMovementFinished()

    def doTestPerformance(self, startTime):
        log.info("start performance")
        startTimestamp = datetime.timestamp(startTime)
        timings = np.cumsum([0, 2, 6.5, 3, 20, 2])
        timestamps = [t + startTimestamp for t in timings]
        log.info(timestamps)
        lm = LedManager()

        step = 0
        Utils.sleepUntilTimestampIndex(step, timestamps)
        for i in range(15):
            lm.setLeds(range(0, i * 5), 255, 255, 255)
            time.sleep(0.05)
            lm.clear()
            time.sleep(0.05)

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        for i in range(10):
            lm.setLeds(range(0, i * 5), i * 10, i * 3, i)
            time.sleep(0.5)

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        self.mm.moveToPos(cs.BEFORE_PICKUP_POSITION, True)

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        self.searchForDie()

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        self.mm.moveToPos(cs.BEFORE_PICKUP_POSITION, True)

    def doDieRollAndPickupPerformance(self, startTime):
        log.info("preparing for performance...")
        self.pickupDie()
        lm = LedManager()
        lm.clear()
        self.mm.setFeedratePercentage(cs.FR_SLOW_MOVE)
        #TODO: check if USE_MAGNET_BETWEEN_P0P1=True, otherwise use left side
        dropoffPos = cs.MESH_MAGNET[2]
        dropoffAdvancePos = Position(
            dropoffPos[0], dropoffPos[1] + cs.DROPOFF_ADVANCE_OFFSET_Y,
            dropoffPos[2] + cs.DROPOFF_ADVANCE_OFFSET_Z)
        self.mm.moveToPos(dropoffAdvancePos, True)
        fr_factor = 2
        fr_default_old = cs.FR_DEFAULT
        cs.FR_DEFAULT = cs.FR_DEFAULT * fr_factor
        log.info("in starting position...")
        log.info("waiting for performance to start...")
        startTimestamp = datetime.timestamp(startTime)
        timings = np.cumsum([
            0,
            0.25,  # turn on leds
            6.0,  # move to dropoff position
            2,  # roll die and mvoe to cs.CENTER_TOP
            0.9 + 4.2,  # take picture
            0.3,  # move to cs.BEFORE_PICKUP_POSITION
            5.1,  # find die on image
            4.9  # pickup die
        ])  # move to starting position (dropoff advance position)
        timestamps = [t + startTimestamp for t in timings]
        log.info(timestamps)

        step = 0
        Utils.sleepUntilTimestampIndex(step, timestamps)
        #cam = Camera(doWarmup=False)
        lm.setAllLeds()

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        self.moveToDropoffPosition(cs.MESH_MAGNET[2],
                                   speedupFactor1=1.5,
                                   speedupFactor2=1)
        #self.moveToDropoffPosition(cs.MESH_MAGNET[2], speedupFactor1=3, speedupFactor2=3)

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        self.mm.setFeedratePercentage(cs.FR_DEFAULT)
        self.mm.rollDie()
        time.sleep(0.4)
        self.mm.moveToPos(cs.CENTER_TOP, True)

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        #image = self.takePicture(cam)
        image = self.takePicture()

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        self.mm.moveToPos(cs.BEFORE_PICKUP_POSITION, True)

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        dieRollResult, _ = self.dr.getDieRollResult(image,
                                                    returnOriginalImg=True)

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        if dieRollResult.found:
            self.pickupDieFromPosition(dieRollResult.position)
        else:
            self.searchForDie()

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        self.mm.moveToPos(dropoffAdvancePos, True)
        lm.clear()

        cs.FR_DEFAULT = fr_default_old

    def doPositionTestWithTiming(self, startTime, clientIdentity, x, y, z):
        log.info("preparing for performance...")
        lm = LedManager()
        lm.clear()
        self.mm.setTopLed(cs.LED_TOP_BRIGHTNESS_OFF)
        log.info("waiting for performance to start...")
        startTimestamp = datetime.timestamp(startTime)
        timings = np.cumsum([
            clientIdentity["Position"] * 0.2,  # wait for position to be next
            27 * 0.2 + 1
        ])  # light up
        timestamps = [t + startTimestamp for t in timings]
        log.info(timestamps)

        step = 0
        Utils.sleepUntilTimestampIndex(step, timestamps)
        p = int(clientIdentity["Position"])
        f = x + y + z
        r = cs.LED_STRIP_DEFAULT_COLOR[0] + 10 * f
        g = cs.LED_STRIP_DEFAULT_COLOR[1] - 8 * f
        b = cs.LED_STRIP_DEFAULT_COLOR[2]
        lm.setAllLeds(r=r, g=g, b=b)

        step += 1
        Utils.sleepUntilTimestampIndex(step, timestamps)
        lm.clear()

    def doLightTest(self, startTime):
        log.info("preparing for performance...")
        lm = LedManager()
        lm.clear()
        self.mm.setTopLed(cs.LED_TOP_BRIGHTNESS_OFF)
        log.info("waiting for performance to start...")
        startTimestamp = datetime.timestamp(startTime)
        timings = np.cumsum([0])
        timestamps = [t + startTimestamp for t in timings]
        log.info(timestamps)

        step = 0
        Utils.sleepUntilTimestampIndex(step, timestamps)
        for r in range(0, 150, 10):
            for g in range(0, 150, 10):
                for b in range(0, 150, 10):
                    lm.setAllLeds(r=r, g=g, b=b)
                    log.info("r={}, g={}, b={}".format(r, g, b))
                    time.sleep(1)

    def doRollDie(self, startTime):
        log.info("preparing for performance...")
        log.info("waiting for performance to start...")
        startTimestamp = datetime.timestamp(startTime)
        timings = np.cumsum([0])
        timestamps = [t + startTimestamp for t in timings]
        log.info(timestamps)

        step = 0
        Utils.sleepUntilTimestampIndex(step, timestamps)
        dropoffPos = cs.MESH_MAGNET[2, :]
        self.moveToDropoffPosition(dropoffPos)

        # roll die
        time.sleep(cs.WAIT_BEFORE_ROLL_TIME)
        self.mm.rollDie()
        time.sleep(cs.DIE_ROLL_TIME / 2.0)
        self.mm.setFeedratePercentage(cs.FR_DEFAULT)
        self.mm.moveToPos(cs.CENTER_TOP, True)
        time.sleep(cs.DIE_ROLL_TIME / 2.0)
Esempio n. 11
0
######################################################################################################################

directory = tsl.DIRECTORY_TEST_IMAGES + r"\20200904\platanen\found\\"
file_extension = ".jpg"
path, start, end = directory + r"img ({}){}", 1, 9
#tags = [3,3,3,3,2,6]  #th [100, 105, 110, 115] [6, 6, 6, 6]
end, tags = 7, [0, 2, 1, 2, 2, 1, 1, 1]

######################################################################################################################

params_iterator = range(start, end + 1)

borderSize = 10
borderCol = (0, 0, 0)
dr = DieRecognizer()

nr_correct_array = []
#thresholds = [100,105,110,115]  #range(40,201,20)
thresholds = [108]

for threshold in thresholds:
    images = []
    results = []
    correct = 0
    j = 0

    for params in params_iterator:
        try:
            len(params)
        except: