From 3e4f97fff26e4d0bca4656601d8162f41e3519ff Mon Sep 17 00:00:00 2001 From: Reece Johnson Date: Sat, 6 Jan 2018 21:25:11 -0500 Subject: [PATCH 1/5] Update Triangular Kinematics Calibration This updates the triangular kinematics calibration routine. Rather than request the user to perform multiple cuts, a single cut is performed and then the machine parameters are iteratively found based on the measured parameters. --- .../Measure Test Shape Triangular.jpg | Bin 0 -> 97873 bytes .../Test Shape Preview Triangular.jpg | Bin 22950 -> 15265 bytes UIElements/measureMachinePopup.py | 2 +- UIElements/triangularCalibration.py | 234 +++++++++++------- groundcontrol.kv | 70 +++--- 5 files changed, 189 insertions(+), 117 deletions(-) create mode 100644 Documentation/Calibrate Machine Dimensions/Measure Test Shape Triangular.jpg diff --git a/Documentation/Calibrate Machine Dimensions/Measure Test Shape Triangular.jpg b/Documentation/Calibrate Machine Dimensions/Measure Test Shape Triangular.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b0af74f8124161db947e5518bb1a625433bf9ab3 GIT binary patch literal 97873 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 diff --git a/UIElements/measureMachinePopup.py b/UIElements/measureMachinePopup.py index 4d1d1de0..0a18a557 100644 --- a/UIElements/measureMachinePopup.py +++ b/UIElements/measureMachinePopup.py @@ -343,7 +343,7 @@ def setKinematicsType(self, kinematicsType, *args): try: #Get the value if it's already there... rotationRadius = self.data.config.get('Advanced Settings', 'rotationRadius') - print "Rotation radius is " + str(rotationRadius) + print "Current rotation radius is " + str(rotationRadius) except: #Set up a good initial guess for the radius print "Rotation radius set to 260" diff --git a/UIElements/triangularCalibration.py b/UIElements/triangularCalibration.py index ad9f42bf..44af1427 100755 --- a/UIElements/triangularCalibration.py +++ b/UIElements/triangularCalibration.py @@ -3,6 +3,7 @@ from UIElements.touchNumberInput import TouchNumberInput from kivy.uix.popup import Popup import global_variables +import math class TriangularCalibration(Widget): ''' @@ -14,8 +15,9 @@ class TriangularCalibration(Widget): numberOfTimesTestCutRun = -2 def cutTestPaternTriangular(self): - - #Credit for this test pattern to David Lang + + workspaceHeight = float(self.data.config.get('Maslow Settings', 'bedHeight')) + self.data.units = "MM" self.data.gcode_queue.put("G21 ") self.data.gcode_queue.put("G90 ") #Switch to absolute mode @@ -25,104 +27,162 @@ def cutTestPaternTriangular(self): self.data.gcode_queue.put("G0 X0 Y0 ") self.data.gcode_queue.put("G17 ") - #(defines the center). Moves up with each attempt - self.data.gcode_queue.put("G0 X0 Y" + str(self.testCutPosSlider.value) + " ") - - self.testCutPosSlider.value = self.testCutPosSlider.value + 18 #increment the starting spot - self.data.gcode_queue.put("G91 ") #Switch to relative mode - self.data.gcode_queue.put("G0 X-902.5 ") + self.data.gcode_queue.put("G0 Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace to first cut point self.data.gcode_queue.put("G1 Z-7 F500 ") - self.data.gcode_queue.put("G1 Y-20 ") self.data.gcode_queue.put("G1 Z7 ") - self.data.gcode_queue.put("G0 X1905 Y20 ") + self.data.gcode_queue.put("G0 Y-" + str(workspaceHeight/2) + " ") # Move down 50% the workspace to second cut point self.data.gcode_queue.put("G1 Z-7 ") - self.data.gcode_queue.put("G1 Y-20 ") - self.data.gcode_queue.put("G1 Z5 ") - if self.testCutPosSlider.value <= 0: - self.data.gcode_queue.put("G0 X-900 Y400 ") - else: - self.data.gcode_queue.put("G0 X-900 Y-400 ") - - - + self.data.gcode_queue.put("G1 Z7 ") + + self.data.gcode_queue.put("G0 Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace to home location + self.data.gcode_queue.put("G90 ") #Switch back to absolute mode - - self.numberOfTimesTestCutRun = self.numberOfTimesTestCutRun + 1 + self.cutBtnT.text = "Re-Cut Test\nPattern" - self.cutBtnT.disabled = True - self.enterValuesT.disabled = False - + self.vertMeasureT1.disabled = False + self.vertMeasureT2.disabled = False self.enterValuesT.disabled = False - - def enterTestPaternValuesTriangular(self, dist): + + def enterTestPaternValuesTriangular(self): ''' - - Takes the measured distance and uses it to determine a new distance to try - + + Takes the measured distance and uses it to iteratively calculate the rotationDiskRadius and yMotorOffset + ''' - if self.data.units == 'INCHES': - dist = dist*25.4 - - errorAmt = 1905 - dist #1905 is expected test spacing in mm. dist is greater than zero if the length is too long, less than zero if if is too short - - print "The error is: " - print errorAmt - - acceptableTolerance = .5 - maximumRealisticError = 300 - - if abs(errorAmt) > maximumRealisticError: - self.data.message_queue.put('Message: ' + str(dist) + 'mm is ' + str(errorAmt) + 'mm away from the target distance of 1905mm which seems wrong.\nPlease check the number and enter it again.') - elif abs(errorAmt) < acceptableTolerance: #if we're fully calibrated - self.carousel.load_slide(self.carousel.slides[11]) - else: - - amtToChange = -.9*errorAmt - - print "so we are going to adjust the motor spacing by: " - print amtToChange - - newSledSpacing = float(self.data.config.get('Advanced Settings', 'rotationRadius')) + amtToChange - - print "Now trying spacing: " + str(newSledSpacing) - self.data.config.set('Advanced Settings', 'rotationRadius', str(newSledSpacing)) - self.data.config.write() - self.cutBtnT.disabled = False - self.data.pushSettings() - - self.enterValuesT.disabled = True #disable the button so the same number cannot be entered twice - + + # Validate user inputs + + workspaceHeight = float(self.data.config.get('Maslow Settings', 'bedHeight')) + + try: + distBetweenCuts = float(self.vertMeasureT1.text) + except: + self.data.message_queue.put("Message: Please enter a number for the distance between cuts.") + return + + if ((distBetweenCuts > workspaceHeight) or (distBetweenCuts < (workspaceHeight / 10))): + self.data.message_queue.put('Message: The measurement between cuts of ' + str(distBetweenCuts) + 'mm seems wrong.\n\nPlease check the number and enter it again.') + return + + try: + distWorkareaTopToCut = float(self.vertMeasureT2.text) + except: + self.data.message_queue.put("Message: Please enter a number for the distance between the top of the work area and the top cut.") + return + + if ((distWorkareaTopToCut > (workspaceHeight / 2)) or (distWorkareaTopToCut < 0)): + self.data.message_queue.put('Message: The measurement between the top edge of the work area and the top cut of ' + str(distWorkareaTopToCut) + 'mm seems wrong.\n\nPlease check the number and enter it again.') + return + + try: + bitDiameter = float(self.bitDiameterT.text) + except: + self.data.message_queue.put("Message: Please enter a number for the bit diameter.") + return + + if ((bitDiameter > 25.4) or (bitDiameter <= 1)): + self.data.message_queue.put('Message: The bit diameter value of ' + str(bitDiameter) + 'mm seems wrong.\n\nPlease check the number and enter it again.') + return + + # Configure iteration parameters + + acceptableTolerance = .001 + numberOfIterations = 5000 + motorYcoordCorrectionScale = 0.5 + rotationRadiusCorrectionScale = 0.5 + + # Gather current machine parameters + + motorSpacing = float(self.data.config.get('Maslow Settings', 'motorSpacingX')) + motorXcoord = motorSpacing/2 + motorYoffsetEst = float(self.data.config.get('Maslow Settings', 'motorOffsetY')) + motorYcoordEst = (workspaceHeight/2) + motorYoffsetEst + rotationRadiusEst = float(self.data.config.get('Advanced Settings', 'rotationRadius')) + gearTeeth = float(self.data.config.get('Advanced Settings', 'gearTeeth')) + chainPitch = float(self.data.config.get('Advanced Settings', 'chainPitch')) + motorSprocketRadius = (gearTeeth*chainPitch)/(2*3.14159) + + # Calculate the actual chain lengths for each cut location + + MotorDistanceCut1 = math.sqrt(math.pow(motorXcoord,2)+math.pow(motorYcoordEst - (workspaceHeight/4),2)) + MotorDistanceCut2 = math.sqrt(math.pow(motorXcoord,2)+math.pow(motorYcoordEst + (workspaceHeight/4),2)) + + ChainLengthCut1 = (motorSprocketRadius * (3.14159 - math.acos(motorSprocketRadius / MotorDistanceCut1) - math.acos((motorYcoordEst - (workspaceHeight/4)) / MotorDistanceCut1))) + math.sqrt(math.pow(MotorDistanceCut1,2) - math.pow(motorSprocketRadius,2)) - rotationRadiusEst + ChainLengthCut2 = (motorSprocketRadius * (3.14159 - math.acos(motorSprocketRadius / MotorDistanceCut2) - math.acos((motorYcoordEst + (workspaceHeight/4)) / MotorDistanceCut2))) + math.sqrt(math.pow(MotorDistanceCut2,2) - math.pow(motorSprocketRadius,2)) - rotationRadiusEst + + # Set up the iterative algorithm + + motorYcoordEst = distWorkareaTopToCut + (bitDiameter / 2) + rotationRadiusEst = 0 + ChainErrorCut1 = acceptableTolerance + ChainErrorCut2 = acceptableTolerance + n = 0 + + print "Iterating for machine parameters" + + # Iterate until error tolerance is achieved or maximum number of iterations occurs + + while (((abs(ChainErrorCut1) >= acceptableTolerance ) or (abs(ChainErrorCut2) >= acceptableTolerance)) and (n < numberOfIterations)): + n += 1 + + # Calculate chain lengths for current estimated parameters + + MotorDistanceCut1Est = math.sqrt(math.pow(motorXcoord,2)+math.pow(motorYcoordEst,2)) + MotorDistanceCut2Est = math.sqrt(math.pow(motorXcoord,2)+math.pow(motorYcoordEst + distBetweenCuts,2)) + + ChainLengthCut1Est = (motorSprocketRadius * (3.14159 - math.acos(motorSprocketRadius / MotorDistanceCut1Est) - math.acos((motorYcoordEst) / MotorDistanceCut1Est))) + math.sqrt(math.pow(MotorDistanceCut1Est,2) - math.pow(motorSprocketRadius,2)) - rotationRadiusEst + ChainLengthCut2Est = (motorSprocketRadius * (3.14159 - math.acos(motorSprocketRadius / MotorDistanceCut2Est) - math.acos((motorYcoordEst + distBetweenCuts) / MotorDistanceCut2Est))) + math.sqrt(math.pow(MotorDistanceCut2Est,2) - math.pow(motorSprocketRadius,2)) - rotationRadiusEst + + # Determine chain length errors for current estimated machine parameters versus the measured parameters + + ChainErrorCut1 = ChainLengthCut1Est - ChainLengthCut1 + ChainErrorCut2 = ChainLengthCut2Est - ChainLengthCut2 + ChainErrorCutRatio = ChainErrorCut1 / ChainErrorCut2 + + # Establish a correction value + + Correction = (ChainErrorCut1 + ChainErrorCut2) / 2 + + # Develop a printable motor Y offset value to update the user + + motorYoffsetEstPrint = motorYcoordEst - distWorkareaTopToCut - (bitDiameter / 2) + + print "N: " + str(n) + ", Motor Spacing: " + str(round(motorSpacing, 3)) + ", Motor Y Offset: " + str(round(motorYoffsetEstPrint, 3)) + ", Rotation Disk Radius: " + str(round(rotationRadiusEst, 3)) + + # Update the machine parameters based on the current chain length errors + + if (ChainErrorCutRatio > 0): + motorYcoordEst -= Correction * motorYcoordCorrectionScale + else: + rotationRadiusEst -= Correction * rotationRadiusCorrectionScale + + if n == numberOfIterations: + self.data.message_queue.put('Message: The machine was not able to be calibrated. Please ensure the work area dimensions are correct and try again.') + self.enterValuesT.text = "Enter Values" + print "Machine parameters could not be determined" + return + + print "Machine parameters found" + + motorYoffsetEst = motorYcoordEst - distWorkareaTopToCut - (bitDiameter / 2) + + motorYoffsetEst = round(motorYoffsetEst, 1) + rotationRadiusEst = round(rotationRadiusEst, 1) + + # Update machine parameters + + self.data.config.set('Maslow Settings', 'motorOffsetY', str(motorYoffsetEst)) + self.data.config.set('Advanced Settings', 'rotationRadius', str(rotationRadiusEst)) + self.data.config.write() + self.data.pushSettings() + + self.carousel.load_slide(self.carousel.slides[11]) + def stopCut(self): self.data.quick_queue.put("!") with self.data.gcode_queue.mutex: self.data.gcode_queue.queue.clear() self.cutBtnT.disabled = False - - - def enterDist(self): - ''' - - Called when the "Enter Measurement" button is pressed - - ''' - self.popupContent = TouchNumberInput(done=self.dismiss_popup, data = self.data) - self._popup = Popup(title="Enter Measured Distance", content=self.popupContent, - size_hint=(0.9, 0.9)) - self._popup.open() - - def dismiss_popup(self): - ''' - - Close The Pop-up to enter distance information - - ''' - try: - numberEntered = float(self.popupContent.textInput.text) - self.enterTestPaternValuesTriangular(numberEntered) - except: - self.data.message_queue.put("Message: Unable to make that into a number") - pass #If what was entered cannot be converted to a number, leave the value the same - self._popup.dismiss() \ No newline at end of file diff --git a/groundcontrol.kv b/groundcontrol.kv index 5f0a0aca..3a39be53 100755 --- a/groundcontrol.kv +++ b/groundcontrol.kv @@ -608,8 +608,10 @@ on_release: root.stopZMove() : - testCutPosSlider:testCutPosSlider cutBtnT:cutBtnT + vertMeasureT1:vertMeasureT1 + vertMeasureT2:vertMeasureT2 + bitDiameterT:bitDiameterT enterValuesT:enterValuesT GridLayout: @@ -620,42 +622,52 @@ cols: 1 size_hint_x: leftCol Label: - text: "To refine these measurements we're going to cut a test shape.\nThe test shape consists of two short vertical cuts a known distance apart\nBased on the distance between these marks we can dial in the machine settings\n\nThe slider to the right of the buttons can be used to vertically adjust where the test cut is done\n\nThe size of bit used is not critical\nMeasure from the left side of one mark to the left side of the other mark\nThe target distance is 1905mm (75in)\nThe process will repeat until the spacing is accurate to within .5mm\nThe more accurate your measurements, the more accurate your machine will be\n\nPress Cut Test Pattern to begin" + text: "To refine these measurements we're going to cut a test shape.\nThe test shape consists of two cuts along the vertical centerline\nBased on the distance between these marks we can dial in the machine settings\n\nThe first measurement is between the cuts\nMeasure from the top edge of one cut to the top edge of the other cut\n\nThe second measurement is between the top of the work area and the top cut\nMeasure from the upper work area edge to the top edge of the top cut\n\nEnter the diameter of the bit used to make the cuts (1/4\" = 6.35 mm)\n\nThe more accurate your measurements, the more accurate your machine will be\n\nPress Cut Test Pattern to begin" GridLayout: cols: 2 Image: source: "./Documentation/Calibrate Machine Dimensions/Test Shape Preview Triangular.JPG" Image: - source: "./Documentation/Calibrate Machine Dimensions/Measure Test Shape Horizontal.jpg" + source: "./Documentation/Calibrate Machine Dimensions/Measure Test Shape Triangular.jpg" GridLayout: cols: 1 size_hint_x: rightCol - GridLayout: - cols: 2 - GridLayout: - cols: 1 - size_hint_x: .8 - Label: - Button: - text: "Enter Value" - on_release: root.enterDist() - id: enterValuesT - disabled: True - Button: - text: "Cut Test\nPattern" - id: cutBtnT - on_release: root.cutTestPaternTriangular() - Button: - text: "Stop\nCut" - on_release: root.stopCut() - Label: - Slider: - orientation: 'vertical' - min: -400 - max: 400 - value: -400 - id: testCutPosSlider - size_hint_x: .2 + Label: + Label: + text: "Measurement\nBetween Cuts (mm):" + halign: "center" + TextInput: + id: vertMeasureT1 + disabled: True + Label: + text: "Measurement\nWork Area Top to Top Cut (mm):" + halign: "center" + TextInput: + id: vertMeasureT2 + disabled: True + Label: + text: "Bit Diameter (mm):" + halign: "center" + TextInput: + id: bitDiameterT + disabled: False + text: "6.35" + Button: + text: "Enter Values" + halign: "center" + on_release: root.enterTestPaternValuesTriangular() + id: enterValuesT + disabled: True + Button: + text: "Cut Test\nPattern" + halign: "center" + id: cutBtnT + on_release: root.cutTestPaternTriangular() + Button: + text: "Stop\nCut" + halign: "center" + on_release: root.stopCut() + Label: : #Set sprockets to 12 o'clock From db9eb2ff75d3588f0b22cf0ba24f75e7b4561168 Mon Sep 17 00:00:00 2001 From: Reece Johnson Date: Sat, 6 Jan 2018 21:42:50 -0500 Subject: [PATCH 2/5] Require Recut Before Entering Values for Triangular Calibration This requires that a recut be performed before new values can be entered after a successful triangular calibration. --- UIElements/triangularCalibration.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UIElements/triangularCalibration.py b/UIElements/triangularCalibration.py index 44af1427..1147fc22 100755 --- a/UIElements/triangularCalibration.py +++ b/UIElements/triangularCalibration.py @@ -120,6 +120,10 @@ def enterTestPaternValuesTriangular(self): ChainErrorCut2 = acceptableTolerance n = 0 + self.vertMeasureT1.disabled = True + self.vertMeasureT2.disabled = True + self.enterValuesT.disabled = True + print "Iterating for machine parameters" # Iterate until error tolerance is achieved or maximum number of iterations occurs From 8ab2f233c1301ac6482298bfca9b733c0203504f Mon Sep 17 00:00:00 2001 From: Reece Johnson Date: Sun, 7 Jan 2018 02:59:19 -0500 Subject: [PATCH 3/5] Improvements to Triangular Calibration Configured the triangular kinematics algorithm to cut 5mm horizontal marks at each cut location, then move the sled out of the way for ease of measurement. Also allowed a 0mm bit size for pen use, and tweaked the algorithm for better stability. --- UIElements/triangularCalibration.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/UIElements/triangularCalibration.py b/UIElements/triangularCalibration.py index 1147fc22..9c8af330 100755 --- a/UIElements/triangularCalibration.py +++ b/UIElements/triangularCalibration.py @@ -17,6 +17,7 @@ class TriangularCalibration(Widget): def cutTestPaternTriangular(self): workspaceHeight = float(self.data.config.get('Maslow Settings', 'bedHeight')) + workspaceWidth = float(self.data.config.get('Maslow Settings', 'bedWidth')) self.data.units = "MM" self.data.gcode_queue.put("G21 ") @@ -29,14 +30,16 @@ def cutTestPaternTriangular(self): self.data.gcode_queue.put("G91 ") #Switch to relative mode - self.data.gcode_queue.put("G0 Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace to first cut point + self.data.gcode_queue.put("G0 X2.5 Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace to first cut point self.data.gcode_queue.put("G1 Z-7 F500 ") + self.data.gcode_queue.put("G1 X-5 ") # Cut 5mm horizontal mark self.data.gcode_queue.put("G1 Z7 ") self.data.gcode_queue.put("G0 Y-" + str(workspaceHeight/2) + " ") # Move down 50% the workspace to second cut point self.data.gcode_queue.put("G1 Z-7 ") + self.data.gcode_queue.put("G1 X5 ") # Cut 5mm horizontal mark self.data.gcode_queue.put("G1 Z7 ") - self.data.gcode_queue.put("G0 Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace to home location + self.data.gcode_queue.put("G0 X" + str((workspaceWidth/4)-2.5) + " Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace and to the side to allow measurement of the cuts self.data.gcode_queue.put("G90 ") #Switch back to absolute mode @@ -82,7 +85,7 @@ def enterTestPaternValuesTriangular(self): self.data.message_queue.put("Message: Please enter a number for the bit diameter.") return - if ((bitDiameter > 25.4) or (bitDiameter <= 1)): + if ((bitDiameter > 25.4) or (bitDiameter < 0)): self.data.message_queue.put('Message: The bit diameter value of ' + str(bitDiameter) + 'mm seems wrong.\n\nPlease check the number and enter it again.') return @@ -90,8 +93,8 @@ def enterTestPaternValuesTriangular(self): acceptableTolerance = .001 numberOfIterations = 5000 - motorYcoordCorrectionScale = 0.5 - rotationRadiusCorrectionScale = 0.5 + motorYcoordCorrectionScale = 0.25 + rotationRadiusCorrectionScale = 0.25 # Gather current machine parameters @@ -114,8 +117,8 @@ def enterTestPaternValuesTriangular(self): # Set up the iterative algorithm - motorYcoordEst = distWorkareaTopToCut + (bitDiameter / 2) - rotationRadiusEst = 0 + motorYcoordEst = distWorkareaTopToCut + (bitDiameter / 2) + (workspaceHeight / 4) + rotationRadiusEst = 100 ChainErrorCut1 = acceptableTolerance ChainErrorCut2 = acceptableTolerance n = 0 @@ -162,6 +165,15 @@ def enterTestPaternValuesTriangular(self): else: rotationRadiusEst -= Correction * rotationRadiusCorrectionScale + # If we get unrealistic values, reset and try again with smaller steps + + if (motorYcoordEst < -(workspaceHeight/4) or rotationRadiusEst < -100): + motorYcoordEst = distWorkareaTopToCut + (bitDiameter / 2) + (workspaceHeight / 4) + rotationRadiusEst = 100 + motorYcoordCorrectionScale = float(motorYcoordCorrectionScale/2) + rotationRadiusCorrectionScale = float(rotationRadiusCorrectionScale/2) + print "Estimated values out of range, trying again with smaller steps" + if n == numberOfIterations: self.data.message_queue.put('Message: The machine was not able to be calibrated. Please ensure the work area dimensions are correct and try again.') self.enterValuesT.text = "Enter Values" From dbedd981615e273eecefb0e98d8cdfc98c72ec15 Mon Sep 17 00:00:00 2001 From: Reece Johnson Date: Sun, 7 Jan 2018 12:36:04 -0500 Subject: [PATCH 4/5] Updated Triangular Kinematics Calibration Image This updates the triangular calibration test cut image to accurately portray the 5mm horizontal cuts and the sled moving out of the way after. --- .../Test Shape Preview Triangular.jpg | Bin 15265 -> 45413 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Documentation/Calibrate Machine Dimensions/Test Shape Preview Triangular.jpg b/Documentation/Calibrate Machine Dimensions/Test Shape Preview Triangular.jpg index 695bbbe2089f7d4adebd9b44de2d5b38c2598c85..94d119575139709776626a73b5074da93a8b68fa 100644 GIT binary patch literal 45413 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 delta 8327 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 LNZ7EQW=#AKV9)G* From 4b08af5ef8e5f6d621e1596580863426115921fe Mon Sep 17 00:00:00 2001 From: Reece Johnson Date: Tue, 9 Jan 2018 21:17:26 -0500 Subject: [PATCH 5/5] Triangular Calibration Improvements Various improvements to the triangular calibration algorithm per user feedback. Changes include support for imperial units, wider cut slots to facilitate tape measure usage, less sled movement to the side and return to home after completion, improved iteration algorithm, and minor other tweaks. --- UIElements/triangularCalibration.py | 102 ++++++++++++++++++---------- groundcontrol.kv | 15 ++-- 2 files changed, 78 insertions(+), 39 deletions(-) diff --git a/UIElements/triangularCalibration.py b/UIElements/triangularCalibration.py index 9c8af330..602a1334 100755 --- a/UIElements/triangularCalibration.py +++ b/UIElements/triangularCalibration.py @@ -30,16 +30,16 @@ def cutTestPaternTriangular(self): self.data.gcode_queue.put("G91 ") #Switch to relative mode - self.data.gcode_queue.put("G0 X2.5 Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace to first cut point + self.data.gcode_queue.put("G0 X12.7 Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace to first cut point self.data.gcode_queue.put("G1 Z-7 F500 ") - self.data.gcode_queue.put("G1 X-5 ") # Cut 5mm horizontal mark + self.data.gcode_queue.put("G1 X-25.4 ") # Cut 25.4mm horizontal mark self.data.gcode_queue.put("G1 Z7 ") self.data.gcode_queue.put("G0 Y-" + str(workspaceHeight/2) + " ") # Move down 50% the workspace to second cut point self.data.gcode_queue.put("G1 Z-7 ") - self.data.gcode_queue.put("G1 X5 ") # Cut 5mm horizontal mark + self.data.gcode_queue.put("G1 X25.4 ") # Cut 25.4mm horizontal mark self.data.gcode_queue.put("G1 Z7 ") - self.data.gcode_queue.put("G0 X" + str((workspaceWidth/4)-2.5) + " Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace and to the side to allow measurement of the cuts + self.data.gcode_queue.put("G0 X" + str((workspaceWidth/8)-12.7) + " Y" + str(workspaceHeight/4) + " ") # Move up 25% the workspace and to the side to allow measurement of the cuts self.data.gcode_queue.put("G90 ") #Switch back to absolute mode @@ -65,36 +65,48 @@ def enterTestPaternValuesTriangular(self): self.data.message_queue.put("Message: Please enter a number for the distance between cuts.") return - if ((distBetweenCuts > workspaceHeight) or (distBetweenCuts < (workspaceHeight / 10))): - self.data.message_queue.put('Message: The measurement between cuts of ' + str(distBetweenCuts) + 'mm seems wrong.\n\nPlease check the number and enter it again.') - return - try: distWorkareaTopToCut = float(self.vertMeasureT2.text) except: self.data.message_queue.put("Message: Please enter a number for the distance between the top of the work area and the top cut.") return - if ((distWorkareaTopToCut > (workspaceHeight / 2)) or (distWorkareaTopToCut < 0)): - self.data.message_queue.put('Message: The measurement between the top edge of the work area and the top cut of ' + str(distWorkareaTopToCut) + 'mm seems wrong.\n\nPlease check the number and enter it again.') - return - try: bitDiameter = float(self.bitDiameterT.text) except: self.data.message_queue.put("Message: Please enter a number for the bit diameter.") return - if ((bitDiameter > 25.4) or (bitDiameter < 0)): - self.data.message_queue.put('Message: The bit diameter value of ' + str(bitDiameter) + 'mm seems wrong.\n\nPlease check the number and enter it again.') - return + if self.unitsBtnT.text == 'Units: inches': + if (((distBetweenCuts*25.4) > workspaceHeight) or ((distBetweenCuts*25.4) < (workspaceHeight / 10))): + self.data.message_queue.put('Message: The measurement between cuts of ' + str(distBetweenCuts) + ' inches seems wrong.\n\nPlease check the number and enter it again.') + return + if (((distWorkareaTopToCut*25.4) > (workspaceHeight / 2)) or (distWorkareaTopToCut < 0)): + self.data.message_queue.put('Message: The measurement between the top edge of the work area and the top cut of ' + str(distWorkareaTopToCut) + ' inches seems wrong.\n\nPlease check the number and enter it again.') + return + if ((bitDiameter > 1) or (bitDiameter < 0)): + self.data.message_queue.put('Message: The bit diameter value of ' + str(bitDiameter) + ' inches seems wrong.\n\nPlease check the number and enter it again.') + return + distBetweenCuts *= 25.4 + distWorkareaTopToCut *= 25.4 + bitDiameter *= 25.4 + else: + if ((distBetweenCuts > workspaceHeight) or (distBetweenCuts < (workspaceHeight / 10))): + self.data.message_queue.put('Message: The measurement between cuts of ' + str(distBetweenCuts) + ' mm seems wrong.\n\nPlease check the number and enter it again.') + return + if ((distWorkareaTopToCut > (workspaceHeight / 2)) or (distWorkareaTopToCut < 0)): + self.data.message_queue.put('Message: The measurement between the top edge of the work area and the top cut of ' + str(distWorkareaTopToCut) + ' mm seems wrong.\n\nPlease check the number and enter it again.') + return + if ((bitDiameter > 25.4) or (bitDiameter < 0)): + self.data.message_queue.put('Message: The bit diameter value of ' + str(bitDiameter) + ' mm seems wrong.\n\nPlease check the number and enter it again.') + return # Configure iteration parameters acceptableTolerance = .001 numberOfIterations = 5000 - motorYcoordCorrectionScale = 0.25 - rotationRadiusCorrectionScale = 0.25 + motorYcoordCorrectionScale = 0.5 + rotationRadiusCorrectionScale = 0.5 # Gather current machine parameters @@ -117,8 +129,11 @@ def enterTestPaternValuesTriangular(self): # Set up the iterative algorithm - motorYcoordEst = distWorkareaTopToCut + (bitDiameter / 2) + (workspaceHeight / 4) - rotationRadiusEst = 100 + print "Previous machine parameters:" + print "Motor Spacing: " + str(motorSpacing) + ", Motor Y Offset: " + str(motorYoffsetEst) + ", Rotation Disk Radius: " + str(rotationRadiusEst) + + motorYcoordEst = distWorkareaTopToCut + (bitDiameter / 2) + rotationRadiusEst = 0 ChainErrorCut1 = acceptableTolerance ChainErrorCut2 = acceptableTolerance n = 0 @@ -127,7 +142,7 @@ def enterTestPaternValuesTriangular(self): self.vertMeasureT2.disabled = True self.enterValuesT.disabled = True - print "Iterating for machine parameters" + print "Iterating for new machine parameters" # Iterate until error tolerance is achieved or maximum number of iterations occurs @@ -146,47 +161,53 @@ def enterTestPaternValuesTriangular(self): ChainErrorCut1 = ChainLengthCut1Est - ChainLengthCut1 ChainErrorCut2 = ChainLengthCut2Est - ChainLengthCut2 - ChainErrorCutRatio = ChainErrorCut1 / ChainErrorCut2 - - # Establish a correction value - - Correction = (ChainErrorCut1 + ChainErrorCut2) / 2 # Develop a printable motor Y offset value to update the user motorYoffsetEstPrint = motorYcoordEst - distWorkareaTopToCut - (bitDiameter / 2) - print "N: " + str(n) + ", Motor Spacing: " + str(round(motorSpacing, 3)) + ", Motor Y Offset: " + str(round(motorYoffsetEstPrint, 3)) + ", Rotation Disk Radius: " + str(round(rotationRadiusEst, 3)) + print "N: " + str(n) + ", Motor Spacing: " + str(round(motorSpacing, 3)) + ", Motor Y Offset: " + str(round(motorYoffsetEstPrint, 3)) + ", Rotation Disk Radius: " + str(round(rotationRadiusEst, 3)) + ", Chain Error Cut 1: " + str(round(ChainErrorCut1,3)) + ", Chain Error Cut 2: " + str(round(ChainErrorCut2,3)) # Update the machine parameters based on the current chain length errors - if (ChainErrorCutRatio > 0): - motorYcoordEst -= Correction * motorYcoordCorrectionScale + if ((ChainErrorCut1 < 0 and ChainErrorCut2 < 0) or (ChainErrorCut1 > 0 and ChainErrorCut2 > 0)): + motorYcoordEst -= ((ChainErrorCut1 + ChainErrorCut2) / 2) * motorYcoordCorrectionScale else: - rotationRadiusEst -= Correction * rotationRadiusCorrectionScale + rotationRadiusEst += ((ChainErrorCut1 - ChainErrorCut2) / 2) * rotationRadiusCorrectionScale + if (rotationRadiusEst < 0): + rotationRadiusEst = 0 # If we get unrealistic values, reset and try again with smaller steps - if (motorYcoordEst < -(workspaceHeight/4) or rotationRadiusEst < -100): - motorYcoordEst = distWorkareaTopToCut + (bitDiameter / 2) + (workspaceHeight / 4) - rotationRadiusEst = 100 + if (motorYcoordEst < -(workspaceHeight/4) or motorYcoordEst > (2*workspaceHeight) or rotationRadiusEst > workspaceHeight): + motorYcoordEst = distWorkareaTopToCut + (bitDiameter / 2) + rotationRadiusEst = 0 motorYcoordCorrectionScale = float(motorYcoordCorrectionScale/2) rotationRadiusCorrectionScale = float(rotationRadiusCorrectionScale/2) print "Estimated values out of range, trying again with smaller steps" if n == numberOfIterations: self.data.message_queue.put('Message: The machine was not able to be calibrated. Please ensure the work area dimensions are correct and try again.') - self.enterValuesT.text = "Enter Values" print "Machine parameters could not be determined" + + # Return sled to workspace center + + self.data.gcode_queue.put("G21 ") + self.data.gcode_queue.put("G90 ") + self.data.gcode_queue.put("G40 ") + self.data.gcode_queue.put("G0 X0 Y0 ") + return - print "Machine parameters found" + print "Machine parameters found:" motorYoffsetEst = motorYcoordEst - distWorkareaTopToCut - (bitDiameter / 2) motorYoffsetEst = round(motorYoffsetEst, 1) rotationRadiusEst = round(rotationRadiusEst, 1) + print "Motor Spacing: " + str(motorSpacing) + ", Motor Y Offset: " + str(motorYoffsetEst) + ", Rotation Disk Radius: " + str(rotationRadiusEst) + # Update machine parameters self.data.config.set('Maslow Settings', 'motorOffsetY', str(motorYoffsetEst)) @@ -194,6 +215,13 @@ def enterTestPaternValuesTriangular(self): self.data.config.write() self.data.pushSettings() + # With new calibration parameters return sled to workspace center + + self.data.gcode_queue.put("G21 ") + self.data.gcode_queue.put("G90 ") + self.data.gcode_queue.put("G40 ") + self.data.gcode_queue.put("G0 X0 Y0 ") + self.carousel.load_slide(self.carousel.slides[11]) def stopCut(self): @@ -202,3 +230,9 @@ def stopCut(self): self.data.gcode_queue.queue.clear() self.cutBtnT.disabled = False + + def switchUnitsT(self): + if self.unitsBtnT.text == 'Units: mm': + self.unitsBtnT.text = 'Units: inches' + else: + self.unitsBtnT.text = 'Units: mm' diff --git a/groundcontrol.kv b/groundcontrol.kv index 3a39be53..b99037c2 100755 --- a/groundcontrol.kv +++ b/groundcontrol.kv @@ -613,7 +613,8 @@ vertMeasureT2:vertMeasureT2 bitDiameterT:bitDiameterT enterValuesT:enterValuesT - + unitsBtnT:unitsBtnT + GridLayout: cols: 2 width: root.width @@ -634,24 +635,28 @@ size_hint_x: rightCol Label: Label: - text: "Measurement\nBetween Cuts (mm):" + text: "Measurement\nBetween Cuts:" halign: "center" TextInput: id: vertMeasureT1 disabled: True Label: - text: "Measurement\nWork Area Top to Top Cut (mm):" + text: "Measurement\nWork Area Top to Top Cut:" halign: "center" TextInput: id: vertMeasureT2 disabled: True Label: - text: "Bit Diameter (mm):" + text: "Bit Diameter:" halign: "center" TextInput: id: bitDiameterT disabled: False - text: "6.35" + Button: + text: "Units: mm" + on_release: root.switchUnitsT() + id: unitsBtnT + disabled: False Button: text: "Enter Values" halign: "center"