From 6662dc687ec89395a70ae01796997ba0029819db Mon Sep 17 00:00:00 2001 From: mwinter Date: Sat, 4 Nov 2023 19:37:02 +0000 Subject: [PATCH] tweaking tracker for improved performance --- python/vernier_tracker.py | 27 +++++++++------- supercollider/installation_control.scd | 43 ++++++++++++++++++++------ 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/python/vernier_tracker.py b/python/vernier_tracker.py index 1d499f2..d18970d 100644 --- a/python/vernier_tracker.py +++ b/python/vernier_tracker.py @@ -22,7 +22,7 @@ def rectFromPoint(center, len, width, axis): return rect -def rectsFromPoint(center, l1, l2, l3, w, axis): +def rectsFromPoint(center, l1, l2, l3, w, cOffset, axis): centerFine = center fineInner = rectFromPoint(centerFine, l1, w, axis) if(axis == 'x'): @@ -36,25 +36,25 @@ def rectsFromPoint(center, l1, l2, l3, w, axis): centerCoarse = center if(axis == 'x'): - centerCoarse = (center[0], center[1] + w) + centerCoarse = (center[0], center[1] + cOffset) elif(axis == 'y'): - centerCoarse = (center[0] + w, center[1]) + centerCoarse = (center[0] + cOffset, center[1]) coarse = rectFromPoint(centerCoarse, l3, w, axis) return [fineInnerNeg, fineInnerPos, fineInner, fineOuter, coarse, center] def moveROI(event, x, y, flags, params): - global roiX, roiY, moving, l1, l2, l3, w, selectedAxis + global roiX, roiY, moving, l1, l2, l3, w, cOffset, selectedAxis if event == cv2.EVENT_LBUTTONDOWN: moving = True elif event==cv2.EVENT_MOUSEMOVE: if moving==True: if(selectedAxis == 'x'): - roiX = rectsFromPoint((x, y), l1, l2, l3, w, selectedAxis) + roiX = rectsFromPoint((x, y), l1, l2, l3, w, cOffset, selectedAxis) elif(selectedAxis == 'y'): - roiY = rectsFromPoint((x, y), l1, l2, l3, w, selectedAxis) + roiY = rectsFromPoint((x, y), l1, l2, l3, w, cOffset, selectedAxis) elif event == cv2.EVENT_LBUTTONUP: moving = False @@ -118,7 +118,7 @@ def drawRoi(frame, roi): cv2.line(frame, (center[0], center[1] - 5), (center[0], center[1] + 5), (0, 255, 0), 1) def picameraToCVTrack(): - global roiX, roiY, moving, l1, l2, l3, w, selectedAxis, dilationKernel, calibrate, oscClient + global roiX, roiY, moving, l1, l2, l3, w, selectedAxis, dilationVal, dilationKernel, calibrate, oscClient while True: frame = picam2.capture_buffer("lores") @@ -148,14 +148,18 @@ def picameraToCVTrack(): if key == ord('+'): dilationVal = dilationVal + 1 dilationKernel = genDKernel(dilationVal) + print(dilationVal) elif key == ord('-'): if dilationVal > 0: dilationVal = dilationVal - 1 dilationKernel = genDKernel(dilationVal) + print(dilationVal) elif key == ord('x'): selectedAxis = 'x' + print(selectedAxis) elif key == ord('y'): selectedAxis = 'y' + print(selectedAxis) elif key == ord('c'): if calibrate: calibrate = False @@ -220,12 +224,13 @@ moving = False l1 = 100 l2 = 300 l3 = 40 -w = 20 +w = 10 +cOffset = 23; roiXCenter = (384, 20) roiYCenter = (20, 384) -roiX = rectsFromPoint(roiXCenter, l1, l2, l3, w, 'x') -roiY = rectsFromPoint(roiYCenter, l1, l2, l3, w, 'y') -dilationVal = 75 +roiX = rectsFromPoint(roiXCenter, l1, l2, l3, w, cOffset, 'x') +roiY = rectsFromPoint(roiYCenter, l1, l2, l3, w, cOffset, 'y') +dilationVal = 70 dilationKernel = genDKernel(dilationVal) calibrate = True diff --git a/supercollider/installation_control.scd b/supercollider/installation_control.scd index 440a1ba..7ac4dbc 100644 --- a/supercollider/installation_control.scd +++ b/supercollider/installation_control.scd @@ -4,7 +4,7 @@ var imageDist, micronsPerStep, automation, imgPositions, curPos, tarPos, netAddress, serialPort, serialListener, moveTo, jogControl, jogHorizontal, jogVertical, -imgSelect, imgCalibrate, automate, lastSelect, trackerPos; +imgSelect, imgCalibrate, automate, lastSelect, trackerPos, trackerOffsetBaseDist, trackerOffset; // init global vars imageDist = 300; // in microns @@ -14,7 +14,23 @@ imgPositions = 9.collect({nil}); curPos = Point.new(0, 0); tarPos = Point.new(0, 0); netAddress = NetAddr.new("127.0.0.1", 8080); -lastSelect = 0; +lastSelect = -1; +trackerOffsetBaseDist = 16000; +trackerOffset = [ + [trackerOffsetBaseDist * 1, trackerOffsetBaseDist * 1], + [trackerOffsetBaseDist * 0, trackerOffsetBaseDist * 1], + [trackerOffsetBaseDist * -1, trackerOffsetBaseDist * 1], + + [trackerOffsetBaseDist * 1, trackerOffsetBaseDist * 0], + [trackerOffsetBaseDist * 0, trackerOffsetBaseDist * 0], + [trackerOffsetBaseDist * -1, trackerOffsetBaseDist * 0], + + [trackerOffsetBaseDist * 1, trackerOffsetBaseDist * -1], + [trackerOffsetBaseDist * 0, trackerOffsetBaseDist * -1], + [trackerOffsetBaseDist * -1, trackerOffsetBaseDist * -1] +]; + + ~serialPort = SerialPort("/dev/ttyACM0", baudrate: 115200, crtscts: true); // recieve motor feedback @@ -121,7 +137,7 @@ imgSelect = { lastSelect = imgIndex; }, { lastSelect.postln; - if(msg[1] == ((lastSelect + 1) * -1), {"here".postln; lastSelect = 0}) + if(msg[1] == ((lastSelect + 1) * -1), {"here".postln; lastSelect = -1}) //lastSelect = 0; /* imgIndex = msg[1].neg - 1; @@ -136,8 +152,17 @@ imgSelect = { imgCalibrate = { var calibrateHold, imgIndex, setPos; calibrateHold = Routine({ + var imageCalibrationIndex = 0; 20.do({0.1.wait}); - imgPositions[imgIndex] = setPos.deepCopy; + //imgPositions[imgIndex] = setPos.deepCopy; + [-1, 0, 1].do({arg row; + [-1, 0, 1].do({arg col; + imgPositions[imageCalibrationIndex] = setPos.deepCopy + Point.new(6550 * col, 6550 * row); + imgPositions[imageCalibrationIndex].postln; + imageCalibrationIndex = imageCalibrationIndex + 1; + }); + }); + imgPositions.postln; netAddress.sendMsg("/STATE/SET", "{message: \"image calibrated\"}"); }); @@ -167,17 +192,17 @@ automate = OSCFunc({arg msg; trackerPos = OSCFunc({arg msg; //imgPositions.postln[lastSelect.postln]; - if(lastSelect.postln > 0, { + if(lastSelect.postln > -1, { var distX, distY, isFocusing; distX = curPos.x - imgPositions[lastSelect].x; distY = curPos.y - imgPositions[lastSelect].y; isFocusing = false; - if((imgPositions[lastSelect] != nil) && (distX.abs < 500) && (msg[1].abs > 8000), { - tarPos.x = curPos.x + (10 * msg[1].sign);// * -1); + if((imgPositions[lastSelect] != nil) && (distX.abs < 300) && ((msg[1] - trackerOffset[lastSelect][0]).abs > 3000), { + tarPos.x = curPos.x + (10 * (msg[1] - trackerOffset[lastSelect][0]).sign);// * -1); isFocusing = true; }); - if((imgPositions[lastSelect] != nil) && (distY.abs < 500) && (msg[2].abs > 8000), { - tarPos.y = curPos.y + (10 * msg[2].sign);// * -1); + if((imgPositions[lastSelect] != nil) && (distY.abs < 300) && ((msg[2] - trackerOffset[lastSelect][1]).abs > 3000), { + tarPos.y = curPos.y + (10 * (msg[2] - trackerOffset[lastSelect][1]).sign);// * -1); isFocusing = true; }); if(isFocusing, {moveTo.value(tarPos)});