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
zcmYc?2=nw+u+TGNU|?VnU|{g=Pfm@os$|eHW?)FqFD}SWNh|_M;lsI!#o3v8_*6jT
z>R<-yXXNLm8tKEiIi-0i`UORa6`95QrA6_@nYjfysqxAAc_l^pIr;^aB^mj7`k8r|
zC7Fpi@epo&aehu|NoIbYeo{_mNqk9aafx0*CB&Xlax?@+LjWxVN=wpoEqED>jSLMy
zGRjJd3c^C6Am%6@4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7$G50QozVi&%nUI1oba?
z9Dsp=ff34w(NOLvH5vk=Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?1VbP(
zg@NH3I|IWm4#@mJtpERjpMl{lKLf)-eg=jE{0t0p`574I@G~$p^D{6s@iQ<u@-r}K
z@-r~};bUO<&Bws7kB@<21s?;$ay|xzWIhIlP(B8RU_J&00X_zXcf1S?>v<U%@^~2-
z6nGgJ1bG=41b7)34)HKB%;aHUNaSH)@Z(`%VBle3ILFPvu!Wm}VKX-a!(46#hE{F{
z277J>23c+fhVxtu4D-1d7(%%i80@$h7(R0{FkIziV3@$kz)-}=z!1a9z+k}1z`)JP
zz;KQO;-_^We+|KS8Flh#2#kinXb6mkz-S1Jh5#%C6ciK`lobkcO7sd6k=doisTz8Q
znhX%J%KTD=<itFMg3=O&M1_LH(&AKw%shq6GzE}Md179PLP@?taZY}@LP<tuUV5=Y
zN`84BSaU&9W?qSgQd&W=m4cFvf}y^GMrvM)g04bwNn%lnCd3A)qLR$qRE7LJg`(8F
zl+>ckymTcU1!Tow13?0|3LvF=AVLFTLRx0JUUFhySz@tXT25(kMto{nYF<e(R90C5
zEU1u}SE*2tnwOH9m#*L*>Zt%xq@z%js#}nlnO6c5FUd$%C{8X)O$GZeFEuqKH3e)j
zk`<s8k{Td>Qc`{e!~x0*$@vA93LxE?xrynipa21JK-LtOB$lM=C?u7Zz)a4~OwTA$
z$jdKLNJ>>m&PdElPfby%Of3OhlvtscQj}O8pIB6qSzMx#lLxb*C{-5{G+=8W(mD#I
z1u2PemqWq;6u2-OL6(3V0`U{rf}A|P;?$D(%9O;CM2)-xz2eL~jS2;A1&u5PeFZ}U
z15E`jg}eg2f=p=iC`0T>MX@$7HM1lmwFoSRY^y?EK12{=p+ZJt8QhCt+d<(5(V$n9
zT3nJ}lp0@@nx2`Tr;(J7@M&>s3E1eQ#N_PsqWsdl6a^3yl<YvhffxYuC)BFaJZMmY
z?Exn+1=OUHmS3ch1u~-u6yzF)1_lP2RtyYCPC|=XWoTjqc{CsFAW(#+6(#1Tmgg5`
zD-`F0vj8Y_6sM*tWR@@}D->sd^FgXYQEG8%4mfLooD6ZK4k(8dD-@I#XQUQ`4Ftzu
zYKlUTyOX0rQfXRRYLP-(QGPB+k^xIvP*wn?4v?%uVqRu$Vo7R>0xT_*WMmdAloqEJ
zD<mo;Cnjg4roi3Lkd&@qtAONFP<o9ASriXS#Yo9nSs^{O1d^Qd(-czkN-~R5K^jYo
zQWZ2(%TkLf!I@kkGp{%^1uUZnGC@<JI5Dpn-AxP(kirF2pcsHk6lGADm8U8c7i8vv
zJps;y3OV`t1)w~WgB0(etX@!*pPX6@G8U0_^9xdo5<yFqiy4#^6p}O*%2Of948zkP
zyGk+=OB50kP(v~yK>-whU;`2n27uxzIlrhVHMu0GQlU7r3KX_^Dc}&#11G?ANLnn(
zS4b~POkz-0NJ>r1FG>YD0kph2Gp`g}gcXAlOJa$F6@#)uc&Y-Z7y<b%tu!a65^NgS
z>uH(kpg>J5QOGPQR!GatOUwaV3MvFaPJtvD24x0ig`CvH;u3}YyyR3pP!cPFgjQlo
zE+}&HON$gza|=o;70NU7Qu50c5-UJSATLEBHLn<CLuQFWW-%-&q$nhoK%xbdQZ<rt
z@{_Y|-4b((Q#Bcs6><}^Qx(9PKrVoq2hyCFS)7^zDaAlC#mPmP1tkjEsi_6U3hDWo
zdFc!c8aa77nhLfGi4}SUIr$|T6*{1D1YEpm>cCTmZAeim*s9cuf}G6cOi)l4r52W^
z7K6fpK^aw{LP=^)PO(C6VhPB|oXjLpIOgXe2O}i)E0kxX<|&k?g0r)ZLSlu2Ex2MU
zE=>aI1l0u$AhEmxy`0Rv;)2BFR1E_i1tVBtrvonf7#K2h3-XIfz%>kvomZM$P^pku
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
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
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