diff --git a/UrumbotXY-Fall2022/.gitkeep b/UrumbotXY-Fall2022/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/UrumbotXY-Fall2022/README.md b/UrumbotXY-Fall2022/README.md new file mode 100644 index 0000000000000000000000000000000000000000..617305c4a1bae7e8e3b927b5997530196b9a32eb --- /dev/null +++ b/UrumbotXY-Fall2022/README.md @@ -0,0 +1,116 @@ +# UrumbotXY Fall 2022 + +This project is a [corexy](https://corexy.com/theory.html) 2D motion system using serialstep. Modified from original files in UrumbotXY. + +<img src=img/corexy_pen.jpg width=100%><br> + +## CoreXY + +For a simple coreXY motion system, here is the list of parts you need to make: + +<img src=img/doc/corexy_kit.png width=100%><br> + +It is advised to 3D print `capstan_motor` and `capstan_pulley`, while all other parts can be machined or laser cut. 3D models files are available under [./files/3d](./files/3d), and dxf files under [./files/2d](./files/2d). + +For assembly, you will also need: + +- 2x NEMA 17 motors +- 9x bearings +- 8x V bearings +- 4x small bearings +- M5 screws (structure and bearings) +- M5 nuts and washers +- M3 screws (string tensioners) +- M3 nuts and washers + +Complete Bill of Materials (BOM) [here](https://docs.google.com/spreadsheets/d/12hboCFKMO40W-K4HecSFnBYBTcj8XZnGsIHQOlsHlmI/edit?usp=sharing) + +Here is the main frame after assembly: + +<img src=img/corexy.jpg width=100%><br> + +Note how the string is inserted on the capstans. The string can be attached to temporary anchor points to provide enough tension during this step. Inside `capstan_pulley`, you should insert a small bearing at the top and bottom. Use appropriate washers to have the correct height; there are 4 levels on `capstan_pulley`, and they should be aligned between each levels of `capstan_motor`. + +<img src=img/capstan.jpg width=100%><br> + + +Here is a video of the motion at constant speed: + +<img src=video/corexy_linear.mp4 width=100%><br> + + +## Pen plotter + +Pen: + +<img src=img/corexy_pen.jpg width=100%><br> + +Drawing: + +<img src=video/corexy_spiral.mp4 width=100%><br> + +## Circuitboard Milling + +Dec. 17-19, 2021. Set up CoreXY for milling, using a linear axis for z-travel and a spare Roland MDX-20 spindle. Keep the original python code, removing the homing step and changing speed to 5 mm/s. + +Run a text file for xy motion. Start, -10.0,-10.0:-10.8,-10.0: -0.8,0.0: 0.0,0.0. + +Axis setup: + +<img src=img/milling_axes_setup.jpg width=50%><br> + +As constructed, end effector responded to sideways force with ~20N/mm. This led to about 0.5 mm oscillation while milling - not stiff enough. Added a clamp to stiffen, which allowed milling of traces. Adjustment of z-axis for milling was accomplished by manual adjustment of bit in collet. Z-axis motor was energized in order to constrain z-motion. Good enough to demonstrate. + +<img src=img/milling_axes_clamp.jpg width=50%><br> + +Movie: + +<img src=video/milling_movie.mp4 width=100%><br> + +Closeup of traces: Using 1/64" bit and 0.8 mm horizontal separation of paths, at a 45 degree angle, the calculated trace width is 0.3 mm. Looks pretty close to this. + +<img src=img/traces.jpg width=50%><br> + +This machine is close to being able to mill circuitboards. For the first try, the stiffness of the end effector wrt sideways force seems to be the limiting factor, rather than the xy stiffness. Next step: a better arrangement of z-stage and full incorporation of the z-motion into the software. + +### Small-excursion z-axis design: + +A cam translates the spindle by flexing the beam a few mm. Total excursion at the spindle is about +/- 2 mm. + +<img src=img/fixed_z.jpg width=50%><br> +<img src=img/z-cam.jpg width=50%><br> + + +#### Metrology - components and assembled parts. + +Initial results and setups are <a href="https://gitlab.cba.mit.edu/classes/865.21/projects/machinemetrology">here, temporarily.</a> + +Fishing line: 3.3 kN + +Seven-strand stainless: 11 kN + +#### Jan 14, 2022 + +Using the limited z-excursion setup above, tested g-code parsing python code and ran PCB milling linetest. Results below are comparable to Roland SRM20 using the same endmill. Cutting was interrupted by a python write timeout error: "serial.serialutil.SerialTimooutException: write timeout" Code used is urumbu_gcode_1.14.22.py . Spindle speed in these tests is 16kRPM. + +<img src=img/linetest.jpg width=50%><br> + +#### Jan 15, 2022 + +Added an ESC to control the BLDC motor. We can use the same board used for servo control. Like the servo, the ESC accepts positive pulses 1-2 ms wide, 20 ms period. To arm, apply 1ms pulses for one second, and then apply pulse length for desired speed. With 12V supply, no load speed is 17kRPM at 1.40 ms pulse length. These pulses need to be applied continuously to run the motor. (this is typical ESC behavior, I think.) Details in Rob's documentation. + +<img src=img/bldc_resize.jpg width=50%><br> + +## Linear axis + +Assembly: + +<img src=img/axis.jpg width=100%><br> + +Constant speed: + +<img src=video/axis_linear.mp4 width=100%><br> + +Acceleration: + +<img src=video/axis_acceleration.mp4 width=100%><br> diff --git a/UrumbotXY-Fall2022/code/examples/abc.xy b/UrumbotXY-Fall2022/code/examples/abc.xy new file mode 100644 index 0000000000000000000000000000000000000000..35dba3e94d6637402805292d24a13e51909f226b --- /dev/null +++ b/UrumbotXY-Fall2022/code/examples/abc.xy @@ -0,0 +1,1675 @@ +UP +60.62121578665207, 104.50139149653452 +DOWN +60.62121578665207, 104.50139149653452 +60.62121578665207, 85.70139149653453 +60.7513178274684, 85.60139149653453 +62.9513178274684, 85.60139149653453 +63.081419868284726, 85.70139149653453 +63.081419868284726, 94.50139149653452 +63.151317827468404, 94.5712894557182 +63.35131782746841, 94.60139149653453 +72.7513178274684, 94.60139149653453 +72.9513178274684, 94.5712894557182 +73.02121578665208, 94.50139149653452 +73.02121578665208, 85.70139149653453 +73.1513178274684, 85.60139149653453 +75.3513178274684, 85.60139149653453 +75.48141986828473, 85.70139149653453 +75.48141986828473, 104.50139149653452 +75.3513178274684, 104.60139149653453 +73.1513178274684, 104.60139149653453 +73.02121578665208, 104.50139149653452 +73.02121578665208, 96.90139149653453 +72.9513178274684, 96.83149353735085 +72.7513178274684, 96.80139149653454 +63.35131782746841, 96.80139149653454 +63.151317827468404, 96.83149353735085 +63.081419868284726, 96.90139149653453 +63.081419868284726, 104.50139149653452 +62.9513178274684, 104.60139149653453 +60.7513178274684, 104.60139149653453 +60.62121578665207, 104.50139149653452 +UP +94.28283297898355, 104.50139149653452 +DOWN +94.28283297898355, 104.50139149653452 +94.28283297898355, 85.70139149653453 +94.35131782746839, 85.63997845305627 +94.55131782746841, 85.60139149653453 +96.35131782746839, 85.60139149653453 +96.54747167362225, 85.70139149653453 +96.54747167362225, 104.50139149653452 +96.35131782746839, 104.60139149653453 +94.55131782746841, 104.60139149653453 +94.35131782746839, 104.56280454001279 +94.28283297898355, 104.50139149653452 +UP +100.19583002259034, 104.50139149653452 +DOWN +100.19583002259034, 104.50139149653452 +100.19583002259034, 85.70139149653453 +100.35131782746839, 85.60139149653453 +102.1513178274684, 85.60139149653453 +102.35131782746839, 85.62398765038068 +102.44658409965774, 85.70139149653453 +102.44658409965774, 104.50139149653452 +102.35131782746839, 104.57879534268838 +102.1513178274684, 104.60139149653453 +100.35131782746839, 104.60139149653453 +100.19583002259034, 104.50139149653452 +UP +171.35516398131455, 104.50139149653452 +DOWN +171.35516398131455, 104.50139149653452 +171.35516398131455, 85.70139149653453 +171.5513178274684, 85.60139149653453 +173.3513178274684, 85.60139149653453 +173.5513178274684, 85.63997845305627 +173.61980267595328, 85.70139149653453 +173.61980267595328, 104.50139149653452 +173.5513178274684, 104.56280454001279 +173.3513178274684, 104.60139149653453 +171.5513178274684, 104.60139149653453 +171.35516398131455, 104.50139149653452 +UP +186.08283297898356, 104.50139149653452 +DOWN +186.08283297898356, 104.50139149653452 +186.08283297898356, 98.30139149653454 +186.07794120409176, 98.10139149653453 +185.95131782746842, 97.93182627914322 +185.5513178274684, 98.33330639015155 +184.75131782746843, 98.9435298613144 +184.3513178274684, 99.15514872196806 +183.75131782746843, 99.38410177690837 +183.3513178274684, 99.44794322067246 +182.95131782746842, 99.55972482986786 +182.5513178274684, 99.60139149653453 +181.95131782746842, 99.60139149653453 +181.5513178274684, 99.56355365869669 +180.5513178274684, 99.34398408912712 +180.3513178274684, 99.23922933437237 +180.1513178274684, 99.19829415140178 +179.3513178274684, 98.79216072730375 +178.75131782746843, 98.37967721082025 +178.1513178274684, 97.79870693277614 +177.89576227191284, 97.50139149653452 +177.50573959617589, 96.90139149653453 +177.10875025990083, 96.10139149653453 +176.89554859669917, 95.50139149653452 +176.6869006495543, 94.70139149653453 +176.51705209320266, 93.70139149653453 +176.45605155527903, 92.30139149653454 +176.52082137356768, 91.30139149653454 +176.62121578665207, 90.70139149653453 +176.69554859669915, 90.30139149653454 +176.92999429805667, 89.50139149653452 +177.26778124210256, 88.70139149653453 +177.48744685972645, 88.30139149653454 +177.7325208349872, 87.90139149653453 +178.20065993273158, 87.30139149653454 +178.6023382356317, 86.90139149653453 +179.1513178274684, 86.44080326124042 +179.75131782746843, 86.06253799334982 +179.95131782746842, 85.98746114827583 +180.1513178274684, 85.86278390159782 +180.5513178274684, 85.74398408912712 +180.75131782746843, 85.63702979440687 +181.1513178274684, 85.57639149653453 +181.5513178274684, 85.4617688550251 +182.1513178274684, 85.40139149653453 +182.75131782746843, 85.4089864332434 +183.1513178274684, 85.45408610731297 +183.5513178274684, 85.56788364313138 +183.95131782746842, 85.6328347955036 +184.5513178274684, 85.88889149653453 +185.1513178274684, 86.2450278601709 +185.6579403440247, 86.70139149653453 +186.1513178274684, 87.21182627914322 +186.23951227191284, 87.10139149653453 +186.25605155527904, 86.90139149653453 +186.25605155527904, 85.70139149653453 +186.3513178274684, 85.62398765038068 +186.5513178274684, 85.60139149653453 +188.1513178274684, 85.60139149653453 +188.34747167362227, 85.70139149653453 +188.34747167362227, 104.50139149653452 +188.1513178274684, 104.60139149653453 +186.3513178274684, 104.60139149653453 +186.1513178274684, 104.56280454001279 +186.08283297898356, 104.50139149653452 +UP +192.68283297898355, 104.50139149653452 +DOWN +192.68283297898355, 104.50139149653452 +192.68283297898355, 100.10139149653453 +192.75516398131455, 99.10139149653453 +192.79583002259037, 98.90139149653453 +192.9170520932027, 96.70139149653453 +192.95516398131457, 96.50139149653452 +193.02121578665208, 95.30139149653454 +193.05605155527905, 95.10139149653453 +193.0869006495543, 94.30139149653454 +193.19583002259037, 93.10139149653453 +193.3610193200057, 90.50139149653452 +193.39583002259036, 90.30139149653454 +193.5513178274684, 90.20139149653453 +194.5513178274684, 90.20139149653453 +194.75131782746843, 90.23775513289817 +194.82300457445638, 90.30139149653454 +194.84658409965778, 90.50139149653452 +195.30680563234645, 97.70139149653453 +195.38558356173414, 98.50139149653452 +195.48141986828475, 100.10139149653453 +195.48141986828475, 104.50139149653452 +195.3513178274684, 104.60139149653453 +192.95131782746842, 104.60139149653453 +192.75131782746843, 104.56280454001279 +192.68283297898355, 104.50139149653452 +UP +84.05131782746841, 99.50139149653452 +DOWN +84.05131782746841, 99.50139149653452 +83.3513178274684, 99.38371707792987 +82.9513178274684, 99.23216072730376 +82.7513178274684, 99.18992360662628 +82.1513178274684, 98.94024499971924 +81.55131782746841, 98.57940196773872 +80.7513178274684, 97.93376559725395 +80.32650579739321, 97.50139149653452 +79.88791913465795, 96.90139149653453 +79.64834163699221, 96.50139149653452 +79.45014823682513, 96.10139149653453 +79.12999429805664, 95.30139149653454 +78.92082137356769, 94.50139149653452 +78.75516398131455, 93.30139149653454 +78.71705209320267, 92.10139149653453 +78.75516398131455, 91.50139149653452 +78.92999429805664, 90.30139149653454 +79.0832196679592, 89.70139149653453 +79.2920821586786, 89.10139149653453 +79.69053351374292, 88.30139149653454 +80.09053351374291, 87.70139149653453 +80.64469531091211, 87.10139149653453 +80.9513178274684, 86.82174033374383 +81.7513178274684, 86.25925313175466 +82.55131782746841, 85.87847482986787 +82.9513178274684, 85.76788364313138 +83.1513178274684, 85.67725356550005 +84.3513178274684, 85.4430581632012 +84.9513178274684, 85.40139149653453 +85.7513178274684, 85.40676339736098 +86.1513178274684, 85.43922933437237 +86.7513178274684, 85.57515387277215 +87.1513178274684, 85.61906591513917 +87.55131782746841, 85.7706222657653 +87.7513178274684, 85.81285938644278 +88.3513178274684, 86.06253799334982 +88.9513178274684, 86.42041323566497 +89.76033422091103, 87.10139149653453 +90.41471652027886, 87.90139149653453 +90.75984495925135, 88.50139149653452 +91.03505276722744, 89.10139149653453 +91.23505276722744, 89.70139149653453 +91.1513178274684, 89.87959662473966 +90.9513178274684, 89.94101413804397 +90.55131782746841, 89.99601959570808 +89.7513178274684, 90.04794322067247 +89.1513178274684, 90.16994819756546 +88.9513178274684, 90.13897111436893 +88.44834163699221, 89.10139149653453 +88.02350325793198, 88.50139149653452 +87.55131782746841, 88.06076649653453 +87.1513178274684, 87.80278038542342 +86.9513178274684, 87.68617410523018 +86.55131782746841, 87.5477770387032 +86.3513178274684, 87.4454592931447 +86.1513178274684, 87.41372629829664 +85.55131782746841, 87.36355365869669 +85.1513178274684, 87.36355365869669 +84.3513178274684, 87.41625636139939 +84.1513178274684, 87.45879890394194 +83.9513178274684, 87.55567721082025 +83.55131782746841, 87.68353435367739 +82.9513178274684, 88.02652810855639 +82.55131782746841, 88.36827047742625 +82.04772501309715, 88.90139149653453 +81.67334163699222, 89.50139149653452 +81.3513178274684, 90.32460578224882 +81.17264135688016, 91.10139149653453 +81.08344217980002, 91.70139149653453 +81.08141986828473, 91.90139149653453 +81.1513178274684, 91.9712894557182 +81.3513178274684, 92.00139149653452 +91.1513178274684, 92.00139149653452 +91.3521052290432, 92.10139149653453 +91.38558356173414, 92.30139149653454 +91.34747167362225, 93.50139149653452 +91.17264135688016, 94.70139149653453 +91.0194159869776, 95.30139149653454 +90.81055349625821, 95.90139149653453 +90.41518879521034, 96.70139149653453 +90.1513178274684, 97.11139149653454 +89.67119360386592, 97.70139149653453 +89.3513178274684, 98.01696035880998 +88.9513178274684, 98.36825196165081 +88.3513178274684, 98.77940196773872 +87.55131782746841, 99.17066232986787 +86.9513178274684, 99.36857899653452 +86.55131782746841, 99.42457990233163 +85.9513178274684, 99.55972482986786 +85.55131782746841, 99.59601959570809 +84.7513178274684, 99.60139149653453 +84.05131782746841, 99.50139149653452 +UP +110.68569282746842, 99.50139149653452 +DOWN +110.68569282746842, 99.50139149653452 +109.95131782746842, 99.38371707792987 +109.55131782746841, 99.22825716817633 +109.35131782746839, 99.18992360662628 +108.7513178274684, 98.94024499971924 +108.1513178274684, 98.59216072730376 +107.55131782746841, 98.15915547168981 +107.06012285891495, 97.70139149653453 +106.55131782746841, 97.08176532831023 +106.3057395961759, 96.70139149653453 +105.90875025990084, 95.90139149653453 +105.70500910263618, 95.30139149653454 +105.47963108048046, 94.30139149653454 +105.35516398131455, 93.30139149653454 +105.35516398131455, 91.70139149653453 +105.42121578665208, 91.10139149653453 +105.51338679298564, 90.50139149653452 +105.70500910263618, 89.70139149653453 +105.90875025990084, 89.10139149653453 +106.09208215867861, 88.70139149653453 +106.3057395961759, 88.30139149653454 +106.72015840717856, 87.70139149653453 +107.06012285891495, 87.30139149653454 +107.7513178274684, 86.67110980639369 +108.35131782746839, 86.25925313175466 +108.7513178274684, 86.04732172909267 +109.35131782746839, 85.80448884166728 +109.55131782746841, 85.76788364313138 +109.95131782746842, 85.61445455959759 +110.35131782746839, 85.56994819756545 +110.95131782746842, 85.43922933437237 +111.35131782746839, 85.40139149653453 +112.1513178274684, 85.40139149653453 +112.55131782746841, 85.43922933437237 +112.95131782746842, 85.537929958073 +113.55131782746841, 85.62889149653454 +113.95131782746842, 85.77996292510596 +114.1513178274684, 85.82129440915588 +114.35131782746839, 85.92792210877943 +114.7513178274684, 86.07486088428963 +115.16610043616407, 86.30139149653454 +115.7513178274684, 86.67173632412073 +116.04086031112854, 86.90139149653453 +116.47119360386591, 87.30139149653454 +116.98247724775825, 87.90139149653453 +117.35525483534241, 88.50139149653452 +117.55525483534242, 88.90139149653453 +117.77668014630899, 89.50139149653452 +117.98181428136911, 90.30139149653454 +118.08141986828474, 90.90139149653453 +118.1818142813691, 91.90139149653453 +118.18558356173415, 93.30139149653454 +118.14747167362225, 93.70139149653453 +117.98924886195115, 94.70139149653453 +117.82828752443811, 95.30139149653454 +117.6105534962582, 95.90139149653453 +117.4280049440328, 96.30139149653454 +117.2121021411939, 96.70139149653453 +116.78247724775827, 97.30139149653454 +116.44251279602187, 97.70139149653453 +115.7513178274684, 98.33104666894832 +115.1513178274684, 98.7435298613144 +114.7513178274684, 98.95546126397639 +114.1513178274684, 99.19829415140178 +113.95131782746842, 99.23489934993768 +113.55131782746841, 99.38832843347147 +113.1513178274684, 99.43489934993767 +112.55131782746841, 99.56355365869669 +112.1513178274684, 99.60139149653453 +111.35131782746839, 99.60139149653453 +110.95131782746842, 99.56355365869669 +110.68569282746842, 99.50139149653452 +UP +152.17576227191284, 99.50139149653452 +DOWN +152.17576227191284, 99.50139149653452 +151.3513178274684, 99.35567721082025 +151.1513178274684, 99.25593695107999 +150.75131782746843, 99.15925666507385 +150.5513178274684, 99.04150138664443 +150.3513178274684, 98.98348104877334 +150.1513178274684, 98.85593695107998 +149.95131782746842, 98.7785935690734 +149.3513178274684, 98.38748775321902 +148.75131782746843, 97.88617410523018 +148.5513178274684, 97.68757035832314 +147.9230569579032, 96.90139149653453 +147.4920821586786, 96.10139149653453 +147.26758288770935, 95.50139149653452 +147.054259003939, 94.70139149653453 +146.88690064955432, 93.70139149653453 +146.85605155527907, 93.30139149653454 +146.85605155527907, 91.70139149653453 +146.88690064955432, 91.30139149653454 +147.0955485966992, 90.10139149653453 +147.42046068461127, 89.10139149653453 +147.69576227191286, 88.50139149653452 +148.06778124210257, 87.90139149653453 +148.56381782746843, 87.30139149653454 +149.22840116080175, 86.70139149653453 +149.5513178274684, 86.45296382357856 +150.3513178274684, 86.00948673462976 +150.5513178274684, 85.94684604198908 +150.75131782746843, 85.8321206632012 +151.1513178274684, 85.73139149653453 +151.3513178274684, 85.63702979440687 +151.95131782746842, 85.5548397723966 +152.3513178274684, 85.44710578224881 +152.95131782746842, 85.40139149653453 +153.5513178274684, 85.40139149653453 +154.1513178274684, 85.45408610731297 +154.5513178274684, 85.55972482986786 +154.95131782746842, 85.60740008022552 +155.75131782746843, 85.85977658970224 +156.5513178274684, 86.22418942399567 +156.75131782746843, 86.3650278601709 +156.95131782746842, 86.45925313175465 +157.53599524682323, 86.90139149653453 +157.95131782746842, 87.27023207624467 +158.61471652027888, 88.10139149653453 +158.95525483534243, 88.70139149653453 +159.21055349625823, 89.30139149653454 +159.3976265523006, 89.90139149653453 +159.58558356173415, 90.90139149653453 +159.68141986828473, 92.10139149653453 +159.68141986828473, 93.30139149653454 +159.61980267595325, 93.90139149653453 +159.38558356173417, 95.10139149653453 +159.19388539503598, 95.70139149653453 +158.82800494403284, 96.50139149653452 +158.44251279602187, 97.10139149653453 +157.93881782746843, 97.70139149653453 +157.1513178274684, 98.39604390295165 +156.5513178274684, 98.78901525891077 +156.1513178274684, 98.99329625843929 +155.95131782746842, 99.05593695107999 +155.75131782746843, 99.17066232986787 +155.3513178274684, 99.27139149653453 +155.1513178274684, 99.36575319866219 +154.5513178274684, 99.45593695107999 +154.1513178274684, 99.55567721082025 +153.75131782746843, 99.59379655982568 +152.95131782746842, 99.60139149653453 +152.3513178274684, 99.54869688575609 +152.17576227191284, 99.50139149653452 +UP +166.9081079509252, 99.50139149653452 +DOWN +166.9081079509252, 99.50139149653452 +166.5513178274684, 99.391158938395 +166.1513178274684, 99.17940196773873 +165.79865116080174, 98.90139149653453 +165.26778124210256, 98.30139149653454 +164.75131782746843, 97.49439149653453 +164.5513178274684, 97.39655278685711 +164.5106928274684, 97.50139149653452 +164.50680563234647, 99.30139149653454 +164.3513178274684, 99.40139149653453 +162.75131782746843, 99.40139149653453 +162.5513178274684, 99.36280454001279 +162.48283297898354, 99.30139149653454 +162.48283297898354, 85.70139149653453 +162.5513178274684, 85.63997845305627 +162.75131782746843, 85.60139149653453 +164.5513178274684, 85.60139149653453 +164.74747167362227, 85.70139149653453 +164.7521052290432, 93.30139149653454 +164.88841460166196, 94.50139149653452 +165.07645443949025, 95.30139149653454 +165.29871667139906, 95.90139149653453 +165.5513178274684, 96.30732369992435 +165.75131782746843, 96.54125163639466 +166.3513178274684, 96.97700125263209 +166.75131782746843, 97.14684604198908 +167.1513178274684, 97.19898185798031 +167.95131782746842, 97.18905669477242 +168.1513178274684, 97.15732369992436 +168.3513178274684, 97.05879890394193 +168.75131782746843, 96.94201649653454 +168.95131782746842, 96.8184769236702 +169.1513178274684, 96.869859965003 +169.84658409965778, 98.70139149653453 +169.80094745709806, 98.90139149653453 +169.75131782746843, 98.9435298613144 +169.3513178274684, 99.15546126397639 +168.75131782746843, 99.38992360662627 +168.1513178274684, 99.54869688575609 +167.75131782746843, 99.60139149653453 +167.3513178274684, 99.59601959570809 +166.9081079509252, 99.50139149653452 +UP +126.80391898353776, 99.30139149653454 +DOWN +126.80391898353776, 99.30139149653454 +130.49554859669917, 87.10139149653453 +130.95131782746842, 85.68096896132326 +131.1513178274684, 85.60139149653453 +133.1513178274684, 85.60139149653453 +133.3726413568802, 85.70139149653453 +135.88841460166196, 95.30139149653454 +136.06469810915854, 95.90139149653453 +136.1513178274684, 96.06539149653453 +136.24971782746843, 95.90139149653453 +136.38355466957367, 95.50139149653452 +136.6869006495543, 94.10139149653453 +138.9050091026362, 85.70139149653453 +138.95131782746842, 85.65879890394194 +139.1513178274684, 85.60139149653453 +141.1513178274684, 85.60139149653453 +141.33089529225714, 85.70139149653453 +145.57264135688018, 99.30139149653454 +145.5513178274684, 99.3218140317458 +145.3513178274684, 99.40139149653453 +143.5513178274684, 99.40139149653453 +143.37174036267967, 99.30139149653454 +140.41422105327484, 89.30139149653454 +140.3513178274684, 89.12139149653453 +140.1513178274684, 88.92939149653454 +140.07925078836226, 89.10139149653453 +139.70970292063612, 90.50139149653452 +137.44658409965774, 99.30139149653454 +137.3513178274684, 99.37879534268838 +137.1513178274684, 99.40139149653453 +135.3513178274684, 99.40139149653453 +135.1513178274684, 99.37194987216904 +135.06758288770936, 99.30139149653454 +134.8955485966992, 98.70139149653453 +133.0955485966992, 92.10139149653453 +132.39583002259036, 89.30139149653454 +132.2773178274684, 88.90139149653453 +132.1513178274684, 88.63504534268837 +132.0913178274684, 88.70139149653453 +131.93089529225716, 89.10139149653453 +129.13089529225715, 99.30139149653454 +128.95131782746842, 99.40139149653453 +126.95131782746842, 99.40139149653453 +126.80391898353776, 99.30139149653454 +UP +83.9513178274684, 97.51526010967322 +DOWN +83.9513178274684, 97.51526010967322 +84.1513178274684, 97.57639149653453 +84.9513178274684, 97.63922933437237 +85.55131782746841, 97.62953220005213 +86.1513178274684, 97.57639149653453 +86.55131782746841, 97.4220645734576 +86.7513178274684, 97.38053841596582 +87.26613264228322, 97.10139149653453 +87.55559133174191, 96.90139149653453 +88.00065993273157, 96.50139149653452 +88.44834163699221, 95.90139149653453 +88.63484055474113, 95.50139149653452 +88.77174036267968, 95.10139149653453 +88.86758288770937, 94.70139149653453 +88.9513178274684, 94.09521865702835 +88.7513178274684, 93.9635536586967 +81.3513178274684, 93.97449091173921 +81.21980267595325, 94.10139149653453 +81.30310354175411, 94.70139149653453 +81.48217497032554, 95.30139149653454 +81.67334163699222, 95.70139149653453 +81.91690224305282, 96.10139149653453 +82.3513178274684, 96.58645643159946 +82.7513178274684, 96.92909419923723 +83.1513178274684, 97.1821206632012 +83.55131782746841, 97.38053841596582 +83.9513178274684, 97.51526010967322 +UP +110.7513178274684, 97.56788364313138 +DOWN +110.7513178274684, 97.56788364313138 +111.55131782746841, 97.63922933437237 +112.1513178274684, 97.62953220005213 +112.7513178274684, 97.5712894557182 +113.35131782746839, 97.36575319866219 +113.55131782746841, 97.23930358444662 +113.7513178274684, 97.16429472234098 +114.36664040811357, 96.70139149653453 +114.76381782746842, 96.30139149653454 +115.05491064183965, 95.90139149653453 +115.38573341188399, 95.30139149653454 +115.59583002259035, 94.70139149653453 +115.6869006495543, 94.30139149653454 +115.79583002259037, 93.70139149653453 +115.85605155527907, 93.10139149653453 +115.85605155527907, 92.10139149653453 +115.7929327343007, 91.30139149653454 +115.63679268780359, 90.50139149653452 +115.3704667636386, 89.70139149653453 +115.17423449413508, 89.30139149653454 +114.7513178274684, 88.68889149653452 +114.35131782746839, 88.30061024653453 +113.7513178274684, 87.83848827072808 +113.55131782746841, 87.76347940862244 +113.35131782746839, 87.63702979440687 +112.7513178274684, 87.43149353735086 +112.1513178274684, 87.37325079301695 +111.55131782746841, 87.36355365869669 +110.7513178274684, 87.43489934993767 +110.55131782746841, 87.52673396228795 +110.1513178274684, 87.64150138664442 +109.7513178274684, 87.85593695107998 +109.40752220703044, 88.10139149653453 +108.9416163349311, 88.50139149653452 +108.4682875244381, 89.10139149653453 +108.06779510019567, 89.90139149653453 +107.9321688912982, 90.30139149653454 +107.84238925603984, 90.70139149653453 +107.70680563234646, 91.50139149653452 +107.68141986828473, 93.10139149653453 +107.70680563234646, 93.50139149653452 +107.83505276722744, 94.30139149653454 +108.06779510019567, 95.10139149653453 +108.2381441747738, 95.50139149653452 +108.46352712979399, 95.90139149653453 +108.95131782746842, 96.51389149653453 +109.1513178274684, 96.70217274653453 +109.7513178274684, 97.14684604198908 +110.1513178274684, 97.36128160642464 +110.55131782746841, 97.4760490307811 +110.7513178274684, 97.56788364313138 +UP +152.1513178274684, 97.53139149653452 +DOWN +152.1513178274684, 97.53139149653452 +152.3513178274684, 97.58652663166967 +152.95131782746842, 97.63560202285032 +153.5513178274684, 97.63775513289816 +154.1513178274684, 97.58652663166967 +154.3513178274684, 97.54398408912712 +154.5513178274684, 97.44710578224881 +154.75131782746843, 97.39586154261748 +155.33182630204468, 97.10139149653453 +155.62578591257477, 96.90139149653453 +155.95131782746842, 96.61413035003771 +156.26012285891494, 96.30139149653454 +156.5566613389188, 95.90139149653453 +156.785733411884, 95.50139149653452 +156.9566613389188, 95.10139149653453 +157.1995321131827, 94.30139149653454 +157.35516398131455, 93.10139149653453 +157.35516398131455, 92.10139149653453 +157.27963108048044, 91.30139149653454 +157.18355466957365, 90.70139149653453 +157.01422105327487, 90.10139149653453 +156.86449148016303, 89.70139149653453 +156.66778124210254, 89.30139149653454 +156.26012285891494, 88.70139149653453 +155.62578591257477, 88.10139149653453 +155.33182630204468, 87.90139149653453 +154.95131782746842, 87.69604798508415 +154.3513178274684, 87.45879890394194 +154.1513178274684, 87.41625636139939 +153.1513178274684, 87.36355365869669 +152.3513178274684, 87.41625636139939 +151.54861512476572, 87.70139149653453 +150.95131782746842, 88.05593695107999 +150.44426654541712, 88.50139149653452 +150.10197572220525, 88.90139149653453 +149.8542940179446, 89.30139149653454 +149.7416163349311, 89.50139149653452 +149.49538562407858, 90.10139149653453 +149.29538562407856, 90.90139149653453 +149.18558356173415, 91.90139149653453 +149.18558356173415, 93.10139149653453 +149.21980267595325, 93.50139149653452 +149.33089529225714, 94.30139149653454 +149.49538562407858, 94.90139149653453 +149.73216889129822, 95.50139149653452 +150.10197572220525, 96.10139149653453 +150.44251279602187, 96.50139149653452 +150.75131782746843, 96.78983080289291 +150.95131782746842, 96.95139149653453 +151.5513178274684, 97.30371707792987 +152.1513178274684, 97.53139149653452 +UP +181.5513178274684, 97.56355365869669 +DOWN +181.5513178274684, 97.56355365869669 +182.3513178274684, 97.63922933437237 +182.75131782746843, 97.63775513289816 +183.3513178274684, 97.57639149653453 +183.95131782746842, 97.36429472234099 +184.3513178274684, 97.13999909147124 +184.65748221103007, 96.90139149653453 +185.26012285891494, 96.30139149653454 +185.6483416369922, 95.70139149653453 +185.97174036267967, 94.90139149653453 +186.19583002259037, 93.90139149653453 +186.28283297898355, 92.90139149653453 +186.28283297898355, 91.70139149653453 +186.25605155527904, 91.30139149653454 +186.02618121544657, 90.10139149653453 +185.80391898353776, 89.50139149653452 +185.6108270299224, 89.10139149653453 +185.3513178274684, 88.73814363328667 +185.1513178274684, 88.48889149653454 +184.7390227455012, 88.10139149653453 +184.3513178274684, 87.82066232986787 +184.1298225003656, 87.70139149653453 +183.5513178274684, 87.45593695107999 +183.3513178274684, 87.41274520832492 +182.3513178274684, 87.36355365869669 +181.75131782746843, 87.42224457710326 +181.1513178274684, 87.63848827072808 +180.5513178274684, 88.0244252043997 +180.2290205301711, 88.30139149653454 +179.84251279602188, 88.70139149653453 +179.44658409965777, 89.30139149653454 +179.25248741811168, 89.70139149653453 +179.10680563234644, 90.10139149653453 +178.9097029206361, 90.90139149653453 +178.78558356173414, 92.30139149653454 +178.84658409965778, 93.70139149653453 +179.07645443949025, 94.90139149653453 +179.28217497032557, 95.50139149653452 +179.48445736235215, 95.90139149653453 +179.75131782746843, 96.3152126347459 +180.1513178274684, 96.74872482986787 +180.3513178274684, 96.92673396228795 +180.95131782746842, 97.31660888783888 +181.5513178274684, 97.56355365869669 +UP +192.79583002259037, 88.10139149653453 +DOWN +192.79583002259037, 88.10139149653453 +192.79583002259037, 85.70139149653453 +192.95131782746842, 85.60139149653453 +195.1513178274684, 85.60139149653453 +195.38558356173414, 85.70139149653453 +195.38558356173414, 88.10139149653453 +195.3513178274684, 88.1336283386398 +195.1513178274684, 88.20139149653453 +192.95131782746842, 88.20139149653453 +192.79583002259037, 88.10139149653453 +UP +62.87999813084576, 52.235620216467325 +DOWN +62.87999813084576, 52.235620216467325 +62.87999813084576, 40.43562021646732 +62.96700108723894, 39.235620216467325 +63.171068757809735, 38.03562021646732 +63.3891772108916, 37.235620216467325 +63.61012361688324, 36.63562021646732 +63.80122020145808, 36.235620216467325 +64.17470162199834, 35.63562021646732 +64.6354859357238, 35.099704723509575 +65.23548593572383, 34.557334502181604 +65.8354859357238, 34.15760974526313 +66.23548593572383, 33.94799645409108 +66.43548593572382, 33.876245216467325 +66.6354859357238, 33.75552312908868 +66.8354859357238, 33.71419164503875 +67.23548593572383, 33.54789294374005 +67.6354859357238, 33.467857058572584 +67.8354859357238, 33.38650779043182 +68.6354859357238, 33.293953549800655 +69.23548593572383, 33.17345805430516 +69.8354859357238, 33.13562021646732 +70.8354859357238, 33.13562021646732 +71.43548593572382, 33.17345805430516 +72.03548593572384, 33.293953549800655 +72.6354859357238, 33.353675772022875 +73.03548593572384, 33.49395354980066 +73.43548593572382, 33.57091433411438 +73.6354859357238, 33.668953549800655 +74.03548593572384, 33.79701262153061 +74.43548593572382, 33.99348185168745 +75.03548593572384, 34.36075682848918 +75.64450232916641, 34.83562021646732 +76.06664535601368, 35.235620216467325 +76.6810641670163, 36.03562021646732 +77.09472160451361, 36.83562021646732 +77.30358409523302, 37.43562021646732 +77.45680946513556, 38.03562021646732 +77.56558797654014, 38.63562021646732 +77.70397078420865, 39.63562021646732 +77.76558797654013, 40.83562021646732 +77.76558797654013, 52.235620216467325 +77.6354859357238, 52.33562021646732 +75.43548593572382, 52.33562021646732 +75.3053838949075, 52.235620216467325 +75.3053838949075, 40.43562021646732 +75.234698534149, 39.63562021646732 +75.07999813084575, 38.63562021646732 +74.92096079605903, 38.03562021646732 +74.7023464008401, 37.43562021646732 +74.34429096717037, 36.83562021646732 +73.98654976551103, 36.43562021646732 +73.43548593572382, 36.015197681256055 +73.03548593572384, 35.80791751376462 +72.6354859357238, 35.682005758635995 +72.43548593572382, 35.577286883133986 +71.43548593572382, 35.36912806987046 +69.8354859357238, 35.33562021646732 +69.03548593572384, 35.37271699066087 +68.6354859357238, 35.49316211590866 +68.23548593572383, 35.562485888109116 +67.6354859357238, 35.79701262153061 +67.23548593572383, 36.015197681256055 +66.6949264951644, 36.43562021646732 +66.30279362803151, 36.83562021646732 +66.02578444318647, 37.235620216467325 +65.81633699955358, 37.63562021646732 +65.61506340051255, 38.235620216467325 +65.52655736429523, 38.63562021646732 +65.39097374060185, 39.43562021646732 +65.33075220791318, 40.235620216467325 +65.30397078420867, 41.03562021646732 +65.30397078420867, 52.235620216467325 +65.23548593572383, 52.297033259945586 +65.03548593572384, 52.33562021646732 +63.03548593572384, 52.33562021646732 +62.87999813084576, 52.235620216467325 +UP +127.70538389490747, 52.235620216467325 +DOWN +127.70538389490747, 52.235620216467325 +127.70538389490747, 33.43562021646732 +127.8354859357238, 33.33562021646732 +129.6354859357238, 33.33562021646732 +129.79097374060188, 33.43562021646732 +129.79097374060188, 34.83562021646732 +129.80436010790925, 35.03562021646732 +129.8354859357238, 35.08169864783987 +130.03548593572384, 35.001220216467324 +130.52055087078878, 34.43562021646732 +131.03548593572384, 33.9785650017434 +131.6354859357238, 33.596766713282605 +132.23548593572383, 33.35290993609349 +132.6354859357238, 33.28906849232939 +133.03548593572384, 33.17345805430516 +133.43548593572382, 33.13562021646732 +134.03548593572384, 33.14099211729377 +134.43548593572382, 33.181334502181606 +134.8354859357238, 33.29627595417224 +135.23548593572383, 33.35290993609349 +135.6354859357238, 33.51646133796265 +135.8354859357238, 33.56634938313399 +136.03548593572384, 33.69395354980065 +136.23548593572383, 33.76449722181491 +136.8354859357238, 34.14812021646732 +137.43548593572382, 34.63640146646732 +138.03548593572384, 35.25093553178264 +138.46374680528902, 35.83562021646732 +138.69472160451363, 36.235620216467325 +139.0608482545644, 37.03562021646732 +139.25680946513558, 37.63562021646732 +139.43627333729864, 38.43562021646732 +139.56558797654014, 39.43562021646732 +139.59097374060184, 39.83562021646732 +139.57955373233398, 41.03562021646732 +139.47341697020659, 42.03562021646732 +139.30358409523302, 42.83562021646732 +138.87805350329137, 44.03562021646732 +138.43548593572382, 44.84599757495789 +138.03548593572384, 45.40641667664431 +137.6354859357238, 45.84435037519748 +137.16957684481474, 46.235620216467325 +136.8354859357238, 46.477758581247194 +136.03548593572384, 46.89348538500665 +135.6354859357238, 47.00562021646732 +135.43548593572382, 47.099981918594985 +134.8354859357238, 47.20676115606464 +134.6354859357238, 47.27524285797676 +134.03548593572384, 47.33562021646732 +133.43548593572382, 47.328025279758464 +133.03548593572384, 47.27524285797676 +132.23548593572383, 47.07422781140403 +132.03548593572384, 46.965722257283645 +131.8354859357238, 46.91087274171984 +131.43548593572382, 46.695503937397554 +130.8354859357238, 46.265901906608164 +130.23548593572383, 45.669213966467325 +130.03548593572384, 45.54593767678478 +129.97407289224554, 45.63562021646732 +129.96558797654012, 45.83562021646732 +129.96558797654012, 52.235620216467325 +129.8354859357238, 52.33562021646732 +127.8354859357238, 52.33562021646732 +127.70538389490747, 52.235620216467325 +UP +215.93907875009506, 52.235620216467325 +DOWN +215.93907875009506, 52.235620216467325 +222.08482804098696, 43.63562021646732 +222.32739345017467, 43.235620216467325 +221.91561015932632, 42.63562021646732 +221.00432651543395, 41.43562021646732 +220.88482804098703, 41.235620216467325 +220.40722506615862, 40.63562021646732 +220.284828040987, 40.43562021646732 +218.77208724291336, 38.43562021646732 +215.0790442179324, 33.43562021646732 +215.23548593572377, 33.33562021646732 +217.8354859357238, 33.33562021646732 +218.00107035130827, 33.43562021646732 +222.48106416701637, 39.63562021646732 +222.89888462853423, 40.235620216467325 +223.43548593572382, 41.101360957208065 +223.63548593572386, 41.328148952099504 +223.8354859357238, 41.198827763637134 +224.18990770443133, 40.63562021646732 +225.5799303801682, 38.63562021646732 +229.26990152013946, 33.43562021646732 +229.43548593572382, 33.33562021646732 +232.03548593572384, 33.33562021646732 +232.23548593572377, 33.380506580103685 +232.29888462853432, 33.43562021646732 +225.40107035130825, 43.03562021646732 +225.26664535601367, 43.235620216467325 +225.19192765351522, 43.43562021646732 +229.6962702494493, 49.43562021646732 +231.76048593572386, 52.235620216467325 +231.63548593572386, 52.324750651249936 +231.43548593572382, 52.33562021646732 +229.43548593572382, 52.33562021646732 +229.23548593572377, 52.321780930753036 +229.11561015932625, 52.235620216467325 +225.00722506615864, 46.83562021646732 +224.05840260239052, 45.43562021646732 +223.8354859357238, 45.17573010657721 +223.63548593572386, 45.33958061250693 +223.08106416701628, 46.235620216467325 +222.2637468052891, 47.43562021646732 +221.3861438304607, 48.63562021646732 +218.8354859357238, 52.26215082871222 +218.63548593572386, 52.33562021646732 +216.23548593572377, 52.33562021646732 +216.03548593572384, 52.31302406262117 +215.93907875009506, 52.235620216467325 +UP +232.81668894324264, 52.235620216467325 +DOWN +232.81668894324264, 52.235620216467325 +240.01668894324257, 41.43562021646732 +240.07999813084575, 41.235620216467325 +240.07999813084575, 33.43562021646732 +240.23548593572377, 33.33562021646732 +242.23548593572377, 33.33562021646732 +242.43548593572382, 33.35821637031348 +242.53075220791322, 33.43562021646732 +242.53075220791322, 41.235620216467325 +242.5919276535152, 41.43562021646732 +250.06664535601362, 52.235620216467325 +249.8354859357238, 52.33562021646732 +247.43548593572382, 52.33562021646732 +247.204326515434, 52.235620216467325 +243.19842299866093, 46.235620216467325 +242.17993038016823, 44.63562021646732 +241.63548593572386, 43.714323920171026 +241.43548593572382, 43.57345805430516 +241.2257844431865, 43.83562021646732 +240.89104149127934, 44.43562021646732 +239.65428292820502, 46.43562021646732 +235.80107035130823, 52.235620216467325 +235.63548593572386, 52.33562021646732 +233.03548593572384, 52.33562021646732 +232.81668894324264, 52.235620216467325 +UP +86.19227605918059, 47.235620216467325 +DOWN +86.19227605918059, 47.235620216467325 +85.8354859357238, 47.12538765832779 +85.43548593572382, 46.913630687671514 +85.08281926905715, 46.63562021646732 +84.55194935035797, 46.03562021646732 +84.03548593572384, 45.22862021646732 +83.8354859357238, 45.1307815067899 +83.79486093572382, 45.235620216467325 +83.79097374060188, 47.03562021646732 +83.6354859357238, 47.13562021646732 +82.03548593572384, 47.13562021646732 +81.8354859357238, 47.09703325994558 +81.76700108723895, 47.03562021646732 +81.76700108723895, 33.43562021646732 +81.8354859357238, 33.37420717298906 +82.03548593572384, 33.33562021646732 +83.8354859357238, 33.33562021646732 +84.03163978187763, 33.43562021646732 +84.03627333729861, 41.03562021646732 +84.17258270991738, 42.235620216467325 +84.36062254774566, 43.03562021646732 +84.58288477965448, 43.63562021646732 +84.8354859357238, 44.041552419857155 +85.03548593572384, 44.27548035632746 +85.6354859357238, 44.71122997256488 +86.03548593572384, 44.881074761921866 +86.43548593572382, 44.9332105779131 +87.23548593572383, 44.923285414705205 +87.43548593572382, 44.89155241985715 +87.6354859357238, 44.79302762387473 +88.03548593572384, 44.67624521646732 +88.23548593572383, 44.552705643603005 +88.43548593572382, 44.60408868493579 +89.13075220791313, 46.43562021646732 +89.08511556535342, 46.63562021646732 +89.03548593572384, 46.6777585812472 +88.6354859357238, 46.88968998390918 +88.03548593572384, 47.12415232655907 +87.43548593572382, 47.28292560568888 +87.03548593572384, 47.33562021646732 +86.6354859357238, 47.33024831564087 +86.19227605918059, 47.235620216467325 +UP +110.81783887690028, 47.235620216467325 +DOWN +110.81783887690028, 47.235620216467325 +110.23548593572383, 47.12255715340426 +109.6354859357238, 46.89770812855524 +109.23548593572383, 46.6777585812472 +108.43548593572382, 46.10043503128214 +107.97208724291335, 45.63562021646732 +107.6354859357238, 45.21907345387739 +107.50886255910041, 45.43562021646732 +107.50397078420866, 47.03562021646732 +107.43548593572382, 47.09703325994558 +107.23548593572383, 47.13562021646732 +105.6354859357238, 47.13562021646732 +105.50538389490748, 47.03562021646732 +105.50538389490748, 33.43562021646732 +105.6354859357238, 33.33562021646732 +107.6354859357238, 33.33562021646732 +107.76558797654013, 33.43562021646732 +107.76558797654013, 41.235620216467325 +107.83627333729862, 42.03562021646732 +107.97955373233401, 42.83562021646732 +108.23548593572383, 43.562364402513836 +108.51217305228823, 44.03562021646732 +108.84450232916646, 44.43562021646732 +109.43548593572382, 44.89925658010368 +109.6354859357238, 44.97353230437941 +109.8354859357238, 45.099981918594985 +110.43548593572382, 45.29627595417224 +111.43548593572382, 45.33562021646732 +111.8354859357238, 45.32075535160246 +112.03548593572384, 45.278212809059916 +112.43548593572382, 45.1265725974197 +112.8354859357238, 44.87215867800578 +113.08281926905715, 44.63562021646732 +113.31900866299657, 44.235620216467325 +113.4880870917932, 43.83562021646732 +113.57971670495459, 43.43562021646732 +113.67999813084577, 42.83562021646732 +113.67999813084577, 33.43562021646732 +113.8354859357238, 33.33562021646732 +115.8354859357238, 33.33562021646732 +115.96558797654012, 33.43562021646732 +115.96558797654012, 41.83562021646732 +115.99387102889153, 42.235620216467325 +116.16062254774567, 43.03562021646732 +116.38288477965443, 43.63562021646732 +116.6354859357238, 44.049441354678706 +116.96330050526024, 44.43562021646732 +117.23548593572383, 44.67624521646732 +117.8354859357238, 45.03794579786267 +118.43548593572382, 45.265620216467326 +118.8354859357238, 45.32847735932447 +119.43548593572382, 45.33562021646732 +120.03548593572384, 45.305518175650995 +120.6354859357238, 45.079178498675915 +120.99563631166365, 44.83562021646732 +121.23548593572383, 44.60149323234034 +121.51900866299655, 44.235620216467325 +121.6354859357238, 43.970805401652505 +121.73025337758429, 43.63562021646732 +121.83933208956995, 42.83562021646732 +121.83933208956995, 42.43562021646732 +121.87999813084576, 42.03562021646732 +121.87999813084576, 33.43562021646732 +122.03548593572384, 33.33562021646732 +123.8354859357238, 33.33562021646732 +124.03548593572384, 33.37420717298906 +124.10397078420868, 33.43562021646732 +124.09125516649306, 43.43562021646732 +123.88179466055601, 44.63562021646732 +123.66084825456437, 45.235620216467325 +123.31902252108966, 45.83562021646732 +123.03548593572384, 46.16343478600375 +122.43548593572382, 46.6777585812472 +122.03548593572384, 46.89770812855524 +121.43548593572382, 47.12334748919459 +120.6354859357238, 47.293953549800655 +120.23548593572383, 47.33562021646732 +119.6354859357238, 47.33562021646732 +119.23548593572383, 47.297782378629485 +118.8354859357238, 47.18217194060525 +118.43548593572382, 47.11833049684115 +117.8354859357238, 46.88968998390918 +117.43548593572382, 46.6777585812472 +116.6354859357238, 46.08192894129954 +116.37766280647213, 45.83562021646732 +115.8354859357238, 45.179650067213586 +115.6354859357238, 45.015197681256055 +115.1266809042773, 45.83562021646732 +114.78246580149562, 46.235620216467325 +114.23548593572383, 46.69130883922181 +113.8354859357238, 46.91087274171984 +113.23548593572383, 47.13042541127252 +112.43548593572382, 47.297782378629485 +112.03548593572384, 47.33562021646732 +111.43548593572382, 47.33562021646732 +111.03548593572384, 47.293953549800655 +110.81783887690028, 47.235620216467325 +UP +169.29852941398468, 47.235620216467325 +DOWN +169.29852941398468, 47.235620216467325 +168.43548593572382, 47.07624521646732 +168.23548593572383, 46.97728688313399 +167.8354859357238, 46.874227811404026 +167.03548593572384, 46.4938123068628 +166.43548593572382, 46.10171217049031 +165.91561015932632, 45.63562021646732 +165.54429096717035, 45.235620216467325 +165.1325097452476, 44.63562021646732 +164.81012361688323, 44.03562021646732 +164.57625026693404, 43.43562021646732 +164.3891772108916, 42.83562021646732 +164.18917721089161, 41.83562021646732 +164.1053838949075, 41.03562021646732 +164.07999813084575, 40.43562021646732 +164.1053838949075, 39.235620216467325 +164.17106875780973, 38.63562021646732 +164.42556227160168, 37.43562021646732 +164.79291836815628, 36.43562021646732 +165.00122020145807, 36.03562021646732 +165.40432651543398, 35.43562021646732 +165.74429096717034, 35.03562021646732 +166.43548593572382, 34.3785650017434 +167.03548593572384, 33.959209960057066 +167.23548593572383, 33.882005758636 +167.43548593572382, 33.753530664228514 +167.6354859357238, 33.69395354980065 +167.8354859357238, 33.57091433411438 +168.23548593572383, 33.46562021646732 +168.43548593572382, 33.371258514339665 +169.03548593572384, 33.28107476192187 +169.43548593572382, 33.181334502181606 +169.8354859357238, 33.143215153176186 +170.6354859357238, 33.13562021646732 +171.03548593572384, 33.17345805430516 +172.03548593572384, 33.36312021646732 +172.23548593572383, 33.45853688313399 +172.6354859357238, 33.577755047927994 +173.43548593572382, 33.99348185168745 +174.24450232916644, 34.63562021646732 +174.8354859357238, 35.29610408743506 +175.08106416701634, 35.63562021646732 +175.31217305228824, 36.03562021646732 +175.66975166998952, 36.83562021646732 +175.8568094651356, 37.43562021646732 +175.979553732334, 38.03562021646732 +175.8254859357238, 38.235620216467325 +175.6354859357238, 38.28990593075304 +174.6354859357238, 38.37271699066087 +174.03548593572384, 38.49925658010368 +173.8354859357238, 38.488221372536685 +173.77715260239052, 38.43562021646732 +173.6677227778291, 37.83562021646732 +173.47202439726226, 37.235620216467325 +173.30234640084007, 36.83562021646732 +173.05840260239052, 36.43562021646732 +172.8354859357238, 36.14145963252572 +172.51903856730274, 35.83562021646732 +172.23548593572383, 35.61907345387739 +171.8354859357238, 35.37728688313399 +171.23548593572383, 35.16248588810912 +170.6354859357238, 35.10417691749825 +170.03548593572384, 35.09778237862948 +169.23548593572383, 35.179688013077495 +169.03548593572384, 35.278212809059916 +168.6354859357238, 35.407917513764616 +168.03548593572384, 35.77274596497031 +167.73280137196542, 36.03562021646732 +167.36048593572383, 36.43562021646732 +166.99097374060187, 37.03562021646732 +166.81633699955358, 37.43562021646732 +166.58727165000954, 38.235620216467325 +166.39097374060185, 39.83562021646732 +166.39097374060185, 40.63562021646732 +166.43163978187766, 40.83562021646732 +166.46975166998953, 41.43562021646732 +166.5938710288915, 42.235620216467325 +166.76634307858097, 42.83562021646732 +166.9223122830292, 43.235620216467325 +167.23548593572383, 43.79580540165251 +167.58614383046063, 44.235620216467325 +167.8354859357238, 44.48496232173048 +168.43548593572382, 44.91634938313399 +168.8354859357238, 45.1147671358986 +169.43548593572382, 45.31062021646732 +170.03548593572384, 45.36706351543639 +170.6354859357238, 45.37345805430516 +171.23548593572383, 45.32127044068257 +171.43548593572382, 45.27624521646732 +171.6354859357238, 45.16634938313399 +171.8354859357238, 45.111229972564885 +172.23548593572383, 44.886497409449774 +172.43548593572382, 44.733308077739 +172.74429096717034, 44.43562021646732 +173.0699015201394, 44.03562021646732 +173.28808709179316, 43.63562021646732 +173.45463487189403, 43.235620216467325 +173.57419561314316, 42.83562021646732 +173.6354859357238, 42.78133450218161 +173.8354859357238, 42.77968801307749 +174.23548593572383, 42.88906849232939 +175.03548593572384, 42.96376091998491 +175.6354859357238, 43.10696853107406 +175.7606225477457, 43.235620216467325 +175.66975166998952, 43.63562021646732 +175.46084825456438, 44.235620216467325 +175.28106416701632, 44.63562021646732 +175.054282928205, 45.03562021646732 +174.9190225210897, 45.235620216467325 +174.40638145811187, 45.83562021646732 +173.94353962699898, 46.235620216467325 +173.6354859357238, 46.45240853763521 +173.23548593572383, 46.6938123068628 +172.8354859357238, 46.87723512329962 +172.43548593572382, 46.990165671012775 +172.23548593572383, 47.089905930753034 +171.6354859357238, 47.18217194060525 +171.23548593572383, 47.28990593075304 +170.6354859357238, 47.33562021646732 +170.03548593572384, 47.33562021646732 +169.43548593572382, 47.27524285797676 +169.29852941398468, 47.235620216467325 +UP +182.6082132084511, 47.235620216467325 +DOWN +182.6082132084511, 47.235620216467325 +181.8354859357238, 47.10812021646732 +181.43548593572382, 46.95533852632648 +181.23548593572383, 46.915717303845966 +180.6253007505386, 46.63562021646732 +180.03548593572384, 46.30967427052138 +179.43548593572382, 45.865901906608165 +179.03548593572384, 45.49901890927778 +178.34652888050908, 44.63562021646732 +178.01012361688322, 44.03562021646732 +177.7585162387541, 43.43562021646732 +177.56738777621462, 42.83562021646732 +177.36379918873587, 41.83562021646732 +177.2799981308458, 41.03562021646732 +177.2799981308458, 39.43562021646732 +177.36379918873587, 38.63562021646732 +177.62556227160167, 37.43562021646732 +177.8354859357238, 36.829209960057064 +178.01012361688322, 36.43562021646732 +178.35194935035798, 35.83562021646732 +178.80432651543396, 35.235620216467325 +179.23548593572383, 34.779699163835744 +179.64141813911363, 34.43562021646732 +180.03548593572384, 34.149523959782826 +180.6354859357238, 33.79676671328261 +181.23548593572383, 33.54708810637558 +181.43548593572382, 33.50875454482553 +181.8354859357238, 33.353294635071975 +182.23548593572383, 33.30938259270495 +182.8354859357238, 33.17345805430516 +183.23548593572383, 33.14099211729377 +184.03548593572384, 33.13562021646732 +184.43548593572382, 33.17345805430516 +185.03548593572384, 33.30417691749825 +185.43548593572382, 33.353294635071975 +185.8354859357238, 33.50485098569809 +186.03548593572384, 33.54708810637558 +186.63548593572386, 33.78895354980065 +187.03548593572384, 33.99348185168745 +187.63548593572386, 34.379256580103686 +187.95193330414486, 34.63562021646732 +188.3861438304607, 35.03562021646732 +188.89888462853423, 35.63562021646732 +189.2780535032914, 36.235620216467325 +189.47805350329133, 36.63562021646732 +189.69472160451357, 37.235620216467325 +189.89990311363795, 38.03562021646732 +190.09990311363788, 39.63562021646732 +190.10397078420863, 41.03562021646732 +190.0697516699895, 41.43562021646732 +189.9071726827118, 42.43562021646732 +189.68179466055608, 43.235620216467325 +189.23548593572377, 44.247078549800655 +188.8666453560137, 44.83562021646732 +188.3553617121213, 45.43562021646732 +187.63548593572386, 46.09198385283096 +187.03548593572384, 46.49447735932446 +186.8354859357238, 46.57271699066087 +186.63548593572386, 46.705620216467324 +186.43548593572382, 46.76572225728365 +186.23548593572377, 46.87723512329962 +185.8354859357238, 46.97728688313399 +185.63548593572386, 47.07821280905991 +185.43548593572382, 47.12961163277633 +185.03548593572384, 47.174964478762405 +184.63548593572386, 47.27524285797676 +184.03548593572384, 47.33562021646732 +183.23548593572383, 47.33024831564087 +182.8354859357238, 47.293953549800655 +182.6082132084511, 47.235620216467325 +UP +197.33288853312638, 47.235620216467325 +DOWN +197.33288853312638, 47.235620216467325 +196.8354859357238, 47.07422781140403 +196.23548593572377, 46.667535110084344 +195.8354859357238, 46.22179907825594 +195.40722506615862, 45.63562021646732 +195.23548593572377, 45.33958061250693 +195.03548593572384, 45.10733738818449 +194.94729149127943, 45.235620216467325 +194.9307522079132, 45.43562021646732 +194.9307522079132, 47.03562021646732 +194.8354859357238, 47.113024062621164 +194.63548593572386, 47.13562021646732 +193.03548593572384, 47.13562021646732 +192.90538389490746, 47.03562021646732 +192.90538389490746, 33.43562021646732 +193.03548593572384, 33.33562021646732 +195.03548593572384, 33.33562021646732 +195.1655879765401, 33.43562021646732 +195.1655879765401, 40.83562021646732 +195.19097374060186, 41.43562021646732 +195.3124556326935, 42.235620216467325 +195.43548593572382, 42.80538765832779 +195.56062254774565, 43.235620216467325 +195.8354859357238, 43.842223990052226 +196.13280137196546, 44.235620216467325 +196.43548593572382, 44.500914334114384 +196.8354859357238, 44.734231327578435 +197.23548593572377, 44.90211236306418 +197.63548593572386, 44.93482970263333 +198.43548593572382, 44.916461337962645 +199.03548593572384, 44.721270440682574 +199.43548593572382, 44.53182874727301 +199.57677625830445, 44.63562021646732 +199.66975166998952, 44.83562021646732 +200.26975166998955, 46.43562021646732 +200.20929545953334, 46.63562021646732 +199.8354859357238, 46.84812021646732 +199.23548593572377, 47.10885253969965 +198.8354859357238, 47.18831482724576 +198.63548593572386, 47.264479276870006 +198.23548593572377, 47.328025279758464 +197.8354859357238, 47.33562021646732 +197.43548593572382, 47.28292560568888 +197.33288853312638, 47.235620216467325 +UP +206.38163978187765, 47.235620216467325 +DOWN +206.38163978187765, 47.235620216467325 +205.63548593572386, 47.11183380870033 +205.23548593572377, 46.95704878789589 +205.03548593572384, 46.915717303845966 +204.42566450715242, 46.63562021646732 +203.8354859357238, 46.295503937397555 +203.26459041333578, 45.83562021646732 +202.63548593572386, 45.21882021646732 +202.204326515434, 44.63562021646732 +201.95879881915937, 44.235620216467325 +201.52096079605906, 43.235620216467325 +201.3891772108916, 42.83562021646732 +201.167001087239, 41.83562021646732 +201.03933208956994, 40.43562021646732 +201.03933208956994, 39.83562021646732 +201.12096079605897, 38.83562021646732 +201.20498948182308, 38.235620216467325 +201.40122020145805, 37.43562021646732 +201.61012361688324, 36.83562021646732 +202.00722506615864, 36.03562021646732 +202.40722506615862, 35.43562021646732 +202.95778323302113, 34.83562021646732 +203.23548593572377, 34.58148008907879 +204.03548593572384, 34.02302762387473 +204.43548593572382, 33.79676671328261 +205.03548593572384, 33.54789294374005 +205.23548593572377, 33.509382592704945 +205.63548593572386, 33.35940662423431 +206.23548593572377, 33.28107476192187 +206.63548593572386, 33.181334502181606 +207.23548593572377, 33.13562021646732 +208.03548593572384, 33.13562021646732 +208.43548593572382, 33.17345805430516 +209.03548593572384, 33.30417691749825 +209.43548593572382, 33.348683279530384 +210.23548593572377, 33.612703549800656 +211.03548593572384, 33.99348185168745 +211.8354859357238, 34.599068492329394 +212.0844221059366, 34.83562021646732 +212.72668090427726, 35.63562021646732 +213.08106416701628, 36.235620216467325 +213.2780535032914, 36.63562021646732 +213.55001107538862, 37.43562021646732 +213.43548593572382, 37.62543503128214 +213.23548593572377, 37.68292560568888 +212.8354859357238, 37.735620216467325 +212.03548593572384, 37.79016567101277 +211.43548593572382, 37.907479512949735 +211.23154892784976, 37.83562021646732 +210.87999813084582, 37.03562021646732 +210.63548593572386, 36.62968801307749 +210.3381704994822, 36.235620216467325 +209.8354859357238, 35.77032609882026 +209.23548593572377, 35.397012621530614 +208.63548593572386, 35.17345805430516 +208.43548593572382, 35.14459457544168 +207.43548593572382, 35.09778237862948 +206.63548593572386, 35.15477909497199 +206.03548593572384, 35.34996999225208 +205.63548593572386, 35.542449484760006 +205.23548593572377, 35.78562021646732 +204.8354859357238, 36.12681518502078 +204.36048593572377, 36.63562021646732 +203.99097374060182, 37.235620216467325 +203.73665552636714, 37.83562021646732 +203.5265573642953, 38.63562021646732 +203.39387102889157, 39.43562021646732 +203.3909737406019, 39.63562021646732 +203.43548593572382, 39.68013241158927 +203.63548593572386, 39.735620216467325 +213.43548593572382, 39.735620216467325 +213.67341697020663, 39.83562021646732 +213.70397078420865, 40.03562021646732 +213.66975166998952, 41.235620216467325 +213.49125516649303, 42.43562021646732 +213.2780535032914, 43.235620216467325 +213.12231228302926, 43.63562021646732 +212.8354859357238, 44.2473223441269 +212.48106416701637, 44.83562021646732 +211.78815260239048, 45.63562021646732 +211.03548593572384, 46.27495354980066 +210.23548593572377, 46.73607893206365 +209.8354859357238, 46.915717303845966 +209.63548593572386, 46.95704878789589 +209.23548593572377, 47.11183380870033 +208.8354859357238, 47.16376091998491 +208.23548593572377, 47.297782378629485 +207.8354859357238, 47.33562021646732 +207.03548593572384, 47.33562021646732 +206.63548593572386, 47.297782378629485 +206.38163978187765, 47.235620216467325 +UP +90.63933208956996, 47.03562021646732 +DOWN +90.63933208956996, 47.03562021646732 +90.63933208956996, 37.83562021646732 +90.67999813084577, 37.63562021646732 +90.68370022143807, 37.235620216467325 +90.78917721089158, 36.43562021646732 +90.9585162387541, 35.83562021646732 +91.21668894324262, 35.235620216467325 +91.60432651543397, 34.63562021646732 +92.03548593572384, 34.22416983478793 +92.43548593572382, 33.94485098569809 +93.03548593572384, 33.62312021646732 +93.43548593572382, 33.49155241985715 +93.6354859357238, 33.38133450218161 +94.23548593572383, 33.28107476192187 +94.6354859357238, 33.17345805430516 +95.03548593572384, 33.13562021646732 +95.6354859357238, 33.13562021646732 +96.03548593572384, 33.17728688313399 +96.43548593572382, 33.28906849232939 +96.8354859357238, 33.34789294374005 +97.43548593572382, 33.56036769121479 +97.6354859357238, 33.68562021646732 +97.8354859357238, 33.75841814392846 +98.23548593572383, 34.00636851578705 +98.6354859357238, 34.32470067623744 +99.6354859357238, 35.34605499907602 +99.72368038016828, 35.235620216467325 +99.74021966353445, 35.03562021646732 +99.74021966353445, 33.43562021646732 +99.8354859357238, 33.35821637031348 +100.03548593572384, 33.33562021646732 +101.6354859357238, 33.33562021646732 +101.76558797654013, 33.43562021646732 +101.76558797654013, 47.03562021646732 +101.6354859357238, 47.13562021646732 +99.6354859357238, 47.13562021646732 +99.47999813084573, 47.03562021646732 +99.47999813084573, 39.03562021646732 +99.32096079605901, 37.83562021646732 +99.27999813084574, 37.63562021646732 +99.07202439726228, 37.03562021646732 +98.71561015932627, 36.43562021646732 +98.53817049948219, 36.235620216467325 +98.03548593572384, 35.79701262153061 +97.6354859357238, 35.56123598001412 +97.43548593572382, 35.48968998390918 +97.23548593572383, 35.367744568798926 +96.8354859357238, 35.265620216467326 +96.6354859357238, 35.18217194060525 +96.23548593572383, 35.14055848807226 +95.6354859357238, 35.13562021646732 +95.03548593572384, 35.16572225728365 +94.43548593572382, 35.36706351543639 +94.03548593572384, 35.59701262153061 +93.55536171212134, 36.03562021646732 +93.41256926905714, 36.235620216467325 +93.19894747418533, 36.63562021646732 +93.01506340051253, 37.235620216467325 +92.93075220791314, 38.03562021646732 +92.90397078420864, 38.83562021646732 +92.90397078420864, 47.03562021646732 +92.8354859357238, 47.09703325994558 +92.6354859357238, 47.13562021646732 +90.8354859357238, 47.13562021646732 +90.63933208956996, 47.03562021646732 +UP +142.4799981308458, 47.03562021646732 +DOWN +142.4799981308458, 47.03562021646732 +142.4799981308458, 37.83562021646732 +142.5123676561539, 37.235620216467325 +142.5797167049546, 36.63562021646732 +142.78917721089158, 35.83562021646732 +142.94865958841842, 35.43562021646732 +143.15879881915941, 35.03562021646732 +143.4479859357238, 34.63562021646732 +143.86330548459603, 34.235620216467325 +144.23548593572383, 33.957609745263134 +145.03548593572384, 33.54585277460686 +145.23548593572383, 33.50211236306418 +145.43548593572382, 33.397012621530614 +145.6354859357238, 33.34162880015831 +146.03548593572384, 33.28906849232939 +146.43548593572382, 33.17728688313399 +146.8354859357238, 33.13562021646732 +147.43548593572382, 33.13562021646732 +147.8354859357238, 33.17345805430516 +148.8354859357238, 33.39302762387473 +149.6354859357238, 33.74799645409109 +150.03548593572384, 33.979931593712834 +150.5881526023905, 34.43562021646732 +151.43548593572382, 35.34287828098345 +151.54361601702465, 35.235620216467325 +151.56700108723896, 35.03562021646732 +151.56700108723896, 33.43562021646732 +151.6354859357238, 33.37420717298906 +151.8354859357238, 33.33562021646732 +153.43548593572382, 33.33562021646732 +153.59097374060184, 33.43562021646732 +153.59097374060184, 47.03562021646732 +153.43548593572382, 47.13562021646732 +151.43548593572382, 47.13562021646732 +151.3053838949075, 47.03562021646732 +151.3053838949075, 39.03562021646732 +151.2799981308458, 38.63562021646732 +151.1517509959648, 37.83562021646732 +151.05463487189405, 37.43562021646732 +150.90462879286667, 37.03562021646732 +150.684828040987, 36.63562021646732 +150.3650161370661, 36.235620216467325 +149.8354859357238, 35.77728688313399 +149.43548593572382, 35.54571637031348 +149.23548593572383, 35.47447371965204 +149.03548593572384, 35.35704878789589 +148.8354859357238, 35.31911078250506 +148.43548593572382, 35.174964478762405 +147.43548593572382, 35.13562021646732 +146.8354859357238, 35.17345805430516 +146.23548593572383, 35.37728688313399 +145.6354859357238, 35.78828688313399 +145.38614383046064, 36.03562021646732 +145.1307522079132, 36.43562021646732 +144.9519632084511, 36.83562021646732 +144.8568094651356, 37.235620216467325 +144.79097374060188, 37.63562021646732 +144.73075220791316, 38.83562021646732 +144.73075220791316, 47.03562021646732 +144.6354859357238, 47.113024062621164 +144.43548593572382, 47.13562021646732 +142.6354859357238, 47.13562021646732 +142.4799981308458, 47.03562021646732 +UP +132.6354859357238, 45.281074761921865 +DOWN +132.6354859357238, 45.281074761921865 +133.43548593572382, 45.37345805430516 +133.8354859357238, 45.37198385283096 +134.43548593572382, 45.30875454482553 +135.03548593572384, 45.08562021646732 +135.6354859357238, 44.70091433411438 +135.9288634191675, 44.43562021646732 +136.28482804098695, 44.03562021646732 +136.44082944717422, 43.83562021646732 +136.67999813084577, 43.43562021646732 +136.92096079605903, 42.83562021646732 +137.1384271121944, 42.03562021646732 +137.2799981308458, 40.83562021646732 +137.2799981308458, 39.63562021646732 +137.0771008425561, 38.235620216467325 +136.8354859357238, 37.50562021646732 +136.6354859357238, 37.06468998390918 +136.43548593572382, 36.73107476192187 +136.03548593572384, 36.22591872393001 +135.8354859357238, 36.03483896646732 +135.23548593572383, 35.5561465322568 +134.8354859357238, 35.35100483185194 +134.6354859357238, 35.29348538500665 +134.43548593572382, 35.19016567101278 +134.23548593572383, 35.146973928257715 +133.23548593572383, 35.09778237862948 +132.6354859357238, 35.15477909497199 +132.03548593572384, 35.36638944723656 +131.6354859357238, 35.59016567101278 +131.10058660686474, 36.03562021646732 +130.8354859357238, 36.31397842542255 +130.58614383046068, 36.63562021646732 +130.34769523804943, 37.03562021646732 +130.16634307858095, 37.43562021646732 +129.9500110753886, 38.235620216467325 +129.79097374060188, 39.43562021646732 +129.79097374060188, 41.03562021646732 +129.979553732334, 42.235620216467325 +130.16634307858095, 42.83562021646732 +130.56048593572382, 43.63562021646732 +131.03548593572384, 44.245321709004635 +131.46831036320475, 44.63562021646732 +131.8354859357238, 44.915093900677846 +132.23548593572383, 45.120235601082705 +132.43548593572382, 45.177755047927995 +132.6354859357238, 45.281074761921865 +UP +182.6354859357238, 45.293953549800655 +DOWN +182.6354859357238, 45.293953549800655 +183.43548593572382, 45.37345805430516 +184.03548593572384, 45.36706351543639 +184.63548593572386, 45.31062021646732 +185.23548593572377, 45.111229972564885 +185.7503007505386, 44.83562021646732 +186.23548593572377, 44.48496232173048 +186.63548593572386, 44.08664062463059 +187.03548593572384, 43.53165982042772 +187.30234640084007, 43.03562021646732 +187.4546348718941, 42.63562021646732 +187.64518742826112, 41.83562021646732 +187.7402196635345, 41.235620216467325 +187.767001087239, 40.83562021646732 +187.7402196635345, 39.43562021646732 +187.67710084255611, 38.83562021646732 +187.55175099596477, 38.235620216467325 +187.28808709179316, 37.43562021646732 +187.09499513817775, 37.03562021646732 +186.684828040987, 36.43562021646732 +186.23548593572377, 35.99576007660718 +185.63548593572386, 35.56001046036976 +185.23548593572377, 35.360010460369764 +184.63548593572386, 35.16062021646732 +183.8354859357238, 35.09778237862948 +182.8354859357238, 35.14553400957077 +182.6354859357238, 35.17728688313399 +182.43548593572382, 35.278212809059916 +182.03548593572384, 35.390165671012774 +181.6354859357238, 35.615197681256056 +181.31942754156324, 35.83562021646732 +180.8683326510523, 36.235620216467325 +180.3841872344251, 36.83562021646732 +180.15750974524764, 37.235620216467325 +179.98288477965446, 37.63562021646732 +179.7586042152937, 38.43562021646732 +179.59097374060184, 39.63562021646732 +179.59097374060184, 40.83562021646732 +179.7500110753886, 42.03562021646732 +179.98288477965446, 42.83562021646732 +180.1519632084511, 43.235620216467325 +180.37597673326985, 43.63562021646732 +180.8354859357238, 44.20149323234034 +181.0744565239591, 44.43562021646732 +181.43548593572382, 44.72445270377697 +182.03548593572384, 45.08107476192187 +182.43548593572382, 45.19302762387473 +182.6354859357238, 45.293953549800655 +UP +206.43548593572382, 45.305518175650995 +DOWN +206.43548593572382, 45.305518175650995 +207.23548593572377, 45.37345805430516 +207.8354859357238, 45.36706351543639 +208.43548593572382, 45.31646133796265 +209.03548593572384, 45.12127044068257 +209.43548593572382, 44.92657259741971 +209.8354859357238, 44.67422781140403 +210.23548593572377, 44.31574444006981 +210.48482804098694, 44.03562021646732 +210.64082944717416, 43.83562021646732 +210.86990152013936, 43.43562021646732 +211.14021966353448, 42.63562021646732 +211.2799981308458, 41.83562021646732 +211.23548593572377, 41.76802762387473 +211.03548593572384, 41.69778237862948 +203.8354859357238, 41.69778237862948 +203.63548593572386, 41.72142666808023 +203.53075220791322, 41.83562021646732 +203.55001107538862, 42.03562021646732 +203.6257844431865, 42.43562021646732 +203.7989474741854, 43.03562021646732 +203.99097374060182, 43.43562021646732 +204.3861438304607, 44.03562021646732 +204.8354859357238, 44.48496232173048 +205.43548593572382, 44.89925658010368 +205.8354859357238, 45.10417691749825 +206.43548593572382, 45.305518175650995 +UP diff --git a/UrumbotXY-Fall2022/code/examples/being.xy b/UrumbotXY-Fall2022/code/examples/being.xy new file mode 100644 index 0000000000000000000000000000000000000000..e3c062f323d3148941742a097f45f0a3cc38f642 --- /dev/null +++ b/UrumbotXY-Fall2022/code/examples/being.xy @@ -0,0 +1,736 @@ +64.50128784,115.1430298 +DOWN +63.6991394,114.5488403 +62.99569702,113.8438232 +62.0062561,113.8369995 +61.02735596,114.0431274 +60.04801636,114.246875 +60.16680298,113.5991333 +60.82615967,112.8468506 +61.51462402,112.1212402 +61.70858154,111.1842163 +61.66801758,110.184729 +61.54602661,109.1921875 +61.45678711,108.1972778 +61.42352905,107.1974243 +61.34185791,106.2015259 +61.27432861,105.2034058 +61.19049683,104.2065308 +60.96121216,103.2345276 +60.81772461,102.2454529 +60.58609619,101.2727966 +60.36594238,100.2995789 +60.14833984,99.32839966 +59.90574341,98.37460327 +59.74078979,97.39176025 +59.48048096,96.45043945 +59.22867432,95.48932495 +59.10870972,94.50062866 +58.94217529,93.51539307 +58.78334961,92.5401062 +58.70187378,91.59238281 +58.27241821,90.71746826 +57.93132935,89.80488892 +57.69803467,88.84338379 +57.32114868,87.92913818 +56.92855225,87.01851196 +56.45822754,86.13978271 +55.78312378,85.40495605 +55.2956665,84.59464111 +54.83184814,83.71542358 +54.25316772,82.91517944 +53.89766235,83.53178711 +53.79960938,84.52592773 +53.78209839,85.52525635 +53.83691406,86.52412109 +53.90066528,87.52154541 +53.93278809,88.52122192 +54.02285767,89.51696167 +54.06710815,90.51639404 +54.15552979,91.51205444 +54.23067017,92.50871582 +54.29088745,93.47800293 +54.34970703,94.47550659 +54.45175171,95.47056885 +54.34918823,96.45257568 +53.78954468,97.28157959 +53.20536499,98.09327393 +52.53023071,97.83944092 +52.29799805,96.86885376 +52.01047363,95.91092529 +51.7945282,94.9342041 +51.43877869,94.00385742 +51.25815125,93.0319397 +50.99374695,92.0706543 +50.73483276,91.10620728 +50.47553711,90.1413147 +50.22458801,89.17572632 +49.89829407,88.23164063 +49.70123291,87.25322266 +49.42381287,86.29447632 +49.21421204,85.31875 +48.83167725,84.39849243 +48.26104431,83.74507446 +48.15665283,84.73644409 +48.07641296,85.73330688 +47.97028198,86.72614746 +47.89754028,87.72391357 +47.8381012,88.7223877 +47.78776245,89.71807861 +47.17896423,89.50422363 +46.78980713,88.58792725 +46.49377136,87.63245239 +46.19282532,86.68282471 +45.97403259,85.71503906 +45.70950012,84.75301514 +45.39346008,83.80582886 +45.02994385,82.87388306 +44.69569092,81.9489502 +44.27583923,81.11505737 +43.84849854,81.8645813 +43.67518921,82.75004272 +43.32283936,83.68592529 +42.91621704,84.59980469 +42.51517944,85.5163208 +42.05328369,86.39960938 +41.52281494,85.80755615 +41.3053833,84.83299561 +41.14084473,83.84755859 +40.9813324,82.86434937 +40.92572937,81.865979 +40.81424255,80.87415161 +40.7544281,79.87583618 +40.70334473,78.87824097 +40.55293579,77.89370117 +39.63286133,77.92102661 +38.87147827,78.53738403 +38.2616333,79.33009033 +37.62339478,80.10038452 +36.98028259,80.86671143 +36.33774719,81.63349609 +35.69241943,82.39780884 +35.02651367,83.14298706 +34.32646484,83.85708008 +33.65128479,84.59529419 +32.99980164,85.35250244 +32.29576721,86.06315308 +31.62471008,86.80460205 +30.9239502,87.51856689 +30.23423462,88.24321899 +29.55631409,88.97888184 +28.88732605,89.72272949 +28.20385437,90.45322266 +27.55032806,91.21062012 +26.9730011,92.00631104 +27.25116882,92.96496582 +27.52415314,93.92669067 +27.82020264,94.88134155 +28.08822632,95.84483032 +28.34364624,96.81201782 +28.57809753,97.78457031 +28.83653564,98.75091553 +29.19003906,99.68637085 +29.58857117,100.6015869 +30.10218506,101.4596375 +30.62151794,102.3127136 +31.0849823,103.1974426 +31.53363953,104.0912537 +31.97104492,104.9908691 +32.36678467,105.9095825 +32.64717407,106.8642212 +32.53189087,107.8391113 +31.61553955,108.0844238 +31.45847473,109.0573242 +31.3326355,110.049585 +30.99040527,110.9766968 +30.553125,111.8462646 +29.9432312,112.6038818 +29.35355225,113.4099243 +28.3989563,113.6148438 +28.13988037,112.8656616 +28.42976074,111.9241211 +28.57087097,110.9373779 +28.07893677,110.7408569 +27.41442871,111.4871582 +26.75166473,112.2348267 +26.10766144,112.7311035 +25.2605072,113.2333008 +24.70575409,113.1097778 +25.0861145,112.2275513 +25.50958557,111.3232056 +25.93469238,110.4176514 +26.39616852,109.5302246 +26.8996048,108.6664551 +27.38750305,107.7959595 +27.89389343,106.9942383 +28.17566833,106.038147 +28.09808655,105.0412842 +27.74587708,104.109436 +27.19558258,103.2762878 +26.58288727,102.4856995 +26.05998383,101.6342346 +25.54515533,100.7767334 +25.18880005,99.84391479 +24.81599121,98.91605225 +24.55921783,97.95113525 +24.24908752,97.00457153 +24.00358124,96.03695679 +23.82232819,95.05369873 +23.61905518,94.07617188 +23.46439056,93.10234985 +23.17630615,92.15647583 +22.74612732,91.25810547 +22.37670288,90.36715088 +22.6754715,89.45881348 +23.11443329,88.56168823 +23.62662048,87.70388794 +24.17476501,86.87049561 +24.71786346,86.03056641 +25.25935059,85.19189453 +25.71808167,84.30687866 +26.25605927,83.4635437 +26.78301697,82.61891479 +27.4420105,81.87402344 +28.07306824,81.09881592 +28.67448425,80.30220337 +29.34551697,79.56051636 +30.0581543,78.86416626 +30.8280304,78.22576904 +31.65224915,77.65948486 +32.4861908,77.10874634 +33.28449402,76.50811768 +34.04795837,75.86426392 +34.73692322,75.13895264 +35.35122681,74.35263062 +36.02269592,73.61618042 +36.65030212,72.86160889 +36.83094482,72.0059082 +36.04460144,72.61928711 +35.23874512,73.21166992 +34.42591858,73.79464111 +33.5861969,74.33832397 +32.74507141,74.87818604 +31.8859314,75.39031372 +31.02217407,75.89369507 +30.13894043,76.36322632 +29.30050659,76.90738525 +28.3921814,77.32247925 +27.46295624,77.68967896 +26.49677429,77.94122925 +25.50984802,78.07926636 +24.51560059,78.18424683 +23.51884613,78.26623535 +22.54131165,78.14611816 +22.60717163,77.26677856 +23.46966095,76.76727905 +24.36018829,76.35358887 +25.26141052,75.92892456 +26.16875305,75.52853394 +27.00690155,75.08583374 +27.81263123,74.60770874 +28.5655426,73.96070557 +29.28020325,73.26118774 +30.05143127,72.63170166 +30.78927307,71.95682983 +31.50550842,71.25839233 +32.03083496,70.42026367 +32.50943909,69.54807129 +32.97476196,68.6647583 +33.4019989,67.76220093 +34.00897522,66.97391968 +34.72151184,66.27283325 +35.38710022,65.52862549 +36.11418152,64.84555054 +36.81974487,64.13643799 +37.51630859,63.41865234 +38.15610352,62.64992676 +38.81315002,61.92351074 +39.35105591,61.08222046 +39.8476532,60.23416748 +39.54293213,59.63196411 +38.72776794,59.89664917 +38.01474609,60.59387817 +37.30214233,61.29469604 +36.62177429,62.0281311 +35.90565796,62.72404175 +35.17427979,63.40663452 +34.41975708,64.06276245 +33.62666321,64.67251587 +32.84589539,65.29795532 +32.04181519,65.89302979 +31.25826721,66.51468506 +30.42625427,67.06680908 +29.61697693,67.65446777 +28.77883911,68.2003418 +27.91491089,68.70456543 +27.03266907,69.1737915 +26.10440674,69.53449097 +25.12462769,69.71951294 +24.18992157,69.90058594 +23.21216125,70.0644043 +22.26988831,70.01375122 +22.51332703,69.10777588 +22.81926117,68.1890625 +23.6194458,67.59603271 +24.34616547,67.01174316 +25.05149536,66.30692139 +25.81925354,65.69363403 +26.48847809,64.95780029 +26.95936584,64.0826416 +27.50442352,63.29984131 +28.15930786,62.59887695 +28.59685669,61.7111145 +29.11990967,60.85963745 +29.7561676,60.09025879 +30.47436523,59.3949707 +31.26805115,58.78618164 +32.02887573,58.13839722 +32.84619141,57.56416016 +33.63538818,56.95020142 +34.47345886,56.40446167 +35.341922,55.91310425 +36.16246338,55.38922119 +36.52108154,54.49335327 +36.45716858,53.49643555 +35.81607056,52.9803772 +34.90424194,53.30911865 +34.15867004,53.97606201 +33.36493225,54.584021 +32.4949585,55.07190552 +31.59289856,55.50288696 +30.69635925,55.94522705 +29.83986511,56.46154175 +29.02655945,57.04404297 +28.24884644,57.67235107 +27.46403656,58.29254761 +26.73475189,58.97720337 +26.02873993,59.68594971 +25.35908966,60.42865601 +24.72191162,61.19987183 +24.08712311,61.9729126 +23.46205139,62.75154419 +22.9005127,63.57352905 +22.40175323,63.10587769 +22.38907928,62.11312256 +22.54971771,61.20678101 +22.7940033,60.26203613 +23.19672394,59.36389771 +23.57086029,58.60958252 +23.73510895,57.73049927 +24.14798584,56.82654419 +24.56491089,55.92017822 +24.96439819,55.00336304 +25.44611359,54.15198975 +25.83025208,53.23826904 +26.3738205,52.40143433 +27.03322449,51.65008545 +27.6913269,50.89916077 +28.3892334,50.18262024 +29.12385254,49.50463257 +29.86109009,48.82915649 +30.61520081,48.17405701 +31.34407349,47.5138031 +32.05834656,46.81433105 +32.68956909,46.04024963 +33.31107483,45.26021118 +32.80792847,45.02742615 +31.92055054,45.48772278 +31.07371216,46.02034607 +30.24257507,46.57677307 +29.41624756,47.13933411 +28.59294434,47.70675964 +27.70643005,48.16990051 +26.84459076,48.63384399 +25.87325287,48.84850464 +24.87524567,48.85864563 +23.97325745,48.52232666 +24.56106262,47.75804138 +25.27369537,47.05591736 +26.00928955,46.37868042 +26.74334259,45.69921265 +27.49539642,45.04057007 +28.22887573,44.36023865 +28.96870728,43.68683472 +29.68586731,42.98938599 +30.40664368,42.29573975 +31.1454071,41.62132263 +31.86993103,40.93144531 +32.58844604,40.23533936 +33.30024109,39.5323822 +33.98462219,38.80578308 +34.63347473,38.04770508 +35.25845032,37.28939514 +35.78104858,36.44056702 +36.11394958,35.50867004 +35.26873474,35.83029785 +34.40450439,36.33423767 +33.55682373,36.86531982 +32.70530701,37.39034729 +31.8318512,37.87516479 +30.97536316,38.38858948 +30.07511902,38.8203125 +29.15890503,39.21163635 +28.20378418,39.50728149 +27.23683472,39.7627655 +26.26804047,40.00530701 +25.27837982,40.11933899 +24.28397675,40.21560669 +23.2854599,40.27635193 +22.31923676,40.19350586 +22.87122803,39.4428772 +23.58669739,38.74598694 +24.36057129,38.11216125 +25.20892334,37.58631897 +25.97357788,36.94560852 +26.72458496,36.28701782 +27.40371399,35.55411072 +28.08622131,34.83447571 +28.82341309,34.16934204 +29.47060852,33.41864014 +30.10231018,32.6454071 +30.46793518,31.80983887 +31.18381958,31.11134338 +31.84543457,30.36192932 +32.47244263,29.58389893 +33.06944885,28.78137817 +33.57307129,27.94152832 +33.92545776,27.01063385 +34.23526611,26.06046753 +34.29935608,25.13117371 +33.88875122,24.25080872 +33.48586426,23.37512054 +32.90020447,24.16507111 +32.50100403,25.08184814 +32.1490448,26.01821442 +31.82384033,26.96427917 +31.49719849,27.90981445 +31.20436707,28.86638184 +30.90411377,29.8196228 +30.45924683,30.71497192 +29.92118835,31.55806885 +29.36129456,32.3870697 +28.77271423,33.19595337 +28.15458069,33.98241882 +27.46299133,34.7048584 +26.72663727,35.38189392 +25.95018616,36.01227722 +25.14023132,36.5914856 +24.24519348,37.03829651 +23.32791595,37.43439026 +22.36890564,37.55603027 +22.52865906,36.64354248 +22.82745056,35.69120178 +23.17710266,34.75410156 +23.51740112,33.82228088 +23.90823059,32.91967468 +24.20722656,31.97437439 +24.54826965,31.03594971 +24.91146545,30.10696411 +25.23929291,29.16186523 +25.60879974,28.23296204 +25.93885956,27.29014282 +26.24554749,26.34046478 +26.50753479,25.37903595 +26.74814911,24.40928192 +26.98921661,23.43914795 +27.17551422,22.464534 +27.29458923,21.47464142 +27.32493591,20.47469482 +27.4442276,19.48865662 +27.55434265,18.49681091 +27.74612732,17.52274933 +28.11793213,16.59474182 +28.4940979,15.67023773 +28.9997467,14.80976105 +29.55621948,13.98292999 +30.14556885,13.18134384 +30.68276367,12.3641571 +31.54458923,11.85689545 +32.43497009,11.40085526 +33.34021606,10.97546616 +34.25748596,10.57736816 +35.17580872,10.19039078 +36.12718811,9.881942749 +37.10940552,9.717469025 +38.10978699,9.706604767 +39.11012573,9.695741272 +40.1105072,9.68487854 +41.0930481,9.812935638 +42.08390808,9.923117065 +43.07149658,10.01701202 +43.99197083,10.39595947 +44.89272766,10.82921219 +45.77586365,11.29762115 +46.67695618,11.70850067 +47.57138062,12.1566246 +48.45645752,12.62288055 +49.32690735,13.1155014 +50.21968689,13.56497269 +51.08359985,14.0682457 +51.927771,14.59518356 +52.76877747,15.13371277 +53.60957642,15.6633728 +54.43355103,16.22888489 +55.249646,16.79940338 +56.05394897,17.38857117 +56.86593628,17.9707962 +57.63665161,18.60841522 +58.39249878,19.26152802 +59.07349854,19.99380341 +59.65407104,20.80813599 +60.15739136,21.66878204 +60.56364136,22.58183136 +60.92749634,23.51332855 +61.31062012,24.43666534 +61.67876587,25.36684875 +62.05726929,26.29291687 +62.42781372,27.22215271 +62.80477295,28.14885864 +63.19865723,29.06805115 +63.64656372,29.96096802 +64.12016602,30.84148865 +64.6114563,31.7111145 +65.14447632,32.5532959 +65.16328125,33.31987305 +64.20991821,33.04107361 +63.28517456,32.66044922 +62.43227539,32.14008484 +61.62719116,31.54728699 +60.8800293,30.88216553 +60.14105225,30.20776367 +59.41013794,29.52466736 +58.67630615,28.84482422 +57.94868774,28.15813599 +57.20007935,27.49472351 +56.42722168,26.85966339 +55.6878479,26.19399872 +55.1,25.38468781 +54.49730835,24.58618622 +53.84146118,23.83217163 +53.07158508,23.21938477 +52.91525574,24.07128906 +53.18032837,25.03582611 +53.47782593,25.99039612 +53.77420044,26.94496765 +54.23812256,27.81721191 +54.49962769,28.76798401 +54.98161011,29.63736267 +55.56566162,30.44895325 +56.20646973,31.2171814 +56.87104492,31.96488342 +57.5586853,32.69141235 +58.21480103,33.44456177 +58.92403564,34.14891357 +59.60904541,34.87632751 +60.32045288,35.5796051 +61.06152344,36.25053406 +61.75761108,36.96886597 +62.5140625,37.62192993 +63.28933716,38.14004822 +63.93108521,38.82395325 +64.66065674,39.46896667 +64.34799194,40.04055176 +63.46174316,39.61708069 +62.53521118,39.25101318 +61.61195679,38.86594543 +60.69137573,38.47438965 +59.79949341,38.02519226 +58.89349976,37.60183411 +58.0062561,37.13963318 +57.11181641,36.69160461 +56.22340088,36.23162537 +55.35316162,35.73947449 +54.53835449,35.16733704 +53.70719604,34.61381531 +53.13395996,35.06647644 +53.01624146,36.05874634 +53.37687988,36.97841187 +53.96847534,37.78434448 +54.60976563,38.55215759 +55.3149353,39.26047668 +56.07545776,39.91025391 +56.87332764,40.51363831 +57.67979126,41.10555725 +58.50073853,41.67680969 +59.39102173,42.11292419 +60.15262451,42.74360046 +60.83382568,43.40693665 +59.94019775,43.60545654 +58.94642334,43.49115295 +57.95980225,43.33405457 +57.0322998,42.98474426 +56.18978882,42.46007385 +55.33956299,41.99437561 +54.44623413,41.56434937 +53.70286865,41.70678711 +54.02023315,42.64222107 +54.50476074,43.51513977 +55.04279175,44.35849915 +55.63676147,45.16271973 +56.30856934,45.90370483 +57.0397583,46.58587036 +57.79540405,47.24141846 +58.58707275,47.85279236 +59.38209839,48.45895691 +60.19324341,49.04233093 +60.89212036,49.69653931 +60.00186157,49.86534729 +59.10185547,49.44376526 +58.17828979,49.0598999 +57.27293091,48.64014282 +56.35081177,48.25352783 +55.45922852,47.80078735 +54.54320679,47.4034668 +53.66664429,46.92349548 +52.76079407,46.52183228 +51.8446167,46.15584106 +51.54939575,46.91057434 +52.07667236,47.75849915 +52.66876831,48.5646637 +53.28720093,49.34998779 +53.86817017,50.15715332 +54.54760132,50.89136658 +55.21908569,51.63299255 +55.89552612,52.37002258 +56.58051147,53.09906616 +57.31044312,53.78248901 +58.21055298,54.19724121 +59.13309937,54.57341309 +60.0453186,54.98106079 +60.97143555,55.35524902 +61.852948,55.82141113 +62.78208008,56.18509521 +63.69869385,56.58374023 +64.60892334,56.99659424 +65.46287231,57.48205566 +65.2362915,58.30805054 +64.31898193,58.13190918 +63.3211853,58.07067871 +62.32097778,58.05192871 +61.32058716,58.0399292 +60.32032471,58.04522095 +59.32023926,58.07182007 +58.32265625,58.13671875 +57.34361572,58.3175415 +56.62301636,58.95678711 +56.36546631,59.88009033 +56.60216064,60.84653931 +57.02113647,61.75367432 +57.44741211,62.65723267 +57.84521484,63.5742981 +58.27296753,64.47846069 +58.74888306,65.35772095 +59.16928711,66.25494995 +59.5942749,67.16054688 +60.05074463,68.05082397 +60.44717407,68.96702271 +60.87664185,69.87044067 +61.26028442,70.79274902 +61.63946533,71.7178894 +62.03635254,72.63579102 +62.3614502,73.58147583 +62.70595703,74.51900635 +63.03070679,75.46503906 +63.32089844,76.42237549 +63.64190063,77.36344604 +63.91520996,78.3229187 +64.19781494,79.28236084 +64.40303345,80.26040039 +64.42802734,81.26029053 +64.56242676,82.25102539 +64.75214233,83.23317261 +64.79188843,84.21501465 +63.87487183,84.21884766 +63.32279053,83.39643555 +62.92930908,82.4960083 +62.54445801,81.60299683 +62.15499878,80.68221436 +61.79046631,79.75666504 +61.32366943,78.87199097 +60.83338013,78.00197144 +60.34561157,77.12874756 +59.79111328,76.30029907 +59.26714478,75.44942627 +58.74321289,74.59789429 +58.30728149,73.69862061 +57.94348145,72.76786499 +57.51834717,71.86253662 +57.12093506,70.94507446 +56.728125,70.07206421 +56.69227905,71.05571899 +56.72126465,72.05571289 +56.80861816,73.05010986 +56.93699341,74.04094238 +57.16905518,75.00616455 +57.56276855,75.9255249 +57.99065552,76.82983398 +58.41623535,77.7348877 +58.84806519,78.63731689 +59.25881348,79.54943848 +59.66802368,80.46229248 +60.08279419,81.3723999 +60.49631958,82.28323364 +60.8800293,83.2069458 +61.3020813,84.11378784 +61.71734619,85.02380981 +62.12592163,85.93695679 +62.52728882,86.85305786 +62.90368652,87.77915649 +63.36265869,88.59055786 +63.59575806,89.5236145 +63.98897705,90.44326172 +64.33167725,91.38300781 +64.67717285,92.321521 +65.10473022,93.20204468 +65.21282959,94.11256714 +65.4789978,95.07664795 +65.48131714,96.07679443 +65.48787842,97.07713013 +65.56401978,98.07398071 +65.49071045,99.06842041 +65.48108521,100.06875 +65.56762695,100.9447021 +65.69934692,101.9246094 +65.49084473,102.8921875 +65.48189087,103.892511 +65.48092041,104.8929688 +65.49387817,105.8932373 +65.6003479,106.8870117 +65.66570435,107.8832031 +65.61110229,108.8820313 +65.57922363,109.8819702 +65.46995239,110.8747437 +65.50722656,111.8652954 +65.53835449,112.8163208 +65.49156494,113.8152344 +65.35814209,114.8029541 +64.68912964,115.2568604 +UP +42.25263977,23.19663086 +DOWN +41.52297974,22.7256546 +41.14078369,23.46480865 +39.8184021,23.52593689 +40.19893188,22.70548553 +39.42129822,22.13331909 +38.76174927,22.67233582 +39.30678711,23.48404999 +UP +44.03705444,22.99941864 +DOWN +43.79431458,22.11143799 +42.95405273,22.15094147 +42.99226685,23.07894745 +UP +38.13984985,18.51739349 +DOWN +38.14954224,17.62409363 +37.27527771,17.3182312 +36.85164185,18.1357254 +37.58720398,18.72620239 +UP +44.71483765,17.25964355 +DOWN +44.46679688,16.35887756 +43.63834839,16.59822083 +43.61328735,17.51537018 diff --git a/UrumbotXY-Fall2022/code/examples/being_flipped.xy b/UrumbotXY-Fall2022/code/examples/being_flipped.xy new file mode 100644 index 0000000000000000000000000000000000000000..c36adf08ff154f6dfc40beac1d11ff45117a4410 --- /dev/null +++ b/UrumbotXY-Fall2022/code/examples/being_flipped.xy @@ -0,0 +1,736 @@ +15.498712159999997, -55.143029799999994 +DOWN +16.3008606, -54.548840299999995 +17.00430298, -53.8438232 +17.9937439, -53.836999500000005 +18.97264404, -54.0431274 +19.95198364, -54.246875 +19.83319702, -53.599133300000005 +19.173840329999997, -52.846850599999996 +18.48537598, -52.1212402 +18.291418460000003, -51.1842163 +18.331982420000003, -50.184729000000004 +18.45397339, -49.1921875 +18.54321289, -48.197277799999995 +18.57647095, -47.197424299999994 +18.65814209, -46.20152589999999 +18.725671390000002, -45.2034058 +18.80950317, -44.206530799999996 +19.038787839999998, -43.23452760000001 +19.18227539, -42.245452900000004 +19.41390381, -41.27279660000001 +19.63405762, -40.2995789 +19.85166016, -39.32839966 +20.09425659, -38.374603269999994 +20.25921021, -37.391760250000004 +20.51951904, -36.450439450000005 +20.771325679999997, -35.48932495 +20.89129028, -34.500628660000004 +21.05782471, -33.51539307 +21.216650389999998, -32.5401062 +21.29812622, -31.592382810000004 +21.727581790000002, -30.717468260000004 +22.06867065, -29.804888919999996 +22.30196533, -28.843383790000004 +22.67885132, -27.929138179999995 +23.071447749999997, -27.018511959999998 +23.541772459999997, -26.139782710000006 +24.216876220000003, -25.404956049999996 +24.704333499999997, -24.594641109999998 +25.168151860000002, -23.715423580000007 +25.74683228, -22.915179440000003 +26.102337650000003, -23.531787109999996 +26.20039062, -24.525927730000006 +26.21790161, -25.525256350000006 +26.163085940000002, -26.524121089999994 +26.09933472, -27.52154541 +26.067211909999997, -28.521221920000002 +25.97714233, -29.51696167 +25.932891849999997, -30.516394039999994 +25.844470209999997, -31.51205444 +25.769329829999997, -32.508715820000006 +25.70911255, -33.47800293 +25.650292970000002, -34.475506589999995 +25.548248289999997, -35.47056885000001 +25.650811769999997, -36.452575679999995 +26.21045532, -37.28157959000001 +26.79463501, -38.093273929999995 +27.469769290000002, -37.83944092 +27.702001950000003, -36.86885375999999 +27.98952637, -35.910925289999994 +28.205471799999998, -34.9342041 +28.56122131, -34.00385742 +28.741848750000003, -33.031939699999995 +29.006253049999998, -32.0706543 +29.265167239999997, -31.106207280000007 +29.524462890000002, -30.141314699999995 +29.775411990000002, -29.175726319999995 +30.10170593, -28.23164063 +30.29876709, -27.253222660000006 +30.57618713, -26.29447632 +30.78578796, -25.318749999999994 +31.16832275, -24.398492430000005 +31.738955689999997, -23.745074459999998 +31.84334717, -24.736444090000006 +31.92358704, -25.73330688 +32.02971802, -26.726147460000007 +32.10245972, -27.723913569999993 +32.1618988, -28.7223877 +32.21223755, -29.718078610000006 +32.82103577, -29.50422363 +33.21019287, -28.587927250000007 +33.50622864, -27.632452389999997 +33.80717468, -26.682824710000006 +34.02596741, -25.715039059999995 +34.29049988, -24.753015140000002 +34.60653992, -23.805828860000005 +34.97005615, -22.873883059999997 +35.30430908, -21.9489502 +35.72416077, -21.115057370000002 +36.15150146, -21.864581299999998 +36.32481079, -22.750042719999996 +36.67716064, -23.68592529 +37.08378296, -24.59980469 +37.48482056, -25.516320800000003 +37.94671631, -26.39960938 +38.47718506, -25.807556149999996 +38.6946167, -24.832995609999998 +38.85915527, -23.847558590000006 +39.0186676, -22.86434937 +39.07427063, -21.865978999999996 +39.18575745, -20.87415161 +39.2455719, -19.875836179999993 +39.29665527, -18.878240969999993 +39.44706421, -17.89370117 +40.36713867, -17.92102661 +41.12852173, -18.53738403 +41.7383667, -19.330090330000004 +42.37660522, -20.100384520000006 +43.01971741, -20.866711429999995 +43.66225281, -21.633496089999994 +44.30758057, -22.397808839999996 +44.97348633, -23.142987059999996 +45.67353516, -23.857080080000003 +46.34871521, -24.595294190000004 +47.00019836, -25.352502439999995 +47.70423279, -26.063153080000006 +48.37528992, -26.80460205 +49.0760498, -27.518566890000002 +49.765765380000005, -28.243218990000003 +50.44368591, -28.97888184 +51.11267395, -29.722729490000006 +51.79614563, -30.453222659999994 +52.44967194, -31.21062012 +53.026998899999995, -32.00631104 +52.748831179999996, -32.96496582 +52.475846860000004, -33.92669067 +52.179797359999995, -34.88134155 +51.911773679999996, -35.84483032 +51.65635376, -36.812017819999994 +51.42190247, -37.78457031000001 +51.16346436, -38.75091553 +50.809960939999996, -39.68637085 +50.41142883, -40.6015869 +49.89781494, -41.4596375 +49.378482059999996, -42.312713599999995 +48.9150177, -43.1974426 +48.46636047, -44.091253699999996 +48.02895508, -44.9908691 +47.63321533, -45.9095825 +47.35282593, -46.8642212 +47.46810913, -47.8391113 +48.38446045, -48.084423799999996 +48.54152527, -49.0573242 +48.667364500000005, -50.04958499999999 +49.00959473, -50.9766968 +49.446875, -51.8462646 +50.0567688, -52.603881799999996 +50.64644775, -53.4099243 +51.601043700000005, -53.6148438 +51.86011963, -52.865661599999996 +51.57023926, -51.924121099999994 +51.42912903, -50.9373779 +51.92106323, -50.7408569 +52.585571290000004, -51.487158199999996 +53.24833527, -52.2348267 +53.89233856, -52.7311035 +54.7394928, -53.233300799999995 +55.29424591, -53.1097778 +54.9138855, -52.2275513 +54.49041443, -51.323205599999994 +54.06530762, -50.4176514 +53.60383148, -49.5302246 +53.1003952, -48.66645509999999 +52.61249695, -47.795959499999995 +52.10610657, -46.994238300000006 +51.82433167, -46.038146999999995 +51.901913449999995, -45.04128420000001 +52.25412292, -44.109436 +52.80441742, -43.276287800000006 +53.41711273, -42.485699499999996 +53.94001617, -41.6342346 +54.45484467, -40.7767334 +54.81119995, -39.84391479 +55.18400879, -38.91605225000001 +55.44078217, -37.95113524999999 +55.75091248, -37.00457153000001 +55.99641876, -36.036956790000005 +56.17767181, -35.053698729999994 +56.380944819999996, -34.076171880000004 +56.53560944, -33.102349849999996 +56.82369385, -32.156475830000005 +57.25387268, -31.258105470000004 +57.623297120000004, -30.367150879999997 +57.3245285, -29.458813480000003 +56.88556671, -28.56168823 +56.37337952, -27.70388794 +55.82523499, -26.870495610000006 +55.282136539999996, -26.030566410000006 +54.74064941, -25.19189453 +54.281918329999996, -24.306878659999995 +53.74394073, -23.463543700000002 +53.21698303, -22.618914790000005 +52.557989500000005, -21.874023440000002 +51.92693176, -21.098815920000007 +51.32551575, -20.30220337 +50.65448303, -19.560516359999994 +49.9418457, -18.864166260000005 +49.1719696, -18.225769040000003 +48.34775085, -17.659484860000006 +47.5138092, -17.108746339999996 +46.71550598, -16.508117679999998 +45.95204163, -15.864263919999999 +45.26307678, -15.13895264 +44.64877319, -14.35263062 +43.97730408, -13.616180420000006 +43.34969788, -12.86160889 +43.16905518, -12.005908199999993 +43.95539856, -12.619287110000002 +44.76125488, -13.211669920000006 +45.57408142, -13.79464111 +46.4138031, -14.338323970000005 +47.25492859, -14.878186040000003 +48.114068599999996, -15.390313719999995 +48.97782593, -15.893695070000007 +49.861059569999995, -16.363226319999995 +50.69949341, -16.907385250000004 +51.6078186, -17.32247925 +52.53704376, -17.689678959999995 +53.503225709999995, -17.941229250000006 +54.49015198, -18.079266360000005 +55.48439941, -18.184246830000006 +56.48115387, -18.266235350000002 +57.45868835, -18.14611816 +57.392828370000004, -17.266778560000006 +56.530339049999995, -16.76727905 +55.639811710000004, -16.353588869999996 +54.73858948, -15.928924559999999 +53.83124695, -15.528533940000003 +52.993098450000005, -15.085833739999998 +52.18736877, -14.607708740000007 +51.4344574, -13.960705570000002 +50.71979675, -13.261187739999997 +49.948568730000005, -12.631701660000004 +49.21072693, -11.956829830000004 +48.49449158, -11.258392330000007 +47.96916504, -10.420263669999997 +47.49056091, -9.548071289999996 +47.02523804, -8.664758300000003 +46.5980011, -7.762200930000006 +45.99102478, -6.9739196799999945 +45.27848816, -6.272833250000005 +44.61289978, -5.528625489999996 +43.88581848, -4.845550540000005 +43.18025513, -4.136437990000005 +42.48369141, -3.4186523400000013 +41.84389648, -2.6499267599999996 +41.18684998, -1.9235107399999976 +40.64894409, -1.082220460000002 +40.1523468, -0.23416748000000354 +40.45706787, 0.3680358900000016 +41.27223206, 0.10335082999999656 +41.98525391, -0.5938781700000035 +42.69785767, -1.294696039999998 +43.37822571, -2.028131100000003 +44.09434204, -2.724041749999998 +44.82572021, -3.4066345199999972 +45.58024292, -4.062762449999994 +46.37333679, -4.672515869999998 +47.15410461, -5.29795532 +47.95818481, -5.89302979 +48.74173279, -6.514685060000005 +49.57374573, -7.066809079999999 +50.38302307, -7.654467769999997 +51.22116089, -8.200341800000004 +52.08508911, -8.704565430000002 +52.96733093, -9.173791499999993 +53.89559326, -9.534490969999993 +54.87537231, -9.719512940000001 +55.810078430000004, -9.90058594 +56.78783875, -10.064404300000007 +57.73011169, -10.013751220000003 +57.48667297, -9.107775880000005 +57.180738829999996, -8.189062500000006 +56.3805542, -7.596032710000003 +55.65383453, -7.011743159999995 +54.948504639999996, -6.306921389999999 +54.18074646, -5.693634029999998 +53.51152191, -4.9578002899999944 +53.040634159999996, -4.082641600000002 +52.49557648, -3.299841309999998 +51.84069214, -2.5988769499999975 +51.403143310000004, -1.7111145000000008 +50.88009033, -0.859637450000001 +50.2438324, -0.09025879000000003 +49.525634769999996, 0.6050292999999982 +48.731948849999995, 1.2138183599999977 +47.97112427, 1.8616027799999983 +47.15380859, 2.43583984 +46.36461182, 3.049798580000001 +45.52654114, 3.5955383299999966 +44.658078, 4.0868957499999965 +43.83753662, 4.610778809999999 +43.47891846, 5.50664673 +43.54283142, 6.503564449999999 +44.18392944, 7.0196228000000005 +45.09575806, 6.690881349999998 +45.84132996, 6.02393799 +46.63506775, 5.415979 +47.5050415, 4.928094479999999 +48.407101440000005, 4.497113040000002 +49.30364075, 4.05477295 +50.160134889999995, 3.538458249999998 +50.97344055, 2.9559570300000004 +51.75115356, 2.3276489300000023 +52.53596344, 1.7074523900000003 +53.26524811, 1.022796630000002 +53.97126007, 0.3140502899999973 +54.640910340000005, -0.4286560099999974 +55.27808838, -1.1998718299999993 +55.91287689, -1.9729126000000008 +56.53794861, -2.751544189999997 +57.0994873, -3.5735290499999977 +57.59824677, -3.10587769 +57.610920719999996, -2.1131225600000008 +57.450282290000004, -1.2067810100000003 +57.2059967, -0.2620361299999985 +56.80327606, 0.6361022899999966 +56.42913971, 1.3904174800000035 +56.26489105, 2.269500729999997 +55.852014159999996, 3.17345581 +55.43508911, 4.079821780000003 +55.03560181, 4.9966369599999965 +54.553886410000004, 5.8480102500000015 +54.16974792, 6.761730960000001 +53.6261795, 7.598565669999999 +52.966775510000005, 8.349914550000001 +52.3086731, 9.100839229999998 +51.610766600000005, 9.817379760000001 +50.87614746, 10.495367430000002 +50.138909909999995, 11.170843509999997 +49.384799189999995, 11.825942990000001 +48.65592651, 12.486196900000003 +47.94165344, 13.18566895 +47.31043091, 13.959750370000002 +46.68892517, 14.739788820000001 +47.19207153, 14.972573850000003 +48.07944946, 14.512277220000001 +48.92628784, 13.979653929999998 +49.75742493, 13.423226929999998 +50.58375244, 12.86066589 +51.40705566, 12.293240359999999 +52.29356995, 11.830099490000002 +53.15540924, 11.366156009999997 +54.12674713, 11.151495359999998 +55.12475433, 11.141354370000002 +56.02674255, 11.477673340000003 +55.43893738, 12.241958619999998 +54.72630463, 12.944082639999998 +53.99071045, 13.621319579999998 +53.25665741, 14.30078735 +52.50460358, 14.959429929999999 +51.77112427, 15.63976135 +51.031292719999996, 16.31316528 +50.31413269, 17.010614009999998 +49.59335632, 17.704260249999997 +48.8545929, 18.37867737 +48.130068969999996, 19.06855469 +47.41155396, 19.764660640000002 +46.69975891, 20.4676178 +46.01537781, 21.194216920000002 +45.36652527, 21.95229492 +44.74154968, 22.710604859999997 +44.21895142, 23.559432979999997 +43.88605042, 24.49132996 +44.73126526, 24.16970215 +45.59549561, 23.66576233 +46.44317627, 23.134680179999997 +47.29469299, 22.60965271 +48.1681488, 22.12483521 +49.02463684, 21.61141052 +49.92488098, 21.1796875 +50.84109497, 20.78836365 +51.79621582, 20.492718510000003 +52.763165279999996, 20.2372345 +53.73195953, 19.994692989999997 +54.72162018, 19.880661009999997 +55.71602325, 19.78439331 +56.7145401, 19.723648070000003 +57.680763240000005, 19.806494139999998 +57.12877197, 20.557122800000002 +56.41330261, 21.25401306 +55.639428710000004, 21.88783875 +54.79107666, 22.41368103 +54.02642212, 23.05439148 +53.27541504, 23.712982179999997 +52.59628601, 24.445889280000003 +51.91377869, 25.16552429 +51.17658691, 25.830657960000003 +50.52939148, 26.58135986 +49.89768982, 27.3545929 +49.53206482, 28.19016113 +48.816180419999995, 28.88865662 +48.154565430000005, 29.63807068 +47.52755737, 30.41610107 +46.93055115, 31.21862183 +46.42692871, 32.05847168 +46.07454224, 32.989366149999995 +45.76473389, 33.93953247 +45.70064392, 34.86882629 +46.11124878, 35.749191280000005 +46.51413574, 36.62487946 +47.09979553, 35.83492889 +47.49899597, 34.918151859999995 +47.8509552, 33.98178558 +48.176159670000004, 33.03572083 +48.50280151, 32.09018555 +48.79563293, 31.13361816 +49.095886230000005, 30.1803772 +49.54075317, 29.28502808 +50.07881165, 28.44193115 +50.638705439999995, 27.612930300000002 +51.22728577, 26.804046630000002 +51.84541931, 26.01758118 +52.53700867, 25.2951416 +53.27336273, 24.618106079999997 +54.04981384, 23.98772278 +54.85976868, 23.4085144 +55.75480652, 22.961703489999998 +56.672084049999995, 22.56560974 +57.63109436, 22.44396973 +57.471340940000005, 23.35645752 +57.17254944, 24.30879822 +56.82289734, 25.245898439999998 +56.48259888, 26.17771912 +56.09176941, 27.08032532 +55.792773440000005, 28.02562561 +55.45173035, 28.96405029 +55.08853455, 29.89303589 +54.76070709, 30.83813477 +54.391200260000005, 31.76703796 +54.06114044, 32.70985718 +53.75445251, 33.659535219999995 +53.49246521, 34.62096405 +53.25185089, 35.59071808 +53.01078339, 36.56085205 +52.82448578, 37.535466 +52.70541077, 38.52535858 +52.67506409, 39.525305180000004 +52.555772399999995, 40.51134338 +52.445657350000005, 41.50318909 +52.25387268, 42.477250670000004 +51.88206787, 43.405258180000004 +51.5059021, 44.32976227 +51.0002533, 45.19023895 +50.443780520000004, 46.01707001 +49.854431149999996, 46.81865616 +49.31723633, 47.6358429 +48.45541077, 48.143104550000004 +47.56502991, 48.59914474 +46.65978394, 49.024533840000004 +45.74251404, 49.42263184 +44.82419128, 49.80960922 +43.87281189, 50.118057250999996 +42.89059448, 50.282530975 +41.89021301, 50.293395233 +40.88987427, 50.304258728 +39.8894928, 50.31512146 +38.9069519, 50.187064362 +37.91609192, 50.076882935 +36.92850342, 49.982987980000004 +36.00802917, 49.60404053 +35.10727234, 49.17078781 +34.22413635, 48.70237885 +33.32304382, 48.29149933 +32.42861938, 47.8433754 +31.54354248, 47.37711945 +30.67309265, 46.8844986 +29.78031311, 46.43502731 +28.91640015, 45.9317543 +28.072229, 45.40481644 +27.231222529999997, 44.86628723 +26.390423579999997, 44.3366272 +25.566448970000003, 43.77111511 +24.750354, 43.20059662 +23.94605103, 42.61142883 +23.13406372, 42.029203800000005 +22.36334839, 41.39158478 +21.607501220000003, 40.73847198 +20.926501459999997, 40.00619659 +20.345928960000002, 39.19186401 +19.84260864, 38.331217960000004 +19.43635864, 37.418168640000005 +19.072503660000002, 36.48667145 +18.689379879999997, 35.563334659999995 +18.32123413, 34.63315125 +17.94273071, 33.70708313 +17.572186279999997, 32.77784729 +17.19522705, 31.85114136 +16.801342769999998, 30.93194885 +16.353436279999997, 30.03903198 +15.87983398, 29.15851135 +15.3885437, 28.2888855 +14.855523680000005, 27.446704099999998 +14.836718750000003, 26.680126950000002 +15.790081790000002, 26.958926390000002 +16.71482544, 27.339550780000003 +17.56772461, 27.85991516 +18.372808839999998, 28.45271301 +19.119970700000003, 29.11783447 +19.85894775, 29.79223633 +20.58986206, 30.47533264 +21.323693849999998, 31.15517578 +22.051312260000003, 31.84186401 +22.799920649999997, 32.50527649 +23.572778319999998, 33.14033661 +24.3121521, 33.806001280000004 +24.9, 34.61531219 +25.502691650000003, 35.41381378 +26.158538819999997, 36.167828369999995 +26.92841492, 36.780615229999995 +27.08474426, 35.92871094 +26.819671630000002, 34.96417389 +26.52217407, 34.00960388 +26.22579956, 33.055032350000005 +25.76187744, 32.18278809 +25.500372310000003, 31.23201599 +25.01838989, 30.36263733 +24.43433838, 29.55104675 +23.793530269999998, 28.7828186 +23.128955079999997, 28.03511658 +22.4413147, 27.30858765 +21.785198970000003, 26.55543823 +21.07596436, 25.851086430000002 +20.39095459, 25.123672489999997 +19.679547120000002, 24.420394899999998 +18.938476559999998, 23.74946594 +18.242388920000003, 23.031134029999997 +17.4859375, 22.37807007 +16.710662839999998, 21.859951780000003 +16.06891479, 21.176046749999998 +15.339343260000007, 20.53103333 +15.65200806, 19.95944824 +16.538256840000003, 20.38291931 +17.464788820000003, 20.74898682 +18.38804321, 21.134054570000004 +19.308624270000003, 21.52561035 +20.200506590000003, 21.974807740000003 +21.106500240000003, 22.39816589 +21.9937439, 22.860366820000003 +22.888183589999997, 23.30839539 +23.77659912, 23.768374629999997 +24.64683838, 24.26052551 +25.461645509999997, 24.83266296 +26.29280396, 25.38618469 +26.86604004, 24.933523559999998 +26.983758539999997, 23.94125366 +26.623120120000003, 23.021588129999998 +26.031524660000002, 22.21565552 +25.39023437, 21.44784241 +24.685064699999998, 20.739523320000004 +23.92454224, 20.08974609 +23.12667236, 19.486361690000003 +22.320208739999998, 18.894442750000003 +21.49926147, 18.32319031 +20.60897827, 17.88707581 +19.847375489999997, 17.256399539999997 +19.166174320000003, 16.59306335 +20.059802249999997, 16.39454346 +21.053576659999997, 16.50884705 +22.040197749999997, 16.66594543 +22.967700200000003, 17.01525574 +23.810211180000003, 17.53992615 +24.660437010000003, 18.00562439 +25.55376587, 18.435650629999998 +26.29713135, 18.29321289 +25.979766849999997, 17.357778930000002 +25.495239259999998, 16.484860230000002 +24.95720825, 15.64150085 +24.363238529999997, 14.83728027 +23.69143066, 14.096295169999998 +22.960241699999997, 13.414129639999999 +22.204595949999998, 12.758581540000002 +21.412927250000003, 12.147207639999998 +20.617901609999997, 11.541043090000002 +19.80675659, 10.957669070000001 +19.10787964, 10.303460690000001 +19.998138429999997, 10.134652709999997 +20.898144530000003, 10.55623474 +21.82171021, 10.940100100000002 +22.72706909, 11.359857179999999 +23.64918823, 11.746472169999997 +24.540771479999997, 12.19921265 +25.45679321, 12.596533200000003 +26.33335571, 13.07650452 +27.239205929999997, 13.478167720000002 +28.155383299999997, 13.84415894 +28.450604249999998, 13.089425660000003 +27.923327639999997, 12.241500850000001 +27.331231690000003, 11.435336300000003 +26.712799070000003, 10.65001221 +26.13182983, 9.842846680000001 +25.45239868, 9.108633419999997 +24.78091431, 8.367007450000003 +24.10447388, 7.629977420000003 +23.419488530000002, 6.90093384 +22.689556879999998, 6.217510990000001 +21.789447019999997, 5.802758789999999 +20.866900630000004, 5.4265869099999975 +19.9546814, 5.018939209999999 +19.028564449999998, 4.644750979999998 +18.147052000000002, 4.178588869999999 +17.21791992, 3.81490479 +16.301306150000002, 3.4162597700000035 +15.391076659999996, 3.0034057599999997 +14.537127690000005, 2.5179443399999997 +14.763708500000007, 1.6919494599999965 +15.681018069999993, 1.868090819999999 +16.678814699999997, 1.9293212899999972 +17.67902222, 1.9480712900000015 +18.679412839999998, 1.960070799999997 +19.67967529, 1.954779049999999 +20.67976074, 1.9281799299999989 +21.67734375, 1.86328125 +22.656384279999997, 1.6824585000000027 +23.37698364, 1.0432128899999995 +23.634533689999998, 0.11990966999999841 +23.39783936, -0.8465393099999972 +22.978863529999998, -1.7536743200000018 +22.552587889999998, -2.657232669999999 +22.154785160000003, -3.5742981 +21.727032469999997, -4.478460690000006 +21.251116940000003, -5.357720950000001 +20.83071289, -6.254949949999997 +20.405725099999998, -7.160546879999998 +19.949255370000003, -8.050823969999996 +19.552825929999997, -8.967022709999995 +19.12335815, -9.870440669999994 +18.739715580000002, -10.792749020000002 +18.36053467, -11.717889400000004 +17.963647459999997, -12.63579102 +17.6385498, -13.581475830000002 +17.29404297, -14.519006349999998 +16.969293209999996, -15.465039059999995 +16.67910156, -16.422375489999993 +16.358099369999998, -17.36344604 +16.08479004, -18.322918700000002 +15.80218506, -19.282360839999996 +15.596966550000005, -20.26040039 +15.57197266, -21.260290530000006 +15.437573240000006, -22.251025389999995 +15.247857670000002, -23.233172609999997 +15.20811157, -24.21501465 +16.125128170000004, -24.218847659999994 +16.67720947, -23.396435550000007 +17.070690919999997, -22.4960083 +17.45554199, -21.602996829999995 +17.84500122, -20.682214360000003 +18.20953369, -19.75666504 +18.676330569999998, -18.87199097 +19.166619869999998, -18.001971440000005 +19.654388429999997, -17.128747559999994 +20.208886720000002, -16.300299069999994 +20.732855219999998, -15.449426270000004 +21.256787109999998, -14.59789429 +21.69271851, -13.698620610000006 +22.05651855, -12.767864990000007 +22.48165283, -11.86253662 +22.87906494, -10.94507446 +23.271875, -10.072064209999994 +23.307720949999997, -11.055718990000003 +23.278735349999998, -12.055712889999995 +23.19138184, -13.050109860000006 +23.06300659, -14.040942380000004 +22.83094482, -15.006164549999994 +22.43723145, -15.9255249 +22.009344480000003, -16.829833980000004 +21.58376465, -17.7348877 +21.15193481, -18.637316889999994 +20.74118652, -19.549438480000006 +20.331976320000003, -20.462292480000002 +19.91720581, -21.372399900000005 +19.503680420000002, -22.283233640000006 +19.119970700000003, -23.2069458 +18.697918700000002, -24.11378784 +18.28265381, -25.023809810000003 +17.87407837, -25.936956789999996 +17.472711179999997, -26.853057860000007 +17.09631348, -27.779156490000005 +16.637341309999996, -28.590557860000004 +16.40424194, -29.523614499999994 +16.011022949999997, -30.443261719999995 +15.668322750000002, -31.383007809999995 +15.322827149999995, -32.321521000000004 +14.895269780000007, -33.20204468 +14.787170410000002, -34.112567139999996 +14.521002199999998, -35.076647949999995 +14.518682859999998, -36.07679443000001 +14.512121579999999, -37.07713013 +14.435980220000005, -38.07398071 +14.509289550000005, -39.06842041 +14.518914789999997, -40.068749999999994 +14.432373049999995, -40.9447021 +14.300653080000004, -41.924609399999994 +14.509155269999994, -42.892187500000006 +14.51810913, -43.892511 +14.519079590000004, -44.892968800000006 +14.506121829999998, -45.893237299999996 +14.399652099999997, -46.8870117 +14.334295650000001, -47.8832031 +14.388897709999995, -48.882031299999994 +14.420776369999999, -49.8819702 +14.530047609999997, -50.874743699999996 +14.492773439999993, -51.865295399999994 +14.461645509999997, -52.8163208 +14.508435059999996, -53.815234399999994 +14.641857909999999, -54.802954099999994 +15.310870359999996, -55.256860399999994 +UP +37.74736023, 36.80336914 +DOWN +38.47702026, 37.2743454 +38.85921631, 36.535191350000005 +40.1815979, 36.47406311 +39.80106812, 37.294514469999996 +40.57870178, 37.86668091 +41.23825073, 37.32766418 +40.69321289, 36.51595001 +UP +35.96294556, 37.00058136 +DOWN +36.20568542, 37.88856201 +37.04594727, 37.84905853 +37.00773315, 36.92105255 +UP +41.86015015, 41.48260651 +DOWN +41.85045776, 42.375906369999996 +42.72472229, 42.6817688 +43.14835815, 41.8642746 +42.41279602, 41.27379761 +UP +35.28516235, 42.74035645 +DOWN +35.53320312, 43.641122440000004 +36.36165161, 43.40177917 +36.38671265, 42.484629819999995 diff --git a/UrumbotXY-Fall2022/code/examples/flip.py b/UrumbotXY-Fall2022/code/examples/flip.py new file mode 100644 index 0000000000000000000000000000000000000000..1c4355cb2c96a018cbee0ab81c592949c4a7c9d7 --- /dev/null +++ b/UrumbotXY-Fall2022/code/examples/flip.py @@ -0,0 +1,26 @@ + + +def main(): + filename_in = "being.xy" + filename_out = "being_flipped.xy" + + f_out = open(filename_out, "w") + + x_c = 80 + y_c = 60 + + with open(filename_in, "r") as f_in: + for line in f_in.readlines(): + if line.upper().startswith("UP") or line.upper().startswith("DOWN"): + f_out.write(line) + else: + x, y = [float(x) for x in line.split(",")] + x = x_c-x + y = y_c-y + f_out.write(f"{x}, {y}\n") + + f_out.close() + + +if __name__ == "__main__": + main() diff --git a/UrumbotXY-Fall2022/code/examples/repeat_dots.xy b/UrumbotXY-Fall2022/code/examples/repeat_dots.xy new file mode 100644 index 0000000000000000000000000000000000000000..de7354c657fae1a17cfa60cb86527918a7a0f861 --- /dev/null +++ b/UrumbotXY-Fall2022/code/examples/repeat_dots.xy @@ -0,0 +1,66 @@ +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP +0, 10 +DOWN +UP +200, 180 +DOWN +UP diff --git a/UrumbotXY-Fall2022/code/examples/spiral.xy b/UrumbotXY-Fall2022/code/examples/spiral.xy new file mode 100644 index 0000000000000000000000000000000000000000..c166a0ceb3f1a582f3b8f0ccb9f5e5e061ad93d6 --- /dev/null +++ b/UrumbotXY-Fall2022/code/examples/spiral.xy @@ -0,0 +1,112 @@ +UP +100, 100 +DOWN +99.98254759356271, 99.00015230484361 +97.98376593952453, 99.06995129824861 +98.14077380825336, 102.06583990251234 +102.13103000929266, 101.78681400753584 +101.69525129555436, 96.8058405170771 +95.72811992334472, 97.43301129668302 +96.58120532718075, 104.38083435817227 +104.50334987711331, 103.26744955049175 +103.09543969175124, 94.3782544851355 +93.24736216162916, 96.11473626180481 +95.34626111077115, 106.9126352797291 +107.08403231957683, 104.41769498991603 +104.15966861310662, 91.75088414770796 +90.57552844524265, 95.13779068610329 +94.45781412178044, 109.62667808043932 +109.83800125679356, 105.21648038736734 +104.86768227650703, 88.95929953599574 +87.74866498319425, 94.52160543474474 +93.93445991788025, 112.48645837113175 +112.72831233359844, 105.6460555046184 +105.20258539314707, 86.04086654817719 +84.80454059267775, 94.28221160332726 +93.79135654793097, 115.45382323273341 +115.71644753135345, 105.69214379891434 +105.15099098783602, 83.03444912299807 +81.78234578405761, 94.43209893951396 +94.04008927702536, 118.48927509259991 +118.76262187707536, 105.34407133459506 +104.70314288993158, 79.98009982755258 +78.72238077639838, 94.98009982755252 +94.68856109861011, 121.55228614931798 +121.82610017561576, 104.59486969385544 +103.85301202011998, 76.91874095165637 +75.66573455324857, 95.93129966966177 +95.74090982553489, 124.60162121977669 +124.86552162303312, 103.44135213724782 +102.59836576640738, 73.89183826549794 +72.65395712935201, 97.28697432787304 +97.19745238029543, 127.59566682469509 +127.83923010505464, 101.88416243723361 +100.94080991644404, 70.94106964809978 +69.72872724639362, 99.04455511517199 +99.05465672908068, 130.4927642847967 +130.70560794398136, 99.92779598460082 +98.88580279058684, 68.10799083120607 +66.93151774947273, 101.1976216467838 +101.3051417255739, 133.2515445697211 +133.42341083079953, 97.58059294680655 +96.44264139988374, 65.43370052627165 +64.30326091555662, 103.73592268222043 +103.93770494986236, 135.83126262576187 +135.952101666797, 94.85470343821264 +93.62441963429043, 62.95850721115414 +61.88401601049682, 106.64542490740126 +106.93737844639122, 138.192128906709 +138.25218104075338, 91.7660248436269 +90.44795866786455, 60.721599847769866 +59.71264134233871, 109.9083894248426 +110.28551208376328, 140.29563584453592 +140.28551208376354, 88.33411161746974 +86.93370994826061, 58.760724782442765 +57.82647305553557, 113.50347553969632 +113.95988407940277, 142.10487702328774 +142.01563747390384, 84.58205806014112 +83.10563131652137, 57.111871046996185 +56.261012873518055, 117.40587125140763 +117.93483805483126, 143.58485686018966 +143.40808640711327, 80.53635474964811 +78.99103697880642, 55.80896623102221 +55.049626946008296, 121.58744968603531 +122.18144581355992, 144.70278865249307 +144.43066940855692, 76.22671947924228 +74.62042222325533, 54.88358503448248 +54.223257892797164, 126.016950533918 +126.66769486447717, 145.4283789166075 +145.05375893005154, 71.68590371963168 +70.02726394158861, 54.36467253515319 +53.810152057802256, 130.6601853923898 +131.35869955016767, 145.73409602713713 +145.2505537635226, 66.94947578616056 +65.24779817531657, 54.2782841179011 +53.8356038965902, 135.48026575470973 +136.2169344828198, 145.59542125733822 +144.99732539730184, 62.05558204640319 +60.320776059503615, 54.64734391285045 +54.321719317506776, 140.43785223519518 +141.20248884115472, 144.99108042833117 +144.27364455097492, 57.04468765065076 +55.28719968205611, 55.491423477732134 +55.28719968205545, 145.49142347773213 +146.27333994128708, 143.90325449194026 +143.06258624465818, 51.959298406183414 +50.19003951248274, 56.826542336775695 +56.7471480444314, 150.5975630611991 +151.38564436314718, 142.317767500171 +141.35091188945484, 46.843665544816496 +45.07393518024659, 58.66499185511586 +58.71289907433278, 155.71126259178976 +156.4940447932515, 140.22425055280743 +139.12922702655928, 41.74347525158649 +39.984881498345004, 61.01518378461641 +61.19187396175789, 160.78623905946426 +161.5519906346375, 137.61628046204788 +136.39211349227406, 36.70552492934375 +34.969901731922036, 63.881524665109 +64.18746144852423, 165.77526443457072 +166.5120703365699, 134.49149202924082 +133.13823494407592, 31.777388269364124 +UP diff --git a/UrumbotXY-Fall2022/code/examples/spiral2.xy b/UrumbotXY-Fall2022/code/examples/spiral2.xy new file mode 100644 index 0000000000000000000000000000000000000000..3ec798e763b1a71012d5eeb2a2acf7a018846a98 --- /dev/null +++ b/UrumbotXY-Fall2022/code/examples/spiral2.xy @@ -0,0 +1,112 @@ +UP +100, 100 +DOWN +99.51519037975366, 100.8746197071394 +98.45535185128726, 99.17852351482654 +101.45124045555097, 99.02151564609771 +99.69775586839465, 102.61669183129437 +96.82987368663943, 98.52093160984941 +102.79700505884907, 97.8937608302435 +100.06188715942415, 104.33729480441056 +95.1365953568189, 98.03320877555677 +104.02579042217515, 96.62529859019469 +100.60558898891843, 106.02222479805377 +93.38893967002284, 97.72041941560329 +105.1267108788285, 95.22547912579019 +101.32587871743289, 107.65744095330963 +91.60066153100698, 97.58668374856846 +106.08954892534304, 93.70439807203077 +102.2187985957482, 109.22912969244666 +89.78578566822227, 97.63515757138421 +106.90480296153505, 92.07285167263518 +103.27943204938063, 110.72376815814079 +87.95854318700115, 97.8680159644099 +107.56373214344245, 90.34228902395876 +104.50192392232108, 112.12818653627332 +86.13330719123334, 98.28644100377623 +108.05839817465576, 88.52476156995706 +105.87950460596421, 113.42962902225068 +84.32452771953322, 98.89061353201113 +108.38170387261927, 86.63287003904358 +107.40451796494892, 114.61581319557826 +82.54666624458787, 99.67970902318633 +108.52742835812127, 84.67970902318676 +109.06845295767648, 115.6749875730349 +80.81412998619115, 100.6518975638858 +108.49025872839056, 82.67880940839055 +110.8619788356909, 116.59598711722458 +79.14120628940815, 101.80434795630009 +108.26581808690631, 80.64407887377112 +112.77498379289658, 117.36828648450006 +77.54199731935877, 103.13323593469515 +107.85068981618087, 78.58974068375178 +114.79661692285761, 117.98205080424019 +76.03035532328582, 104.6337564714962 +107.24243799333685, 76.53027100442469 +116.91533333012342, 118.42818379018972 +74.61981870883731, 106.30014013424203 +106.43962386223181, 74.48033498084726 +119.11894222981385, 118.6983729940099 +73.3235491849078, 108.12567343984821 +105.44181829013311, 72.45472181693339 +121.39465785853353, 118.7851320213 +72.15427020792319, 110.10272313795309 +104.24961015146533, 70.46827910364792 +123.72915300909213, 118.68183954112111 +71.12420697210216, 112.22276434064749 +102.86461059589648, 68.53584664440089 +126.10861499163394, 118.3827749314171 +70.24502817708388, 114.47641240174482 +101.28945317294162, 66.67219002885643 +128.51880381452187, 117.88315041467494 +69.52778980029483, 116.85345843487346 +99.5277898002965, 64.8919342078081 +130.945112369808, 117.17913955063804 +68.98288109462398, 119.3429083461908 +97.58428257821765, 63.20949732232476 +133.37262840034322, 116.26790196584892 +68.6199730243795, 121.93302524444383 +95.46459146738515, 61.63902504003343 +135.78619801856973, 115.14760421320405 +68.44796934414302, 124.61137507848883 +93.17535786276856, 60.19432565018185 +138.17049054082634, 113.81743666851031 +68.47496051604216, 127.36487534024482 +90.7241841110387, 58.88880616699388 +140.5100643956007, 112.27762638519368 +68.70818065117678, 130.1798466595684 +88.11960903386671, 57.735409687888506 +142.78943385960343, 110.5294458427731 +69.15396765044932, 133.04206710642256 +85.37107953423602, 56.74655424918606 +144.99313637183388, 108.57521753943743 +69.81772670896055, 135.93682900548913 +82.48891837722138, 55.9340734172833 +147.1058001729711, 106.41831439398916 +70.70389733641755, 138.84899805859646 +79.48428825090328, 55.30915884766181 +149.1122120154658, 104.06315593750325 +71.81592403373813, 141.7630745613653 +76.36915222687288, 54.88230503771731 +150.997384688639, 101.51520029023837 +73.15623075323322, 144.66325649216319 +73.15623075323246, 54.66325649216319 +152.74662410291774, 98.7809319345794 +74.72619925652673, 147.53350424403453 +69.85895532593285, 54.66095751185915 +154.3455956780545, 95.86784531003255 +76.52615147060006, 150.35760676338163 +66.49141899690592, 54.88350480802733 +155.78038978179444, 92.78442427148258 +78.55533592833504, 153.11924885339624 +63.06832388934795, 55.33810313447827 +157.03758596793824, 89.54011746704664 +80.81191836544082, 155.8020793950908 +59.60492590203145, 56.03102412024218 +158.1043157662251, 86.14530970668076 +83.29297653100355, 158.38978023441456 +56.116976795235956, 56.967568474063164 +158.96832378049078, 82.61128940763109 +85.99449925380532, 160.86613548088405 +52.62066386131464, 58.152031721006296 +UP \ No newline at end of file diff --git a/UrumbotXY-Fall2022/code/test.py b/UrumbotXY-Fall2022/code/test.py new file mode 100644 index 0000000000000000000000000000000000000000..87ed5d84587148225c7c6ce306fc59e344b2825e --- /dev/null +++ b/UrumbotXY-Fall2022/code/test.py @@ -0,0 +1,8 @@ +class A(object): + def __init__(self, variable_A=1, variable_B=2): + self.variable_A = variableA + self.variable_B = variableB + + def functionA(self, param): + return param + self.variable_A + diff --git a/UrumbotXY-Fall2022/code/urumbu_corexy.py b/UrumbotXY-Fall2022/code/urumbu_corexy.py new file mode 100644 index 0000000000000000000000000000000000000000..99620dc2dc5e2edcae70f0b3a0347a36788f3c3c --- /dev/null +++ b/UrumbotXY-Fall2022/code/urumbu_corexy.py @@ -0,0 +1,325 @@ +import serial +import time +import multiprocessing +import logging +import argparse +import numpy as np + +BAUDRATE_DEFAULT = 921600 + + +class Module: + def __init__(self, port, baudrate=BAUDRATE_DEFAULT): + self.port = None + self.baudrate = baudrate + try: + self.port = serial.Serial(port, baudrate) + except serial.SerialException: + logging.error(f"Cannot connect to {port}") + + @property + def connected(self): + return self.port is not None + + def write(self, txt): + self.port.write(txt) + + def close(self): + self.port.close() + + def pressed(self, nc=True): + self.write(b"?") + r = self.port.read(1) + if nc: + return r == b"1" + else: + return r == b"0" + + +class Stepper(Module): + def __init__(self, steps_per_unit, port, baudrate=BAUDRATE_DEFAULT, reverse=False): + super().__init__(port, baudrate) + self.steps = 0 + self.reverse = reverse + self.steps_per_unit = steps_per_unit + + def step(self, forward): + self.steps += 1 if forward else -1 + if self.reverse: + forward = not forward + self.write(b"f" if forward else b"r") + + +class Servo(Module): + def __init__(self, pulse_min, pulse_max, port, baudrate=BAUDRATE_DEFAULT): + self.pulse_min = pulse_min + self.pulse_max = pulse_max + super().__init__(port, baudrate) + self.delay_us = 0 + + def pulse(self, delay_us): + self.write(delay_us.to_bytes(2, byteorder='little')) + + def fraction(self, f): + p = int(self.pulse_min + (self.pulse_max - self.pulse_min) * f) + self.pulse(p) + + def pressed(self, nc=True): + self.pulse(65535) + r = self.port.read(1) + if nc: + return r == b"1" + else: + return r == b"0" + + +class Action: + pass + + +class HomingAction(Action): + def __init__(self, axis, name, pos, feedrate, nc=True): + self.axis = axis + self.name = name + self.pos = np.array(pos) + self.feedrate = feedrate + self.nc = nc + + +class PathAction(Action): + def __call__(self, t): + raise NotImplementedError() + + def init(self, pos_start): + raise NotImplementedError() + + +class WaitAction(Action): + def __init__(self, dt): + self.dt = dt + + def __call__(self, dt): + return dt <= self.dt + + +class ServoAction(Action): + def __init__(self, name, pulse, dt=0.01, wait=1.0): + self.name = name + self.pulse = pulse + self.dt = dt + self.wait = wait + + +class Line(PathAction): + def __init__(self, pos_end, feedrate): + self.pos_start = np.zeros_like(pos_end) + self.pos_end = np.array(pos_end) + self.duration = -1 + self.feedrate = feedrate + + def init(self, pos_start): + self.pos_start = np.array(pos_start) + self.duration = np.linalg.norm(self.pos_end - self.pos_start) / self.feedrate + + def __call__(self, t): + if t > self.duration: + # end move + return None + u = t / self.duration + return self.pos_start * (1 - u) + self.pos_end * u + + +def transform_corexy(pos, pos_transform): + pos_transform[:] = pos[:] + pos_transform[0] = pos[0] + pos[1] + pos_transform[1] = pos[0] - pos[1] + + +def modules_manager(action_queue, modules_config, pos_transformer=None): + logging.info("start loop") + + modules = {} + + modules_axis = {} + + for name, config in modules_config.items(): + if config["type"] == "stepper": + obj = Stepper(config["steps_per_unit"], + config["port"], + config["baudrate"], + reverse=config.get("reverse", False)) + modules[name] = obj + if "axis" in config: + modules_axis[config["axis"]] = obj + elif config["type"] == "servo": + modules[name] = Servo(config["pulse_min"], + config["pulse_max"], + config["port"], + config["baudrate"]) + + n_axis = len(modules_axis) + pos = np.zeros((n_axis,)) + pos_motors = np.zeros((n_axis,)) + + def tick_motor(): + if pos_transformer is None: + pos_motors[:] = pos[:] + else: + pos_transformer(pos, pos_motors) + for j in range(n_axis): + m = modules_axis[j] + s = int(pos_motors[j] * m.steps_per_unit) + if m.steps < s: + m.step(True) + elif m.steps > s: + m.step(False) + + while True: + if not action_queue.empty(): + action = action_queue.get() + t0 = time.perf_counter() + + if isinstance(action, PathAction): + # time in s, ~us resolution + action.init(pos) + + while True: + t = time.perf_counter() + + # path is a time function + pos_new = action(t - t0) + + if pos_new is None: + # done + break + + pos[:] = pos_new[:] + tick_motor() + elif isinstance(action, WaitAction): + dt = 0 + while action(dt): + dt = time.perf_counter() - t0 + elif isinstance(action, ServoAction): + dt1 = 0 + t0_pwm = t0 + action_wait = WaitAction(action.wait) + while action_wait(dt1): + t1 = time.perf_counter() + dt1 = t1 - t0 + dt2 = t1 - t0_pwm + if dt2 >= action.dt: + t0_pwm = t1 + modules[action.name].pulse(action.pulse) + + elif isinstance(action, HomingAction): + line = Line(action.pos, action.feedrate) + line.init(pos) + + while True: + t = time.perf_counter() + + # path is a time function + pos_new = line(t - t0) + + if pos_new is None: + logging.error(f"Homing failed for axis {action.axis}") + break + + pos[:] = pos_new[:] + + tick_motor() + + if modules[action.name].pressed(action.nc): + logging.info(f"Homing axis {action.axis}") + # homing success + for i in range(n_axis): + motor = modules_axis[i] + motor.steps = 0 + pos[action.axis] = 0 + break + + +def parse_arguments(): + usage_text = ( + "Usage: python urumbu_corexy.py [options]" + ) + parser = argparse.ArgumentParser(description=usage_text) + parser.add_argument("-f", "--filename", type=str, required=True, + help="filename for .xy file") + parser.add_argument("--feedrate", type=float, default=15, + help="feedrate for XY motion") + parser.add_argument("-a", type=str, default="COM18", + help="COM port for A") + parser.add_argument("-b", type=str, default="COM25", + help="COM port for B") + parser.add_argument("-s", default="COM24", + help="COM port for servo") + parser.add_argument("-u", "--unit_scale", type=float, default=1.0, + help="Scaling factor") + parser.add_argument("-d", "--dryrun", action="store_true", + help="Perform a dryrun") + return parser.parse_known_args() + + +def main(): + multiprocessing.set_start_method('spawn') + action_queue = multiprocessing.Queue() + + args, _ = parse_arguments() + + modules_config = { + "a": { + "type": "stepper", + "port": args.a, + "baudrate": 921600, + "axis": 0, + "steps_per_unit": 6400 / 64, # 64 mm / turn + "reverse": True + }, + "b": { + "type": "stepper", + "port": args.b, + "baudrate": 921600, + "axis": 1, + "steps_per_unit": 6400 / 64, + "reverse": True + }, + "servo": { + "type": "servo", + "port": args.s, + "pulse_min": 600, + "pulse_max": 2500, + "baudrate": 921600, + } + } + + p1 = multiprocessing.Process(target=modules_manager, args=(action_queue, modules_config, transform_corexy)) + p1.start() + + feedrate = args.feedrate + feedrate_homing = 20 + + servo_up = ServoAction("servo", 1265, wait=0.5) + servo_down = ServoAction("servo", 800, wait=0.5) + + action_queue.put(servo_up) + action_queue.put(HomingAction(0, "servo", [-200, 0], feedrate_homing)) + action_queue.put(HomingAction(1, "b", [0, -200], feedrate_homing)) + + with open(args.filename, "r") as f: + for line in f.readlines(): + if line.upper().startswith("UP"): + if not args.dryrun: + action_queue.put(servo_up) + elif line.upper().startswith("DOWN"): + if not args.dryrun: + action_queue.put(servo_down) + else: + action_queue.put(Line([float(x)*args.unit_scale for x in line.strip().split(",")], feedrate)) + + action_queue.put(servo_up) + action_queue.put(Line([0, 0], feedrate)) + + +if __name__ == "__main__": + main() diff --git a/UrumbotXY-Fall2022/code/urumbu_gcode.py b/UrumbotXY-Fall2022/code/urumbu_gcode.py new file mode 100644 index 0000000000000000000000000000000000000000..0a7f9fb5ca91a0a94125676f3143be43b44ef0c6 --- /dev/null +++ b/UrumbotXY-Fall2022/code/urumbu_gcode.py @@ -0,0 +1,381 @@ +import serial +import time +import multiprocessing +import logging +import argparse +import numpy as np +import math +import os + +BAUDRATE_DEFAULT = 921600 + + +class Module: + def __init__(self, port, baudrate=BAUDRATE_DEFAULT): + self.port = None + self.baudrate = baudrate + try: + self.port = serial.Serial(port, baudrate) + except serial.SerialException: + logging.error(f"Cannot connect to {port}") + + @property + def connected(self): + return self.port is not None + + def write(self, txt): + self.port.write(txt) + + def close(self): + self.port.close() + + def pressed(self, nc=True): + self.write(b"?") + r = self.port.read(1) + if nc: + return r == b"1" + else: + return r == b"0" + + +class Stepper(Module): + def __init__(self, steps_per_unit, port, baudrate=BAUDRATE_DEFAULT, reverse=False): + super().__init__(port, baudrate) + self.steps = 0 + self.reverse = reverse + self.steps_per_unit = steps_per_unit + + def step(self, forward): + self.steps += 1 if forward else -1 + if self.reverse: + forward = not forward + self.write(b"f" if forward else b"r") + + +class Servo(Module): + def __init__(self, pulse_min, pulse_max, port, baudrate=BAUDRATE_DEFAULT): + self.pulse_min = pulse_min + self.pulse_max = pulse_max + super().__init__(port, baudrate) + self.delay_us = 0 + + def pulse(self, delay_us): + self.write(delay_us.to_bytes(2, byteorder='little')) + + def fraction(self, f): + p = int(self.pulse_min + (self.pulse_max - self.pulse_min) * f) + self.pulse(p) + + def pressed(self, nc=True): + self.pulse(65535) + r = self.port.read(1) + if nc: + return r == b"1" + else: + return r == b"0" + + +class Action: + def __iter__(self): + return [self].__iter__() + + + +class HomingAction(Action): + def __init__(self, axis, name, pos, feedrate, nc=True): + self.axis = axis + self.name = name + self.pos = np.array(pos) + self.feedrate = feedrate + self.nc = nc + + +class PathAction(Action): + def __call__(self, t): + raise NotImplementedError() + + def init(self, pos_start): + raise NotImplementedError() + + +class WaitAction(Action): + def __init__(self, dt): + self.dt = dt + + def __call__(self, dt): + return dt <= self.dt + + +class SequenceAction(Action): + def __init__(self, *sub_actions): + self.sub_actions = sub_actions + + def __iter__(self): + return self.sub_actions.__iter__() + + +class ServoAction(Action): + def __init__(self, name, pulse, dt=0.01, wait=1.0): + self.name = name + self.pulse = pulse + self.dt = dt + self.wait = wait + + +class Line(PathAction): + def __init__(self, pos_end, feedrate): + self.pos_start = np.zeros_like(pos_end) + self.pos_end = np.array(pos_end) + self.duration = -1 + self.feedrate = feedrate + + def init(self, pos_start): + self.pos_start = np.array(pos_start) + mask_nan = np.isnan(self.pos_end) + self.pos_end[mask_nan] = self.pos_start[mask_nan] + self.duration = np.linalg.norm(self.pos_end - self.pos_start) / self.feedrate + + def __call__(self, t): + if t > self.duration: + # end move + return None + u = t / self.duration + return self.pos_start * (1 - u) + self.pos_end * u + + +def transform_corexy(pos, pos_transform): + pos_transform[:] = pos[:] + pos_transform[0] = pos[0] + pos[1] + pos_transform[1] = pos[0] - pos[1] + + +def modules_manager(action_queue, modules_config, pos_transformer=None): + logging.info("start loop") + + modules = {} + + modules_axis = {} + + for name, config in modules_config.items(): + if config["type"] == "stepper": + obj = Stepper(config["steps_per_unit"], + config["port"], + config["baudrate"], + reverse=config.get("reverse", False)) + modules[name] = obj + if "axis" in config: + modules_axis[config["axis"]] = obj + elif config["type"] == "servo": + modules[name] = Servo(config["pulse_min"], + config["pulse_max"], + config["port"], + config["baudrate"]) + + n_axis = len(modules_axis) + pos = np.zeros((n_axis,)) + pos_motors = np.zeros((n_axis,)) + + def tick_motor(): + if pos_transformer is None: + pos_motors[:] = pos[:] + else: + pos_transformer(pos, pos_motors) + for j in range(n_axis): + m = modules_axis[j] + s = int(pos_motors[j] * m.steps_per_unit) + if m.steps < s: + m.step(True) + elif m.steps > s: + m.step(False) + + while True: + if not action_queue.empty(): + action = action_queue.get() + t0 = time.perf_counter() + + for sub_action in action: + if isinstance(sub_action, PathAction): + # time in s, ~us resolution + sub_action.init(pos) + + while True: + t = time.perf_counter() + + # path is a time function + pos_new = sub_action(t - t0) + + if pos_new is None: + # done + break + + pos[:] = pos_new[:] + tick_motor() + elif isinstance(sub_action, WaitAction): + dt = 0 + while sub_action(dt): + dt = time.perf_counter() - t0 + elif isinstance(sub_action, ServoAction): + dt1 = 0 + t0_pwm = t0 + action_wait = WaitAction(sub_action.wait) + while action_wait(dt1): + t1 = time.perf_counter() + dt1 = t1 - t0 + dt2 = t1 - t0_pwm + if dt2 >= sub_action.dt: + t0_pwm = t1 + modules[sub_action.name].pulse(sub_action.pulse) + + elif isinstance(sub_action, HomingAction): + line = Line(sub_action.pos, sub_action.feedrate) + line.init(pos) + + while True: + t = time.perf_counter() + + # path is a time function + pos_new = line(t - t0) + + if pos_new is None: + logging.error(f"Homing failed for axis {sub_action.axis}") + break + + pos[:] = pos_new[:] + + tick_motor() + + if modules[sub_action.name].pressed(sub_action.nc): + logging.info(f"Homing axis {sub_action.axis}") + # homing success + for i in range(n_axis): + motor = modules_axis[i] + motor.steps = 0 + pos[sub_action.axis] = 0 + break + + +def parse_arguments(): + usage_text = ( + "Usage: python urumbu_corexy.py [options]" + ) + parser = argparse.ArgumentParser(description=usage_text) + parser.add_argument("-f", "--filename", type=str, required=True, + help="filename for .xy file") + parser.add_argument("--feedrate", type=float, default=15, + help="feedrate for XY motion") + parser.add_argument("-a", type=str, default="COM18", + help="COM port for A") + parser.add_argument("-b", type=str, default="COM25", + help="COM port for B") + parser.add_argument("-s", default="COM24", + help="COM port for servo") + parser.add_argument("-u", "--unit_scale", type=float, default=1.0, + help="Scaling factor") + return parser.parse_known_args() + + +def parse_xy(filename, action_queue, + feedrate, + homing_action, + servo_up_action=None, + servo_down_action=None): + + action_queue.put(homing_action) + + with open(filename, "r") as f: + for line in f.readlines(): + if line.upper().startswith("UP"): + if servo_up_action is not None: + action_queue.put(servo_up_action) + elif line.upper().startswith("DOWN"): + if servo_down_action is not None: + action_queue.put(servo_down_action) + else: + action_queue.put(Line([float(x) for x in line.strip().split(",")], feedrate)) + + +def parse_gcode(filename, action_queue, homing_action, default_feedrate): + feedrate = default_feedrate + + with open(filename, "r") as f: + for line in f.readlines(): + if line.startswith("G1") or line.startswith("G0"): + params = line.split(" ") + + params_parsed = { + "X": np.nan, + "Y": np.nan, + "Z": np.nan, + "F": np.nan + } + + for p in params: + name = p[0].upper() + val = float(p[1:]) + if name in params_parsed: + params_parsed[name] = val + + if not math.isnan(params_parsed["F"]): + feedrate = params_parsed["F"] + + action_queue.put(Line([params_parsed["X"], + params_parsed["Y"], + params_parsed["Z"]], feedrate)) + + elif line.startswith("G28"): + action_queue.put(homing_action) + + +def main(): + multiprocessing.set_start_method('spawn') + action_queue = multiprocessing.Queue() + + args, _ = parse_arguments() + + modules_config = { + "a": { + "type": "stepper", + "port": args.a, + "baudrate": 921600, + "axis": 0, + "steps_per_unit": 6400 / 64, # 64 mm / turn + "reverse": True + }, + "b": { + "type": "stepper", + "port": args.b, + "baudrate": 921600, + "axis": 1, + "steps_per_unit": 6400 / 64, + "reverse": True + }, + "servo": { + "type": "servo", + "port": args.s, + "pulse_min": 600, + "pulse_max": 2500, + "baudrate": 921600, + } + } + + p1 = multiprocessing.Process(target=modules_manager, args=(action_queue, modules_config, transform_corexy)) + p1.start() + + feedrate = args.feedrate + feedrate_homing = 20 + + homing_action = SequenceAction(HomingAction(0, "servo", [-200, 0], feedrate_homing), + HomingAction(1, "b", [0, -200], feedrate_homing)) + + filename = args.filename + ext = os.path.splitext(filename)[-1] + if ext == "xy": + parse_xy(filename, action_queue, feedrate, homing_action) + elif ext in ("nc", "gcode"): + parse_gcode(filename, action_queue, homing_action, args.feedrate) + else: + print(f"Unrecognized file type: '{ext}'") + + +if __name__ == "__main__": + main() diff --git a/UrumbotXY-Fall2022/code/urumbu_gcode_1.14.22.py b/UrumbotXY-Fall2022/code/urumbu_gcode_1.14.22.py new file mode 100644 index 0000000000000000000000000000000000000000..fbabb7e4d895272bcc4a95f462732187d3f515c7 --- /dev/null +++ b/UrumbotXY-Fall2022/code/urumbu_gcode_1.14.22.py @@ -0,0 +1,427 @@ + +# Modified version of Quentin Bolsee 'urumbu_gcode.py'. +# Modified by Robert Hart 1/13/22 - 1/14/22. +# Used 1/14/22 to run Urumbu machine with x,y, and a cam-driven z-axis. +# Supports g-code in a limited way. +# +# +# + + +import serial +import time +import multiprocessing +import logging +import argparse +import numpy as np +import math +import os + +BAUDRATE_DEFAULT = 921600 + + +class Module: + def __init__(self, port, baudrate=BAUDRATE_DEFAULT): + self.port = None + self.baudrate = baudrate + try: + self.port = serial.Serial(port, baudrate) + except serial.SerialException: + logging.error(f"Cannot connect to {port}") + + @property + def connected(self): + return self.port is not None + + def write(self, txt): + self.port.write(txt) + + def close(self): + self.port.close() + + def pressed(self, nc=True): + self.write(b"?") + r = self.port.read(1) + if nc: + return r == b"1" + else: + return r == b"0" + + +class Stepper(Module): + def __init__(self, steps_per_unit, port, baudrate=BAUDRATE_DEFAULT, reverse=False): + super().__init__(port, baudrate) + self.steps = 0 + self.reverse = reverse + self.steps_per_unit = steps_per_unit + + def step(self, forward): + self.steps += 1 if forward else -1 + if self.reverse: + forward = not forward + self.write(b"f" if forward else b"r") + + +class Servo(Module): + def __init__(self, pulse_min, pulse_max, port, baudrate=BAUDRATE_DEFAULT): + self.pulse_min = pulse_min + self.pulse_max = pulse_max + super().__init__(port, baudrate) + self.delay_us = 0 + + def pulse(self, delay_us): + self.write(delay_us.to_bytes(2, byteorder='little')) + + def fraction(self, f): + p = int(self.pulse_min + (self.pulse_max - self.pulse_min) * f) + self.pulse(p) + + def pressed(self, nc=True): + self.pulse(65535) + r = self.port.read(1) + if nc: + return r == b"1" + else: + return r == b"0" + + +class Action: + def __iter__(self): + return [self].__iter__() + + + +class HomingAction(Action): + def __init__(self, axis, name, pos, feedrate, nc=True): + self.axis = axis + self.name = name + self.pos = np.array(pos) + self.feedrate = feedrate + self.nc = nc + + +class PathAction(Action): + def __call__(self, t): + raise NotImplementedError() + + def init(self, pos_start): + raise NotImplementedError() + + +class WaitAction(Action): + def __init__(self, dt): + self.dt = dt + + def __call__(self, dt): + return dt <= self.dt + + +class SequenceAction(Action): + def __init__(self, *sub_actions): + self.sub_actions = sub_actions + + def __iter__(self): + return self.sub_actions.__iter__() + + +class ServoAction(Action): + def __init__(self, name, pulse, dt=0.01, wait=1.0): + self.name = name + self.pulse = pulse + self.dt = dt + self.wait = wait + + +class Line(PathAction): + def __init__(self, pos_end, feedrate): + self.pos_start = np.zeros_like(pos_end) + self.pos_end = np.array(pos_end) + self.duration = -1 + self.feedrate = feedrate + + def init(self, pos_start): + self.pos_start = np.array(pos_start) + mask_nan = np.isnan(self.pos_end) + self.pos_end[mask_nan] = self.pos_start[mask_nan] + self.duration = np.linalg.norm(self.pos_end - self.pos_start) / self.feedrate + + def __call__(self, t): + if t > self.duration: + # end move + return None + u = t / self.duration + return self.pos_start * (1 - u) + self.pos_end * u + + +def transform_corexy(pos, pos_transform): + pos_transform[:] = pos[:] + pos_transform[0] = pos[0] + pos[1] + pos_transform[1] = pos[0] - pos[1] + + +def modules_manager(action_queue, modules_config, pos_transformer=None): + logging.info("start loop") + + modules = {} + + modules_axis = {} + + for name, config in modules_config.items(): + if config["type"] == "stepper": + obj = Stepper(config["steps_per_unit"], + config["port"], + config["baudrate"], + reverse=config.get("reverse", False)) + modules[name] = obj + if "axis" in config: + modules_axis[config["axis"]] = obj + elif config["type"] == "servo": + modules[name] = Servo(config["pulse_min"], + config["pulse_max"], + config["port"], + config["baudrate"]) + + n_axis = len(modules_axis) + pos = np.zeros((n_axis,)) + pos_motors = np.zeros((n_axis,)) + + def tick_motor(): + if pos_transformer is None: + pos_motors[:] = pos[:] + else: + pos_transformer(pos, pos_motors) + for j in range(n_axis): + m = modules_axis[j] + s = int(pos_motors[j] * m.steps_per_unit) + if m.steps < s: + m.step(True) + elif m.steps > s: + m.step(False) + + while True: + if not action_queue.empty(): + action = action_queue.get() + t0 = time.perf_counter() + + for sub_action in action: + if isinstance(sub_action, PathAction): + # time in s, ~us resolution + sub_action.init(pos) + + while True: + t = time.perf_counter() + + # path is a time function + pos_new = sub_action(t - t0) + + if pos_new is None: + # done + break + + pos[:] = pos_new[:] + tick_motor() + elif isinstance(sub_action, WaitAction): + dt = 0 + while sub_action(dt): + dt = time.perf_counter() - t0 + elif isinstance(sub_action, ServoAction): + dt1 = 0 + t0_pwm = t0 + action_wait = WaitAction(sub_action.wait) + while action_wait(dt1): + t1 = time.perf_counter() + dt1 = t1 - t0 + dt2 = t1 - t0_pwm + if dt2 >= sub_action.dt: + t0_pwm = t1 + modules[sub_action.name].pulse(sub_action.pulse) + + elif isinstance(sub_action, HomingAction): + line = Line(sub_action.pos, sub_action.feedrate) + line.init(pos) + + while True: + t = time.perf_counter() + + # path is a time function + pos_new = line(t - t0) + + if pos_new is None: + logging.error(f"Homing failed for axis {sub_action.axis}") + break + + pos[:] = pos_new[:] + + tick_motor() + + if modules[sub_action.name].pressed(sub_action.nc): + logging.info(f"Homing axis {sub_action.axis}") + # homing success + for i in range(n_axis): + motor = modules_axis[i] + motor.steps = 0 + pos[sub_action.axis] = 0 + break + + +def parse_arguments(): + usage_text = ( + "Usage: python urumbu_corexy.py [options]" + ) + parser = argparse.ArgumentParser(description=usage_text) + parser.add_argument("-f", "--filename", type=str, required=True, + help="filename for .xy file") + parser.add_argument("--feedrate", type=float, default=5, + help="feedrate for XY motion") + parser.add_argument("-a", type=str, default="COM5", + help="COM port for A") + parser.add_argument("-b", type=str, default="COM4", + help="COM port for B") + parser.add_argument("-z", type=str, default="COM7", + help="COM port for Z") + # parser.add_argument("-s", default="COM7", + # help="COM port for servo") + parser.add_argument("-u", "--unit_scale", type=float, default=1.0, + help="Scaling factor") + return parser.parse_known_args() + + +def parse_xy(filename, action_queue, + feedrate, + servo_up_action=None, + servo_down_action=None): + + # action_queue.put(homing_action) + + with open(filename, "r") as f: + for line in f.readlines(): + if line.upper().startswith("UP"): + if servo_up_action is not None: + action_queue.put(servo_up_action) + elif line.upper().startswith("DOWN"): + if servo_down_action is not None: + action_queue.put(servo_down_action) + else: + action_queue.put(Line([float(x) for x in line.strip().split(",")], feedrate)) + + +def parse_gcode(filename, action_queue, default_feedrate): + feedrate = default_feedrate + + with open(filename, "r") as f: + for line in f.readlines(): + if line.startswith("G1") or line.startswith("G0"): + + + params_parsed = { + "X": np.nan, + "Y": np.nan, + "Z": np.nan, + "F": np.nan + } + + fx = line.find('X') + fy = line.find('Y') + fz = line.find('Z') + ff = line.find('F') + + if fx > 0: + end = fx + 1 + while line[end].isdigit() or line[end] == '-' or line[end] == '.': + end = end + 1 + + params_parsed["X"] = float(line[fx + 1:end]) + + if fy > 0: + end = fy + 1 + while line[end].isdigit() or line[end] == '-' or line[end] == '.': + end = end + 1 + + params_parsed["Y"] = float(line[fy + 1:end]) + + if fz > 0: + end = fz + 1 + while line[end].isdigit() or line[end] == '-' or line[end] == '.': + end = end + 1 + + params_parsed["Z"] = float(line[fz + 1:end]) + + if ff > 0: + end = ff + 1 + while line[end].isdigit() or line[end] == '-' or line[end] == '.': + end = end + 1 + + params_parsed["F"] = float(line[ff + 1:end]) + + # if not math.isnan(params_parsed["F"]): + # feedrate = params_parsed["F"] + + action_queue.put(Line([params_parsed["X"], + params_parsed["Y"], + params_parsed["Z"]], feedrate)) + + # elif line.startswith("G28"): + # action_queue.put(homing_action) + + +def main(): + multiprocessing.set_start_method('spawn') + action_queue = multiprocessing.Queue() + + args, _ = parse_arguments() + + modules_config = { + "a": { + "type": "stepper", + "port": args.a, + "baudrate": 921600, + "axis": 0, + "steps_per_unit": 6400 / 64, # 64 mm / turn + "reverse": True + }, + "b": { + "type": "stepper", + "port": args.b, + "baudrate": 921600, + "axis": 1, + "steps_per_unit": 6400 / 64, + "reverse": False + }, + "z": { + "type": "stepper", + "port": args.z, + "baudrate": 921600, + "axis": 2, + "steps_per_unit": 1600/(3.14)/0.5, #uses slope at middle point of eccentric. ~3.1 mm in 50 steps. 0.5 is geometry factor! + "reverse": False + }#, + # "servo": { + # "type": "servo", + # "port": args.s, + # "pulse_min": 600, + # "pulse_max": 2500, + # "baudrate": 921600, + # } + } + + p1 = multiprocessing.Process(target=modules_manager, args=(action_queue, modules_config, transform_corexy)) + p1.start() + + feedrate = args.feedrate + #feedrate_homing = 20 + + #homing_action = SequenceAction(HomingAction(0, "servo", [-200, 0], feedrate_homing), + # HomingAction(1, "b", [0, -200], feedrate_homing)) + + filename = args.filename + ext = os.path.splitext(filename)[-1] + if ext == ".xy": + parse_xy(filename, action_queue, feedrate) + elif ext in (".nc", ".gcode"): + parse_gcode(filename, action_queue, args.feedrate) + else: + print(f"Unrecognized file type: '{ext}'") + + +if __name__ == "__main__": + main() diff --git a/UrumbotXY-Fall2022/files/3d/bearing_plate.stl b/UrumbotXY-Fall2022/files/3d/bearing_plate.stl new file mode 100644 index 0000000000000000000000000000000000000000..3d3cd313c8772e3d294cf9752b23054fe79f749b Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/bearing_plate.stl differ diff --git a/UrumbotXY-Fall2022/files/3d/bearing_plate2.stl b/UrumbotXY-Fall2022/files/3d/bearing_plate2.stl new file mode 100644 index 0000000000000000000000000000000000000000..f39ae9936a2069649060b801438ece02e37a7644 Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/bearing_plate2.stl differ diff --git a/UrumbotXY-Fall2022/files/3d/capstan_motor.stl b/UrumbotXY-Fall2022/files/3d/capstan_motor.stl new file mode 100644 index 0000000000000000000000000000000000000000..23bb86a4864e21aecbf162d9b4857311522ffc7b Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/capstan_motor.stl differ diff --git a/UrumbotXY-Fall2022/files/3d/capstan_pulley.stl b/UrumbotXY-Fall2022/files/3d/capstan_pulley.stl new file mode 100644 index 0000000000000000000000000000000000000000..8f4566988b6b7e1d8db53662e0c8ecb5af9a6f89 Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/capstan_pulley.stl differ diff --git a/UrumbotXY-Fall2022/files/3d/corner.stl b/UrumbotXY-Fall2022/files/3d/corner.stl new file mode 100644 index 0000000000000000000000000000000000000000..1ef8cb1afd816be007e840e5b27c0f37dbe660e4 Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/corner.stl differ diff --git a/UrumbotXY-Fall2022/files/3d/feet.stl b/UrumbotXY-Fall2022/files/3d/feet.stl new file mode 100644 index 0000000000000000000000000000000000000000..971ebad8b9f531bafbec176dda1c2af4600f7ee0 Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/feet.stl differ diff --git a/UrumbotXY-Fall2022/files/3d/feet_endstop.stl b/UrumbotXY-Fall2022/files/3d/feet_endstop.stl new file mode 100644 index 0000000000000000000000000000000000000000..e9fa1013aab86efeba30c8ee44e2f476ca2dbcf6 Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/feet_endstop.stl differ diff --git a/UrumbotXY-Fall2022/files/3d/motor_mount.stl b/UrumbotXY-Fall2022/files/3d/motor_mount.stl new file mode 100644 index 0000000000000000000000000000000000000000..08fff4bbf5d54d4ee8413710d6df24e37d95e203 Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/motor_mount.stl differ diff --git a/UrumbotXY-Fall2022/files/3d/servo_mount.stl b/UrumbotXY-Fall2022/files/3d/servo_mount.stl new file mode 100644 index 0000000000000000000000000000000000000000..c0b698a3e0effcdf7fc7a6d9102f0ea6aa0a664b Binary files /dev/null and b/UrumbotXY-Fall2022/files/3d/servo_mount.stl differ diff --git a/UrumbotXY-Fall2022/files/fusion/bearing_plate v3.f3d b/UrumbotXY-Fall2022/files/fusion/bearing_plate v3.f3d new file mode 100644 index 0000000000000000000000000000000000000000..b985a5f933265a6ad1bff9853e58ecb5aa00df3a Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/bearing_plate v3.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/bearing_plate2 v2.f3d b/UrumbotXY-Fall2022/files/fusion/bearing_plate2 v2.f3d new file mode 100644 index 0000000000000000000000000000000000000000..e74487c046987d0607e551c5dc67d8157b5b3626 Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/bearing_plate2 v2.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/cable_mount v1.f3d b/UrumbotXY-Fall2022/files/fusion/cable_mount v1.f3d new file mode 100644 index 0000000000000000000000000000000000000000..3d002ab4e807395019b7539bf7d896c7db003278 Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/cable_mount v1.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/capstan_motor v2.f3d b/UrumbotXY-Fall2022/files/fusion/capstan_motor v2.f3d new file mode 100644 index 0000000000000000000000000000000000000000..a5ada2340015ca6856d689848e9b8584b8f2c2f1 Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/capstan_motor v2.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/capstan_pulley v3.f3d b/UrumbotXY-Fall2022/files/fusion/capstan_pulley v3.f3d new file mode 100644 index 0000000000000000000000000000000000000000..37a36fa5297f869820ad71076b0770cba6b13d37 Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/capstan_pulley v3.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/corner_clamp v1.f3d b/UrumbotXY-Fall2022/files/fusion/corner_clamp v1.f3d new file mode 100644 index 0000000000000000000000000000000000000000..8fa75d3ed7bb3856f894228fa5329f0c9e4b6219 Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/corner_clamp v1.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/double_pulley_mount v3.f3d b/UrumbotXY-Fall2022/files/fusion/double_pulley_mount v3.f3d new file mode 100644 index 0000000000000000000000000000000000000000..b9ecb60ddebc3fea2e195ee06434f29d51f190ba Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/double_pulley_mount v3.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/feet v3.f3d b/UrumbotXY-Fall2022/files/fusion/feet v3.f3d new file mode 100644 index 0000000000000000000000000000000000000000..85d9b2bd88d2ce239852cb4e8aa0d231c9a62362 Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/feet v3.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/feet_endstop v2.f3d b/UrumbotXY-Fall2022/files/fusion/feet_endstop v2.f3d new file mode 100644 index 0000000000000000000000000000000000000000..bb004b37124767f2168e388c9ccd70483b8391fb Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/feet_endstop v2.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/motor_mount v10.f3d b/UrumbotXY-Fall2022/files/fusion/motor_mount v10.f3d new file mode 100644 index 0000000000000000000000000000000000000000..43d4d87571ee9b8c135801bd7957ebfc5b629625 Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/motor_mount v10.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/pen_arms v3.f3d b/UrumbotXY-Fall2022/files/fusion/pen_arms v3.f3d new file mode 100644 index 0000000000000000000000000000000000000000..67dc5240496eea6e8dba0f18cf06e80971543560 Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/pen_arms v3.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/pulley_mount v2.f3d b/UrumbotXY-Fall2022/files/fusion/pulley_mount v2.f3d new file mode 100644 index 0000000000000000000000000000000000000000..2b953a0c53e006ed9730d6decc9db4442529fdaf Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/pulley_mount v2.f3d differ diff --git a/UrumbotXY-Fall2022/files/fusion/servo_mount2 v1.f3d b/UrumbotXY-Fall2022/files/fusion/servo_mount2 v1.f3d new file mode 100644 index 0000000000000000000000000000000000000000..6d4af70e40c0baebc74426c26ba9823438d4fae0 Binary files /dev/null and b/UrumbotXY-Fall2022/files/fusion/servo_mount2 v1.f3d differ diff --git a/UrumbotXY-Fall2022/img/axis.jpg b/UrumbotXY-Fall2022/img/axis.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe3876696675af7a15cd9bc3a619badcf384f7c1 Binary files /dev/null and b/UrumbotXY-Fall2022/img/axis.jpg differ diff --git a/UrumbotXY-Fall2022/img/bldc_resize.jpg b/UrumbotXY-Fall2022/img/bldc_resize.jpg new file mode 100644 index 0000000000000000000000000000000000000000..35c476e829da04d191a17b88426afd88076012ea Binary files /dev/null and b/UrumbotXY-Fall2022/img/bldc_resize.jpg differ diff --git a/UrumbotXY-Fall2022/img/capstan.jpg b/UrumbotXY-Fall2022/img/capstan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bfd2d283340bae70b7a96fd22a6be6482dfc75ea Binary files /dev/null and b/UrumbotXY-Fall2022/img/capstan.jpg differ diff --git a/UrumbotXY-Fall2022/img/corexy.jpg b/UrumbotXY-Fall2022/img/corexy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50c0fd8904997af14b1aa0a9a1bd64786691530e Binary files /dev/null and b/UrumbotXY-Fall2022/img/corexy.jpg differ diff --git a/UrumbotXY-Fall2022/img/corexy_pen.jpg b/UrumbotXY-Fall2022/img/corexy_pen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4bb415af78ce37950f3540d3f0361a9f28df77cc Binary files /dev/null and b/UrumbotXY-Fall2022/img/corexy_pen.jpg differ diff --git a/UrumbotXY-Fall2022/img/doc/bearing_plate.png b/UrumbotXY-Fall2022/img/doc/bearing_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..df99971ad46c80d6b56f56881281538eef11a418 Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/bearing_plate.png differ diff --git a/UrumbotXY-Fall2022/img/doc/bearing_plate2.png b/UrumbotXY-Fall2022/img/doc/bearing_plate2.png new file mode 100644 index 0000000000000000000000000000000000000000..a7517026f64828e35ac52e28f109a9651da3e402 Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/bearing_plate2.png differ diff --git a/UrumbotXY-Fall2022/img/doc/capstan_motor.png b/UrumbotXY-Fall2022/img/doc/capstan_motor.png new file mode 100644 index 0000000000000000000000000000000000000000..d90e28791100adc0179c5e0fccd95276cc1abaf2 Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/capstan_motor.png differ diff --git a/UrumbotXY-Fall2022/img/doc/capstan_pulley.png b/UrumbotXY-Fall2022/img/doc/capstan_pulley.png new file mode 100644 index 0000000000000000000000000000000000000000..47fa38d1201c84d3acadb81d40ebf2c429045f0d Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/capstan_pulley.png differ diff --git a/UrumbotXY-Fall2022/img/doc/corexy_kit.png b/UrumbotXY-Fall2022/img/doc/corexy_kit.png new file mode 100644 index 0000000000000000000000000000000000000000..ce5f2c5700516a926d1905d29b7e397a5140e3b3 Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/corexy_kit.png differ diff --git a/UrumbotXY-Fall2022/img/doc/feet.png b/UrumbotXY-Fall2022/img/doc/feet.png new file mode 100644 index 0000000000000000000000000000000000000000..e9003f14d151d840b496719023f4b7405d87644a Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/feet.png differ diff --git a/UrumbotXY-Fall2022/img/doc/feet_endstop.png b/UrumbotXY-Fall2022/img/doc/feet_endstop.png new file mode 100644 index 0000000000000000000000000000000000000000..19b9a122dc4158ad3f870202dd9bc02bd84a365a Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/feet_endstop.png differ diff --git a/UrumbotXY-Fall2022/img/doc/pen_arms.png b/UrumbotXY-Fall2022/img/doc/pen_arms.png new file mode 100644 index 0000000000000000000000000000000000000000..2736932d4986156c0870f99e234ad774a585dff7 Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/pen_arms.png differ diff --git a/UrumbotXY-Fall2022/img/doc/pulley_mount.png b/UrumbotXY-Fall2022/img/doc/pulley_mount.png new file mode 100644 index 0000000000000000000000000000000000000000..9d2275945a7a8b78ce5dcb01d3b8bf23c2eec7a8 Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/pulley_mount.png differ diff --git a/UrumbotXY-Fall2022/img/doc/servo_mount.png b/UrumbotXY-Fall2022/img/doc/servo_mount.png new file mode 100644 index 0000000000000000000000000000000000000000..81984ce2b24b4a1b8da24cead596e11857444089 Binary files /dev/null and b/UrumbotXY-Fall2022/img/doc/servo_mount.png differ diff --git a/UrumbotXY-Fall2022/img/fixed_z.jpg b/UrumbotXY-Fall2022/img/fixed_z.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10972ce14ef153ad1d038ebbc67556f7489d0c52 Binary files /dev/null and b/UrumbotXY-Fall2022/img/fixed_z.jpg differ diff --git a/UrumbotXY-Fall2022/img/linetest.jpg b/UrumbotXY-Fall2022/img/linetest.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3a5098d1db8ba3ec7ff56872d7d93e75388edf9 Binary files /dev/null and b/UrumbotXY-Fall2022/img/linetest.jpg differ diff --git a/UrumbotXY-Fall2022/img/milling_axes_clamp.jpg b/UrumbotXY-Fall2022/img/milling_axes_clamp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25393db1e630e0dd4f0d7f03ec1a313aed13fa82 Binary files /dev/null and b/UrumbotXY-Fall2022/img/milling_axes_clamp.jpg differ diff --git a/UrumbotXY-Fall2022/img/milling_axes_setup.jpg b/UrumbotXY-Fall2022/img/milling_axes_setup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04ca9c1b2794e67cbd48b91bfa3eb297817b1731 Binary files /dev/null and b/UrumbotXY-Fall2022/img/milling_axes_setup.jpg differ diff --git a/UrumbotXY-Fall2022/img/traces.jpg b/UrumbotXY-Fall2022/img/traces.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b95560ce34d4c7ae8e691d2a163c16c03838ffd8 Binary files /dev/null and b/UrumbotXY-Fall2022/img/traces.jpg differ diff --git a/UrumbotXY-Fall2022/img/z-cam.jpg b/UrumbotXY-Fall2022/img/z-cam.jpg new file mode 100644 index 0000000000000000000000000000000000000000..165e3a3003b77e504ae40f4d5ff147e81f47ef3f Binary files /dev/null and b/UrumbotXY-Fall2022/img/z-cam.jpg differ diff --git a/UrumbotXY-Fall2022/video/axis_acceleration.mp4 b/UrumbotXY-Fall2022/video/axis_acceleration.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..006f5fd7878ec0dc15cbd4a855e27fe6efb28732 Binary files /dev/null and b/UrumbotXY-Fall2022/video/axis_acceleration.mp4 differ diff --git a/UrumbotXY-Fall2022/video/axis_linear.mp4 b/UrumbotXY-Fall2022/video/axis_linear.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..30ed01fde6b6dc32f3aa8aa1541253b5c38fd89e Binary files /dev/null and b/UrumbotXY-Fall2022/video/axis_linear.mp4 differ diff --git a/UrumbotXY-Fall2022/video/corexy_linear.mp4 b/UrumbotXY-Fall2022/video/corexy_linear.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..35cb6f7abbea88769dd974bd7c0261fb5f404c33 Binary files /dev/null and b/UrumbotXY-Fall2022/video/corexy_linear.mp4 differ diff --git a/UrumbotXY-Fall2022/video/corexy_spiral.mp4 b/UrumbotXY-Fall2022/video/corexy_spiral.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d1d00e2334dcae366715cdde14ab8cf3f5098aa9 Binary files /dev/null and b/UrumbotXY-Fall2022/video/corexy_spiral.mp4 differ diff --git a/UrumbotXY-Fall2022/video/milling_movie.mp4 b/UrumbotXY-Fall2022/video/milling_movie.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..5851f0156a89fee40d94746d5889d42bfa20ce8a Binary files /dev/null and b/UrumbotXY-Fall2022/video/milling_movie.mp4 differ