From 2cce67ad847ca1a92c118295148c1e2216d0bace Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Sat, 15 Apr 2017 15:22:50 -0400 Subject: [PATCH] docs: Add initial Kinematics document Signed-off-by: Kevin O'Connor --- docs/Code_Overview.md | 3 +- docs/Kinematics.md | 266 ++++++++++++++++++++++++++++ docs/Overview.md | 6 +- docs/img/corner.svg | 158 +++++++++++++++++ docs/img/corner.svg.png | Bin 0 -> 1176 bytes docs/img/delta-tower.svg | 227 ++++++++++++++++++++++++ docs/img/delta-tower.svg.png | Bin 0 -> 5698 bytes docs/img/lookahead.svg | 120 +++++++++++++ docs/img/lookahead.svg.png | Bin 0 -> 3323 bytes docs/img/ooze.svg | 167 +++++++++++++++++ docs/img/ooze.svg.png | Bin 0 -> 9319 bytes docs/img/pressure-advance.svg | 193 ++++++++++++++++++++ docs/img/pressure-advance.svg.png | Bin 0 -> 12621 bytes docs/img/pressure-cornering.svg | 166 +++++++++++++++++ docs/img/pressure-cornering.svg.png | Bin 0 -> 9556 bytes docs/img/smoothed.svg | 132 ++++++++++++++ docs/img/smoothed.svg.png | Bin 0 -> 5017 bytes docs/img/trapezoid.svg | 102 +++++++++++ docs/img/trapezoid.svg.png | Bin 0 -> 3152 bytes docs/img/trapezoids.svg | 179 +++++++++++++++++++ docs/img/trapezoids.svg.png | Bin 0 -> 4748 bytes docs/img/virtual-tower.svg | 241 +++++++++++++++++++++++++ docs/img/virtual-tower.svg.png | Bin 0 -> 5865 bytes docs/img/xy+z-tower.svg | 241 +++++++++++++++++++++++++ docs/img/xy+z-tower.svg.png | Bin 0 -> 6653 bytes docs/img/zigzag.svg | 126 +++++++++++++ docs/img/zigzag.svg.png | Bin 0 -> 5076 bytes 27 files changed, 2324 insertions(+), 3 deletions(-) create mode 100644 docs/Kinematics.md create mode 100644 docs/img/corner.svg create mode 100644 docs/img/corner.svg.png create mode 100644 docs/img/delta-tower.svg create mode 100644 docs/img/delta-tower.svg.png create mode 100644 docs/img/lookahead.svg create mode 100644 docs/img/lookahead.svg.png create mode 100644 docs/img/ooze.svg create mode 100644 docs/img/ooze.svg.png create mode 100644 docs/img/pressure-advance.svg create mode 100644 docs/img/pressure-advance.svg.png create mode 100644 docs/img/pressure-cornering.svg create mode 100644 docs/img/pressure-cornering.svg.png create mode 100644 docs/img/smoothed.svg create mode 100644 docs/img/smoothed.svg.png create mode 100644 docs/img/trapezoid.svg create mode 100644 docs/img/trapezoid.svg.png create mode 100644 docs/img/trapezoids.svg create mode 100644 docs/img/trapezoids.svg.png create mode 100644 docs/img/virtual-tower.svg create mode 100644 docs/img/virtual-tower.svg.png create mode 100644 docs/img/xy+z-tower.svg create mode 100644 docs/img/xy+z-tower.svg.png create mode 100644 docs/img/zigzag.svg create mode 100644 docs/img/zigzag.svg.png diff --git a/docs/Code_Overview.md b/docs/Code_Overview.md index 011de21a..07df5599 100644 --- a/docs/Code_Overview.md +++ b/docs/Code_Overview.md @@ -113,7 +113,8 @@ Code flow of a move command A typical printer movement starts when a "G1" command is sent to the Klippy host and it completes when the corresponding step pulses are produced on the micro-controller. This section outlines the code flow -of a typical move command. +of a typical move command. The [kinematics](Kinematics.md) document +provides further information on the mechanics of moves. * Processing for a move command starts in gcode.py. The goal of gcode.py is to translate G-code into internal calls. Changes in diff --git a/docs/Kinematics.md b/docs/Kinematics.md new file mode 100644 index 00000000..924d1291 --- /dev/null +++ b/docs/Kinematics.md @@ -0,0 +1,266 @@ +This document provides an overview of how Klipper implements robot +motion (its [kinematics](https://en.wikipedia.org/wiki/Kinematics)). +The contents may be of interest to both developers interested in +working on the Klipper software as well as users interested in better +understanding the mechanics of their machines. + +Acceleration +============ + +Klipper implements a constant acceleration scheme whenever the print +head changes velocity - the velocity is gradually changed to the new +speed instead of suddenly jerking to it. Klipper always enforces +acceleration between the tool head and the print. The filament +leaving the extruder can be quite fragile - rapid jerks and/or +extruder flow changes lead to poor quality and poor bed adhesion. Even +when not extruding, if the print head is at the same level as the +print then rapid jerking of the head can cause disruption of recently +deposited filament. Limiting speed changes of the print head (relative +to the print) reduces risks of disrupting the print. + +It is also important to enforce a maximum acceleration of the stepper +motors to ensure they do not skip or put excessive stress on the +machine. Klipper limits the acceleration of each stepper by virtue of +limiting the acceleration of the print head. Enforcing acceleration at +the print head naturally also enforces acceleration at the steppers +that control that print head (the inverse is not always true). + +Klipper implements constant acceleration. The key formula for +constant acceleration is: +``` +velocity(time) = start_velocity + accel*time +``` + +Trapezoid generator +=================== + +Klipper uses a traditional "trapezoid generator" to model the motion +of each move - each move has a start speed, it accelerates to a +cruising speed at constant acceleration, it cruises at a constant +speed, and then decelerates to the end speed using constant +acceleration. + +![trapezoid](img/trapezoid.svg.png) + +It's called a "trapezoid generator" because a velocity diagram of the +move looks like a trapezoid. + +The cruising speed is always greater than or equal to both the start +speed and the end speed. The acceleration phase may be of zero +duration (if the start speed is equal to the cruising speed), the +cruising phase may be of zero duration (if the move immediately starts +decelerating after acceleration), and/or the deceleration phase may be +of zero duration (if the end speed is equal to the cruising speed). + +![trapezoids](img/trapezoids.svg.png) + +Lookahead +========= + +The "lookahead" system is used to determine cornering speeds between +moves. + +Consider the following two moves contained on an XY plane: + +![corner](img/corner.svg.png) + +In the above situation it is possible to fully decelerate after the +first move and then fully accelerate at the start of the next move, +but that is not ideal as all that acceleration and deceleration would +greatly increase the print time and the frequent changes in extruder +flow would result in poor print quality. + +To solve this, the "lookahead" mechanism queues multiple incoming +moves and analyzes the angles between moves to determine a reasonable +speed that can be obtained during the "junction" between two moves. If +the next move forms an acute angle (the head is going to travel in +nearly a reverse direction on the next move) then only a small +junction speed is permitted. If the next move is nearly in the same +direction then the head need only slow down a little (if at all). + +![lookahead](img/lookahead.svg.png) + +The junction speeds are determined using "approximated centripetal +acceleration". Best +[described](https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/) +by the author. + +Klipper implements lookahead between moves contained in the XY plane +that have similar extruder flow rates. Other moves are rare and +implementing lookahead between them is unnecessary. + +Key formula for lookahead: +``` +end_velocity^2 = start_velocity^2 + 2*accel*move_distance +``` + +Smoothed lookahead +------------------ + +Klipper also implements a mechanism for smoothing out the motions of +short "zig-zag" moves. Consider the following moves: + +![zigzag](img/zigzag.svg.png) + +In the above, the frequent changes from acceleration to deceleration +can cause the machine to vibrate which causes stress on the machine +and increases the noise. To reduce this, Klipper tracks both regular +move acceleration as well as a virtual "acceleration to deceleration" +rate. Using this system, the top speed of these short "zig zag" moves +are limited to smooth out the printer motion: + +![smoothed](img/smoothed.svg.png) + +In the above, note the dashed gray lines - this is a graphical +representation of the "pseudo acceleration". Where the two dashed +lines meet enforces a limit on the move's top speed. For most moves +the limit will be at or above the move's existing limits and no change +in behavior is induced. However, for short "zig-zag" moves the limit +comes into play and it reduces the top speed. Note that the grey lines +represent a pseudo-acceleration to limit top speed only - the move +continues to use it's normal acceleration scheme up to its adjusted +top-speed. + +Generating steps +================ + +Once the lookahead process completes, the print head movement for the +given move is fully known (time, start position, end position, +velocity at each point) and it is possible to generate the step times +for the move. This process is done within "kinematic classes" in the +Klipper code. Outside of these kinematic classes, everything is +tracked in millimeters, seconds, and in cartesian coordinate space. +It's the task of the kinematic classes to convert from this generic +coordinate system to the hardware specifics of the particular printer. + +In general, the code determines each step time by first calculating +where along the line of movement the head would be if a step is +taken. It then calculates what time the head should be at that +position. Determining the time along the line of movement can be done +using the formulas for constant acceleration and constant velocity: + +``` +time = sqrt(2*distance/accel + (start_velocity/accel)^2) - start_velocity/accel +time = distance/cruise_velocity +``` + +Cartesian Robots +---------------- + +Generating steps for cartesian printers is the simplest case. The +movement on each axis is directly related to the movement in cartesian +space. + +Delta Robots +------------ + +To generate step times on Delta printers it is necessary to correlate +the movement in cartesian space with the movement on each stepper +tower. + +![delta-tower](img/delta-tower.svg.png) + +To simplify the math, for each move contained in an XY plane, the code +calculates the location of a "virtual tower" that is along the line of +movement. This virtual tower is chosen at the point where the line of +movement (extended infinitely in both directions) would be closest to +the actual tower. + +![virtual-tower](img/virtual-tower.svg.png) + +It is then possible to calculate where the head will be along the line +of movement after each step is taken on the virtual tower. The key +formula is Pythagorean's formula: + +``` +distance_to_tower^2 = arm_length^2 - tower_height^2 +``` + +One complexity is that if the print head passes the virtual tower +location then the stepper direction must be reversed. In this case +forward steps will be taken at the start of the move and reverse steps +will be taken at the end of the move. + +### Delta movements beyond simple XY plane ### + +Movement calculation is a little more complicated if the move is not +fully contained within a simple XY plane. A virtual tower along the +line of movement is still calculated, but in this case the tower is +not at a 90 degree angle relative to the line of movement: + +![xy+z-tower](img/xy+z-tower.svg.png) + +The code continues to calculate step times using the same general +scheme as delta moves within an XY plane, but the slope of the tower +must also be used in the calculations. + +Should the move contain only Z movement (ie, no XY movement at all) +then the same math is used - just in this case the tower is parallel +to the line of movement (its slope is 1.0). + +Extruder kinematics +------------------- + +Klipper implements extruder motion in its own kinematic class. Since +the timing and speed of each print head movement is fully known for +each move, it's possible to calculate the step times for the extruder +independently from the step time calculations of the print head +movement. + +Basic extruder movement is simple to calculate. The step time +generation uses the same constant acceleration and constant velocity +formulas that cartesian robots use. + +### Pressure advance ### + +Experimentation has shown that it's possible to improve the modeling +of the extruder beyond the basic extruder formula. In the ideal case, +as an extrusion move progresses, the same volume of filament should be +deposited at each point along the move and there should be no volume +extruded after the move. Unfortunately, it's common to find that the +basic extrusion formulas cause too little filament to exit the +extruder at the start of extrusion moves and for excess filament to +extrude after extrusion ends. This is often referred to as "ooze". + +![ooze](img/ooze.svg.png) + +The "pressure advance" system attempts to account for this by using a +different model for the extruder. Instead of naively believing that +each mm^3 of filament fed into the extruder will result in that amount +of mm^3 immediately exiting the extruder, it uses a model based on +pressure. Pressure increases when filament is pushed into the extruder +(as in [Hooke's law](https://en.wikipedia.org/wiki/Hooke%27s_law)) and +the pressure necessary to extrude is dominated by the flow rate +through the nozzle orifice (as in +[Poiseuille law](https://en.wikipedia.org/wiki/Poiseuille_law)). The +details of the above physics are not important - only that the +relationship between pressure and flow rate is linear. It is expected +that an appropriate "pressure advance" value for a particular filament +and extruder will be determined experimentally. + +Once configured, Klipper will push in an additional amount of filament +during acceleration and retract that additional filament during +deceleration. The higher the desired filament flow rate, the more +filament must be pushed in during acceleration to account for +pressure. Any additional filament pushed in during head acceleration +is retracted during head deceleration (the extruder will have a +negative velocity). + +![pressure-advance](img/pressure-advance.svg.png) + +One may notice that the pressure advance algorithm can cause the +extruder motor to make sudden velocity changes. This is tolerated +based on the idea that the majority of the inertia in the system is in +changing the extruder pressure. As long as the extruder pressure does +not change rapidly it is okay to make some sudden changes in extruder +motor velocity. + +One area where sudden velocity changes become problematic is during +small changes in head speed due to cornering. + +![pressure-cornering](img/pressure-cornering.svg.png) + +To prevent this, the Klipper pressure advance code utilizes the move +lookahead queue to detect intermittent speed changes. In these cases +the amount of pressure increased and decreased will be reduced or +eliminated. diff --git a/docs/Overview.md b/docs/Overview.md index 8b221763..14fb5bd3 100644 --- a/docs/Overview.md +++ b/docs/Overview.md @@ -1,7 +1,9 @@ See [installation](Installation.md) for information on compiling, installing, and running Klipper. Read [features](Features.md) for a -high-level description of useful capabilities. The history of releases -is available at [releases](Releases.md). +high-level description of useful capabilities. The +[kinematics](Kinematics.md) document provides information on how +movement is implemented. The history of releases is available at +[releases](Releases.md). There are also several documents available for developers interested in understanding how Klipper works: diff --git a/docs/img/corner.svg b/docs/img/corner.svg new file mode 100644 index 00000000..3383a969 --- /dev/null +++ b/docs/img/corner.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/docs/img/corner.svg.png b/docs/img/corner.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..c94ade2096d5f3da24d953b89a52a2942c3b06e3 GIT binary patch literal 1176 zcmV;J1ZVq+P)+e3z16ID2j^+DrgnNopjliqHaWMn>78d)hbx1O8rRMG%n6u-gGjreQ(}J z-fQO%m${ku=FH8V^S|eR&fGVmMiJw90T1CAj%O|PPvYF_46Q~lF|yhN7+^ex8Qf4f ze*vd(*u^9{mbFvacWMk7YBF3Jcj7bLSMu4iaQbTs=g;G3L6$_2)A&)4<^gQP5gf&d z?3x;@jG7FW$6CCG=Y;c*ws_rgb}Y_u(Z+fFB#2RLhwxXWQP*f2H5ppRBX}RzYn>2f zSk~UWpHWVfqaxDOlB`Rp$et96DBZ;8#@@|-$HIB$(8S) zP$&9rp(X>jVViKy?YaI$hjvp0_(PCj8h@62@8;b7ifyybqR_9{Z)HR|++-|+icySV zv6nZwTF9^lw`(|iI!;+xE$S30Cpal`jT!t?(bigxC{k?Ou&#q~4x9XXSwygp;1X% zP4rTJoza-5e#);Yd?)g*W$ec5*wYQ;gG`2I(&lba(PoJN<%)XFJe~VHk>WJoQ8BORCmG75&34>c z!B#VA)6RspiY@qFM5F)k9(Ib-<<*E@%ddQHlAiAoQI$&=$G5_N@(X6F;GGjuVn=49 zC3Kq%Yea%mboy>fn>qcdc3g`uahF(a-oo#FxbLu{pYrQ0Ud--UM!+Ov_ux$}lZc(QcP;(C#kC4ji>Ogh}>0Vc^>I~#T#Q{n{YES zEQm~gn50dOD;MLUi1CcpcK?=bxnC6i`vVSU?GO%*iB)~d%8E@bZE6e>Hsf<4k7y8~ z>~|xJ!od${IQxO@*!2Cwh&oBEG5B~`>;Tx1J9j~BhMW@)KQCM1#gC=h-V!qiZ=h?` qXogWdi$_HzGCBLakndgH()~Yow^V!a#(psX0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + tower + line of movement + move + + + + + + diff --git a/docs/img/delta-tower.svg.png b/docs/img/delta-tower.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..fe03d8d40af2dab82a075442b2ac86d64cb38204 GIT binary patch literal 5698 zcmW+)2{=^k`yOMB!6&;JghKXxo2;KbZDXCuma%0o#yZwM*_C3lWhp~`*%@1dDVb42 zN(@=26fw3$Xu|*WKi756xz2m;_dVx*pZj^9`+2jjUbf-omf!|~K)iOgmI&a^0L~aL z4&eHwscQqcu|-;Zd#e#)k@2Fnj2gz1inX8+*7?GUA!A75?CGW2=kinUDx-mMiC) z&}wmD)dLT3lKHoLc7|lVqx$c(2r1lb%?I(p=#i@IYSQ$`uVs|fH-~($5al&PMuKje zeV*Vypg@ow>m%Qe6WMJAx+Y!EEWmI%YxvQxdn9{0i0(v3($z_g$X}m8bD#!J8jCXt z<;@e(G-b`A555vhIc(cM#*hNE^D*oZ`TM^S>I-`dKg_ij2T7`)<(hOyTk>L>FJEC#~6@c`y11o@%Il?&QWxS4$1k4>+O!C}S zUYYewMORNP!$}vm{-}c#SZzSAaTGh20r0V?zycpVkRC_xGE(H;$BzH%1g_?tx{g$=FnR=P_K+6us8up2 zlryxj85)ACwsG~jH% z3^?zBl{HhBG%C)-avgkP{=`K0GYfLdAnr8tJT~y;4_%d;iQMr zWoovHH>t<8;1}Gj%QoQIf9l=~x|}&0r=;lr6a2^FQG#u!2V_D98LwW5co9-D*d?>J zGqz+b&-B_+QdQT+r7H1m$br~+vIFHHRWt@7j(wHG;2%z33fYRhknQ&UsK8vl?RAmK zB7@{ea=m{XY`D$!z}e(q{7~*(rNU_s(rnij)X_)R3$Nw1jck)Tx^K+J3> zr9DtfKau$7$;`}*%*oKE?b*}fJqi1p%6Xci=kd6nCb(d+M$p7FLjr;D0_b{WSg(1? z=cbK^he!L^3S24Vk~6>YEgaFpuqM5kCO!2Ur$G80#t*jXHS=PYAKl< zhZimx=(8wnergX`m>~o&Qe(_KJ_8GBUoQnHxWsr*XnUs|=bp_bX>o5m&`TCqL=gy-$8^6M#2fd#6&JFXa{ zD8vm#Cp8qt(=hYr^78W3SKzhoHvpV6fMe!rs_W|MEhn0%zEcU;yun$lk~nm5bgZt3 z|KFXLbn!!O+0$9MkaP>(;qvvoCWe$pt_6D;QuXMp7)0tRAxWdeL8>cg@_z&T%RR=_ zgm%PQk54=CQ;QE_w+!%Sr}G#rK#7S&#<4a`C0wt8w{y4b+EeR!HU}P#JJqQd#v(u!E-0LV+ky%XowDs2a-r>-1=9Vj{3{kGHY0G0`)_=yX=$U5n}*0_{rtrzkh% zLdb43uYArq<)nedOL&ASc#apUS6)Xj858^YvmZviRo;_j=~IIE-zTxi5FH80Xq-Nj z#&P}jUBFzj3}==OMZCYhj*iY=)QQ;{jW;Vlj~;0*$4+6?^M`y|Q?oiWTJ@$MXuqXW z2kHxhtX({953&7HygGg;PrB6<=3b}8Je0ZJb1vY*{#;~zc6RoDfzqjZ+*SBvRJ!;L|zlD!C9K;|L3M41~GYFXoMZBFcvgQ$WRU-oCXzG3S)rb%wu%N4T}3e&_AS z&fO-V7Fb@-cwel1(?PVa&w)xvw9%dtzH$Iu>La5T{`}>(Fl}d#I{c+2G9*P$(b>cBTk0p~qbpzZL50!&FE5Ytl#F9*x7 zDn@BU^bv^vN|zxs&X?d^&-~~K~AxOBRgo+R$NzAi(ahQ4b|`)Xl;fD@OxiK z*@R)>?@)}TH3q}$ZHxo1|3+v;!GjxdSDfq6rK>#_FO^8*jyb!nZAZ8(M zB^w~Lao=JR6G^@9>jri2K1g|(`Ved4HH?{G%GHej@;Xbu{|6cB`W4S1wcyd-r?(`^cldBay*MbuZ7`@b=0@GLJ#UPij z+8cv&CsEQM?_9g?CMIqDQ+wUS#6))-U#pEc@8E}m`Y60R}%@x@a1mgHXxotBmz?jhBsIHn*-R%|6Aey%5V@RXmN8ss$V z;3IMLNa4FqWjr5;6q`T4r&Ho!HfGx}yEAD8cD78yvTF4U&A8DvSs}u_iB&}&Q9n^) zQrS!$sMB1gH+8Ce5)b46pB0$GP(l{_k20Y8VIiZTg~q@j5r<;ihE?1K`M-)*60WBo z$B;ySC=rltPYM0}2950-WU)fT2Db^|_}}xO`tPDW_8ssOxqxWnK7({|(Sv(gu)|4( zSFBkTWL`aHb&^dR)r&36Vvzz{q_({xs7lC#O#mK{8Fr#-4kqvGcdLQs_ z?wJLp?8Ba)cL@SHu=$+9V64<7X8{@2QdVf^!0zX&AOozAjE77?~t_!d{>t?&~GX3y{gSNId!8}a?^az+PHH8@v z1mvGo=Gcv)Qd6A>y$CrCwWXu^VYf8Xr9Po;EuXS3UYC?1O9NO%b)m#V2l?g+)IdnC zp-8u^M4rjaN3@f(a}lWFdY9U#Th}p|y;LCZ*yAUV`Zdgfh2Bipyhfc}*Tmo-_ZTS7GaC84~r`HRZ2I+?Wr1aKoStoTRg&-oWRiyJ>ZD0Ex_lA z0x5vcs@FD=JVRg5KGjO(|KRy7+3I)sicfmb&9Teqk?CWp*Z#B$M{X?pf!a>&_0s+O zSqIdD5<8KL@Iu7C7i3xLvOwfTYzvE1UNjO^w~OQev_OUO2T~}N+Kl=i;>;ErMHgm z$!Je$Ns|oDE$u1XEYr|tMPfnT5Ut2if!kw}&GVWhC%QXaVvg)oCGhO&5gT*hOz>d^ z4`i4dgiG^flb!xS`kYDX2hC+e%#MW)h*Q5@=pb)!i^M_4{_%;7+NQU!#pn$Zr2u~| zk)%@tjn)l)B1J2d!|ne&6YxIS!7fqjHfma z+yrWRazvaDB^6~FuSR`XH#>8+wy^hVaAJj~e=lOq5Iy4S{gBbC4`>%>kB#v2Mz2V` z!|5j(!_#EM*;6VO9F?2r-00p*48@;afETZf6i&HeXx zz51Ck73s7KaeF$UCBnYjf&32=sj1xbaPiqATWL(PuV29wFXkjRfau^K69g}(eF1Ow~ zMVmX%pFdZqh#I%UqZm=ke~h&RzbbLmS?6Y1KfRbr0rHoJP}iMS$Z4x{G(hwuD+=`* z6xknzu1~kB2RAmeh{zGHRzlZfJ40uqPersW85klps9MDHrON%T*g(S;kKn$V{{G`b zEQJk-VE$0_rnwhm6soL@cs9rLG>c!(QUl~d+hUaPqpabB@-{$7ox}kA- znzN~n5)u-6Kn>7z)xMD>thu3Kccp!#58rZL5$eu`>(U0|pLuX!#Is$zYPyZNFU_Kj z__(@o#wWKVyKu6_Eq?UAXmB-h;hhGVSXVgH#l(qRjK168_7OLQnNMpcKHjd@tZiWW z|7|UI%XzuuKPaY+3N{vNuT!yld;fGW`Ssl{MQ=c_<0r(>BQFl~2NB(nQ>`M^-$uzo z=#h(m_pQ3WIyVdj#lcSlA{M9?Yc^)Pt^-QaVc|7u1lJ|^B6_2A_2;49>?r}gwSw8*ngg_LbniWL0#wUJ|{1CWXVo^a2ZiVRHR-&1mi6GK?)uirSkur|oeUzs; zrG$6Mg&FRwefEh{#ihyy_+VfwT)xgfVp0+KiCG{IK5d|Rj=So?g-vOYD+-HL+zzfWB7L*{bT=V&5%R~T^=nQ!L_-zT z@x6scqs7-WSdNPcPNKXdbB00|oeTt#9zT3)Xm2FwruWCW_(9TEA{m~k4dO+XE||)D zPCN%{p+0?(`l2?|wi)J1s%xqj_@t`w>>d2@_x-e+k;@~7-N3Gpv8+={OcCN^p5|gS zjN-x>zT|Hid(B%AVVo$qErl?VNts|`x$869z~}vU*&_atT|O#6T?p>`)hw&rSNUZ_ z5Z1tt7RUZBLW-)QbZQ9%j2z zOp{Gmf~utwXUYV_ops$pX)e_rrf!k_vp?gHItAiG6uEe9NAZC%3yfZx8>)Qs`O+cA zn{_*&W(Ff46Bnv&$QnBbKaTglylK%1(LI)?*vaQ#Zi~GK?DvA~tS(zNS$L=YADDLV A5C8xG literal 0 HcmV?d00001 diff --git a/docs/img/lookahead.svg b/docs/img/lookahead.svg new file mode 100644 index 00000000..4962a48a --- /dev/null +++ b/docs/img/lookahead.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + time + velocity + + + + + + diff --git a/docs/img/lookahead.svg.png b/docs/img/lookahead.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..eb822746c0dc49948976f6a58741d9da8426e27f GIT binary patch literal 3323 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 yM85`xes|j|vRAk#1I?R!0^B?Hg9Q)t)_ + + + + + + + + + + + image/svg+xml + + + + + + + + head velocity + + + + extrude move + non-extrude move + + time + filament + + + + diff --git a/docs/img/ooze.svg.png b/docs/img/ooze.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..138010dd346d98ac5aeb6626f0a46ca829d3478e GIT binary patch literal 9319 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 literal 0 HcmV?d00001 diff --git a/docs/img/pressure-advance.svg b/docs/img/pressure-advance.svg new file mode 100644 index 00000000..a05f66ce --- /dev/null +++ b/docs/img/pressure-advance.svg @@ -0,0 +1,193 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + extrudervelocity + + + + head velocity + + + + extrude move + non-extrude move + + extruderpressure + + + + diff --git a/docs/img/pressure-advance.svg.png b/docs/img/pressure-advance.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..87772f84511ea7c09aea2f19f19cd063ee24bbd5 GIT binary patch literal 12621 zcmZ{L2T+q;6K)Ej3ZZv`f=Uq(>Agr573sYMkQnK`3MA4&zye5-mWXr-ARs*|O^Wnh z#SaNxq)NT7-~azJckay1Oollp=j_?D@4MyMUE&S&b!e$MsX-tR?HyfBBM=De27Hl} zY9T4gw}Q{Io3mj6G3)fet>- zpuoUDvBw^+zD^Ea&SIWEkFvLvI6CQ7#cgylZU?b|ak&AV#qnHRGD=1`5D3G*7WgPmXKD__1ux!1Y^ zf?~h_XBb5}d4fkAxC)}PGcCbM5IayE7(pg;X@*;}X8c7U{3Mn*M%*O61Z{hw#;X;4 zpHzxsl(GA`JhmUHahaC=zt_G8K-eJm6!QsozC;eATMpTO$CwuOBeKD?-;L0^Ov|L-dUsMOT)p(#`^v?Vs56+bCB#-@KIfq~ ze5S9QE{S?F1y?mz1RVgYf>g|$c`4i^YcS-XSJ*`CA;ube6T)v)*TOm}TA!YoX<6!w zF*dk)Y$|ndJX!7j9-@-z+tk-*WrpWHc88o&2O%awlN=TdlTf+bVG*7GojK`*Rm83m zX9O*_InHLIjrb=(H?AJ+2r@|4C`h?*AE+%J4ox(1%$$Z!4g7nB0z>6lE#mLJOXIv0 z`u&q#;Qw-}F+_UqsGk7TZd`0mt}b3Ne)hRTH&7|Iz|Pvs-f0BJ$tO ztFG`95#&{`tG_Jvrn{?us8G4(R96Dx9CH*QfHK$`uN3S{BQL;(GAf|fsNdsXBSyuL z`kk%%@lx{!d!EO3q!^2~0Ons@ek*g7MNnC-u8oOfPQv#6C#n_S!sfojL_iVbcId&K zR!I5NT!D<}-|mY(oNNTq;cmp%GI7nh(mhi6u+Wwk=-2lLm8fdw|7prXV_{sDNd?M&)t@`3AL3y#7D&#CJmj6JYD>b+&Z2 znzG;({E{6g78LrL=MW;Lok!XZxHFp0)cq*9F(3f(>k_rp4ai~sBAFNcFM0)m3DCLL zNcdaK=iPlStMMkyqP*3e5CE~j`rmrg7vv8zJPnOjsKLA0=iTckIN*FxNl zKAc@7<% zF!uIrnVih=nF|^+QkDui7$=St2a3~ugur^F1`1vUx-ae$dx^aGJosCwKPAwQT(+1p z-25m%2{+4e^k^v~TW5O#i)vCyR8ccaO19lD=3C!VS`3ZPYlEFW*gIPox^UVs&;yg6 zwFl&bjz&l)g+ubP}f$^bd7Y5MfvdUx8)dRc4a1O z;hiRHLD)vu5QWj~yH_NHfs;28!Ftv#k;TuraQ_*exrXkoU(3_?9a@H5=^D!gKbo*j zSXB3rI{ya(;}e zu^!*W62s?{jQZ1H#jkVT&>pil-mmCTAF9erYJDltYmQkcSe%K6oINh?dhyd_F`l$8 zK)Rh2aW1qLT^xmamd*?-`8|5cNpIq$_uIEtP&ma#E?l0hT1k?Nis`}bD-x%u{S&fL-xf04?FG%? zIcwZPnC||!NyTD;i|cFq`f+x7k>7Sqg_NJ!v&~6k6fhCmtBu;3@d~z8-hvrj%D)zH z^Sf3g4R>#xs5$PNt{5i=p{SsFOoeptLw|JU8|V0hzVb#U@lxYOkwAxhmFUo>`4gJ@ zxLjVV;|_WO^mBN0B>Iq?MF{CLY{GZvM%pr+xqJ)z?RL{>Z)D9rxec2G2jj zmkshBd{|alRHSuFbXKI98|v4ZI2zjX@Gp`yq+aCl`&Pjn7RI|@x~(>F3!$~Lha#>Q z8~@Hh=k$pRklr80xZ5&92yaQ7^)HYUmGMJvg$s@jk%N_AcebrN%L>tmQj`bl_ zY~9(*_hK34ngbP5zbp9Afe_5FPth-T#mEj;n4E6^5^H21*MUlR|PuFu_(91LO+y0Hg$PxKsr#-meVI4ywQ*(OmE0@MWY5zx43oGy2 zw^#7+x7SFGHcYlnuM2ji>&W)sU2wDnikvrjK-`|ae_d9Rix7^wA{f+n`-0swKQa8z zv(2_hm6Dkb-PHP4$|T$*4Xo(Z(5vG~F*KTiM5ao1w*<)cfubkAqw?gUM~RIogWL6 zAZ?V&Ui#T*E+~0NGi;qYwG{`BnP$P&5g-_w4fBVAHQ}_4gK6OQ=s|XWX$13)ICg zz$b!x$PM|?nk`L!#)HBY18Drb z4kas49zJtcTHAX_%Tya)3J{@{`o~R#GxtCu?U8J)quxIjQn%Xm8cCVdcdam6)z!`S zk0}(;M;3(z1-?S}9R}*J{ES*Y9*@=7K|%gb@y`BaWWVPaP@m+xVrGc^7;>}8{=dr`94vS zJ+1R1XIOkW(dbg4L5ciN!NEKBakss9C2gxvOt+#DIdS#2hQhAbjkKaa)~XXg1eqd~WPC2D z7k$dg@;gGn`NZr_yqm_V2B}tf#_EKG`_OKNc>KbUl%?Bb)`#f?g5g1*U8W(*=NFm{ z>#h=Yo@uGNZ|JDgfUh`m_5V~K}QcuY)VI_CyWKro@4(UHo#3?rFuuZ zQ`=XGdc1I zDoUZsP@!_lZZ&#&^Py*Syd>h=qu_t4Z1u;UPP27hDvVDm+v+(RgcA`A|pi%ew@$GjsXMQtke6Q`2L+hB3ND zbsPOLm%;AT?puP$3&dF4d`gcp30I`K1kcVU*@=xG=b?U9O=y*9yf&`2p)K=0iAST% z4bKp^nmVx_aj<%R1vZ4s=c*KS_-a43yX#`|U{diS%PinUUnsKm<6fkyNk4m%N)Z_&XNdL+h@4QXEaSglB_VS^;=?W`t)~l|0>i)OV zW$~ett4in7J<|Bu($~`e+zDa@d zcYR086sS-1gob`!=C3dcY zm!&BG#}A2HpmRMT3)Pr}>1S74mgX1}SO@|I2eVIsXV&ws0Hd6F3_X}e=X767@<^?1 z)BZ_N1(#zX2Q5TH()Yf!w+jla?)P=zD>YX8&PsJfc6|!HDeIjIG)el*ujk-y0mzcy8m&q<-#-a0JWA0sV{?$Em~f;8jq5x=jdHIxC(rKb|@Ukb5!`dn6XC= zMRuiVs|IRTrg1&}Jy+nL--H#D`r1{_%0uiWHCr}yhIxR}J*^V^);>s5hi^k3X;y}@ z$%#78=qFTh{%IuPLgRD&4f=%t@GAr+mpjaS4|>wJZ^+N9kW3a%!yQ$++u_t)c{%LJ z*ibt@NM3xsB1qFvbY!$1>f!EaUCxVsNVKB};)b9`TEYpxb;_` zvPfa~xZV;gsFVbc?Y1M{>_+r3ht&P}NgPHu6yaEK)#LPs)i?S>Z0Ir)?;TQ`vJTRi-fEf1#OS0s;Wk;KKg{~S4COiS`&YMeZv zo+Nj5uT8Z+gRLe8Wxyt|K2v3Q@BZwU%B_ERQZHy6~eHH`IQQkLiWYJ?RGLL4d-4ua#4*QsPbSEF^mLp~=PRULTqtbv}W z>`a3`yveZCkaCPC*kWn%+q{r1O=rE8e54$+vdt-~r?uevw|lqQMmB-;*#4NGpD2*T zpl_+8vTGXREM@?Qa&uBatn&A&Nhi08=l3CgO&Qlm+c_TS)N3aS3~r z{o`aGWhqb-q7?tFQisx7pljM7;%+iPZ(eVYSY4Wrdz{^8|Xr?!EZ- zKkFqd^%CnXa>&@$x^h~UYq2@z;Nl`oq5<*!p|S=`NvY1z%p|tw1*@g~j2xu!7y&zQ z*G&vrgI^>EqoZZcUuY&}4Xz8#N2BhrhShziV2-GL-hnoKg$upm2XzsDy_9k}D0RvA!~I{PsqATB7gpf4J-`F8s6fy|;{yUWcg2BMpk z{_YlLQ(V%O>WZ(x0)-uv73LP1Y1vE3LXZWuf@ZZR?OOj183+_0Hjn^rwKn`VKq->` z)9)LCw7qyq5rvm9v?o_&9rDOT_tYj2QRA>Nk z;E{@u>3qX@OR~%`w`E2Ydvl~k<-IW<3MJiB6MNQ@I`N<1NXRJ{p%-&lUdSuJfcG8e z4Z13bT{(@_R&FKR0E2ZoJ)?&qAeyYA%l@4*@!O@n{6Dv?GT1y)s(RC0G)#6c<*;4 zhc47$AB=mI?_z2(wua(OJVBS_5Ef!id3*)8nS- zcMls*uwxPjmf2frziww^x5Q*<=ICkGj7dsI)})w>YyP-df1SNBALcF)a+P$FS1=!# zm4->tJb9mjVC*=lz&!OgyV;@(cmTk6%M&Od^&NfXvHFVxf^u!pC$zAMwtVib>qM1@ z3+K=`WKZanFU?$?zWMD=EBOPco3>jRWHjPdS3c|iGTr*Dyvp58-fs%IXp630hT z6sqK<^2P~v8*GkOJ66fk{moU)E7zL*du|&@Z&L(pr@HUTOg&D)?Gb)_e_|Y2_qnfJ zpWm>y(H*;-eQMWhd?L4vY9wD4X`^qvVn+GR!FpzfgC$Hj@RnZYTT9mcVU0CSCcVbN z#&i_jB*6daj)LIIsZ^F4V?;{=O4!U7v?{s!^X1uKHKovtiXq#MAA*3|0t>khdeJ@p zKD8M;L_>6Ah%~=$CDpBz4V;D+Ui~N`txJr~yua#R71^v5<&&mJ z<`&74;`>(+^P4hz73CyhwAFDF3H%QgT6gjO!-+5Cw(M6zrko7rCl8B7mz_|oCKA^q zprUAn=ksZ7XChugb7gb3*chs<2LYv5zd5bUjpRlpsLW|EvmpEWsIPDkRzMM2LP<2M z=k)Js#yCqJatxQ9^^eOhd&*Z2<7Jl+3{zUB0Pl&kIt0Up-*cc=LXGth50k zJkl{Wu+}jX^DU*GQk7{!#FRp~(#nIQy0`2d2gOD*N_X7o-m1HvtJ=?HaX)pt^xYGy z^*FYN^GbdiebsNrD(pCd%Hy~HkRKa#j}(#|m6TQvYsbB>DCp>4nxn6=I34uXKwipP zmII0e`1R`9*>3J834mOzBZE1U4_)%)P~#@v#8xuc zinHMWB(>Dy>C^okmgHMWTVFs6_!IGl!;)EzfzZ@$ZFJAsE(u#~nZ-5OAkW}$H%~jm zU6UKmv8ep$RSQvFk~`MJKO*f%sFiCYTh5K9D33Ufy^X2dmsN8f(g;t>ML($~?`=|T zWkKrQ^k!o|M1*^7!o<-V8}A!6Z&E2XxG)-ws&Mje;Bc!iRWSwA!@c<(^k&cO?8%-~ zeGU(Pr%8^l6>jPl`{Tlzs5)9?GTS5aykgMn-Gx@ee3PMPa0m5Cdw@>j6ofmnr~0W6 zChhv=K9JeAmUXC8D04aQ*VVJ~T3W4vhw1s#k|_1GL$_^+jJEtT#b95D5b=gIw<~j@ zGy|JqNWMI`g@r?#k};oWfzlbTZ-}a^JB?vQCY?!WXSo46XhG*j<^@?2vpi!CVXU04 zIj++^f+|UbBgVyz*W95^fTWT$SFW3^6X@JV2|N>@*N{U);n+qh>SFV;j~5e$n=c}? zPFkM%bZ7`~?6UvbnU@+Dp~%Kz&TJL~GWNZ=3zt7R@?-LhPa;408^n(>4U%5EoG3qA zGsGaI;_&_=%Yb9zTA3Inj99!R+eJFO`(8y8Ip>lRaqids(Ogv@2LDY4n%@GWe^R zW#~(0%g}G6F*ee`>e^jW+DLzCgUYe5go=5E8p?pv^Vnu-|1tVmfb#Wxy+;EObMwiq z_jcSfBAx^JAG%o!xE#;SgW;iK%ElZ}th7*4)%y;$)!gTB5Qx6@Z!Z9l-?$reO_l zk7!By3XfL$xpPr%CVR6IhXrT+*?YAwe_Uuk%Yqe0r}S%@lhh@H7K(mLa@5TFvH3nJK_mtRSKonYZlYg0U1DIjCualGH?$u!0 zdxrs12izlJ9)bXoLz$rU9mnziWmsO+u|fDYF#wQx8nkY?loC7xP%#A{c#Ea`*K)C( z0xk^XASgjO*Ppqgjm9EtDdJbH6PLZFwAME=go|Ech)Y*Q7rj+M5+2)&u~)kVIiMka zB0Uae5GDT^?9;l))so>A4Ky#C5=2(gC@rM2?tcJ{{S>P<#|CQ1;u5ro z&4WqZUg89PuS%Pv&Oh^H=%JmKpaflRoQG=av96zAb0-yXIq^(M?;r3$jf)lg>{n)4ZVMq*5 zTuQlK?I=%k1nyu5IgWcOMLs=92VPLoLVRvgq6+y?xoLaiZpb)(3}2R;#6#%kbPCy9 z`6s_ZT(YLLGe4ev`-cxuTZj&XH+IbZO~EM3UvnIn^WIk}(gGZahs2tLDtqG?9@c8b-Nc&@DVX;s z!QqlMw`n-8w$Un)*}z0Pl>t5z6re5JRzwH%CnF&Amn;+3gf~Iuc#ja`iXrZI@&Sli z`;1=wH$75l@pHTD-#!sj20mnE!qbDL_P@vpWg6A(5FxNEU8LF9S1PFY-0yFL3-#ZA z7FNU5ziN|d$)ZK|^531`0q8Q$m%s>U5CAN3g6hM6Sr7&$=Dq-D|KAg@|H2$ILqo`c zW5Nh4z_&0!`ftlf0`9LW{Cn2lcl_UpJOA&*|5p5W%LmMv4$_A=S^kn7EQtQ2Qiyxt zViffW@IX*zT2@56OClq&PPuS5$Q#(RWVznjcT^yd5o$4z;E8KU1!|Jp?9r!Qyx0~0R+!0t4y-CJuXq6U5 zFV1Z7yehA3KQq(x1uM`HGalF4iQCgXm2T?CwJ~Al;25YPgaSNc ztW1hv{8(C_BrUmK834;AuhUfb`$5|G#cGsp%wUHRU)G)s%wb&DXS@2!?eFwDY?GgY zmfx@$g?Py^C7l+(r3qrTX!#Z(_czwmdeq~(4d%yftKM^~QRvY!_m%PD_+`8(&)lw~ z)z$<75}b(t3b2*&BiTnb*hC>_0CED&9{1{lVy+Nnfo>}BE^fP$PZ`-1n^UPyx{&TQ zdYIC{3lgz)Solu5Q0>j2ZsTIy%yVX*TDc=I_2X1M=Xv=fA)eIh!G#Un155;nF3n^h zctPWnzvZGYv5d%uU2&EBDb|A4xk0{>0@Yy>i@Q|#yXI-(j_qCiGXSAdUlv6|Pg%#9 zEolpHpfn?7?%sH(c>tlKnTxYK2GKV3N$?ha85RN0mk_ogdmH?{GlKWWvjh6^zb(!i zXgwzA7Xyi!d*3spcX~zGEWuoUJ4#cDPUqZ5WOJbrJEBKcXq$irvkiv_@#jh`L4r=% zaKm4{jKbnpo2|*(dhXDBG_$PhD@zzrbT@8Ke@cWXbd4 zQB)jl3zv=_-Av*6{EY-HNtU42=BA4yk~>R^7`s`v@T;zUoqW!+0rG_2E^?2Rx9DcZK zR0iO$Q~z2=i}7PtP$1})K|^%!XPK_@ru&Ba0lYv-ovcyxO?0P|`K}^ThSO34YPx+w z6Ed9Zteooe7}kq}XTU~PVGC9x@uXzo&2J+jAE6kw!8_B@YmU4l?T6MBumdv!{8-j| zyYXTYa+asc1sK+}@+jdw|Iw-edOhPAb+}lHW=XmTFFsI%QbUf{wpjo$jLWFYdQ1U^ z5jos7m&px-r@c0cQpY`K>Bg>SCZO)1HruY3(oa(7YO`(q4NV%3?e{L`OJ5b1)4uH& zn`K=lEZ|caS8p>t4!8MoYXT=VyQwzHKSy;xIPYcEgEA#Q?pPI@d36omii*!8Wzh?YC_{R_)Y}qzE^u>teO+ z1q!?;1!Py1yKs!}wdxRSw*5dvNP~*-qq|p8S72#3uIbO@p(XIs#KdJ^wZvxbW*tnS zD!%SQ(rWO~tvZ%MOech;jZdE3w!G~xxbJ-RuG}leaAu8U`Hj4lIV=M7>k?<;87PD@ z6LqPhGANLRdXgd_It2Pa`H)wT5wTxJxsclE2ew>3VFsD?tzwKK`KSWxIDQUQM%h^BelEp&K?G z5(){ry2=!Oa2hR^UDiIkd8Q{I34BnoUc-7 zSKfbH$5_k-eT_>9NMzjJAtwYxpDh)HCAvHgN^a)PNV9%MjoD1vx}3vVWdnezO8mTs zk}?mo+6s>1`J)N1J~pATgmdv7gf*Tb(=tKsgQq1Dn);}q5_H+@chO7ubjyZ;H)u=N?d;ccZxQsIY}Fqk(Q_^ z{_2K@b9&?zL4!c>qp_-mQgmijm4EBPI@(Xqko)QR)@uNKv!nxI>I>}3*tmLQ{dbxS%}F3&j_8bryS5Yv(+ZE6O}P1X)^qw9m7 zKOL8xrJJnkxwQg$eYN$0nAwRJunDjfYR)LYp9p6s{6yUA#K(&~A1G{=p%i5q7rBY+ z2uegk{a!B`m74W`BiS?nCb&F;3seqsV>wfb+HeV7CI`pja}WHB>$=HJ4>F_Iyx7#0 zu*ElNODp99~v(% zXr|Zx$F*$iwx8{#{E)`Ma-sKHt0@Je^jzWWZvb zg=<`w(>C`9mhppX$Uoev5A?~042vmFpQJg>$Mq0AUIe)djne!H2Bh)ASwH@glESz0G!i@TZ7{s(XQ z-fC*+D@Jypt4wRG?o%9m0+fwlg_4!|e1?YH)@{PWg(q6;LOPbs7T&T4CXC0ptPcIG zh1_E>;?s|{@KlaOQKVdX()DH9gv6|A1k3_e^JBhngH5G6X)O{clNsn5vXGMR2I^X# z9lU!0C}h^6o-8otdu1?GWKEKfnf;qa32vtS8}}Q$#qcOxTRN@XALA-!Z3bj)%q)tG z-EdGuTJy`LxZgJh7D!yHRv>V4zT8*Km$3--BG$bVG9uDt0ygVC*C0i#rRQ7%Q0j~V zHb=4mo7Wr^c^s3Le9Fe9{vK?^$CD}sSVC7a0CK()1a_t|PSMXbs=$?a7SAfq+FcbJ zXG^6`h9CiPh&rIGil0mAsYnKFPz5%Dnedwaoibo!@D0EktrvgS93Z7W70`$_BgX|1 z^N(oF0S=c6ewd-9-*gS~(V&tTDK@@FRo;H=j?)Dzwrl7VX_Q-{76EpUS~Qcvhnhfl zM%LHI46em|uni!k!;kGBg3!vY9JP)|$RVvYScH%(IgC>XcCuM$U;j>6#YILka5boZ zl!w~qX!OP!OZu-zCP9*JBS!H|ndx zZHe+)jcWR8W%^w`<~BERTIjSRzIDhv-CP`JbJDcc!`*Jrq>=d$xUHgA9X(68a5WtJ z2RkDUIwBXodcaFGb;x!?p&oZaCJLx5Zp6ALWM(>NUTOwCfv0?zmAvs*pZV=0@J#f- x^BgJUsy0+2Tz@mZW}oDV<|Pu;s~4cFF2nB4Skqg;zdnHOXz6Rdzm0tQe*lBjM!o<5 literal 0 HcmV?d00001 diff --git a/docs/img/pressure-cornering.svg b/docs/img/pressure-cornering.svg new file mode 100644 index 00000000..d3788579 --- /dev/null +++ b/docs/img/pressure-cornering.svg @@ -0,0 +1,166 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + extrudervelocity + + + + head velocity + + + + first extrude + second extrude + + + diff --git a/docs/img/pressure-cornering.svg.png b/docs/img/pressure-cornering.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..aed2b0fb46c763c7aaf6c8d5c7253c096297307c GIT binary patch literal 9556 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 literal 0 HcmV?d00001 diff --git a/docs/img/smoothed.svg b/docs/img/smoothed.svg new file mode 100644 index 00000000..3e348018 --- /dev/null +++ b/docs/img/smoothed.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + time + velocity + + + + + + + + diff --git a/docs/img/smoothed.svg.png b/docs/img/smoothed.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..6385486b99f3c2c87ce25126fff6015fbaca68c4 GIT binary patch literal 5017 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 + + + + + + + + + image/svg+xml + + + + + + + + time + velocity + + + + diff --git a/docs/img/trapezoid.svg.png b/docs/img/trapezoid.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..89474edc1a7a0b3a5ec4bc6206993fd36cb0c49b GIT binary patch literal 3152 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 Rkaqu|L#|#fP0r-Z{{v(Ct*8J1 literal 0 HcmV?d00001 diff --git a/docs/img/trapezoids.svg b/docs/img/trapezoids.svg new file mode 100644 index 00000000..b4ff5faf --- /dev/null +++ b/docs/img/trapezoids.svg @@ -0,0 +1,179 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + time + velocity + + + + + + + + 1 + 2 + 3 + 4 + + diff --git a/docs/img/trapezoids.svg.png b/docs/img/trapezoids.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..891a4715390430e0f698e10a390fd9a0f1810519 GIT binary patch literal 4748 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + virtual tower + line of movement + move + + + virtual arm + + + + diff --git a/docs/img/virtual-tower.svg.png b/docs/img/virtual-tower.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..7856192c73a049f6b5f854a3c6989ad8dddcfb5c GIT binary patch literal 5865 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 b{(?1;xQC7<7OB9sG{{ibOs7uU@yY)HFa`$d literal 0 HcmV?d00001 diff --git a/docs/img/xy+z-tower.svg b/docs/img/xy+z-tower.svg new file mode 100644 index 00000000..b1f3101f --- /dev/null +++ b/docs/img/xy+z-tower.svg @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + virtual tower + line of movement + move + + + virtual arm + + + + diff --git a/docs/img/xy+z-tower.svg.png b/docs/img/xy+z-tower.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..96c5480884f07766ce26bf73f68f26b46d10b6d9 GIT binary patch literal 6653 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 Nn>Q?>b=TdW{tw0B5>@~J literal 0 HcmV?d00001 diff --git a/docs/img/zigzag.svg b/docs/img/zigzag.svg new file mode 100644 index 00000000..01eca11b --- /dev/null +++ b/docs/img/zigzag.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + time + velocity + + + + + + + diff --git a/docs/img/zigzag.svg.png b/docs/img/zigzag.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..90118d03b331f64cc625057ad908551685064001 GIT binary patch literal 5076 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 literal 0 HcmV?d00001