From 595635eef4e30c871c1062f6b721a058c37c1cce Mon Sep 17 00:00:00 2001
From: m-guberina <gubi.guberina@gmail.com>
Date: Sun, 26 Nov 2023 22:51:34 +0100
Subject: [PATCH] i think i got blitting to work in tkinter. of course code
 should be finished so that everything is blitted. and also, there should be a
 class handling all of the updating etc so that a) everything isn't unreadable
 and b) code is not duplicated. look into the HUMRO project to see how you go
 tkinter to update based on multiprocessing. this way you can update as much
 as you manage, while the control loop runs unimpeded. do note that this
 visualization stuff is really only useful when comparing logged runs and
 that's really it'

---
 .../initial_python_solution/.blit_test.py.swp | Bin 12288 -> 0 bytes
 ....manipulator_visual_motion_analyzer.py.swp | Bin 45056 -> 0 bytes
 .../example_code/blit_in_tk.py                |  95 +++++++++++++++
 .../{ => example_code}/blit_test.py           |   0
 .../dark_background_example.py                |   0
 .../{ => example_code}/ellipse.py             |   0
 .../embedding_in_tk_sgskip.py                 |   0
 .../example_code/manager_anim.py              | 108 ++++++++++++++++++
 .../{ => example_code}/run_classic_ik_algs.py |   0
 .../manipulator_visual_motion_analyzer.py     |  20 +++-
 .../robot_stuff/.forw_kinm.py.swp             | Bin 36864 -> 0 bytes
 .../__pycache__/forw_kinm.cpython-310.pyc     | Bin 11451 -> 11480 bytes
 .../robot_stuff/forw_kinm.py                  |  12 +-
 13 files changed, 229 insertions(+), 6 deletions(-)
 delete mode 100644 python/initial_python_solution/.blit_test.py.swp
 delete mode 100644 python/initial_python_solution/.manipulator_visual_motion_analyzer.py.swp
 create mode 100644 python/initial_python_solution/example_code/blit_in_tk.py
 rename python/initial_python_solution/{ => example_code}/blit_test.py (100%)
 rename python/initial_python_solution/{ => example_code}/dark_background_example.py (100%)
 rename python/initial_python_solution/{ => example_code}/ellipse.py (100%)
 rename python/initial_python_solution/{ => example_code}/embedding_in_tk_sgskip.py (100%)
 create mode 100644 python/initial_python_solution/example_code/manager_anim.py
 rename python/initial_python_solution/{ => example_code}/run_classic_ik_algs.py (100%)
 delete 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
deleted file mode 100644
index 5c52e18edb5224f1c6bd60b1766faf468b66fb90..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12288
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
XtdLg#6GFI0ub>iSK1jMCr-T6j(*MfY

diff --git a/python/initial_python_solution/.manipulator_visual_motion_analyzer.py.swp b/python/initial_python_solution/.manipulator_visual_motion_analyzer.py.swp
deleted file mode 100644
index 6dfe2a96bb05e401c7327f20ce338af45f733479..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 45056
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
XEg}Nn76>|5t~ft8wIm}mFP#AZt|q6I

diff --git a/python/initial_python_solution/example_code/blit_in_tk.py b/python/initial_python_solution/example_code/blit_in_tk.py
new file mode 100644
index 0000000..db7b3dd
--- /dev/null
+++ b/python/initial_python_solution/example_code/blit_in_tk.py
@@ -0,0 +1,95 @@
+import tkinter as Tk
+import numpy as np
+import matplotlib.pyplot as plt
+from datetime import datetime
+import time
+
+from matplotlib.figure import Figure
+from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
+
+# from Backend import Backend  #self written data acquisition handler  
+import random
+
+#global variables
+t0 = datetime.now() #start time of program
+
+#Returns time difference in seconds
+def time_difference(t1, t2):
+    delta = t2-t1
+    delta = delta.total_seconds()
+    return delta
+
+# Define Class for Flow data display
+class FlowFig():
+    def __init__(self, master): #master:Parent frame for plot
+        #Initialize plot data
+        self.t = []
+        self.Flow = []
+
+        #Initialize plot for FlowFig
+        self.fig = plt.figure(figsize=(4,4))
+        self.ax = self.fig.add_subplot(111)
+        self.ax.set_title("Flow Control Monitor")
+        self.ax.set_xlabel("Time")
+        self.ax.set_ylabel("Flow")
+        self.ax.axis([0,100,0,5])
+        self.line = self.ax.plot(self.t, self.Flow, '-')
+
+        #Set up canvas
+        self.canvas = FigureCanvasTkAgg(self.fig, master = master)
+        self.canvas.draw()
+        self.ax.add_line(self.line[0])
+        self.background = self.canvas.copy_from_bbox(self.ax.bbox)
+        self.ax.grid(True)
+
+        # # Initialize handler for data aqcuisition
+        # self.Data= Backend() 
+        # self.Data.initialize()
+
+    #update figure
+    def update(self):
+        start = time.time()
+        # get new data values
+        self.t.append(time_difference(t0, datetime.now()))
+        Flow = random.uniform(1, 5)
+        self.Flow.append(Flow)
+
+        # shorten data vector if too long
+        if len(self.t) > 200:
+            del self.t[0]
+            del self.Flow[0]
+
+        #adjust xlims, add new data to plot
+        self.ax.set_xlim([np.min(self.t), np.max(self.t)])
+        self.line[0].set_data(self.t, self.Flow) 
+
+        #blit new data into old frame
+        self.canvas.restore_region(self.background)
+        self.ax.draw_artist(self.line[0])
+        self.canvas.blit(self.ax.bbox)
+        self.canvas.flush_events()
+        root.after(1,self.update)
+        end = time.time()
+        print("time on rendering", end - start)
+        print("fps: ", 1/ (end - start))
+
+#Flow Frame of GUI
+class FlowPage(Tk.Frame):
+    def __init__(self, parent, controller):
+        Tk.Frame.__init__(self,parent)    
+        self.parent = parent    
+        self.FlowPlot = FlowFig(self)
+        self.FlowPlot.canvas.get_tk_widget().grid(row=0, column=0, rowspan=9, columnspan=9)
+
+# Mainloop
+root= Tk.Tk()
+root.rowconfigure(0, weight=1)
+root.columnconfigure(0, weight=1)
+
+Flowmonitor = FlowPage(root, root)
+Flowmonitor.grid(row =0, column=0, rowspan =10, columnspan=10)
+Flowmonitor.rowconfigure(0, weight=1)
+Flowmonitor.columnconfigure(0, weight=1)
+
+root.after(25, Flowmonitor.FlowPlot.update)
+root.mainloop()
diff --git a/python/initial_python_solution/blit_test.py b/python/initial_python_solution/example_code/blit_test.py
similarity index 100%
rename from python/initial_python_solution/blit_test.py
rename to python/initial_python_solution/example_code/blit_test.py
diff --git a/python/initial_python_solution/dark_background_example.py b/python/initial_python_solution/example_code/dark_background_example.py
similarity index 100%
rename from python/initial_python_solution/dark_background_example.py
rename to python/initial_python_solution/example_code/dark_background_example.py
diff --git a/python/initial_python_solution/ellipse.py b/python/initial_python_solution/example_code/ellipse.py
similarity index 100%
rename from python/initial_python_solution/ellipse.py
rename to python/initial_python_solution/example_code/ellipse.py
diff --git a/python/initial_python_solution/embedding_in_tk_sgskip.py b/python/initial_python_solution/example_code/embedding_in_tk_sgskip.py
similarity index 100%
rename from python/initial_python_solution/embedding_in_tk_sgskip.py
rename to python/initial_python_solution/example_code/embedding_in_tk_sgskip.py
diff --git a/python/initial_python_solution/example_code/manager_anim.py b/python/initial_python_solution/example_code/manager_anim.py
new file mode 100644
index 0000000..edd9a92
--- /dev/null
+++ b/python/initial_python_solution/example_code/manager_anim.py
@@ -0,0 +1,108 @@
+import matplotlib.pyplot as plt
+import numpy as np
+import time
+
+class BlitManager:
+    def __init__(self, canvas, animated_artists=()):
+        """
+        Parameters
+        ----------
+        canvas : FigureCanvasAgg
+            The canvas to work with, this only works for subclasses of the Agg
+            canvas which have the `~FigureCanvasAgg.copy_from_bbox` and
+            `~FigureCanvasAgg.restore_region` methods.
+
+        animated_artists : Iterable[Artist]
+            List of the artists to manage
+        """
+        self.canvas = canvas
+        self._bg = None
+        self._artists = []
+
+        for a in animated_artists:
+            self.add_artist(a)
+        # grab the background on every draw
+        self.cid = canvas.mpl_connect("draw_event", self.on_draw)
+
+    def on_draw(self, event):
+        """Callback to register with 'draw_event'."""
+        cv = self.canvas
+        if event is not None:
+            if event.canvas != cv:
+                raise RuntimeError
+        self._bg = cv.copy_from_bbox(cv.figure.bbox)
+        self._draw_animated()
+
+    def add_artist(self, art):
+        """
+        Add an artist to be managed.
+
+        Parameters
+        ----------
+        art : Artist
+
+            The artist to be added.  Will be set to 'animated' (just
+            to be safe).  *art* must be in the figure associated with
+            the canvas this class is managing.
+
+        """
+        if art.figure != self.canvas.figure:
+            raise RuntimeError
+        art.set_animated(True)
+        self._artists.append(art)
+
+    def _draw_animated(self):
+        """Draw all of the animated artists."""
+        fig = self.canvas.figure
+        for a in self._artists:
+            fig.draw_artist(a)
+
+    def update(self):
+        """Update the screen with animated artists."""
+        cv = self.canvas
+        fig = cv.figure
+        # paranoia in case we missed the draw event,
+        if self._bg is None:
+            self.on_draw(None)
+        else:
+            # restore the background
+            cv.restore_region(self._bg)
+            # draw all of the animated artists
+            self._draw_animated()
+            # update the GUI state
+            cv.blit(fig.bbox)
+        # let the GUI event loop process anything it has to do
+        cv.flush_events()
+
+# make a new figure
+fig, ax = plt.subplots()
+x = np.linspace(0, 2 * np.pi, 100)
+# add a line
+(ln,) = ax.plot(x, np.sin(x), animated=True)
+# add a frame number
+fr_number = ax.annotate(
+    "0",
+    (0, 1),
+    xycoords="axes fraction",
+    xytext=(10, -10),
+    textcoords="offset points",
+    ha="left",
+    va="top",
+    animated=True,
+)
+bm = BlitManager(fig.canvas, [ln, fr_number])
+# make sure our window is on the screen and drawn
+plt.show(block=False)
+plt.pause(.1)
+
+for j in range(100):
+    start = time.time()
+    # update the artists
+    ln.set_ydata(np.sin(x + (j / 100) * np.pi))
+    fr_number.set_text(f"frame: {j}")
+    # tell the blitting manager to do its thing
+    bm.update()
+
+    end = time.time()
+    print("time on rendering", end - start)
+    print("fps: ", 1/ (end - start))
diff --git a/python/initial_python_solution/run_classic_ik_algs.py b/python/initial_python_solution/example_code/run_classic_ik_algs.py
similarity index 100%
rename from python/initial_python_solution/run_classic_ik_algs.py
rename to python/initial_python_solution/example_code/run_classic_ik_algs.py
diff --git a/python/initial_python_solution/manipulator_visual_motion_analyzer.py b/python/initial_python_solution/manipulator_visual_motion_analyzer.py
index 23a428d..6900208 100644
--- a/python/initial_python_solution/manipulator_visual_motion_analyzer.py
+++ b/python/initial_python_solution/manipulator_visual_motion_analyzer.py
@@ -145,6 +145,7 @@ for robot_index, robot in enumerate(ik_env.robots):
     trajectory_plots.append(trajectory_plot)
 # goal point
 ik_env.goal_point_plot = drawPoint(ik_env.ax, ik_env.goal, 'maroon', '*')
+#background_manipulator = fig_manipulator.canvas.copy_from_bbox(fig_manipulator.bbox)
 
 
 # let's add the manipulability ellipse
@@ -293,8 +294,13 @@ notebook_right.grid(row=0, column=1, sticky='ew')
 
 # tkinterize these plots
 canvas_manipulator = FigureCanvasTkAgg(fig_manipulator, master=frame_manipulator) 
+canvas_manipulator.draw()
 # NEW
+# TODO maybe you want another background idk
+# worked elsewhere with figure.bbox
 background_manipulator = canvas_manipulator.copy_from_bbox(fig_manipulator.bbox)
+#background_manipulator = canvas_manipulator.copy_from_bbox(canvas_manipulator.bbox)
+
 canvas_manipulator_widget = canvas_manipulator.get_tk_widget()     
 canvas_manipulator_widget.grid(row=0, column=0) 
 canvas_manipulator._tkcanvas.grid(row=1, column=0)   
@@ -349,6 +355,7 @@ def update_points(new_val):
 # ee plot
 ###########################################################################
     start = ttime.time()
+    #fig_manipulator.canvas.restore_region(background_manipulator)
     canvas_manipulator.restore_region(background_manipulator)
     index = int(np.floor(float(new_val)))
     
@@ -370,6 +377,11 @@ def update_points(new_val):
     for robot_index, robot in enumerate(ik_env.robots):
         ik_env.robots[robot_index].setJoints(ik_env.data[robot_index]["qs"][index])
         ik_env.robots[robot_index].drawStateAnim()
+
+    # NEW AND BROKEN
+        for link in robot.lines:
+            for line in link:
+                ik_env.ax.draw_artist(line)
         # all these are in lists as that's what the line plot wants, 
         # despite the fact that we have single points
         point_in_time_eigen1_line.set_xdata([time[index]])
@@ -405,8 +417,12 @@ 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()
-    # NEW
+    # NEW AND BROKEN
+#    fig_manipulator.canvas.blit(fig_manipulator.bbox)
+#    fig_manipulator.canvas.flush_events()
+    canvas_manipulator.blit(fig_manipulator.bbox)
+    canvas_manipulator.flush_events()
+    #canvas_manipulator.draw()
     # might need to manually update all artists here from ax_something
     #canvas_manipulator.blit(fig_manipulator.bbox)
     canvas_manip_graphs.draw()
diff --git a/python/initial_python_solution/robot_stuff/.forw_kinm.py.swp b/python/initial_python_solution/robot_stuff/.forw_kinm.py.swp
deleted file mode 100644
index c0aefbb19e9fc5f2403b0c03a9d5e4906deb177d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 36864
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
IMbnA_08#Vw)&Kwi

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 fef8c56c5d57b61d99de335ea07b479488fdf269..ae795696554855aaab0586582d8ca7a29dcd7522 100644
GIT binary patch
delta 1824
zcmdlTc_Wf9pO=@5fq{WRb$fEEUc^Q|Rd&Xb$tLV7j0-16vZpa-O+LUb&7Z=S!rsdo
z!&u8%!;r-Q5|a|(fD3XV1Ucb?+%Q2&kTfGid~zU%HzU{Nxg1iwA)1W0I1=+Ra}!Ha
zQzmcc$Y(QRU|=Y+nykZF&aTC##i+%ovw0Qg9Y!{DkhsO<9&SYwD-hEJM2Lb2DG(tK
zB1{<=7;Xut6eX7X7iFgAl_ZvA=I1%)W#$$cPkzWPA__8lC3BG)NEus6zEfgxYLWG1
zE*?e38Jl%@5*ZmyCin5WGFnf*!mGr%X!Cd8>CAR6AcI{&gd2!(XJBB^WPT0`D-bS<
z0||l&Mi5H~L<oWi50FB($rlAhCr5E}O@1xNqXF>($a40yoczQRW20Nl1@WmxV6P~F
zG=aThI$2&QiaP+rw+0c3lUsyT*wR7FjLGYSBp9P69~aVO+`svw&^bl{FOWTaMJga;
z8AFQ9C!ZJ57q9>+2Ac>rJAE>rs0CxxWOq?hM&Zr1qR$y+%0Mc>4k`!fWKOM2y~SFb
zoLNv=R5`gpT-gAu5o`q5W^nj|jZFdROa<A>4-Uzq8jwKk<jdkVd{H1~6UabD*P_PB
zvJxSTmYa(tWEm5{!2xk*5!h}qkW#P%DnYEtAOee>w^)h`i%M=Wr=*q?fm~Vya)Tx-
zlFf}Eol%qDOR6(QZx)yGW30y#Wkn$Six5%d3DN`(I-Vl1BS6L$d4ojNL4*&8KsX2N
zdr0JfJjVq}VqvMtCHX}~pfpwF4^plJB_=<S7G%tu{7w2fW6b1xGHNcf7#JAR^V+08
z{8Z#T07)_Ipzz~GSbdAHC^a#~D?c-@B)BB8B(;bYWLN@-U;_~*lRad;8KWjok=14_
zpL{@ek2ctG;PfvEQUG?`91v?R0|Nszkr&Ma2}Dg^E+@;_vH7T69is&(sixo0RS5m9
z_|v{91|$!1OA#l?K|)1f%isZWi>V;92<!-x$%;zizPGrGQ%eH!i!(v_st9CJ5!l`^
zkTGD(7l2q2AVL*nAPXd(K+d?un_5v)lo+3qm|KvUmtGV#`M!cS<HXI}ihPV53qgvx
zi$JzW$S(zHM;Hz^7i3xy*ziS@Ba{pnH*D@y5@a+80qNr?0;eT#fPfP$mH;UN8?b2d
zDP=>(W0U_Vf5n<ez`+4eB$}KM-+>JVh4d}9qI_`Vfc*;(B}fQ?${tO2B>%E!fnu}R
zs0f@Xkg_w#dpeT~RMi;oPoA#&EW!}v2~KcYxW$o^nO9tpm<%lxK(<00u?nOMZ0}4E
z3*;S5Hi&KD1Pcyg*5Zu(lHyw|AgU;8@>Mle#y69Ht0lQRgY*P~h-eT2(p}UHVod@O
z(?JB-Sa1k0262~zh!r4WC5Tu9A~sE4qOQZJu=%2T2NQwt17|mIVF*rLpqy3&s$evE
zA*CI{W1y^ci#sj9s64SK#XB=E7aS1aY>o)nB4bdt<0wuoiBCx^NxUUkJo$!}pa{s#
znnJf&(~1&vQ^DpJ&71sJOO*{=ZU#)&(6$t{0lC~3MA(4{Z4ePPxlCJ$@%QAJ+V=bh
kL7~rei#4w_x1h4feDZT`Gsd>bayn6r2PaqRI5N5c06XQGoB#j-

delta 1750
zcmcZ+xjT|CpO=@5fq{V`c}8;T!my2es_cv@lTFxF7-vq7WKUyUF!=zxH1|T57{*%8
z8ip(e5MPRi4J^Qg5MT!jaKi*7*=iWF7#FfkPUP@r<e0pcLu&FBj(j#l1_p*A%gLUc
z<?L!qYK&@(8k>)E-eF`j1BshYUdgQ(YYAc+g9uR&Aq67jL4*kd1H&!hl%m9P|Dw#)
zypqI{%=|pZyv*DpBajRqNG2>bxg@^`EC{k{C3BG)NRF)}-zl*;wa9AnM_%E{Ry=%+
zQ#O0@Br-A@PhQRI$_NrxVw|^Ggl{^tr8CGb7ZBkJBHS1l7&Mumg8~SIi()~7V1g0E
z5&{u|Ai{m}6F~zFh(|znvZv+bCzco+-C{0?Pb~s_NC~74>>-oMHbPO{{vf^;h)9^c
zP)J2S4a7_bX=cmKN=%N=y2X;46`v0#3yLBqKM~So+`XAk_#C5vC&*cRMJgc0j3Gs4
zli!Hw3z&oSgDnADmo`~j)PgZ`a*C)aBmd@EqR$y+N<k{XZY%@oWKOM2y~SFboLNv=
zR55w3xUvCQBiIPAW559qHZ~cgGX-QTKR8T_szCxZlRt>t@I``{jUWRVU5gqfTS<g4
znr`lwkY!A82Wfyfvj}Xr7)UAD0Tm$DBoKkc&RZ<Sg+(Q|m{U?qia;(c0=Yqx70KoX
zkj}`-JW}e6;hRmQ{1{n45jVL}S~Lm~F&-dA;Gp6u0$U0)rpOB<stzK&K?K5jux}yp
z1M&<PB1IK}Qd5y1DEV-6f`o%h5=&CECJW0vXN;cwTSiS`CIbUQdS09Kho6d^2Oz10
z9prglsKt{VWhJ@eLH4nM2;<4Avfhl5lQ+t0GZs(2E4xP<><n;{mjo#QJ7YG8HHU$L
z0h*AD=7IzwA<igHE%D0F%quBw+5AYZj*%afDAVufDun)4{AphlJvm=NR0QtnTTBI+
zMPTcVC)+8BPhPLUXAd&C2y9O%$XKvt^Fb^L5TOckJqsknLDt^lO|2*?N{mlQ%q_^w
zOD_VsU1YL=qBvvkW(`F?Mves_4ctW_^Cje$fQ&#`05%(BViDMag&-eH?og6tT(fzZ
zk|3i&Fi0;)5jb^#0|J}`u>?dB*bs>RU&?ZfhbBv^e60sXeGzJ&Es6%Y0G<>yIUzm;
z8x9KPTWm%7pg1f7`yC!mkT3!jHJa>5erL}DhqO@<IH@D$TaYC>lefw8PoASH&UkzB
z7S(4F1|ZLHg5&)bM^0v5aY14-v;+Xz3~|UxkWR4OGe9hmw=~%xHiDBTILKLxGxAG{
zZ?S-=B5<@%W>ptrd@)%<J;~h(q%QzOM1cs92}MmH)<h674Mc#A28Z|}5O*1fSPmjq
zfQZ!~V&mk4>N<=vo8PH-Fj?UbM^I)i0vC9olwAbMS4E(jLzB12c=84<1yL-aSY$N$
zsg|M$$RV0Sw^-AP5_40*nu_L5meN*b1DAgOlU=nfMXf>3u>ldbAVM2Nfcz{ndAT+p
w<M+wiwC(v1fP$9m7HeK<Zb4;{*<=<SGsf1*);dv)2PPj>7oWUVM~l%3032PBssI20

diff --git a/python/initial_python_solution/robot_stuff/forw_kinm.py b/python/initial_python_solution/robot_stuff/forw_kinm.py
index dbf3d3e..0a54f80 100644
--- a/python/initial_python_solution/robot_stuff/forw_kinm.py
+++ b/python/initial_python_solution/robot_stuff/forw_kinm.py
@@ -133,10 +133,14 @@ 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')#, 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)
+            #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)
+            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