From 1709e91d0df509ea62c9dea596c3e94b5cf5c1fd Mon Sep 17 00:00:00 2001 From: gac-S_Changer Date: Fri, 10 Aug 2018 17:02:30 +0200 Subject: [PATCH] --- config/devices.properties | 10 ++++- devices/cx.properties | 17 +++++++++ devices/cz.properties | 17 +++++++++ devices/fx.properties | 17 +++++++++ devices/fy.properties | 17 +++++++++ devices/img.properties | 20 +++++----- devices/monitoring_cam.properties | 20 ++++++++++ devices/ry.properties | 17 +++++++++ devices/top_cam.properties | 20 ++++++++++ plugins/MXSC-1.10.0.jar | Bin 202223 -> 202653 bytes plugins/Recovery.java | 39 +++++++++++-------- script/devices/Gonio.py | 37 ++++++++++++++++++ script/devices/Hexiposi.py | 18 ++++++--- script/devices/Wago.py | 2 + script/imgproc/CameraCalibration.py | 16 +++++++- script/imgproc/CoverDetection.py | 25 ++++++++++-- script/imgproc/CoverDetectionCalibration.py | 40 ++++++++++++++++++++ script/local.py | 6 +-- script/motion/tools.py | 27 ++++++++++--- script/setup/ExposureScan.py | 16 +++++--- script/test/TestRemoveBackground.py | 31 +++++++++++++++ script/test/test_hexiposi.py | 8 ++++ script/test/test_swingutils.py | 24 ++++++++++++ 23 files changed, 392 insertions(+), 52 deletions(-) create mode 100644 devices/cx.properties create mode 100644 devices/cz.properties create mode 100644 devices/fx.properties create mode 100644 devices/fy.properties create mode 100644 devices/monitoring_cam.properties create mode 100644 devices/ry.properties create mode 100644 devices/top_cam.properties create mode 100644 script/devices/Gonio.py create mode 100644 script/imgproc/CoverDetectionCalibration.py create mode 100644 script/test/TestRemoveBackground.py create mode 100644 script/test/test_hexiposi.py create mode 100644 script/test/test_swingutils.py diff --git a/config/devices.properties b/config/devices.properties index 8a2c023..fe84e5a 100644 --- a/config/devices.properties +++ b/config/devices.properties @@ -1,5 +1,8 @@ img=ch.psi.pshell.prosilica.Prosilica|25001 "PacketSize=1522;PixelFormat=Mono8;BinningX=1;BinningY=1;RegionX=300;RegionY=200;Width=1000;Height=1000;MulticastEnable=Off"|||false gripper_cam=ch.psi.pshell.imaging.MjpegSource|http://axis-accc8e9cc87b.psi.ch/axis-cgi/mjpg/video.cgi?camera=1||-1| +monitoring_cam=ch.psi.pshell.imaging.MjpegSource|http://axis-accc8e9cc87b.psi.ch/axis-cgi/mjpg/video.cgi?camera=2||-1| +top_cam=ch.psi.pshell.imaging.MjpegSource|http://axis-accc8e9cc87b.psi.ch/axis-cgi/mjpg/video.cgi?camera=3||-1| +#cam=ch.psi.pshell.epics.AreaDetector|MX-SAMCAM||| microscan=ch.psi.pshell.serial.TcpDevice|MicroHAWK38C528:2001||| microscan_cmd=ch.psi.pshell.serial.TcpDevice|MicroHAWK38C528:2003||| ue=LaserUE|COM4|||false @@ -19,7 +22,6 @@ puck_detection=ch.psi.mxsc.PuckDetection|tell-raspberrypi:5556||| #robot_req=ch.psi.pshell.modbus.AnalogOutput|robot_modbus 13||| #robot_ack=ch.psi.pshell.modbus.AnalogInput|robot_modbus 14||| #robot_ret=ch.psi.pshell.modbus.AnalogInputArray|robot_modbus 15 12||| -#wago_back=ch.psi.pshell.modbus.ModbusTCP|SF-TEST-WAGO1:502||| wago=ch.psi.pshell.modbus.ModbusTCP|wago-mxsc-1:502||| led_ok_1=ch.psi.pshell.modbus.DigitalInput|wago 0||1000| led_ok_2=ch.psi.pshell.modbus.DigitalInput|wago 1||1000| @@ -70,5 +72,9 @@ led_ctrl_1=ch.psi.pshell.modbus.ProcessVariable|wago 0||| led_ctrl_2=ch.psi.pshell.modbus.ProcessVariable|wago 1||| led_ctrl_3=ch.psi.pshell.modbus.ProcessVariable|wago 2||| smc_current=ch.psi.pshell.modbus.ProcessVariable|wago 3||| -#cam=ch.psi.pshell.epics.AreaDetector|MX-SAMCAM||| #img_back=ch.psi.pshell.imaging.CameraSource|cam||-100| +#fx=ch.psi.pshell.epics.Motor|SAR-EXPMX:MOT_FX|||true +#fy=ch.psi.pshell.epics.Motor|SAR-EXPMX:MOT_FY|||true +#ry=ch.psi.pshell.epics.Motor|SAR-EXPMX:MOT_ROT_Y|||true +#cz=ch.psi.pshell.epics.Motor|SAR-EXPMX:MOT_CZ|||true +#cx=ch.psi.pshell.epics.Motor|SAR-EXPMX:MOT_CX|||true diff --git a/devices/cx.properties b/devices/cx.properties new file mode 100644 index 0000000..1720045 --- /dev/null +++ b/devices/cx.properties @@ -0,0 +1,17 @@ +#Fri Aug 10 15:47:53 CEST 2018 +defaultSpeed=2.0 +estbilizationDelay=0 +hasEnable=false +homingType=None +maxSpeed=NaN +maxValue=0.0 +minSpeed=NaN +minValue=0.0 +offset=0.0 +precision=3 +resolution=0.001 +rotation=false +scale=1.0 +sign_bit=0 +startRetries=1 +unit=mm diff --git a/devices/cz.properties b/devices/cz.properties new file mode 100644 index 0000000..b8877dd --- /dev/null +++ b/devices/cz.properties @@ -0,0 +1,17 @@ +#Fri Aug 10 15:47:15 CEST 2018 +defaultSpeed=2.0 +estbilizationDelay=0 +hasEnable=false +homingType=None +maxSpeed=NaN +maxValue=0.0 +minSpeed=NaN +minValue=0.0 +offset=0.0 +precision=3 +resolution=0.001 +rotation=false +scale=1.0 +sign_bit=0 +startRetries=1 +unit=mm diff --git a/devices/fx.properties b/devices/fx.properties new file mode 100644 index 0000000..44a1a35 --- /dev/null +++ b/devices/fx.properties @@ -0,0 +1,17 @@ +#Fri Aug 10 15:47:14 CEST 2018 +defaultSpeed=2.0 +estbilizationDelay=0 +hasEnable=false +homingType=None +maxSpeed=NaN +maxValue=0.0 +minSpeed=NaN +minValue=0.0 +offset=0.0 +precision=3 +resolution=0.001 +rotation=false +scale=1.0 +sign_bit=0 +startRetries=1 +unit=mm diff --git a/devices/fy.properties b/devices/fy.properties new file mode 100644 index 0000000..44a1a35 --- /dev/null +++ b/devices/fy.properties @@ -0,0 +1,17 @@ +#Fri Aug 10 15:47:14 CEST 2018 +defaultSpeed=2.0 +estbilizationDelay=0 +hasEnable=false +homingType=None +maxSpeed=NaN +maxValue=0.0 +minSpeed=NaN +minValue=0.0 +offset=0.0 +precision=3 +resolution=0.001 +rotation=false +scale=1.0 +sign_bit=0 +startRetries=1 +unit=mm diff --git a/devices/img.properties b/devices/img.properties index db77fa4..83e6c9c 100644 --- a/devices/img.properties +++ b/devices/img.properties @@ -1,4 +1,4 @@ -#Wed Aug 08 11:53:16 CEST 2018 +#Fri Aug 10 15:19:19 CEST 2018 colormap=Grayscale colormapAutomatic=false colormapMax=18.133 @@ -9,16 +9,16 @@ grayscale=false invert=false rescaleFactor=1.0 rescaleOffset=0.0 -roiHeight=-1 -roiWidth=-1 -roiX=0 -roiY=0 -rotation=0.0 +roiHeight=972 +roiWidth=972 +roiX=12 +roiY=15 +rotation=229.8340828443476 rotationCrop=true scale=1.0 -spatialCalOffsetX=NaN -spatialCalOffsetY=NaN -spatialCalScaleX=NaN -spatialCalScaleY=NaN +spatialCalOffsetX=-486.0 +spatialCalOffsetY=-486.0 +spatialCalScaleX=0.48315133165771174 +spatialCalScaleY=0.48314848201202937 spatialCalUnits=mm transpose=false diff --git a/devices/monitoring_cam.properties b/devices/monitoring_cam.properties new file mode 100644 index 0000000..fa56b35 --- /dev/null +++ b/devices/monitoring_cam.properties @@ -0,0 +1,20 @@ +#Thu Aug 09 11:01:09 CEST 2018 +flipHorizontally=false +flipVertically=false +grayscale=false +invert=false +rescaleFactor=1.0 +rescaleOffset=0.0 +roiHeight=-1 +roiWidth=-1 +roiX=0 +roiY=0 +rotation=0.0 +rotationCrop=false +scale=1.0 +spatialCalOffsetX=NaN +spatialCalOffsetY=NaN +spatialCalScaleX=NaN +spatialCalScaleY=NaN +spatialCalUnits=mm +transpose=false diff --git a/devices/ry.properties b/devices/ry.properties new file mode 100644 index 0000000..f43c3d2 --- /dev/null +++ b/devices/ry.properties @@ -0,0 +1,17 @@ +#Fri Aug 10 15:47:14 CEST 2018 +defaultSpeed=50.0 +estbilizationDelay=0 +hasEnable=false +homingType=None +maxSpeed=NaN +maxValue=0.0 +minSpeed=NaN +minValue=0.0 +offset=0.0 +precision=3 +resolution=0.001 +rotation=false +scale=1.0 +sign_bit=0 +startRetries=1 +unit=deg diff --git a/devices/top_cam.properties b/devices/top_cam.properties new file mode 100644 index 0000000..827552b --- /dev/null +++ b/devices/top_cam.properties @@ -0,0 +1,20 @@ +#Thu Aug 09 11:46:12 CEST 2018 +flipHorizontally=false +flipVertically=false +grayscale=false +invert=false +rescaleFactor=1.0 +rescaleOffset=0.0 +roiHeight=-1 +roiWidth=-1 +roiX=0 +roiY=0 +rotation=0.0 +rotationCrop=false +scale=1.0 +spatialCalOffsetX=NaN +spatialCalOffsetY=NaN +spatialCalScaleX=NaN +spatialCalScaleY=NaN +spatialCalUnits=mm +transpose=false diff --git a/plugins/MXSC-1.10.0.jar b/plugins/MXSC-1.10.0.jar index f3f63157b223f5582924fc24b95aada424497349..0fbc961e7040332f7fabe203a2dd5db5e07ee481 100644 GIT binary patch delta 36070 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" + segment.get(1) + " [" + segment.get(2) + "mm]"); - } catch (Exception ex) { - System.out.println(ex); + Device robot = getContext().getDevicePool().getByName("robot", Device.class); + if (!robot.getState().isNormal()){ ledValidSegment.setColor(Color.BLACK); - textSegment.setText(""); - } - try{ - String point = (String) eval("robot.get_current_point()", true); - ledKnownPosition.setColor((point == null) ? Color.RED : Color.GREEN); - textPosition.setText((point == null) ? "": point); - } catch (Exception ex) { - System.out.println(ex); + textSegment.setText(""); ledKnownPosition.setColor(Color.BLACK); textPosition.setText(""); - } + } else { + try{ + List segment = (List) eval("get_current_segment()", true); + ledValidSegment.setColor((segment == null) ? Color.RED : Color.GREEN); + textSegment.setText((segment == null) ? "": segment.get(0) + "->" + segment.get(1) + " [" + segment.get(2) + "mm]"); + } catch (Exception ex) { + System.out.println(ex); + ledValidSegment.setColor(Color.BLACK); + textSegment.setText(""); + } + try{ + String point = (String) eval("robot.get_current_point()", true); + ledKnownPosition.setColor((point == null) ? Color.RED : Color.GREEN); + textPosition.setText((point == null) ? "": point); + } catch (Exception ex) { + System.out.println(ex); + ledKnownPosition.setColor(Color.BLACK); + textPosition.setText(""); + } + } updateButton(); } diff --git a/script/devices/Gonio.py b/script/devices/Gonio.py new file mode 100644 index 0000000..cf006b2 --- /dev/null +++ b/script/devices/Gonio.py @@ -0,0 +1,37 @@ + + +def home_fast_table(): + caput ("SAR-EXPMX:ASYN.AOUT", "enable plc 1") + +def get_fx_pos(): + return caget("SAR-EXPMX:MOT_FX.RBV", 'f') + +def set_fx_pos(pos): + return caput("SAR-EXPMX:MOT_FX.VAL", float(pos)) + + +def get_fy_pos(): + return caget("SAR-EXPMX:MOT_FY.RBV", 'f') + +def set_fy_pos(pos): + return caput("SAR-EXPMX:MOT_FY.VAL", float(pos)) + +def get_ry_pos(): + return caget("SAR-EXPMX:MOT_ROT_Y.RBV", 'f') + +def set_ry_pos(pos): + return caput("SAR-EXPMX:MOT_ROT_Y.VAL", float(pos)) + +def get_cz_pos(): + return caget("SAR-EXPMX:MOT_CZ.RBV", 'f') + +def set_cz_pos(pos): + return caput("SAR-EXPMX:MOT_CZ.VAL", float(pos)) + +def get_cx_pos(): + return caget("SAR-EXPMX:MOT_CX.RBV", 'f') + +def set_cx_pos(pos): + return caput("SAR-EXPMX:MOT_CX.VAL", float(pos)) + + diff --git a/script/devices/Hexiposi.py b/script/devices/Hexiposi.py index 01f5a1e..c168204 100644 --- a/script/devices/Hexiposi.py +++ b/script/devices/Hexiposi.py @@ -95,10 +95,16 @@ class Hexiposi(DiscretePositionerBase): self.move_pos(self.val) #Workaround as state does not changes immediatelly if moving: - try: - self.waitState(State.Busy,1200) - except: - pass + #try: + # self.waitState(State.Busy,1200) + #except: + # print sys.exc_info()[1] + start = time.time() + while self.state != State.Busy: + if time.time() - start > 1.5: + print "Timeout waiting Hexiposi busy" + break + self.update() def is_in_position(self, pos): return take() == pos @@ -131,7 +137,7 @@ class Hexiposi(DiscretePositionerBase): dev = Hexiposi("hexiposi", "myriotell:8002/hexiposi") add_device(dev, True) -hexiposi.polling=500 +hexiposi.polling=1000 #print dev.url #print dev.get_status() @@ -144,4 +150,4 @@ class hexiposi_position(ReadonlyRegisterBase): add_device(hexiposi_position(), True) hexiposi_position.polling = 1000 - +hexiposi.set_deadband(0.5) diff --git a/script/devices/Wago.py b/script/devices/Wago.py index 9473b08..b57b4d1 100644 --- a/script/devices/Wago.py +++ b/script/devices/Wago.py @@ -112,6 +112,8 @@ def release_psys(): """ Release psys safety """ + if is_manual_mode(): + raise Exception ("Cannot release PSYS in manual mode") release_psys_safety.write(False) time.sleep(0.01) release_psys_safety.write(True) diff --git a/script/imgproc/CameraCalibration.py b/script/imgproc/CameraCalibration.py index 1be0af4..07b123c 100644 --- a/script/imgproc/CameraCalibration.py +++ b/script/imgproc/CameraCalibration.py @@ -2,6 +2,9 @@ import ch.psi.pshell.device.Camera as Camera import ch.psi.pshell.imaging.RendererMode as RendererMode import ch.psi.pshell.imaging.Calibration as Calibration from ch.psi.pshell.imaging.Overlays import * +import ch.psi.utils.swing.SwingUtils as SwingUtils +import javax.swing.SwingUtilities as SwingUtilities +from swingutils.threads.swing import callSwing #SIMULATION = ch.psi.pshell.imaging.FileSource """ img.camera.setColorMode(Camera.ColorMode.Mono) @@ -15,9 +18,10 @@ img.config.rotationCrop=True """ MOVE_HEXIPOSI = True +ROTATION_OFFSET = 180.0 if MOVE_HEXIPOSI: - enable_motion() + release_safety() #enable_motion() sensor_width,sensor_height = img.camera.getSensorSize() img.camera.setROI(0, 0,sensor_width, sensor_height) @@ -29,11 +33,17 @@ img.camera.start() p = show_panel(img) +dlg = SwingUtilities.getWindowAncestor(p) +dlg.setSize(800,800) +frm=SwingUtils.getFrame(p) +dlg.setLocationRelativeTo(frm) + p.setMode(RendererMode.Fit) ov_text = Text(Pen(java.awt.Color.GREEN.darker()), "", java.awt.Font("Verdana", java.awt.Font.PLAIN, 24), java.awt.Point(20,20)) ov_text.setFixed(True) p.addOverlay(ov_text) + try: #Find image center and Prosilica ROI ov_text.update("Click on the center of the Dewar...") @@ -130,10 +140,12 @@ try: print a, sx, sy, roi_w, roi_h - img.config.rotation=-a + img.config.rotation=-a + ROTATION_OFFSET img.config.roiX,img.config.roiY, img.config.roiWidth,img.config.roiHeight = roi_x, roi_y, roi_w, roi_h img.config.setCalibration(Calibration(sx, sy, -roi_w/2, -roi_h/2)) img.config.save() + + set_return ("Success calibrating the camera") finally: set_led_state(False) diff --git a/script/imgproc/CoverDetection.py b/script/imgproc/CoverDetection.py index 315911e..1398a07 100644 --- a/script/imgproc/CoverDetection.py +++ b/script/imgproc/CoverDetection.py @@ -6,11 +6,15 @@ FRAMES_INTEGRATION = 3 STEP_SIZE = 2 POSITION_NAMES = [ 'A','B','C','D', 'E', 'F'] -POSITION_ANGLES = [330, 30, 90, 150, 210, 270] + +#POSITION_ANGLES = [ 330, 30, 90, 150, 210, 270 ] +POSITION_ANGLES = [ 0, 60, 120, 180, 240, 300 ] POSITION_TOLERANCE = 3 -MINIMUM_CONFIDENCE = 10 +MINIMUM_CONFIDENCE = 3 DEBUG = cover_detection_debug -REFERENCE_IMG = "ref2" +#REFERENCE_IMG = "ref2" +REFERENCE_IMG = "ref1" +BORDER = 7 #Load reference image ref = load_image(str("{images}/cover/" + REFERENCE_IMG + ".png") , title="Line") @@ -23,9 +27,16 @@ smooth(ip) #bandpass_filter(ip, 30, 1000) edges(ip) auto_threshold(ip, method = "MaxEntropy") +#binary_erode(ip, False) +#binary_dilate(ip, True) +ip.getProcessor().erode(1, 255) cx,cy = int(ip.width/2), int(ip.height/2) ip = sub_image(ip, cx-ref.width/2, cy-ref.height/2, ref.width, ref.height) +if BORDER>0: + sip = sub_image(ip, BORDER,BORDER, ref.width-2*BORDER, ref.height-2*BORDER) + ip = pad_image(sip, BORDER, BORDER, BORDER, BORDER, fill_color=Color.WHITE) + #Show ROI of pre-processed image if DEBUG: image_panel = show_panel(ip.bufferedImage) @@ -49,6 +60,14 @@ for i in xdata: peaks = estimate_peak_indexes(ydata, xdata, (min(ydata) + max(ydata))/2, 25.0) peaks_x = map(lambda x:xdata[x], peaks) peaks_y = map(lambda x:ydata[x], peaks) +if len(peaks_x) > 1: + #remoce close peaks between 350 deg and 10 deg + if ((peaks_x[0]<10) and (peaks_x[1]>350)) or ((peaks_x[1]<10) and (peaks_x[0]>350)): + peaks.pop(1) + peaks_x.pop(1) + peaks_y.pop(1) + + confidence = None if len(peaks_x)<2 else int(((float(peaks_y[0])/peaks_y[1])-1) * 1000) angle = (None if len(peaks_x)==0 else peaks_x[0]) diff --git a/script/imgproc/CoverDetectionCalibration.py b/script/imgproc/CoverDetectionCalibration.py new file mode 100644 index 0000000..36f6a54 --- /dev/null +++ b/script/imgproc/CoverDetectionCalibration.py @@ -0,0 +1,40 @@ +#Parameters +FRAMES_INTEGRATION = 3 +MINIMUM_CONFIDENCE = 10 +DEBUG = cover_detection_debug +REFERENCE_IMG = "ref1" +ERODE_ITERATIONS = 2 + +#Load reference image +SIZE = [128,128] +BORDER = 7 + +hexiposi.move("A") +#Pre-process camera image +#ip = load_image("{images}/cover/Cover_000" + str(index) + ".png", title="Img") +ip = integrate_frames(FRAMES_INTEGRATION) +ip = grayscale(ip, True) +smooth(ip) +#bandpass_filter(ip, 30, 1000) +edges(ip) + +auto_threshold(ip, method = "MaxEntropy") +#binary_dilate(ip, True, 2) +for i in range(ERODE_ITERATIONS): + ip.getProcessor().erode(1, 255) + +cx,cy = int(ip.width/2), int(ip.height/2) +ip = sub_image(ip, cx-SIZE[0]/2, cy-SIZE[1]/2, SIZE[0], SIZE[1]) + +invert(ip) +ip = grayscale(ip, True) +#smooth(ip) + +if BORDER > 0: + sip = sub_image(ip, BORDER,BORDER, SIZE[0]-2*BORDER, SIZE[1]-2*BORDER) + ip = pad_image(sip, BORDER, BORDER, BORDER, BORDER) +if DEBUG: + image_panel = show_panel(ip.bufferedImage) + +save_image(ip, str("{images}/cover/" + REFERENCE_IMG + ".png") ,"png") + \ No newline at end of file diff --git a/script/local.py b/script/local.py index df1ab13..d0251f8 100644 --- a/script/local.py +++ b/script/local.py @@ -16,7 +16,7 @@ run("setup/Layout") ################################################################################################### for script in ["devices/RobotSC", "devices/Wago", "devices/BarcodeReader", "devices/LaserDistance", \ - "devices/LedCtrl", "devices/SmartMagnet", "devices/HexiPosi"]: + "devices/LedCtrl", "devices/SmartMagnet", "devices/HexiPosi", "devices/Gonio"]: try: run(script) except: @@ -71,7 +71,7 @@ def get_puck_img_detection(segment, puck): return str(Controller.getInstance().getPuck(str(segment).upper() + str(puck)).imageDetection) def assert_puck_detected(segment, puck): - if get_puck_detection(segment, puck) != "Present": + if get_puck_elect_detection(segment, puck) != "Present": raise Exception ("Puck " + str(segment).upper() + str(puck) + " not present") @@ -122,7 +122,7 @@ try: #img.camera.setDataType(Camera.DataType.UInt8) img.camera.setGrabMode(Camera.GrabMode.Continuous) img.camera.setTriggerMode(Camera.TriggerMode.Fixed_Rate) - img.camera.setExposure(50.00) + img.camera.setExposure(25.00) img.camera.setAcquirePeriod(200.00) img.camera.setGain(0.0) #img.camera.setROI(200, 0,1200,1200) diff --git a/script/motion/tools.py b/script/motion/tools.py index e2215c7..277924b 100644 --- a/script/motion/tools.py +++ b/script/motion/tools.py @@ -1,10 +1,21 @@ POSITION_TOLERANCE = 50 -def enable_motion(): + +def is_manual_mode(): """ - Check safety and enable arm power if in remote mode + return if operating in local mode. TODO: should be based on IO, not on robot flag. + """ + return robot.working_mode == "manual" + +def release_safety(): """ - auto = robot.working_mode != "manual" + Release sefety signals acording to working mode + """ + if air_pressure_ok.take() != True: + raise Exception("Cannot release safety: air preassure not ok") + if n2_pressure_ok.take() != True: + raise Exception("Cannot release safety: n2 pressure not ok") + auto = not is_manual_mode() if auto: if feedback_psys_safety.read() == False: release_psys() @@ -18,6 +29,12 @@ def enable_motion(): if feedback_local_safety.read() == False: raise Exception("Cannot enable power: check sample changer emergency stop button") +def enable_motion(): + """ + Check safety and enable arm power if in remote mode + """ + release_safety() + auto = not is_manual_mode() if auto: if not robot.state.isNormal(): raise Exception("Cannot enable power: robot state is " + str(robot.state)) @@ -31,7 +48,7 @@ def set_hexiposi(pos, force = False): if hexiposi.position == pos: return - if robot.working_mode == "manual": + if is_manual_mode(): set_status("Move Hexiposi to position " + str(pos) + " ...") try: hexiposi.waitInPosition(pos, -1) @@ -48,7 +65,7 @@ def _set_hexiposi(pos): def visual_check_hexiposi(segment): - #if robot.working_mode == "manual" ? + #if is_manual_mode(): ? if hexiposi.moved: #Clearing for image processing if not robot.is_park(): diff --git a/script/setup/ExposureScan.py b/script/setup/ExposureScan.py index dfec60b..7a1d438 100644 --- a/script/setup/ExposureScan.py +++ b/script/setup/ExposureScan.py @@ -12,18 +12,22 @@ class Contrast(Readable): def read(self): data = img.getData() #roi = Data(data.getRectSelection(500,300,700,600), False) - return data.getGradientVariance(False, Rectangle(480,0,600,670)) + #return data.getGradientVariance(False, Rectangle(480,0,600,670)) + return data.getGradientVariance(False, None) contrast=Contrast() #a= lscan(exposure,img.getContrast(), 0.5, 1.0, 0.01, 0.5) #a= lscan(exposure,contrast, 0.2, 0.4, 0.01, 0.7) -a= lscan(exposure,contrast, 10.0, 250.0, 10.0, 0.7) - -(n, m, s) = fit(a.getReadable(0), xdata=a.getPositions(0)) -if m is None: - m=max(a.getReadable(0)) +ret= lscan(exposure,contrast, 10.0, 150.0, 5.0, 0.5) +y, x = ret.getReadable(0), ret.getPositions(0) +#(n, m, s) = fit(a.getReadable(0), xdata=a.getPositions(0)) +#if m is None: +# m=max(a.getReadable(0)) +m=x[y.index(max(y))] +p=get_plots()[0] +p.addMarker(m, p.AxisId.X, str(m), Color.RED) print "Setting exposure = ", m exposure.write(m) diff --git a/script/test/TestRemoveBackground.py b/script/test/TestRemoveBackground.py new file mode 100644 index 0000000..7376f07 --- /dev/null +++ b/script/test/TestRemoveBackground.py @@ -0,0 +1,31 @@ +number_frames = 5 +number_backgrounds = 5 +minimum_size = 78 # r = 5 # 150 +maximum_size = 750 # r = 15 #1500 +min_circ = 0.2 + +threshold_method = "MaxEntropy" +threshold_method,threshold_range = "Manual", (0, 215) + +exclude_edges = True +led_latency = 0.5 #0.1 + +set_led_state(False) +time.sleep(led_latency) +img.waitNext(2000) + +background = average_frames(number_backgrounds) +#background = integrate_frames(number_backgrounds) + +set_led_state(True) +time.sleep(led_latency) +img.waitNext(2000) +image = average_frames(number_frames) +#image = integrate_frames(number_frames) + +set_led_state(False) + +op_image(image, background, "subtract", float_result=True, in_place=True) +image=grayscale(image) + +show_panel(image.getBufferedImage()) \ No newline at end of file diff --git a/script/test/test_hexiposi.py b/script/test/test_hexiposi.py new file mode 100644 index 0000000..324a480 --- /dev/null +++ b/script/test/test_hexiposi.py @@ -0,0 +1,8 @@ +index = 1 +while(True): + for pos in ['A', 'B', 'C', 'D', 'E', 'F']: + hexiposi.move(pos) + visual_check_hexiposi(pos) + print "Ok: " + pos + print index + index = index + 1 \ No newline at end of file diff --git a/script/test/test_swingutils.py b/script/test/test_swingutils.py new file mode 100644 index 0000000..65b354b --- /dev/null +++ b/script/test/test_swingutils.py @@ -0,0 +1,24 @@ +import ch.psi.pshell.imaging.RendererMode as RendererMode +import ch.psi.pshell.imaging.Calibration as Calibration +from ch.psi.pshell.imaging.Overlays import * +import ch.psi.utils.swing.SwingUtils as SwingUtils +import javax.swing.SwingUtilities as SwingUtilities +from swingutils.threads.swing import callSwing + + +p = show_panel(img) +dlg = SwingUtilities.getWindowAncestor(p) +dlg.setSize(800,800) +frm=SwingUtils.getFrame(p) +dlg.setLocationRelativeTo(frm) + +def update_frame(frm): + SwingUtilities.updateComponentTreeUI(frm) + frm.validate() + frm.repaint() +#$callSwing(update_frame, frm) + + +x=0 +for i in range(0,10000000): + x=x+1 \ No newline at end of file