From 2ac2ccc16ec1abf02c36addccd76182f4e5bfc0b Mon Sep 17 00:00:00 2001
From: m-guberina <gubi.guberina@gmail.com>
Date: Thu, 16 Nov 2023 10:25:26 +0100
Subject: [PATCH] commiting for the sake of it, dont remember last time i did

---
 README.md                                     |  13 +-
 dmp/.notes.md.swp                             | Bin 0 -> 12288 bytes
 dmp/my_sol/.create_dmp.py.swp                 | Bin 0 -> 24576 bytes
 dmp/my_sol/.run_dmp.py.swp                    | Bin 0 -> 28672 bytes
 dmp/my_sol/.temporal_coupling.py.swp          | Bin 0 -> 12288 bytes
 dmp/my_sol/create_dmp.py                      |  49 ++-
 .../drawing_gen/.cliking_the_path.py.swp      | Bin 0 -> 16384 bytes
 dmp/my_sol/drawing_gen/.draw_path.py.swp      | Bin 0 -> 12288 bytes
 dmp/my_sol/drawing_gen/draw_path.py           |  34 +-
 dmp/my_sol/path_in_pixels.csv                 | 346 ++++++++++++++++++
 dmp/my_sol/run_dmp.py                         |  84 ++++-
 dmp/notes.md                                  |   9 +-
 12 files changed, 492 insertions(+), 43 deletions(-)
 create mode 100644 dmp/.notes.md.swp
 create mode 100644 dmp/my_sol/.create_dmp.py.swp
 create mode 100644 dmp/my_sol/.run_dmp.py.swp
 create mode 100644 dmp/my_sol/.temporal_coupling.py.swp
 create mode 100644 dmp/my_sol/drawing_gen/.cliking_the_path.py.swp
 create mode 100644 dmp/my_sol/drawing_gen/.draw_path.py.swp
 create mode 100644 dmp/my_sol/path_in_pixels.csv

diff --git a/README.md b/README.md
index 388dfea..bda1a27 100644
--- a/README.md
+++ b/README.md
@@ -60,4 +60,15 @@ Here is a checklist of what to do together with the key remarks.
   the only TODO is to add the gripper to the simulator somehow, but you can also just
   skip using it when simulating.
 
-TODO:: explain hom transf mat
+#TODO for students
+- explain hom transf mat
+- make this documentation prettier
+
+# TODO for profit
+- writing documentation, making text and video tutorials to the point where this can be used as teaching material
+
+#TODO for fun. general point: get a collection of control algorithms for the arm
+- implement and test other inverse kinematics algorithms
+- rewrite finalized dmp (and other) code into C++
+- learn pybind, create python bindings for that code
+- create a DMP from multiple trajectories (actually learn a DMP from multiple examples)
diff --git a/dmp/.notes.md.swp b/dmp/.notes.md.swp
new file mode 100644
index 0000000000000000000000000000000000000000..af62b6937c3771714f9fe8dd420469879cfe0038
GIT binary patch
literal 12288
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

literal 0
HcmV?d00001

diff --git a/dmp/my_sol/.create_dmp.py.swp b/dmp/my_sol/.create_dmp.py.swp
new file mode 100644
index 0000000000000000000000000000000000000000..ccf79eb987906d4a922574488965cf0993317338
GIT binary patch
literal 24576
zcmYc?2=nw+u+TGNU|?VnU|`5+4^5pNRKwt5$H0)DUtEx%l2`<i!iRGci?cKH@Tq{v
z)xiwZ&&bbBHPVN3b4v44^b3j-D>94qON-)*Gjj`aQsa~J^Gb^HbM#Yk3-og<<BRii
z^plHH6H8L#Q*sOR3MwInj*_DxFd71cL!h)IP1k~#!Pv;q0Hj!1Nl`&qC=|pT#iJoG
z8UmvsFd71*Aut*OqaiRF0;3@?8UiCE1WF2680r}q7?_~`<$=<SXfz9y50mGD@?q*&
zq5K>uEeWMz^2|`aB9w;p-eK}k;ZbTd1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON
zU^E0qLx2V$keI^2(8$ZcaF!P`{}1cmzvX9Oc*@Vfu#umEp`M?C!JD6fL71O`;Upge
z!wEhHhDJUH1`9q0hF4I%XLuPHviKMn{P`Fd{P-9c^!OMUr1=;aSojziUh^_AT;*k8
z*vrenu!om{p`Vw5p^}$@A(oec!HJiF!I77N!H}1ML7JC=fsvPi;Uy0P!$lqjhMhbN
z3_Exj7#8v{Fm&)RFtqb9Fy!+vFevgcFfj2jFudnxV0g#P!0?uvfnhN>149cp1A`Pd
z1H*eR28K;s3=GX&3=B?O3=GO#3=FS085j<7GB6zAWMEj$$-t1s$-v;t$-rR7$-p4Z
z$-wZ3gMr~L2Lr<$4hDw991IL=IT#qGaWF7cb1*PeaWF8%axgHsb1*O%a4<0Na4;}%
zb1*P`VrO8u!_L5Pl%0WL1v>-7a&`uW9(D$XN_GZ@3U&sD7<L8*S9S&l7j^~)HFgGu
zKWq#POW7D0`q>y5?ARC>Y}ptXRM;38_}Ca2zOyng>|teKh-GD95MyOvU}a@sU}0ro
zc+JAVaFvCDVIK<vLm3MLLn#XbLo5pegBuG2gD?vN!+mB3hI`Bm47-^b80IrGFw`?M
zFhnpjFlaF|FlaI}F#Ka;U^vdiz_5jhfuWO$fgyv5fx!ec*aN~03=9fTP@I~RrkAc@
zs{m$HMqBA9=o-fA6{QwuBo?G<Xn=+DbQBCVHBt3c8lY%0AVyCfT#Fvq_-KPzxS`4l
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
Pji6B<G{1vJd$Jh--q=dE

literal 0
HcmV?d00001

diff --git a/dmp/my_sol/.run_dmp.py.swp b/dmp/my_sol/.run_dmp.py.swp
new file mode 100644
index 0000000000000000000000000000000000000000..9e41aba318dc810933ed1d8655a411c2590406d2
GIT binary patch
literal 28672
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
V?AgMm0xG6VHTU3}(L+1x3jiBgWNZKc

literal 0
HcmV?d00001

diff --git a/dmp/my_sol/.temporal_coupling.py.swp b/dmp/my_sol/.temporal_coupling.py.swp
new file mode 100644
index 0000000000000000000000000000000000000000..8c4f6bb34f5adee1ba3b007865778db26f988418
GIT binary patch
literal 12288
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

literal 0
HcmV?d00001

diff --git a/dmp/my_sol/create_dmp.py b/dmp/my_sol/create_dmp.py
index 066e64f..b9d7a6d 100644
--- a/dmp/my_sol/create_dmp.py
+++ b/dmp/my_sol/create_dmp.py
@@ -1,31 +1,50 @@
 import numpy as np
-
+# TODO:
+# 1. change the dimensions so that they make sense,
+#    i.e. shape = (N_points, dimension_of_points)
+# 2. change hand-written numerical differentiation 
+#    to numpy calls (for code style more than anything)
+# 3. separate x into z and s variables, this is unnecessarily complicated
+
+# k,d are constanst which determine the baseline uncostrained dynamics
+# these work fine, but it could be good to play around with them just to
+# see their effect. normally people set them so that you get critical damping
+# as the uncostrained system
 class DMP:
     def __init__(self, k=100, d=20, a_s=1, n_bfs=100):
+        # TODO load the trajectory here
+        # and then allocate all these with zeros of appopriate length
+        # as this way they're basically declared twice
+
         # parameters
+        # for whatever reason, k, d and a_s don't match the ,
+        # OG formulation: tau * z_dot = alpha_z * (beta_z * (g - y) - z) + f(x) 
+        # this formulation: tau * z_dot = k * (g - y) - d * z + f(x) = h (z, y, s)
+        # i.e. k = beta_z * alpha_z
+        #      d = alpha_z
         self.k = k
         self.d = d
         self.a_s = a_s
         self.n_bfs = n_bfs
 
         # trajectory parameters
-        self.n = 0
-        self.y0 = None
-        self.tau0 = None
-        self.g = None
-        self.tau = None
+        self.n = 0 # n of dofs
+        self.y0 = None # initial position
+        self.tau0 = None # final time
+        self.g = None # goal positions
+        self.tau = None # scaling factor, updated online to ensure traj is followed
 
         # initialize basis functions for LWR
-        self.w = None
-        self.centers = None
-        self.widths = None
+        self.w = None # weights of basis functions
+        self.centers = None # centers of basis functions
+        self.widths = None # widths of basis functions
 
         # state
         self.x = None
         self.theta = None
-        self.pos = None
-        self.vel = None
-        self.acc = None
+        self.pos = None # position
+        self.vel = None # velocity 
+        self.acc = None # acceleration
 
         # desired path
         self.path = None
@@ -38,13 +57,9 @@ class DMP:
 
     # TODO pass other trajectories as arguments and etc to make this nice
     def load_trajectory(self):
-        # load trajectory. the current one is something on ur10, but apart from scale it's the same robot
-        # and this is just joint positions
-        #trajectory_loadpath = './ur10_omega_trajectory.csv'
+        # load trajectory.  this is just joint positions.
         trajectory_loadpath = './new_traj.csv'
         data = np.genfromtxt(trajectory_loadpath, delimiter=',')
-        # this one is slow enough
-        #self.time = data[:, 0] * 1.5
         self.time = data[:, 0]
         self.time = self.time.reshape(1, len(self.time))
         self.y = np.array(data[:, 1:]).T
diff --git a/dmp/my_sol/drawing_gen/.cliking_the_path.py.swp b/dmp/my_sol/drawing_gen/.cliking_the_path.py.swp
new file mode 100644
index 0000000000000000000000000000000000000000..d1cca6873b6fb0050ee28d2f71905ab50bcdb369
GIT binary patch
literal 16384
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

literal 0
HcmV?d00001

diff --git a/dmp/my_sol/drawing_gen/.draw_path.py.swp b/dmp/my_sol/drawing_gen/.draw_path.py.swp
new file mode 100644
index 0000000000000000000000000000000000000000..9ea5eca545c56746695523ee25b68fca2bfe33c5
GIT binary patch
literal 12288
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
Y49W_+;6fjv6x4VF84YQaVD$<E04DINVE_OC

literal 0
HcmV?d00001

diff --git a/dmp/my_sol/drawing_gen/draw_path.py b/dmp/my_sol/drawing_gen/draw_path.py
index 1c6bd81..c192a4e 100644
--- a/dmp/my_sol/drawing_gen/draw_path.py
+++ b/dmp/my_sol/drawing_gen/draw_path.py
@@ -1,13 +1,26 @@
+# TODO: possible improvement:
+# - draw multiple lines
+# - then you would just generate multiple dmps for each trajectory
+#   and do movel's + movej's to provide the connections
+# TODO: possible improvement: make it all bezier curves
+#   https://matplotlib.org/stable/users/explain/artists/paths.html
+#   look at the example for path handling if that's what you'll need
+
 import numpy as np
 import matplotlib.pyplot as plt
-# used for drawing
-# it's hacked from lasso where there's drawing
-from matplotlib.path import Path
+# LassoSelector is used for drawing.
+# The class actually just does the drawing with mouse input,
+# and the rest of processing is done on the obtained path.
+# Thus it is the correct tool for the job and there's no need
+# to reimplement it from mouse events.
 from matplotlib.widgets import LassoSelector
-
+# Path is the most generic matplotlib class.
+# It has some convenient functions to handle the draw line,
+# i.e. collection of points, but just refer to matplotlib 
+# documentation and examples on Lasso and Path to see more.
+#from matplotlib.path import Path
 
 class DrawPath:
-
     def __init__(self, ax):
         self.canvas = ax.figure.canvas
         self.lasso = LassoSelector(ax, onselect=self.onselect)
@@ -15,6 +28,7 @@ class DrawPath:
     def onselect(self, verts):
         # verts is a list of tuples
         self.path = np.array( [ [i[0], i[1]] for i in verts ] )
+        # this would refresh the canvas and remove the drawing
         #self.canvas.draw_idle()
 
     def disconnect(self):
@@ -27,9 +41,8 @@ if __name__ == '__main__':
     # we can multiply however we want later
     # idk about the number of points, but it's large enough to draw
     # a smooth curve on the screen, so it's enough for the robot to draw as well i assume
-    # NOTE: possible improvement: make it all bezier curves
-    # https://matplotlib.org/stable/users/explain/artists/paths.html
-    # look at the example for path handling if that's what you'll need
+    # --> it is, and the system operates well
+    # depending on the curve the number of points is in the 50-200 range
     subplot_kw = dict(xlim=(0, 1), ylim=(0, 1), autoscale_on=False)
     fig, ax = plt.subplots(subplot_kw=subplot_kw)
 
@@ -41,11 +54,12 @@ if __name__ == '__main__':
             print(selector.path)
             selector.disconnect()
             ax.set_title("")
+            # TODO: ensure this runs fine after packaging
             np.savetxt("./path_in_pixels.csv", selector.path, delimiter=',', fmt='%.5f')
-            print("TODO: run clik on me")
+            print("TODO: run clik on the pixel path to make it a trajectory")
             exit()
 
     fig.canvas.mpl_connect("key_press_event", accept)
-    ax.set_title("Press 'Enter' to accept drawn path.")
+    ax.set_title("The drawing has to be 1 continuous line. Press 'Enter' to accept the drawn path. ")
 
     plt.show()
diff --git a/dmp/my_sol/path_in_pixels.csv b/dmp/my_sol/path_in_pixels.csv
new file mode 100644
index 0000000..c253974
--- /dev/null
+++ b/dmp/my_sol/path_in_pixels.csv
@@ -0,0 +1,346 @@
+0.28565,0.60847
+0.28416,0.60847
+0.28416,0.60997
+0.28416,0.61147
+0.28268,0.61297
+0.27971,0.61747
+0.27377,0.62347
+0.27377,0.62497
+0.26634,0.63696
+0.26486,0.63996
+0.26486,0.64146
+0.26486,0.64296
+0.26634,0.64446
+0.26634,0.64596
+0.27228,0.65496
+0.28119,0.67745
+0.28268,0.68345
+0.28565,0.69095
+0.28862,0.69695
+0.30198,0.71944
+0.30495,0.72844
+0.30792,0.73444
+0.31683,0.75544
+0.32277,0.76443
+0.32425,0.76893
+0.32722,0.77943
+0.34058,0.80043
+0.35098,0.82592
+0.35692,0.83192
+0.35989,0.84242
+0.36583,0.84841
+0.38067,0.87241
+0.38364,0.87841
+0.38513,0.88291
+0.38661,0.88441
+0.39404,0.89041
+0.39552,0.89041
+0.39701,0.89041
+0.39849,0.89041
+0.39998,0.88891
+0.40295,0.88741
+0.41186,0.88441
+0.43264,0.86341
+0.43858,0.85741
+0.44452,0.85141
+0.45789,0.82742
+0.46086,0.82292
+0.46383,0.81692
+0.47422,0.78543
+0.48164,0.77343
+0.49055,0.74794
+0.49352,0.73894
+0.49649,0.73294
+0.49946,0.72394
+0.50689,0.71345
+0.50837,0.70895
+0.50837,0.70745
+0.51134,0.70295
+0.51431,0.69695
+0.51431,0.69545
+0.51431,0.69395
+0.51431,0.69245
+0.51283,0.69095
+0.51134,0.68645
+0.50243,0.67895
+0.50095,0.67895
+0.49946,0.67895
+0.50095,0.68045
+0.50689,0.68345
+0.51431,0.68945
+0.53064,0.69845
+0.57519,0.71794
+0.58558,0.72544
+0.59004,0.72694
+0.62567,0.74494
+0.63161,0.75094
+0.64052,0.75394
+0.65092,0.76143
+0.65537,0.76443
+0.68804,0.77493
+0.69398,0.78093
+0.69991,0.78243
+0.72516,0.79743
+0.72961,0.80043
+0.73852,0.80343
+0.74001,0.80343
+0.74001,0.80193
+0.74001,0.80043
+0.74001,0.79893
+0.74001,0.79443
+0.74001,0.78993
+0.74001,0.78543
+0.74001,0.76893
+0.74001,0.76593
+0.74001,0.76143
+0.74446,0.74494
+0.74446,0.74044
+0.74446,0.73594
+0.74446,0.72094
+0.74446,0.71944
+0.74001,0.70295
+0.73852,0.69845
+0.73555,0.68195
+0.73258,0.67595
+0.72516,0.66546
+0.71179,0.64296
+0.71179,0.64146
+0.70585,0.63696
+0.70437,0.63546
+0.69991,0.62947
+0.67913,0.60847
+0.67467,0.60697
+0.66873,0.59947
+0.66725,0.59947
+0.66131,0.59647
+0.65685,0.59347
+0.65388,0.59197
+0.64795,0.58897
+0.64646,0.58897
+0.63161,0.58598
+0.63013,0.58448
+0.62567,0.58448
+0.62419,0.58298
+0.61825,0.58298
+0.61676,0.58298
+0.61825,0.58298
+0.61973,0.58298
+0.62122,0.58298
+0.66131,0.57698
+0.67022,0.57398
+0.67764,0.57248
+0.71179,0.56048
+0.72070,0.56048
+0.75337,0.54998
+0.75485,0.54998
+0.75782,0.54848
+0.76228,0.54848
+0.76376,0.54548
+0.76822,0.54398
+0.77416,0.54099
+0.77861,0.53949
+0.77861,0.53799
+0.77861,0.53649
+0.78010,0.53499
+0.78307,0.52899
+0.78307,0.52749
+0.78307,0.52599
+0.78307,0.52449
+0.78158,0.51999
+0.77713,0.51399
+0.77119,0.50799
+0.76525,0.50199
+0.74149,0.48250
+0.73407,0.47650
+0.72664,0.47350
+0.69991,0.45700
+0.69546,0.45401
+0.68507,0.44801
+0.65982,0.43751
+0.65388,0.43601
+0.64795,0.43001
+0.63013,0.42101
+0.62567,0.42101
+0.62419,0.41801
+0.61825,0.41651
+0.61676,0.41651
+0.61528,0.41651
+0.61528,0.41801
+0.61231,0.41951
+0.61082,0.42251
+0.61082,0.42401
+0.60934,0.42701
+0.60785,0.42701
+0.60637,0.43001
+0.60489,0.43001
+0.60489,0.43151
+0.60489,0.43301
+0.60192,0.43601
+0.60192,0.43751
+0.60043,0.43901
+0.60043,0.44051
+0.60043,0.44201
+0.59895,0.44201
+0.59895,0.44051
+0.59004,0.41351
+0.58558,0.40302
+0.57964,0.39702
+0.54401,0.34003
+0.53658,0.32803
+0.52322,0.31004
+0.51134,0.29804
+0.50392,0.28304
+0.48313,0.25905
+0.47570,0.24705
+0.45492,0.22606
+0.44898,0.21706
+0.44155,0.21106
+0.44007,0.20656
+0.42077,0.19157
+0.41631,0.18707
+0.41037,0.18107
+0.40443,0.17507
+0.40146,0.17507
+0.40146,0.17357
+0.40295,0.17357
+0.40295,0.17507
+0.39998,0.17657
+0.39998,0.17807
+0.39849,0.18257
+0.39849,0.18407
+0.39552,0.19307
+0.38364,0.22756
+0.38364,0.23955
+0.38067,0.24855
+0.38067,0.25755
+0.37474,0.29954
+0.37177,0.30854
+0.36731,0.34453
+0.36731,0.36103
+0.36434,0.37002
+0.35840,0.40452
+0.35840,0.41501
+0.35543,0.42551
+0.35098,0.45700
+0.35098,0.46150
+0.35098,0.46450
+0.35098,0.46600
+0.35098,0.46750
+0.35098,0.46900
+0.35098,0.46750
+0.35098,0.46600
+0.34801,0.46300
+0.34652,0.46150
+0.34504,0.45700
+0.34058,0.45251
+0.33464,0.44651
+0.31237,0.42401
+0.30792,0.41951
+0.28862,0.40452
+0.28416,0.40002
+0.27525,0.39702
+0.27228,0.39552
+0.26486,0.39252
+0.26337,0.39252
+0.24704,0.38952
+0.24259,0.38952
+0.24110,0.38652
+0.23219,0.38652
+0.23071,0.38652
+0.22922,0.38652
+0.22774,0.38652
+0.22625,0.38652
+0.22180,0.38952
+0.21734,0.38952
+0.21734,0.39102
+0.21289,0.39252
+0.21289,0.39402
+0.20992,0.39552
+0.20992,0.39702
+0.20992,0.39852
+0.20843,0.40002
+0.20843,0.41501
+0.20843,0.42101
+0.20843,0.43001
+0.21140,0.43901
+0.22180,0.46900
+0.22328,0.47500
+0.22774,0.48550
+0.24259,0.51249
+0.24555,0.52299
+0.25595,0.54698
+0.25892,0.55148
+0.26486,0.55748
+0.26783,0.56648
+0.27228,0.57098
+0.28862,0.59797
+0.29010,0.60247
+0.29307,0.60397
+0.29158,0.60247
+0.29010,0.60247
+0.28862,0.59947
+0.28713,0.59797
+0.28565,0.59647
+0.28119,0.59497
+0.27228,0.58897
+0.26783,0.58598
+0.24110,0.57098
+0.23071,0.56648
+0.19804,0.54998
+0.18765,0.54249
+0.17280,0.53649
+0.15498,0.52749
+0.12974,0.51399
+0.11934,0.51099
+0.10895,0.50649
+0.10301,0.50499
+0.10153,0.50499
+0.10153,0.50649
+0.10153,0.50799
+0.10450,0.51249
+0.11192,0.53349
+0.11934,0.54548
+0.12677,0.55598
+0.16240,0.61447
+0.16983,0.62947
+0.18022,0.64296
+0.18913,0.65796
+0.21586,0.70445
+0.23071,0.73594
+0.23368,0.74044
+0.24110,0.75244
+0.24259,0.76143
+0.25298,0.78693
+0.25595,0.79143
+0.25892,0.79593
+0.26040,0.79743
+0.26189,0.80642
+0.26189,0.80792
+0.26337,0.80792
+0.26337,0.80942
+0.26486,0.80942
+0.26634,0.80942
+0.26931,0.80942
+0.26931,0.80792
+0.27080,0.80642
+0.27080,0.80492
+0.27674,0.79893
+0.27971,0.79743
+0.28565,0.78693
+0.28565,0.78543
+0.28713,0.78543
+0.28862,0.78393
+0.28862,0.78243
+0.29010,0.78093
+0.29010,0.77943
+0.29158,0.77793
+0.29158,0.77643
+0.29307,0.77343
+0.29455,0.76893
+0.29455,0.76743
+0.29455,0.76293
+0.29901,0.75394
+0.29901,0.74794
+0.30198,0.74344
+0.30198,0.74194
+0.30198,0.74194
diff --git a/dmp/my_sol/run_dmp.py b/dmp/my_sol/run_dmp.py
index 554104b..e8096c4 100644
--- a/dmp/my_sol/run_dmp.py
+++ b/dmp/my_sol/run_dmp.py
@@ -1,6 +1,6 @@
 from create_dmp import DMP
-from rtde_control import RTDEControlInterface as RTDEControl
-from rtde_receive import RTDEReceiveInterface as RTDEReceive
+from rtde_control import RTDEControlInterface
+from rtde_receive import RTDEReceiveInterface
 from rtde_io import RTDEIOInterface
 from robotiq_gripper import RobotiqGripper
 from temporal_coupling import NoTC, TCVelAccConstrained
@@ -15,18 +15,45 @@ import copy
 sys.path.insert(0, '../../util')
 from give_me_the_calibrated_model import get_model
 
+# TODO:
+# 1. clean up these instantiations in a separate util file
+#    and just do a line-liner importing -> need to make this a package to get rid
+#    of the relative-path imports
+# 2. delete the unnecessary comments
+# 3. figure out how to scale the dmp velocity when creating it -> DONE
+# 4. parametrize everything, put argparse with defaults in a separate file
+#    like in tianshou examples. make magic numbers arguments!
+#    also add helpfull error messages based on this, ex. if interfaces couldn't connect
+#    with the simulation argument on, write out "check whether you started the simulator"
+# 5. remove all unused code:
+#    - for stuff that could work, make a separate file
+#    - just remove stuff that's a remnant of past tries
+# 6. put visualization into a separate file for visualization 
+# 7. put an actual low-pass filter over the force-torque sensor
+# 8. add some code to pick up the marker from a prespecified location
+# 9. add the (optional) decomposition of force feedback so that
+#    you get hybrid motion-force control
+# 10. write documentation as you go along
+
+# create models
+# TODO make a argument for loading/not loading and running gepetto visualization
 urdf_path_relative = "../../robot_descriptions/urdf/ur5e_with_robotiq_hande.urdf"
 urdf_path_absolute = os.path.abspath(urdf_path_relative)
 mesh_dir = "../../robot_descriptions/"
 mesh_dir_absolute = os.path.abspath(mesh_dir)
 model, data = get_model(urdf_path_absolute, mesh_dir_absolute)
 
-rtde_control = RTDEControl("192.168.1.102")
-rtde_receive = RTDEReceive("192.168.1.102")
+# create and connect robot communication interfaces
+rtde_control = RTDEControlInterface("192.168.1.102")
+rtde_receive = RTDEReceiveInterface("192.168.1.102")
 rtde_io = RTDEIOInterface("192.168.1.102")
-# on scale from 0 to 1
-rtde_io.setSpeedSlider(0.7)
+# on scale from 0 to 1 set the maximum allowed speed on the robot.
+# it's a global thing on the robot
+# TODO make this an argument
+speed_slider = 0.7
+rtde_io.setSpeedSlider(speed_slider)
 
+# TODO add a use gripper argument
 # run if marker isn't gripped
 #gripper = RobotiqGripper()
 #gripper.connect("192.168.1.102", 63352)
@@ -35,22 +62,27 @@ rtde_io.setSpeedSlider(0.7)
 #gripper.move(255,100,100)
 #time.sleep(3)
 
+# TODO create a simulation argument!
 #rtde_control = RTDEControl("127.0.0.1")
 #rtde_receive = RTDEReceive("127.0.0.1")
 
+# TODO make N_iter and argument
 N_ITER = 10000
+# TODO gather all vector memory allocation in one place
+# allocate memory for vectors (use numpy arrays instead of default python linked lists)
 qs = np.zeros((N_ITER, 6))
 dmp_poss = np.zeros((N_ITER, 6))
 dqs = np.zeros((N_ITER, 6))
 dmp_vels = np.zeros((N_ITER, 6))
 
-
+# TODO move to util file
+# catch SIGINT
 def handler(signum, frame):
     print('sending 100 speedjs full of zeros')
     for i in range(100):
         vel_cmd = np.zeros(6)
         rtde_control.speedJ(vel_cmd, 0.1, 1.0 / 500)
-
+# TODO make a separate visualization file and put this in a function there
     print('also plotting')
     t = np.arange(N_ITER)
     ax_q = plt.subplot(221)
@@ -76,20 +108,34 @@ def handler(signum, frame):
 #    if not rtde_control.isProgramRunning():
 #        exit()
 
+# catch SIGINT
 signal.signal(signal.SIGINT, handler)
+
+#######################################################################
+#                            initalization                            #
+#######################################################################
+
+# load trajectory, create DMP based on it
 dmp = DMP()
+# get up from the board
 current_pose = rtde_receive.getActualTCPPose()
 current_pose[2] = current_pose[2] + 0.03
 rtde_control.moveL(current_pose)
+# move to initial pose
+# this is a blocking call 
 rtde_control.moveJ(dmp.pos.reshape((6,)))
-# TODO check that you're there instead of a sleep
-#t.sleep(3)
 
+# TODO make all these arguments
 TEMPORAL_COUPLING = True
 update_rate = 500
+# TODO calculate this when setting default arguments
 dt = 1.0 / update_rate
 JOINT_ID = 6
 
+# ========================================================================
+# TODO: either write a separate file where this is used
+# ---> TODO write a separate file where you're testing this out
+# or just delete it
 task_frame = [0, 0, 0, 0, 0, 0]
 # these are in {0,1} and select which task frame direction compliance is active in
 # just be soft everywhere
@@ -105,8 +151,12 @@ ftype = 2
 #                       and where is this set?)
 # why these values?
 limits = [2, 2, 2, 2, 2, 2]
+# ========================================================================
+
+
 
 # parameters from yaml config file in albin's repo
+# TODO: make these arguments
 kp = 2
 acceleration = 1.7
 #acceleration = 0.5
@@ -115,15 +165,16 @@ if not TEMPORAL_COUPLING:
     tc = NoTC()
 else:
     # TODO learn the math already
+    # TODO  MAKE THESE ARGUMENTS
     tau0 = 5
     gamma_nominal = 1.0
     gamma_a = 0.5
     eps = 0.001
-    v_max = np.ones(6) * 2
+    v_max = np.ones(6) * 2 * speed_slider
     a_max = np.ones(6) * 1.7
     tc = TCVelAccConstrained(gamma_nominal, gamma_a, v_max, a_max, eps)
 
-# TODO: check sign!
+# TODO make this an argument
 alpha = 0.003
 # lame hack for the current orientation (which it doesn't change so it's ok)
 wrench_offset = np.array([-1.07988, -1.407225, -2.63069, 0.071115, -0.0487768, 0.089271])
@@ -138,7 +189,10 @@ for i in range(N_ITER):
     tau = dmp.tau + tc.update(dmp, dt) * dt
     dmp.set_tau(tau)
     q = rtde_receive.getActualQ()
-    # TODO this fucker feel the weight of the gripper, this causes bias -> fix it!
+    # TODO and NOTE the weight, TCP and inertial matrix needs to be set on the robot
+    # you already found an API in rtde_control for this, just put it in initialization 
+    # under using/not-using gripper parameters
+    # TODO: document the mathematics with one-line comments
     wrench = np.array(rtde_receive.getActualTCPForce())
     wrench_avg[i % 5] = wrench
     wrench = np.average(wrench_avg, axis=0)
@@ -170,6 +224,9 @@ for i in range(N_ITER):
     dmp_poss[i] = dmp.pos.reshape((6,))
     dqs[i] = dq.reshape((6,))
     dmp_vels[i] = dmp.vel.reshape((6,))
+    # TODO make start-end times a function wrapper or something,
+    # so that it is in every controller for-loop by default
+    # (or leave it here, whatever)
     end = time.time()
     diff = end - start
     if dt < diff:
@@ -181,6 +238,7 @@ for i in range(N_ITER):
     if (np.linalg.norm(dmp.vel) < 0.0001) and (i > 5000):
         break
 
+# call the handler to stop movement 
 handler(None, None)
 
     #print(vel_cmd[0][0])
diff --git a/dmp/notes.md b/dmp/notes.md
index aeb3bfa..3222426 100644
--- a/dmp/notes.md
+++ b/dmp/notes.md
@@ -68,7 +68,12 @@ def compute_ctrl(self, target_state, robot_state):
     return vel_cmd
 ```
 
-# add some impedance to live with errors
+# add some impedance to live with errors - DONE, but needs filtering
 --------------------------------------
 - f/t readings are added and works fine for impedance
-- TODO: cancel out the gripper weight
+- TODO: cancel out the gripper weight -> DONE, but TODO put the payload
+  assignment into code to avoid surprises
+
+# make a main file that runs all of it at once
+----------------------------------------
+- do it
-- 
GitLab