From 2019c2249afac58a25be9ffefc1972508a18fe13 Mon Sep 17 00:00:00 2001 From: m-guberina <gubi.guberina@gmail.com> Date: Sun, 26 Nov 2023 20:16:05 +0100 Subject: [PATCH] got 30fps without tkinter. if i do the same in tkinter, then the past drawings are not removed, and the thing is slow still. ideally there is a really simple fix for this, but it remains to be found --- .../initial_python_solution/.blit_test.py.swp | Bin 0 -> 12288 bytes ....manipulator_visual_motion_analyzer.py.swp | Bin 45056 -> 45056 bytes python/initial_python_solution/blit_test.py | 7 +++++- .../dark_background_example.py | 18 ++++++++++++++ .../manipulator_visual_motion_analyzer.py | 4 ++-- .../robot_stuff/.InverseKinematics.py.swp | Bin 16384 -> 0 bytes .../robot_stuff/.forw_kinm.py.swp | Bin 0 -> 36864 bytes .../robot_stuff/InverseKinematics.py | 22 ++++++++++++++++-- .../InverseKinematics.cpython-310.pyc | Bin 4559 -> 4792 bytes .../__pycache__/forw_kinm.cpython-310.pyc | Bin 11436 -> 11451 bytes .../robot_stuff/forw_kinm.py | 8 +++---- 11 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 python/initial_python_solution/.blit_test.py.swp create mode 100644 python/initial_python_solution/dark_background_example.py delete mode 100644 python/initial_python_solution/robot_stuff/.InverseKinematics.py.swp create mode 100644 python/initial_python_solution/robot_stuff/.forw_kinm.py.swp diff --git a/python/initial_python_solution/.blit_test.py.swp b/python/initial_python_solution/.blit_test.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..5c52e18edb5224f1c6bd60b1766faf468b66fb90 GIT binary patch literal 12288 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 XtdLg#6GFI0ub>iSK1jMCr-T6j(*MfY literal 0 HcmV?d00001 diff --git a/python/initial_python_solution/.manipulator_visual_motion_analyzer.py.swp b/python/initial_python_solution/.manipulator_visual_motion_analyzer.py.swp index 12b2cf4aa8c3ea2f063d13812214aa29f1ac0189..6dfe2a96bb05e401c7327f20ce338af45f733479 100644 GIT binary patch delta 1349 zcmZp8z|`=7Nh--8%+puFLeGeSfq_AQf#Ls*<kVoRN(LR{jZ%C9jI5J21>_moCVL9V zGqO+46p-g+0V!l)U~ry1Q9zuN3(Dh|yiq`0lLN|&hti7}Aq*(RzzN|p1W*1bpw1D( z1mR9jTo}9AK(Lu_lLCtZZwVs<!yJ%|00V>bX2Ae%M$2VP5TRL23=Abq3=CmR3=BFT zB}@zq=NK6nrZX}yG%zwSgu?6rnX90npfGuEU}Zgsk(QYrpPQJMSx}mjSdw3)mz<ba zmRPKpmQz}s5uaL?npaY+p~(PJsgRbL4yF|p6pB-G()7|Y(_zY!axzOa;DSj>`4vz- zFbyz0i4}S&MTzC{iA5!u5yd4MIhlE>s7llFixfbj3YmEzI@=0jxq^ZMR3;lF1GcLu zKPkUN52Uylrb=1C&oz8<W1Pg~{touZ^QTE}z8j=&TQASRz_1+@1_BHWuqe30&%kh- zpMl{PKLf))eg=j`{0t0j{0t0s{0t2L`4|{p@i8!*;bUM}%g4Zw&BwqH$;ZGD!N<U0 z!^gm&z{kMA!pFd{hnIn&mY0DcgO`E9i<f~xo0oy%B@Y9`bsh$WYdj1LyLcEF=J7Dp zGc@rqFj(<0F#P6bV0gyOz;J?_fng;#14BAD14Ae`149Tm14A%3149ru1A{9!1A`Ga z0|PHN1H(Zs28KCY3=HL53=Fnh3=GU%3=G#e85rhqGB7xCGB6zFU|>k&U|?Y3U|?9p z&cNWn&cN`5je((^je((vje#MSje)_Qt)78FfsKKIkBxzWmyLmek&S`j2P*@^cUA_5 zXRHhiXIL2+4zn^aw6iiWc(O7u7_l-isIoFJsIW3HD6=v!u&^>PTw!5gSk1z~;LF0m z07~i4m>C!jF*7i<Gcz#cGcz#cF*7jaGBYr!GBYsTWny5M%EZ7hg^7Won2CYGT7-## zfrE*Gft`tg;R_=qDz;5dT&OfTai!>HzDb{WC)dprn4BGGRG*l_z#zxKz|aPbtzb}! zWnf@9!Oy_Z&d<PL!_UAV#LvL+5gI#-`4|`~`4|{t_!t<B_!t;C_!t;&@iH)+;ALQ# z!OOr<$jiX+i-&>XEDr<286F0PojeQ-H9QOqE<6kjKe-tg&T}&`tm9^2=;UT#NZ@9u zXE5VtV36cyV0h2Pz;Kj{fnhoq14Anp1A`A21H&Os28P+33=GPg3=H2m7#O~CFfe@K zU|_h+!N9PSgMncO2LnR_2LppP2Ll5K2Lr<sb_Rw`><kRE*cliK*clk|*%=t}*clkC z*%=r<urV-9WMg26VPjyhU}InqWn*9vVM}LVc*x4YFpZUg!JL(Wfr*uY;T{VE!)_J^ zhFvTS3_DpE7}{7E7_3<s8167LFf3<gU}$D$U`SwQV2EdCV2ER8U@&E7V0gpCz|g_O zz+lP5z#z)R!0?HYf#D+~1H%PINXWKMPF$$CdEY`OzR3qCT9|?Yy`GPOVK*P7sDqVO zJE2)3ou7drke`8ppPzx@FCPQLGmzTNjt&i=6a~tkljjC*pPV~Qf>C+$C4ariAwli{ DAF1;W delta 1117 zcmZp8z|`=7Nh--8%+puFLeGeSfq_AQfx$H}IW^d-l7UTOqZFS2Bim$60eMFD$({o8 zj2x3Q1>`wdK?)fd7+fY#6cFcRf%3Q~Zxj&M<b?8Kp!8Bk2m?wna6z~XL6biUs51s{ zmK1!gXIII`z;KWcVmmif!8v{ghV}dm3^Vx|7{d7(7+m=o81(oV7?}AP81C~iFx=x~ zV7Lp`w^>oJo^SHLey7R1*PWkyp-*`7y!Fz8i75;W8jK7KAxsc+T{a6ka5LI1Wny5M z%>)si%EZ9n$;7~5%*4R(k&%JnJ|hFe2}TBnxr_`9m5dAw6^slF<%|pr(J;p|Oy1k? zJbCxJ?UQ$|cjs47P*6}-@N*4k0JA1v=ri7Y*Gb*B-jsoX;UGwl00RRo9G>tqFr46L zU})fHU~uGTV9?=bVBq6tV0h2Rz_6B&fnhcu1H&vn28KF528JX)1_n1i28MsU3=I2u z85maaGBEV;GBD)wGB9ZKGB8N;GB8N+GBEt%VPJT`!@zKahk>Dnhk?PChk-$ZhoPQ< zi-&>XH8%spN^S;*>D&wq)3_NJrgAedOyOo=Xy;~NDB)&c@aJY=VCH6ExW~o7u#<~{ zp`MF@!Ig`FL4u2c;Q=QDLklMZ13M=J!wL=t1~(1{h9~R{3{C6|3~KBQ3@6zb7`Cu6 zFwAFTU}$7xU`S$PU<hDiVDM*SU~p!uXJD{mV_>jkV_?u=V_@K8V_;xqV_-PR%D~Xg z%D_;<%D|A$%D|Au%D|Ay%D~{p%D^DT%E0iJg@K`;g@M7Fg@HkXg@J*Eg@NHDGXuj$ zW(I~0%nS_cnHd<;nHd=5nHd<aGchn+V`5;~%EZ7>%f!Io1&v8FCI*I|oQ#m*KfpNg zqxs|$^DQRL72ABa@gr|NC{08$Ffi<cMothkt?lP$U?|~dVDRE+V9?}eU|`{AV7Sf4 zz_5{zfnf?C149-c1A_w}1A`DKjq))tT;OG3Sjo%4V8qM7z{<<Oz{1PG@R5gsVGA@O z40#wB*m)Qjo^dlU9OPzTn8D4!kjKqX&k)GXz@W~}!0?xgf#EzC1H)b}28I?c28Lgp z3=Ee!85p8D85s0985ndq85ndp85p=Z85lltFfe@JU|^WR!N8Er!NB0a!N4HH!NBl} zoq^#JI|IWCb_Ry!><kRc*clj#*%=r#pb<2Mje((nje)_Jje)_3je$XuEro&M94iAu zJ}U!*6*SO4voJ7xVqswT$il#|kA;Dun1z8sgoT0OJ~IQuZe|9C8O#g})0r6<rZF=x w<T5ibs4z1y9AIK#C}d(_@MU6P&|+d>&}3p@;9!D;>R!f)A7eJRO?2V|01I!ega7~l diff --git a/python/initial_python_solution/blit_test.py b/python/initial_python_solution/blit_test.py index d0a9729..b6832cf 100644 --- a/python/initial_python_solution/blit_test.py +++ b/python/initial_python_solution/blit_test.py @@ -1,5 +1,6 @@ import matplotlib.pyplot as plt import numpy as np +import time x = np.linspace(0, 2 * np.pi, 100) @@ -30,7 +31,8 @@ ax.draw_artist(ln) # renderer to the GUI framework so you can see it fig.canvas.blit(fig.bbox) -for j in range(100): +for j in range(1000): + start = time.time() # reset the background back in the canvas state, screen unchanged fig.canvas.restore_region(bg) # update the artist, neither the canvas state nor the screen have changed @@ -41,5 +43,8 @@ for j in range(100): fig.canvas.blit(fig.bbox) # flush any pending GUI events, re-painting the screen if needed fig.canvas.flush_events() + end = time.time() + print("time on rendering", end - start) + print("fps: ", 1/ (end - start)) # you can put a pause in if you want to slow things down # plt.pause(.1) diff --git a/python/initial_python_solution/dark_background_example.py b/python/initial_python_solution/dark_background_example.py new file mode 100644 index 0000000..df4705f --- /dev/null +++ b/python/initial_python_solution/dark_background_example.py @@ -0,0 +1,18 @@ +import matplotlib.pyplot as plt +import numpy as np + +plt.style.use('dark_background') + +fig, ax = plt.subplots() + +L = 6 +x = np.linspace(0, L) +ncolors = len(plt.rcParams['axes.prop_cycle']) +shift = np.linspace(0, L, ncolors, endpoint=False) +for s in shift: + ax.plot(x, np.sin(x + s), 'o-') +ax.set_xlabel('x-axis') +ax.set_ylabel('y-axis') +ax.set_title("'dark_background' style sheet") + +plt.show() diff --git a/python/initial_python_solution/manipulator_visual_motion_analyzer.py b/python/initial_python_solution/manipulator_visual_motion_analyzer.py index 3cea270..23a428d 100644 --- a/python/initial_python_solution/manipulator_visual_motion_analyzer.py +++ b/python/initial_python_solution/manipulator_visual_motion_analyzer.py @@ -405,10 +405,10 @@ def update_points(new_val): ik_env.p_e_point_plots[robot_index].set_data([ik_env.data[robot_index]['p_es'][index][0]], [ik_env.data[robot_index]['p_es'][index][1]]) ik_env.p_e_point_plots[robot_index].set_3d_properties([ik_env.data[robot_index]['p_es'][index][2]]) canvas_ee.draw() - #canvas_manipulator.draw() + canvas_manipulator.draw() # NEW # might need to manually update all artists here from ax_something - canvas_manipulator.blit(fig_manipulator.bbox) + #canvas_manipulator.blit(fig_manipulator.bbox) canvas_manip_graphs.draw() canvas_imu.draw() # TODO update may not be needed as we're going by slider here diff --git a/python/initial_python_solution/robot_stuff/.InverseKinematics.py.swp b/python/initial_python_solution/robot_stuff/.InverseKinematics.py.swp deleted file mode 100644 index a9ec7ce2e024e479f6e20b5e8b5460644f0e31c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmYc?2=nw+u+TGNU|?VnU|=|;k(3%}Rms4nz`&56UtEx%l2`<i!iRGci?cKH@Tq{v z)xiwZ&&bbBHPVN3b4v44^b3j-D>94qON-)*Gjj`aQsa~J^Gb^HbMy-;OEU8F^fU7^ zOEMF4;vwAl;{2S_lFa-({i6J&{F3<MlG3y^eb2nI)S}{4@65c^+{BX1<YK*oN{HQ~ z<Y)+th5#>vv5}zxC>)fP6cvPpLP5+?JQ@O{Aut*OqaiRF0;3@?8UmvsFd71*AuvKh zprn9_p`L+(feGs0EGW&0Ml(bCX;3;FO2gDaxueu*2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQJ^Ufy5LB21y16hP$ASyZ{3OtpER*pMhaNKLf)Yeg=k8eg=k6 zeg=jReg+07eg+18eg+0Teg=led<+ar`4|{n`4||!@G>ym=Vf4+!^^-ho0oxM7B2%s z9WMhzEiVIu2QLG|D;@@hvpft8Yj_wKvUwO7%y}3XM0gk&zHl=z+~#Ir*vrkpFq@l! zA()$iL6@6>;U5<R!*ebMhND~z4D+}c81lIo81lFn7^1is7<9N87+!HQFudesU|7w` zz|g_Tz>v(zz~I8kz~Icuz~IEmz#zfNz;K^~fnfm$14B6n1A{FG1A{0B0|PS$1H)~0 z28PY-3=Ea*3=H<{3=ACX3=9w07#Pm6F)(aoV_=xh#=y|U#=y|Y#=y|Q#=sE9#=yYM z#=!7|m4V?LD+9x9RtAPvRtAPpRt5$)Rt5%hRt5$|RtAQTEDQ{fSQr@2vM?~5VPRl6 z&BDO2kcEMvm4$)9h=qZHn}vblEi(hd8)gQE>&y%cOPLuMCNMKFBr-EF1T!-*xH2;^ z7%($1FfubRd}d-`SkA=2(8R>R5Y5EE5XHp65Xr>A5W&R25YEKF;KT%pvpb-8!<DWS zpg>t6#NWl=N&&irBC{%00laELAuB&KucTO^xFoS8RiPwbAyJ_yF)t-QS3x7Gv_zpS zF()%cK_fE{q7EdNo~o${GX|oK0c1x?YMMe(YH@0bMsaFRnx+-lK_CebE=nyaEy`2K zPb$_?C`v6)EK1Q)NXgGj)ltaIOUnoA2Pp&T)JrYMEY43!jW15lFG^L=wuNedD}v}( zuvGx7PR`FQC@o2ihlpzAClyDlCnjfPrk16q#HZ&c=BUT&KvaS_5c@RYW`QiNMd5)& z)H93Yi%XM}Q;Un$trYSK^wM(j6HAPZGz|0%G<8svgPgBmt56LWOwB1ywSx0NrjcO2 zAz||~(-cyRit>x%OHzv=L9GXlN4<jhR3wjTBHRE9X9ZgYx5S*{R0g=q@{@{TK^UK& zS`we1RIGsr7jV$##pkERmlS2D7RRUM7sVHV5(+3j4B>`=l|ige%P#^&t9NEzZdhhw zKz?y1Xk|{ZMq)CEj<(V@j8)KwL_|trZb4>Vx{d-=PS-FNVlyZS6_=zIfKw1mTGNU_ zS;5ag#MMf{Daha3)lb1OSiv(yJy^lbKS;sf&nHsB-_KPc$lu97gn@xU85HCo3{7$% z-y;M;61AvYkPv|ghnopf3y*QQC?v|^T#zDC?0`f%igrvph>v!-K_H*Q;~nHE5C+E> zRU)=9J|(}T7$Z)hk&6_e;FVm#h-igq)KP${1ZByT)CzEc0dgS>!xI@u02-N)OpYQ0 zkp(3^1zQC}0|OLENX&qgAY+Ir3bqQmh6-8=DVfD3iFwJX3Me{3>XmUQ)K)N5(1+_o z(UzH}ke6RVY7PZi26u+70;r&hhw(K~3NszBBqVS_x-!!sSqkFP_>#(kR0UgG1@)BF zyy8@KL>T~53&PNFL@Lq@L1h|>A8-X4xCBSisS8TDC_2gWJuW{K7bF&;ctTmh8B*B8 z!(JgNwWK^XH4hvr3W<3s3MCn-3a}6Zi|T=02r607Y6?(J0F^OFRRtt;K?yP~pTuGZ z6u2M^G8L@`vsFMON@cJ-N^B{pLp=(1DBKJ*HIN8}D}mJJ3aNRCNja$s#i=DFnR)48 z&*zt9q!uaU=cOu?XO?6rq!*<omZTObq$VO4{>ln@si`TcDGF)%V5v%2eV$pB2r8}> z^3x!OB^9R@l|h7x3lfu4;SK=%1C&q|Y(W(yq{*NMp)`y&6|@u#^vvO^mBHqN;{#Cx zfsH6m%uS6iE=eo`c_6+3T5ZJVgNmp$1>~RuD^JbI$t)<&&rFFgE-gxnFUSEELADCf zv2d%v$_nCBA=MR56)A}&i3%thmBE2gT#{b|3d-_~{G3#UqSCx#P*^19<Um?W#i;gx zT!~RbB0E}HAv-m-K%t~4F*zG#5GZ+;Wag%VYPn(sjgowYq*O?&Ng*)}98YDbMU@KB zCJ-W@gM9_I4O|Ns$3qKuM9KoIfV2$CQj-;I75wt^(4q@k;40WEn4)?E)FzBCERF}) z<fx$nHWn-nYA!@0xM(2`R-$055CmR{Ta;L?0TzkROUzBRRm#f;E$CH3_y?MP%ZoBg zQWX*vlJoP*Qu8uXLB()NMtnhHQDSZ?C^&NR6H`FZkye@qZbzWHJ2@jWCnp}<=)|b# z3W_rGN;K3{^U4&G!FeD>9b!GGD2R^-dpRE3(8$eCNzI8bNG!>)1%(=@0D!DBE-c6| zh6?4yLs}~cesO6MI2yqU6u{+0acT*yT2s)-)JxS<NGVYO(*;GT$(hBO`FRRCsU_;g zkZ4cL(PUsq&PgmTR=`-b?3z~wYC<bh3>cKb1!GZZ9;8Gl$w(~GV*uqyh2+HIRE5g? zQibxwyb@5`zqB}2p(G=-SOHWAlxL(CrRpeTl@^yMq-Ewo%GTuk+}z9(g{0IpP~#kw zoRc#W^U_lplpz{(Qxo%w6+m_<WF+RK!P0zkehR2S%E?hk%}Y@zEl@~G1x0I8QGRx6 zo`ObVu|lFkPJRhUd1i@1X0bwIPEl%NN~J<#US)Y=r6$<H>bYPubrVy-X(BNXQr3YJ z8aVTUoKsL*RFGes3eL7*eoj8vyF`a0xUH#xQ#k`eW^O@#QHercX>LKKLSnH(UIBx$ zLV9XmYEfd20z|Tyfg!CZKNnJFK-Q(}m6l}Y6hq||v@qq<@^f<X%j1(vi^@{*D9g+% zi_gx?%f+Jv)D%ZkqpXk(Uk|TPl$w)Rl9~cFp_l>G|F>pfV0aJeM+z`7z~=X_@iQ=N z=VxG;!q32v$IrkJ&d<OQ#?QcD$<M&>osWT`fscWqoR5J)iI0JSkB@=j87~9FN?rzr zVqOM@B3=dtUtR_VbzTOBe>@Bfk9ZguHt{ep<nk~u=<zTxyn^=kw{SBs<a0AHm~t~P zm~b;NeC1+bxX#7EaD<D2;V>5iLkAZFLp2uzLogQug9#S{11}c?0}mGi!xK&hhI5<@ z468U97&15+7}Pl#7;bSeFm!V;Fj#XiFi3GQF#Kd^V7S4~z_5UwfuV|>fgzlofq{V? z(#K!M#=y|V#=wxl#=zjt#=xM!#=s!Y#=s!Q#=yYB#=!8Dm4V?9D+9wEXkWjMm4ShS zm4V?u3j@PO76yh5EDQ{jSQr@USr{1VSQr>;Sr`~HSQr>=SQr@eSr{1fSQr>|Sr{0; zF*7iHWoBTw#>~JlpP7N7lbL~`gPDP$otc3lpP7Lnnwf#Yn3;ir2Q(hQ#K5qbiGiVy ziGiV)iGiVpiGd-8iGe|biGkr4BLl++Mo1jJ1H}`#drckzYGZ&fYR6PPCAB!S2-az~ zg0w3^HN0MOenF)MTEABv*2seNv7ySrSrOC|#jYnG(VS4X0uKhj%kv`006{gPc>w94 z<`w8A78IoBrGR?&I-o{LNn$aiAP0E?q6kqdA=wQ#x+EjDBoS15fy^o@O03j?is&e$ zfEvuUh&C<4V36SuWib1}<0N`uF@!Qu`w1+ekeLSwF-Q=A#flN_Z?HCy8=x%}a3uum zc7vRc(*1!3Ms#s%Y6@CCn^zDIX=H)=`l%`4E_^DeIMjp7Xn?dqoCvZ8#DmszASSrB z0@()gp|V0*Vo_#(X|Y0SW=UpFW=W+2tfnniaP|-Ibahbx7i4LvCCM4_sd;4#hzKf3 zEJieklogV5@{3ay@(WV)6w)$tQi~Nb(?F%SLShl9PDw3-G)6!!0;>c&3FHoVJVAY( zpM)?KDSD9xDd0Mk6<qv5#WlEfnVFaa8q`7_!Gg6bA){0}(6(4cszO0gY8lwu$ZaIJ zv7q?S1EqXO+cpuLW}+d%u2-6unU-IatD$S4XKtVaYULVe>VSsDQu1?2mxK;{K;i;Y zhm@o$<fWD?fZKV9zy`Ys+yF!$kU?&4B2<C3Lz{`(whCxNHqiDZbchXR0w`|4jVZ*~ z5=sPtO;5{A*Go>!D@!caOUo%O&WKMfOU*067&}5zR$7pfSdxk~xCCt~fSMU)pwyCB zT#{M@4}C}%2}yqns5J>m&ya8ecQX}0!U~YaLUv|eN}@s<syQI}0ML*XIHl<&R)BI$ zP8v93brjT#Qd87*6x8#ftwNB=VE-jn=oP1y#Fu22<fLj8mlQ#CV+(mr1#JcOk_?5+ zlGGwd7pWv4JPrX$I_SniiUp9Hf<XhVj(M56NFf5Z9i$*LFWoaQ6I4OlDufi3Lh=nr z1qg%P2r&%Qgmo!OEYHkKhd2`C#pL{){G#}r%)D$wh=KGW#1(86)RS@&le5*~K@L(- zkW->pnUk5T5v^;WXR2eUXNr_IVG1fB3JkF-06Q(QLJ!m_(}0(?(FU=aI-o8hG#jCD zb-@<tC?wmeCn1Fy$U?Hr!)+WW)uk4vg3BXNv7K0vTC7l<oR|Y@h?Zw$CTA$5<fj%Z zfW~h!z;%v7VrfY}cn@J>PEI9CXhGcuE`D>;^gyXKF$L5qO#=Jg(9lpvp`a)~D;3;p zu~j#Q^*%rz17S!iPplx{1h5m*GSd}o6+m&9mYH5!gq+Jjwtyru^Yf5W8f>ryEule& zhpi9=4oExL3N)3_ab%D*2&YygrxuhbIF^(YWhRxDq`HE}rV;fXNC`Gmp!UJTw4|sK zq6tz4<)x%TGM<hCsBdPgo>7{cn5V9zP@b7ml3{CVV4$Ork(!yFQ37Iv3Mr69AWU>6 z0vl5XMK^RX1T=n>sh$f?0cn{PpmYJNb->+=Tu_$>ocD^6#+gC3f~$K-+W;1!5OvW8 zv3g+1;^@p+hyujuGbj~i>Odz}GV>Ht^Gb6;MM)|oJ3~zXQ}LO3DXA4OvycY&;UNfe z1`HRc<`riqf$Q`5<c!qhYy~VO2}p5fnnH47PI4)zKj52~mswDnlL*o039=8#9hwSu z3I=+HrjS?y>4jl%^nx9!2kLkv7Nua!0YF<nItqrUg%ZpNXtNI1(lXOCvQW?hl^M`F z7eZ-hD(EU0>lvD08UhMQa4-{ShQTa^ItXR_2P9XXk(rYUj(?0GMD;j^G{*P?ETf@} zQ9z;rDVGr)c$i@a@dN2$Mr>F?%tsv!0*xAgM@I0sw7>%nkc3yBkqRD=%q&sJP0UU$ z1~&;op@*o};7J%#CW2~DIybx^vrFJD=amX2iJ&2g#PY;S1@+{7P<>FYkO>;H0S)ee z$5ay)igPkkkee*f?mwQU8|HW;IO?&rD=<er!K%n<(Sg!5Y(A(wBQ;N<v=~&XL9$A6 J4rCsV0RX$d?TY{a diff --git a/python/initial_python_solution/robot_stuff/.forw_kinm.py.swp b/python/initial_python_solution/robot_stuff/.forw_kinm.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..c0aefbb19e9fc5f2403b0c03a9d5e4906deb177d GIT binary patch literal 36864 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 IMbnA_08#Vw)&Kwi literal 0 HcmV?d00001 diff --git a/python/initial_python_solution/robot_stuff/InverseKinematics.py b/python/initial_python_solution/robot_stuff/InverseKinematics.py index 8cbe712..9cd579d 100644 --- a/python/initial_python_solution/robot_stuff/InverseKinematics.py +++ b/python/initial_python_solution/robot_stuff/InverseKinematics.py @@ -6,6 +6,7 @@ from robot_stuff.utils import * # general imports import numpy as np +import matplotlib.pyplot as plt # ######################################### NOTE ######################### # i'm half-adding another robot for the purposes of the plot. @@ -144,7 +145,7 @@ class InverseKinematicsEnv: self.drawingInited = False if self.drawingInited == False: - plt.ion() + #plt.ion() self.fig = plt.figure() #self.ax = self.fig.add_subplot(111, projection='3d') self.ax = self.fig.add_subplot(111, projection='3d') @@ -156,13 +157,30 @@ class InverseKinematicsEnv: color_link = 'black' self.robot.initDrawing(self.ax, color_link) self.drawingInited = True + plt.pause(0.1) + # put this here for good measure + self.robot.drawStateAnim() + self.bg = self.fig.canvas.copy_from_bbox(self.fig.bbox) + # manual blitting basically + # restore region + self.fig.canvas.restore_region(self.bg) + # updating all the artists (set new properties (position bla)) self.robot.drawStateAnim() + # now you need to manually draw all the artist (otherwise you update everything) + # thank god that's just lines, all in a list. + # btw, that should definitely be a dictionary, not a list, + # this makes the code fully unreadable (although correct). + for link in self.robot.lines: + for line in link: + self.ax.draw_artist(line) + self.fig.canvas.blit(self.fig.bbox) + # NOTE: this might not work self.ax.set_title(str(self.n_of_tries_for_point) + 'th iteration toward goal') drawPoint(self.ax, self.goal, 'red', 'o') # if no draw it is kinda faster #self.fig.canvas.draw() # this is even faster - self.fig.canvas.update() + #self.fig.canvas.update() self.fig.canvas.flush_events() diff --git a/python/initial_python_solution/robot_stuff/__pycache__/InverseKinematics.cpython-310.pyc b/python/initial_python_solution/robot_stuff/__pycache__/InverseKinematics.cpython-310.pyc index 47e56460692494af368d10f7e35571c312e88590..2396b89a46501036d462e70fa75232ab54f4e46f 100644 GIT binary patch delta 882 zcmX@FyhD{QpO=@5fq{V`cS>^V1o?@4GK_8$wY8;E7*d#W*mBvUI2ak+8B&;2SXvlT zSelulI5(!aF*Ay7Ud`OY$Y?y-g7qV#>t-#sK1RmS%{$rOGBRdOUe1}y$IigOz`?-4 z;LO0lP~0<Fip!+Fsf1|(^FoFihIp15hAfsW))Xd?xxGv^4DoC=3|VYh>?IrvI8#{D z85c65vDiRjDeNg6y)29j1k`dOt1V$#z?H(8!j{fdzmSoUp@eAxcM2DX3*x14*MgkF zvw#<5WDUzgCPs!7o*IUDkUG8;UXYp^hAf^1{0kYt*0N*?ED)>#IbLWXV+}*RFqkc{ zK%|BtOBh2nPnM_)Lo9DCYYnRlLu@=pE!dX}#A?_;N(-kKPKIh12h&0zQIJCxNR&v{ zFl0$JGp6u~Gk`=(q(R~}3|TTM{3!y>kT3u_Mi%6-6oz01O~J{5+@752vu1+8PW#ET zxRn{@Chy}`o&18^FOjt%v9vh#7H>*XVtH^$Vo9oFUS{qsw&cXTvc%$Be98F*mGNms z`ML2)N%<AGSimGxQu-~vqSWG&{G!zOqSW-v{JdMNIhlE>#kaUY=ENr!m1Gu|++s<} z$t;=d!lTB|la^CjoDrW|mYP>mtjRvPlShr`7E4ZMUN)FaoxGk$+_@K&A}kmf7?>FO z7<m}E7@7WaF>^5qG3hYrF!C|-F|sfUFtRanF>*19FbXhpG4Zf+F!C`n{TE^qV-jK% zV6Bp#oG2hVS%7yLW9a1VyiSa}C;#HDVLUmxoG+TOVDe=?Gu9FY28Iih`S?FFhE5W2 zV!S%pSs<9PVDfYUXMtP>28N=15K#ysN+!P&P*f8Jxk(J1WVx6*WI2R51UN*wlsWV` z__)}4Sc{k$7#K9UCL0Q-DcusxO)M$M$uG&tOwuc;1hH<hLFgiXkcrHb-wTLO-XO>? Q#0N5vkplvmc^HMb0N3r|NdN!< delta 654 zcmdm?dS00?pO=@5fq{YHkVaCfiOfVk8Ahv#+S+{X3@OYhEG-NvEX_<&Y#R&Qm>ESk zZ)fgdWHg%W!upZXWwRMuA0uPP=A-Oy85uJtZ{|$pV`X4q;9y{2aAsg&C^nj`#${4p zRKm1?c_9NMLkZIYmW2#84DqZr3|XvMY$;42^Lv?U7~<J$7_!*2I7&DdaHX)OGcIIA zW3hq6QrJ^CdRZ752&m;mR$IbUzkoZ1GleakX(1!n2|OuWFkT9GElUkU7ViQ+kdZYk z3z--hQg~_@;z3sMF5m|_8YHtophU2SAxo&4F@;y00c?&iNW6w2OC*Iag})i%DAp{| z1!7P=AhtM&ox;ix%%CYSc{{h~WKJGsMv2L~JgO|rnfZB>19|-UcvFfJ%Y#c2OHv*4 zGIJ+0@~X+RB`4;UB^KXeD=kP#EJ?k^la^CjoDrW|mYP>mtjRjrj91O8NQr@g0YWG< zFfiO=D@x5vNiFIDg}N340|OHyA0rPV7bDYuE@lo!E=D0H9VQ({K1M!97DfR^HbyQ+ zF-9Rq9u@({$p?7%GKNjA<8xwMIr$)84deF7cKp$d8Ix!6o3Z9FFfi<!e3kzrW7y>5 z0#1yFCvyn~GiFSV6Lc0x1-T#{L}Y@9oXHyn71e}54iE#U0WM|^Sq>o%0S-|vWe!;m jJ}!11)*@yG1_n*`$v*_sCf5mR2=IVZGIBs5vk(^mFXWS{ diff --git a/python/initial_python_solution/robot_stuff/__pycache__/forw_kinm.cpython-310.pyc b/python/initial_python_solution/robot_stuff/__pycache__/forw_kinm.cpython-310.pyc index 83515247013d576e7357d50aa88d446cd98cef1c..fef8c56c5d57b61d99de335ea07b479488fdf269 100644 GIT binary patch delta 64 zcmZ1zxjT|KpO=@5fq{V`c}8;T!i~JrY>dT|HQ8+B3Mxx7^7HgF^D;{^6LaDr-1y@B PoYIoa{JhO2Y!+$&h};#h delta 49 zcmdlTxh9e~pO=@5fq{V`XQ^6h>_%Q`HpZ06nrt@wxruq11*JKOCHY11Wtml*o7pVX E09not0ssI2 diff --git a/python/initial_python_solution/robot_stuff/forw_kinm.py b/python/initial_python_solution/robot_stuff/forw_kinm.py index 267373b..dbf3d3e 100644 --- a/python/initial_python_solution/robot_stuff/forw_kinm.py +++ b/python/initial_python_solution/robot_stuff/forw_kinm.py @@ -133,10 +133,10 @@ class Robot_raw: z_hat = self.joints[j].HomMat[0:3,2] p = self.joints[j].HomMat[0:3,3] - line_x, = self.ax.plot(np.array([]),np.array([]),np.array([]), 'r') - line_y, = self.ax.plot(np.array([]),np.array([]),np.array([]), 'g') - line_z, = self.ax.plot(np.array([]),np.array([]),np.array([]), 'b') - line_p, = self.ax.plot(np.array([]),np.array([]),np.array([]), self.color_link) + line_x, = self.ax.plot(np.array([]),np.array([]),np.array([]), 'r')#, animated=True) + line_y, = self.ax.plot(np.array([]),np.array([]),np.array([]), 'g')#, animated=True) + line_z, = self.ax.plot(np.array([]),np.array([]),np.array([]), 'b')#, animated=True) + line_p, = self.ax.plot(np.array([]),np.array([]),np.array([]), self.color_link)#, animated=True) self.lines += [[line_x, line_y, line_z, line_p]] avg_link_lenth += self.joints[j].d + self.joints[j].r -- GitLab