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