From a97e074022bc6c8f38e228f7cf6f3280da94530d Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Thu, 27 Apr 2017 11:19:30 -0400 Subject: [PATCH] docs: Kinematics document image updates Signed-off-by: Kevin O'Connor --- docs/Kinematics.md | 41 ++++--- docs/img/corner-blob.jpg | Bin 5772 -> 4665 bytes docs/img/corner-dimple.jpg | Bin 5507 -> 4388 bytes docs/img/corner-good.jpg | Bin 5461 -> 4354 bytes docs/img/corner.svg | 42 +++++-- docs/img/corner.svg.png | Bin 1176 -> 2157 bytes docs/img/lookahead-slow.svg | 208 ++++++++++++++++++++++++++++++++ docs/img/lookahead-slow.svg.png | Bin 0 -> 7641 bytes docs/img/lookahead.svg | 36 ++++-- docs/img/lookahead.svg.png | Bin 3323 -> 4180 bytes docs/img/trapezoids.svg | 25 ++-- docs/img/trapezoids.svg.png | Bin 4748 -> 4613 bytes 12 files changed, 304 insertions(+), 48 deletions(-) create mode 100644 docs/img/lookahead-slow.svg create mode 100644 docs/img/lookahead-slow.svg.png diff --git a/docs/Kinematics.md b/docs/Kinematics.md index 92de88ad..401554f8 100644 --- a/docs/Kinematics.md +++ b/docs/Kinematics.md @@ -73,21 +73,24 @@ flow would result in poor print quality. To solve this, the "look-ahead" 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). +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) +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. + +![lookahead](img/lookahead-slow.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. +[described by the author](https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/). Klipper implements look-ahead between moves contained in the XY plane -that have similar extruder flow rates. Other moves are rare and -implementing look-ahead between them is unnecessary. +that have similar extruder flow rates. Other moves are relatively rare +and implementing look-ahead between them is unnecessary. Key formula for look-ahead: ``` @@ -158,20 +161,20 @@ To generate step times on Delta printers it is necessary to correlate the movement in cartesian space with the movement on each stepper tower. +To simplify the math, for each stepper tower, 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. + ![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. +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. ![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 Pythagoras's theorem: - +The key formula is Pythagoras's theorem: ``` distance_to_tower^2 = arm_length^2 - tower_height^2 ``` @@ -196,7 +199,7 @@ 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). +to the line of movement. ### Stepper motor acceleration limits ### @@ -248,7 +251,7 @@ 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 +[Poiseuille's law](https://en.wikipedia.org/wiki/Poiseuille_law)). The key idea is that the relationship between filament, pressure, and flow rate can be modeled using a linear coefficient: ``` diff --git a/docs/img/corner-blob.jpg b/docs/img/corner-blob.jpg index 6dd529a01bd16541084d93520f515aff727009cf..eaf9024cdbfd064858f02da1b6bf46374d09a138 100644 GIT binary patch delta 12 TcmeCt-KoO#|HkG}7IPs0B7p?O delta 1126 zcmZ`%O-NKx6h8O9r=}Ll6bb#_qR6tD?t3%(oQZ;n8MAaEi?T(Fk$L9J`GFZnboI(j z1`*@iB?v=Jo1lfzMuLzwg_~T~CTbI{TDA&b=e}Qqdc&FXbHDR{){Z@nn)WCAD|BDZ z3}=840D?cTw;+FUEPdg|)v**CzsY9xO4TTrSUjfiT=ZV8I8n|RbA9R36e~|MmGePG zRR&nEQJT>!M)AnWzRXB5SDj|;S}j*FX6D&BruCm@*Nf%y%#=~Oi#qSHze%6d=A1DJ zFggmS0AL5~A}Uan_8`4nJPtB)EJ!*)x*dBv>Tl8D**iDsZjc;|sJ+*dF#`7DVY=4I zerR#yz(nj_L4mRm>63Zh)X@mi&T+vcIky4UONu(0-lp2Su zK3A)<{&Des35iV93WX^>mygz}dWC5*C8n~hI+V~dEUpbC6WRc)=mkAj)y?R%K3@$S z;c$b51um@kbH+?ZMWDltL*H3#A-*m-7~HZ+HfjV1b5-S5d+6L~@srUlOAZozx1>P+xp>0GlluVAdbaucF%`}imN6IZ zAG@T#M5p+DK+6AX#Q>4>c!xiH%wQs^@+ADtY>$>iqC>rjj6laG=HKXC8?FRY8CA@C0n~TKae!i;vrZM z)`O7lu}}z_UIY(<2f-hTAWARRn;?iD6i*&KcAb~~tDqYuGjHBEGvB;GZj)7pGHf<{G=Dl`DFw$cBd$IUBiIEzFiO`cgPuoM)vu zrpj_cQI!}Q)QgK+SuY$p9?nb@vXuqKE?2X8eQ}wcVeyfZ>`I|jTAbI5H*hV7%x}W? zbZtqW1DKqI695o^4x$1@s|V%r>QN9;BO&1+>1z3dxPFZe+uycB_k+;FaPEV)jTx{P z8`HT(`oU-Afp?^P4_*OU!wnhb!#&*zAQCy?2AHI?Ral%DOCt*LdS~eG{R$QHUn2(SK8yG8r-Ml-iKME)-^w(1WB*S8*X;xd0YCr4ua={? zKR!RbzKtZ13BUW|bTYwLd;+43L^%%M#-Y}38zxyn;(Ru(`CxNAieh&DF8EEynF2mo9j<%(Q0Gv(tu=&g9kF!(OVoUS(Dt9Q fG~v{8=4Tj%fZs3qeE~_5g26zjy{F@8U;Dm4$OD_y diff --git a/docs/img/corner-good.jpg b/docs/img/corner-good.jpg index 687c73aaf9c4889050b57f60ec73654709c67119..812c82a50d734b6b8052c2f9a686dcc64e49a071 100644 GIT binary patch delta 11 Scmcbr)uhDq|Hk4_7C`_WTm*^$ delta 1125 zcmZ{jOGs2v7=ZtC?p0F@O#`6^orKCX?cO_&J2O!fF=K`rS(KX=BXiZ8^MHAX(&Cbv zrcI1@6A8vt(8or}E0**^o`ptaDLs6nlA9@{^rfL>ex4O( znIcIsS&^e`K+l)8qMkc+Y$!FJOP3ZHyHrVM_3|=1#ni}gb~#rll;`#Q9Qsm+^2`XLZ5bXV*rf z1q|o(5Nfmr0gnkF%ugPJSN-4@)&78K2!UOvUeeAjv*z=!O#&TG9{Sd73;3E~GkD7e z-CT8wiG&JZw)#8xS_8WYQBoAiY!8C#EnYF&G)2F_4^!~%U)7@yPwxRd>f09U<&-69 zWescL{o^j_Z@yC;?@==Ux?+Hy)A$a5dQ4P_sqqN>tt_h<{eJ?Oa}yu}t^5y%k)by~ zzC5|MiA`W9{OyZV@fi2`4Tusp$~p8z`)KgKghiL6lYHfX9o32Rcah>Roiq2*a$mjh z9A|iDdX4kWBjL;|fa`n)#!&cWV_mNM&Y<3Q4Cp~G3P+B(nt!3(=OcqMfWrL~jwTOK JXCBhse*hJ4n63Z- diff --git a/docs/img/corner.svg b/docs/img/corner.svg index 3383a969..f2e3d0ef 100644 --- a/docs/img/corner.svg +++ b/docs/img/corner.svg @@ -102,8 +102,8 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="2.49" - inkscape:cx="27.644" - inkscape:cy="0.62950496" + inkscape:cx="95.030833" + inkscape:cy="-0.17370789" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" @@ -112,11 +112,11 @@ fit-margin-right="0" fit-margin-bottom="0" showborder="false" - inkscape:window-width="1920" - inkscape:window-height="1032" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1"> + inkscape:window-width="1068" + inkscape:window-height="478" + inkscape:window-x="378" + inkscape:window-y="113" + inkscape:window-maximized="0"> image/svg+xml - + @@ -154,5 +154,31 @@ id="path3514-5" inkscape:connector-curvature="0" sodipodi:nodetypes="cc" /> + move 1 + move 2 diff --git a/docs/img/corner.svg.png b/docs/img/corner.svg.png index c94ade2096d5f3da24d953b89a52a2942c3b06e3..12444e7c732f355467db5bb684a862f37ff75081 100644 GIT binary patch delta 2085 zcmV+=2-^3U3GEP&7YZ8)1^@s6!4f;@ks(Zf2kJ>gK~#90?c8~+TvZ(h@K4)UUeRhn zNCl)=%2H@4E?5bmMnoiWD~TE{qDB!!1x!F$fp0wchp773_z9 zU@4x#q_OSJxWp7ZkJ&~0CD?)!i}q0%syhGEco_F%Irb=yAB5d|+}A#~0h5buD%NAx z*mh@JVzwA}iQVwDO5}ez9xL`2;t}kBRkS~gUl;qQ)XM}lEp8^qBgG` zRgAYXX#g`dPT8A_Z39-}fKlq#_JsW;%9q#|_hMtwo`ruG`^VyHJXo}^l*|Et!l707 zIj;EbQM^L3$lr@+eZEP5X5)9b4PVCB+Wb8e21iJghZE$b-Guw_nh~zO7N_=qpihH1 z7nk82EXH9HVYdf-3YS;4KZ>iW+KchCV*hfSR`uO1DY0NjJd0^ECTsA<;=AAClwyCH zaFe&S(6@zns+Aux78p&^^ggVX2tlIDwUP;5jWZ+?JtYJCL(LsxNN+O33qsJpAd##( zd#=Y?$x3VMY>)P!KkedX{I#loy{AO*64jaG0TCohERrZroMK4c&EdEczZV|yW+CGz z7x%ikIOm2D`Zil7D@_PY!*|7CR^wyE@#FAk72|q0mKFPFOO!fBYSpEZ)=M&14-!JwLm(;u?t`h=BUj9Qe&?R=)I5R9So_{{x zk9i&as@5?{bovdFv08D6ZfsA=m|r8M+etEqFvsYKAJdEH?OJnx{6xtpX9?Fkr@{4u zl3i{WB0sLtDrcA}Gnt2pL0l)sduQ?ewKy7olZaUTqE@J=61PZpI9(jzM7BYd_Zt zzu8tii{I2azEnzo)VE8(8me;+;ShUBHSkau`qNXi>I_3NFdK^Yaw&mI+%1km4Eh*} z281*{Qg!axV*KkRqm(!kSBT;LQVef{-eani2c^-^DfSoWPN}j{YU=Z3SwuBKF9xfz;el}3)TTFTf>Biy@HEUD9{PS;4CCrZ?n!ehFQR+lr( z$InHUgS|z6PAhBrnKC!9Q_-F)q-mX$2CKW#*%q;f;Ss*vpVPs;){88;LVm;3!hxpR zdhE*b@NrSoF49{~y;)Y-yH5XF#RggOQqNKD69Hf>u(L?UgCf#gh9|oDfK~@=Pz+&) zMEuG4gGhv>m(CSZH5%AK9JAKw55S8%xL+A5?@=*-{CgzhZ7$B4CerYMhLj#V4!Ur4!sCHStxtS6=iQWmc)pocpL`_fGJF5aoJ~ zvQl?{Z0A%JDSflp@D1_~ZnO>DVmz$+91!)W_T?Nb~DM8xB!-gArxxYqt zm4`hgd+a2G{u6v%GQvbdGg3cS^NG@t&wq9>SHuX{YF`_FktJFxeSJzB%@y_l7CZl+PN}9 zl*V3ub{ZWT5!fMPTZf+}*=&jKX!8>py(IO`P^x@?#J9vbHr6|FBxk5cwC0P^w_7`Z zHX^Wh8^0?Vrx|-?Xd+-hCO*qDy7qIVnfg{x&i_0i%Y!aZBNI>3n7}U3{$Di_MPZc~ zd$$N|9}^q(%C7~opmS=I>zd(Nk-;w(PGXYCik+x756Zm4P|en8wzZEwx`oBET6xg6 zFN5DCf9!P8fDpn)&QKDU+6aG#v73p1>|^3$2N5w&vGsz`de~H)Q%wgp%1ruQ#b>$Q zKOoV4f8&$D_R&X)S@JJ$USG6JM<|t}T7zFBwtRoFl}6uC2$>``*J!K`?W2!QakQ*{ z*rn>&W|7@jim~6TV)z{`HXIK#(0%mL2$N+Q&|(o~?o)~Kt3<5n8vX|eT}z1&2(QaP P00000NkvXXu0mjfwSNEQ delta 1096 zcmV-O1h@O`5SR&&7YY^#1^@s6eT*nJks(Zf1Qkg{K~#90?b}Ug9aR(u@LytVQ$MJ- z8?_20sm8X7;9lIgaPLCJg$U}#l{>+e3z16ID2j^+DrgnNopjliqHaWMn>78d)hbx1 zO8rRMG%n6u-gGjreQ(}J-fQO%m${ku=FH8V^S|eR&fGVmMiJw90T1CAj%O|PPvYEv z>I|($FEO&(0~laDh8f&YIDY}BaM;BpIhM6k*>`FT8EP_I8h7F|+*k71vT*uq3g^$` zXF--kkkj~4kmdnw#1S0DiR_vhtBjfqm&aPXhUbLykG6Q-a&|1vanZ(k{3M7`Y=`hy zrBT;t8#NhP$0K+j*K3^+WmwkUyq{5jPL!h}($tcyOQ^}v92>ATYg5_rUfiMDye(iF z*I^STFo_#G7~|hUZY9Z;@1Ia7`fZ^m1GizDaL(uh?&8L^<4KEQ5+sjA5~tH@RBKum-nlID0xySy?UW6e%Y-DRPY&{8Q0?)>@4y zQf%9>u7hz7oBVoNM7p;{L89xp(#Vij+58H>T{wNQ>eCAHE9)$l#0p<#YbiTFiyhdd z_f?{@|91jgu)YJk3;0DjQD*UP2ezwX9ljA2z7NH7nD6EdhLsH6ls1b(HsqatKMn{@ zp0FN!#Y&wgLy81n;}v|NQAt{VP4rTJoza-5e#);Yd?)g*W$ec5*wYQ;gG`2I(&lba z(PoJN<%)X(ADeq9PlLhTa~ z{S!^{ip!B9Nt?XW--BB!462{frdt?OZ=&lLHVRTqYUC%Wze(pRCP}EXBL90yA+H$G zT-sC(Yei|3j>iq&i<}z6fin4ZKOW3JtAYhVifK_%G$Posu}wpN=f&3Kxy;bKMwzmf z6E%8`r|_8)IUda5FM2h)jN%q)m-07vrLc@r>4X|CVjJUljiP0}f{G z5Dt!sRej3JicKwTY77!K<8vX8Xb_?7cO#3!!4GIS`+@A(^!>w#I!UZC_;^_C0N9W_ zcR_51oD&W|FI(X=#gC=h-V!qiZ=h?`XogWdi$_HzGCBLakndgH()~Yow^V!a#(psX O0000 + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + time + velocity + + + + move A + move B + + + move A + move B + + diff --git a/docs/img/lookahead-slow.svg.png b/docs/img/lookahead-slow.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..80450e09e6db2121a6175e0cb0174eab732d76aa GIT binary patch literal 7641 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/svg+xml - + @@ -110,11 +110,27 @@ id="path3361-7" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" /> - + move 1 + move 2 diff --git a/docs/img/lookahead.svg.png b/docs/img/lookahead.svg.png index eb822746c0dc49948976f6a58741d9da8426e27f..b40e256ce455eb759218ae349476df12c8f8c504 100644 GIT binary patch delta 4124 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 diff --git a/docs/img/trapezoids.svg b/docs/img/trapezoids.svg index b4ff5faf..541309c4 100644 --- a/docs/img/trapezoids.svg +++ b/docs/img/trapezoids.svg @@ -25,9 +25,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="0.94" - inkscape:cx="294.7319" - inkscape:cy="45.708959" + inkscape:zoom="2.67" + inkscape:cx="164.48301" + inkscape:cy="76.011989" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" @@ -55,7 +55,7 @@ image/svg+xml - + @@ -106,7 +106,7 @@ sodipodi:nodetypes="cccc" /> @@ -118,19 +118,22 @@ sodipodi:nodetypes="ccc" /> + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> f3O{8dB;D=y$J~fxCulo)R2ILK$JuXiUtCh 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 KS=O23lKu~vVZc=Y