diff --git a/.gitignore b/.gitignore index 24b1dd27379b455c404f6738e9b449bf036b5aae..e2d6ced430bdae0757c8dc105266bd647ff9d432 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ cam/ **/ASF/ bom/* -cad/archive/* \ No newline at end of file +cad/archive/* +*.ipynb_checkpoints \ No newline at end of file diff --git a/data/2022-02-07_hysteresis.ipynb b/data/2022-02-07_hysteresis.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..7111dfd1dc6ec67d81bb863c7475013046fb407b --- /dev/null +++ b/data/2022-02-07_hysteresis.ipynb @@ -0,0 +1,216 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import math \n", + "import matplotlib.pyplot as plt\n", + "import statistics " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# these are hysteretic jogs, so I am just jogging back-and-forth by 5mm on each count... \n", + "# so we will see the effects of coming-back from some other direction \n", + "\n", + "x = [ 4.999, 0.071, -4.901, 0.022, 5.000, 0.073, -4.9, 0.022, 5.001, 0.072, -4.895, 0.024, 5.001, 0.073, -4.9, 0.023,\n", + " 5.002, 0.072, -4.899, 0.023, 5.000, 0.072, -4.900, 0.023, 4.999, 0.071, -4.901, 0.021, 4.999, 0.070 ]\n", + "\n", + "y = [ 4.937, -0.002, -5.024, -0.031, 4.936, 0.000, -5.025, -0.032,\n", + " 4.934, -0.001, -5.023, -0.033, 4.932, -0.002, -5.023, -0.041, 4.932, -0.003, -5.023, -0.036, 4.933, 0.000, -5.025, \n", + " -0.034, 4.930, -0.003, -5.023, -0.036 ]\n", + "\n", + "z = [ 4.89, 0, -5.022, -0.084, 4.880, -0.006, -5.024, -0.089, 4.874, -0.013, -5.026, -0.093, 4.871, -0.014, \n", + " -5.027, -0.097, 4.866, -0.020, -5.030, -0.100, 4.858, -0.026, -5.028, -0.103, 4.855, -0.030, -5.030, -0.104, 4.852,\n", + " -0.033, -5.038, -0.105, 4.851, -0.035, -5.039, -0.106, 4.849, -0.039, -5.040, -0.109, 4.846, -0.041, -5.043, -0.111 ]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "ax = y" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[<matplotlib.lines.Line2D at 0x2073e3beac8>]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# might just want to plot these all simple like;\n", + "plt.plot(ax, 'bo')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# really we want to see those mid points, so \n", + "def midpick(series):\n", + " mpnts = []\n", + " cntr = 0\n", + " for i in range(len(series)):\n", + " cntr += 1 \n", + " if(cntr >= 2):\n", + " cntr = 0\n", + " mpnts.append(series[i])\n", + " return mpnts \n", + "\n", + "def toppick(series):\n", + " tpnts = []\n", + " cntr = 3\n", + " for i in range(len(series)):\n", + " cntr += 1\n", + " if(cntr >= 4):\n", + " cntr = 0 \n", + " tpnts.append(series[i])\n", + " return tpnts \n", + "\n", + "def botpick(series):\n", + " bpnts = []\n", + " cntr = 1\n", + " for i in range(len(series)):\n", + " cntr += 1 \n", + " if(cntr >= 4):\n", + " cntr = 0 \n", + " bpnts.append(series[i])\n", + " return bpnts " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "mid = midpick(ax)\n", + "top = toppick(ax)\n", + "bot = botpick(ax)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "mid pts stdev 0.0174 (0.0007)\n", + "top pts stdev 0.0024 (0.0001)\n", + "bottom pts stdev 0.0010 (0.0000)\n" + ] + } + ], + "source": [ + "print('mid pts stdev ' + '{:.4f}'.format(statistics.stdev(mid)) + ' ({:.4f}'.format(statistics.stdev(mid)/ 25.4) + ')')\n", + "print('top pts stdev ' + '{:.4f}'.format(statistics.stdev(top)) + ' ({:.4f}'.format(statistics.stdev(top)/ 25.4) + ')')\n", + "print('bottom pts stdev ' + '{:.4f}'.format(statistics.stdev(bot)) + ' ({:.4f}'.format(statistics.stdev(bot)/ 25.4) + ')')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 1224x648 with 3 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.rcParams[\"figure.figsize\"] = (17, 9)\n", + "fig, (ax1, ax2, ax3) = plt.subplots(1, 3)\n", + "fig.suptitle('Hysteresis on Y Axis')\n", + "ax1.plot(top, 'or')\n", + "ax1.set_ylim([4.9, 5.1])\n", + "ax1.title.set_text('upper tap')\n", + "ax2.plot(mid, 'or')\n", + "ax2.set_ylim([-0.1, 0.1])\n", + "ax2.title.set_text('hysteretic gap')\n", + "ax3.plot(bot, 'or')\n", + "ax3.set_ylim([-5.1, -4.9])\n", + "ax3.title.set_text('lower tap')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/data/2022-02-07_toolchanger-deviations.ipynb b/data/2022-02-07_toolchanger-deviations.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..1fa244f5f190f1e8da7cafbcb42f7f54dd3b57bc --- /dev/null +++ b/data/2022-02-07_toolchanger-deviations.ipynb @@ -0,0 +1,157 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "import math \n", + "import matplotlib.pyplot as plt\n", + "import statistics " + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "# touch-off pts for toolchanger pick-up put-down: tc dropped and reclaimed between each measurement \n", + "# there should be a video in the log w/ this data \n", + "\n", + "x = [ 5.501, 5.496, 5.481, 5.475, 5.474, 5.476 ]\n", + "y = [ 3.750, 3.744, 3.743, 3.742, 3.742, 3.741 ]\n", + "z = [ 4.528, 4.535, 4.539, 4.539, 4.540, 4.540 ]" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "def avg(series):\n", + " sum = 0 \n", + " for i in range(len(series)):\n", + " sum += series[i]\n", + " return sum / len(series)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "def deviations(series):\n", + " basis = avg(series)\n", + " for i in range(len(series)):\n", + " mm = basis - series[i] \n", + " inch = mm / 25.4 \n", + " print('{:.4f}'.format(mm) + ' ' + '({:.4f}'.format(inch) + \")\")" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.0172 (-0.0007)\n", + "-0.0122 (-0.0005)\n", + "0.0028 (0.0001)\n", + "0.0088 (0.0003)\n", + "0.0098 (0.0004)\n", + "0.0078 (0.0003)\n" + ] + } + ], + "source": [ + "deviations(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "def avgdev(series):\n", + " center = avg(series)\n", + " sum = 0\n", + " for i in range(len(series)):\n", + " sum += center - series[i]\n", + " avgd = sum / len(series)\n", + " return avgd" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-1.480e-16 (-5.828e-18)\n" + ] + } + ], + "source": [ + "avgd = avgdev(z)\n", + "print('{:.3e}'.format(avgd) + ' ' + '({:.3e}'.format(avgd/25.4) + ')')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0047 (0.0002)\n" + ] + } + ], + "source": [ + "std = statistics.stdev(z)\n", + "print('{:.4f}'.format(std) + ' ' + '({:.4f}'.format(std/25.4) + ')')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/data/2022-02-07_x-hysteresis.png b/data/2022-02-07_x-hysteresis.png new file mode 100644 index 0000000000000000000000000000000000000000..c70292f3a949f36ccbbe0e0a0d6201f6ce3c330e Binary files /dev/null and b/data/2022-02-07_x-hysteresis.png differ diff --git a/data/2022-02-07_y-hysteresis.png b/data/2022-02-07_y-hysteresis.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec8b943d5b354fb51652d17fdc1d53ceb984fce Binary files /dev/null and b/data/2022-02-07_y-hysteresis.png differ diff --git a/data/2022-02-07_z-hysteresis.png b/data/2022-02-07_z-hysteresis.png new file mode 100644 index 0000000000000000000000000000000000000000..88b9b842484041fdca099c058f5d171747c0de2e Binary files /dev/null and b/data/2022-02-07_z-hysteresis.png differ diff --git a/log/clank-stretch-log.md b/log/clank-stretch-log.md index 69519fdbefb56bd452f94756595e5b96ababfc70..604b2246ff317e82c405a1c594c21f14d7af849f 100644 --- a/log/clank-stretch-log.md +++ b/log/clank-stretch-log.md @@ -561,9 +561,65 @@ This is way too heavy, I am going to setup a situation where the basics are in p Sweet lorde, it's like all day, but it's done now. Certainly haven't found any secret for hardware publishing... I'm rebooting fusion and I'll try a test BOM, then populate hardware / etc? Finish writing the site, push repos & bedone with it? ---- +## 2022 02 07 -assembly completion: +### Toolchanger Perf -- second pencil -- psu-board addition, controller reconfig \ No newline at end of file +I had a chance to performance test this yesterday, hotplate included. I'm going to note-take from video streams here, then post results on the webby. Here's the raw stuff: + +| hotplate touchoff | x data | x deviations, mm (inch) | y data | y deviations, mm (inch) | z data | z deviations, mm (inch) | +| --- | --- | --- | --- | --- | --- | --- | +| 1 | 5.501 | -0.0172 (-0.0007) | 3.750 | -0.0063 (-0.0002) | 4.528 | 0.0088 (0.0003) | +| 2 | 5.496 | -0.0122 (-0.0005) | 3.744 | -0.0003 (-0.0000) | 4.535 | 0.0018 (0.0001) | +| 3 | 5.481 | 0.0028 (0.0001) | 3.743 | 0.0007 (0.0000) | 4.539 | -0.0022 (-0.0001) | +| 4 | 5.475 | 0.0088 (0.0003) | 3.742 | 0.0017 (0.0001) | 4.539 | -0.0022 (-0.0001) | +| 5 | 5.474 | 0.0098 (0.0004) | 3.742 | 0.0017 (0.0001) | 4.540 | -0.0032 (-0.0001) | +| 6 | 5.476 | 0.0078 (0.0003) | 3.741 | 0.0027 (0.0001) | 4.540 | -0.0032 (-0.0001) | + +Then something a little easier to read: + +| axis | standard deviation after pickup, mm (inch) | average from center, mm (inch) | +| --- | --- | --- | +| x | 0.0047 (0.0002) | 5.921e-16 (2.331e-17) | +| y | 0.0033 (0.0001) | -2.220e-16 (-8.742e-18) | +| z | 0.0047 (0.0002) | -1.480e-16 (-5.828e-18) | + +These are all astoundingly good. Kinematics coming in hot. Standard deviation tells us how far off of zero the thing will be after each pickup, then average deviation could tell us if it's relatively well centered. Here's how I calculated that: + +```python +def avgdev(series): + center = avg(series) + sum = 0 + for i in range(len(series)): + sum += center - series[i] + avgd = sum / len(series) + print(avgd) +``` + +So, we can expect about 5 microns of error after each toolchange. That these errors are well centered (across only 6 samples anyways) is not terribly exciting / relevant. + +### Motion System Perf + +Next I just hysteresis-checked the thing... I should include the video here, and maybe make some plots on each axis. + +Alright this test is surprisingly revealing, and I'm also seeing some alarming drift in the z axis. + +I just want to write a quick way to display all of this data... I think I'm just going to plot things out and then discuss / pick round numbers from the plots. + +Alright I'm just collecting plots for these; + + + + + +These all look ~ similar enough, though Z is notably worse. Here's what I reckon: + +| axis | hysteresis mm (inch) | +| --- | --- | +| x | 0.050 (0.0020) | +| y | 0.035 (0.0014) | +| z | 0.075 (0.0030) | + +These are a lot worse than the repeatability tests, which registered about one whole order of magnitude less error, including the toolchanger swapping. I will write these up on the site and look forward to hooking the controllers up to closed loop, seeing if any of this can be reclaimed. + + \ No newline at end of file diff --git a/log/videos/2022-02-03-clank-perf.mp4 b/log/videos/2022-02-03-clank-perf.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a49f79196a332ba2e951c9b7a7f47cb794667e69 Binary files /dev/null and b/log/videos/2022-02-03-clank-perf.mp4 differ