From c3f1150153613250da29d9d7264d56ba296f61d7 Mon Sep 17 00:00:00 2001
From: m-guberina <gubi.guberina@gmail.com>
Date: Fri, 18 Oct 2024 14:19:44 +0200
Subject: [PATCH] movejPI implemented

---
 python/examples/oc_for_ik.py                  |  77 +---------
 python/ur_simple_control.egg-info/SOURCES.txt |   3 -
 .../__pycache__/managers.cpython-311.pyc      | Bin 23690 -> 42158 bytes
 .../__pycache__/managers.cpython-312.pyc      | Bin 41969 -> 42063 bytes
 .../basics/__pycache__/basics.cpython-311.pyc | Bin 1871 -> 2382 bytes
 .../basics/__pycache__/basics.cpython-312.pyc | Bin 2183 -> 2141 bytes
 python/ur_simple_control/basics/basics.py     | 140 +++++++++++++++++-
 .../dmp/__pycache__/dmp.cpython-311.pyc       | Bin 15441 -> 16850 bytes
 python/ur_simple_control/managers.py          |   7 +-
 .../optimal_control/optimal_control.py        |  41 ++++-
 .../__pycache__/draw_path.cpython-311.pyc     | Bin 3907 -> 3826 bytes
 .../__pycache__/get_model.cpython-311.pyc     | Bin 4180 -> 4180 bytes
 .../__pycache__/logging_utils.cpython-311.pyc | Bin 2599 -> 5911 bytes
 .../__pycache__/visualize.cpython-311.pyc     | Bin 10383 -> 18242 bytes
 .../__pycache__/visualize.cpython-312.pyc     | Bin 16436 -> 16436 bytes
 15 files changed, 182 insertions(+), 86 deletions(-)

diff --git a/python/examples/oc_for_ik.py b/python/examples/oc_for_ik.py
index 36ce607..da2a7e9 100644
--- a/python/examples/oc_for_ik.py
+++ b/python/examples/oc_for_ik.py
@@ -2,7 +2,7 @@ import numpy as np
 import time
 import argparse
 from functools import partial
-from ur_simple_control.managers import ControlLoopManager, RobotManager
+from ur_simple_control.managers import getMinimalArgParser, ControlLoopManager, RobotManager
 # TODO: implement
 from ur_simple_control.optimal_control.optimal_control import IKOCP
 # TODO: implement
@@ -11,81 +11,8 @@ from ur_simple_control.util.logging_utils import saveLog
 import pinocchio as pin
 
 
-"""
-Every imaginable magic number, flag and setting is put in here.
-This way the rest of the code is clean.
-If you want to know what these various arguments do, just grep 
-though the code to find them (but replace '-' with '_' in multi-word arguments).
-All the sane defaults are here, and you can change any number of them as an argument
-when running your program. If you want to change a drastic amount of them, and
-not have to run a super long commands, just copy-paste this function and put your
-own parameters as default ones.
-NOTE1: the args object obtained from args = parser.get_args()
-is pushed all around the rest of the code (because it's tidy), so don't change their names.
-NOTE2: that you need to copy-paste and add aguments you need
-to the script you will be writing. This is kept here 
-only as a convenient reference point.
-"""
 def get_args():
-    parser = argparse.ArgumentParser(description='Run closed loop inverse kinematics \
-            of various kinds. Make sure you know what the goal is before you run!',
-            formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-    parser.add_argument('--simulation', action=argparse.BooleanOptionalAction, 
-            help="whether you are running the UR simulator", default=False)
-    parser.add_argument('--robot-ip', type=str, 
-            help="robot's ip address (only needed if running on the real robot)", \
-                    default="192.168.1.102")
-    parser.add_argument('--pinocchio-only', action=argparse.BooleanOptionalAction, 
-            help="whether you want to just integrate with pinocchio", default=False)
-    parser.add_argument('--visualize-manipulator', action=argparse.BooleanOptionalAction, 
-            help="whether you want to visualize the manipulator and workspace with meshcat", default=False)
-    parser.add_argument('--real-time-plotting', action=argparse.BooleanOptionalAction, 
-            help="whether you want to have some real-time matplotlib graphs (parts of log_dict you select)", default=False)
-    parser.add_argument('--gripper', action=argparse.BooleanOptionalAction, \
-            help="whether you're using the gripper", default=False)
-    parser.add_argument('--goal-error', type=float, \
-            help="the final position error you are happy with", default=1e-2)
-    parser.add_argument('--max-iterations', type=int, \
-            help="maximum allowable iteration number (it runs at 500Hz)", default=100000)
-    parser.add_argument('--acceleration', type=float, \
-            help="robot's joints acceleration. scalar positive constant, max 1.7, and default 0.4. \
-                   BE CAREFUL WITH THIS. the urscript doc says this is 'lead axis acceleration'.\
-                   TODO: check what this means", default=0.3)
-    parser.add_argument('--speed-slider', type=float,\
-            help="cap robot's speed with the speed slider \
-                    to something between 0 and 1, 0.5 by default \
-                    BE CAREFUL WITH THIS.", default=0.5)
-    parser.add_argument('--tikhonov-damp', type=float, \
-            help="damping scalar in tikhonov regularization", default=1e-3)
-    parser.add_argument('--minimum-detectable-force-norm', type=float, \
-            help="we need to disregard noise to converge despite filtering. \
-                  a quick fix is to zero all forces of norm below this argument threshold.",
-                 default=3.0)
-    # TODO add the rest
-    parser.add_argument('--clik-controller', type=str, \
-            help="select which click algorithm you want", \
-            default='dampedPseudoinverse', choices=['dampedPseudoinverse', 'jacobianTranspose', 'invKinmQP'])
-        # maybe you want to scale the control signal
-    parser.add_argument('--controller-speed-scaling', type=float, \
-            default='1.0', help='not actually_used atm')
-    parser.add_argument('--debug-prints', action=argparse.BooleanOptionalAction, \
-            help="print some debug info", default=False)
-    parser.add_argument('--save-log', action=argparse.BooleanOptionalAction, \
-            help="save log data folder in whatever directory you called this in. if it doesn't exists there, it's saved to /tmp/data", default=False)
-    parser.add_argument('--alpha', type=float, \
-            help="force feedback proportional coefficient", \
-            default=0.01)
-    parser.add_argument('--beta', type=float, \
-            help="low-pass filter beta parameter", \
-            default=0.01)
-    parser.add_argument('--past-window-size', type=int, \
-            help="how many timesteps of past data you want to save", default=5)
-
-    args = parser.parse_args()
-    if args.gripper and args.simulation:
-        raise NotImplementedError('Did not figure out how to put the gripper in \
-                the simulation yet, sorry :/ . You can have only 1 these flags right now')
-    return args
+    parser = getMinimalArgParser()
 
 if __name__ == "__main__": 
     args = get_args()
diff --git a/python/ur_simple_control.egg-info/SOURCES.txt b/python/ur_simple_control.egg-info/SOURCES.txt
index 8ed9418..0043b92 100644
--- a/python/ur_simple_control.egg-info/SOURCES.txt
+++ b/python/ur_simple_control.egg-info/SOURCES.txt
@@ -108,8 +108,6 @@ ur_simple_control/basics/__pycache__/basics.cpython-310.pyc
 ur_simple_control/basics/__pycache__/basics.cpython-311.pyc
 ur_simple_control/basics/__pycache__/basics.cpython-312.pyc
 ur_simple_control/clik/__init__.py
-ur_simple_control/clik/clik_point_to_point.py
-ur_simple_control/clik/clik_trajectory_following.py
 ur_simple_control/clik/__pycache__/__init__.cpython-310.pyc
 ur_simple_control/clik/__pycache__/__init__.cpython-311.pyc
 ur_simple_control/clik/__pycache__/__init__.cpython-312.pyc
@@ -179,7 +177,6 @@ ur_simple_control/robot_descriptions/urdf/__pycache__/__init__.cpython-311.pyc
 ur_simple_control/robot_descriptions/urdf/__pycache__/__init__.cpython-312.pyc
 ur_simple_control/util/__init__.py
 ur_simple_control/util/calib_board_hacks.py
-ur_simple_control/util/default_args.py
 ur_simple_control/util/draw_path.py
 ur_simple_control/util/freedrive.py
 ur_simple_control/util/ft_calibration.py
diff --git a/python/ur_simple_control/__pycache__/managers.cpython-311.pyc b/python/ur_simple_control/__pycache__/managers.cpython-311.pyc
index ee06032c7c773a30ce7ce19ebd45121640fc714b..18f3958bb1c315fff9b9f78273c15d57a03f5cf6 100644
GIT binary patch
literal 42158
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
IsRo>l0F~G^vH$=8

delta 7676
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
G;}8JKiy0^Y

diff --git a/python/ur_simple_control/__pycache__/managers.cpython-312.pyc b/python/ur_simple_control/__pycache__/managers.cpython-312.pyc
index 49cdc1ff94ca1a8be35034d322263985a15a4d32..cbec686b753e00fb945018a65c3a29abc042fc33 100644
GIT binary patch
delta 2286
zcmex(oay`tCf?J$yj%<n3=HS|h0+&p<W+TJoHE(iZ5yM;=2vcRjGQIPAV~%WhRNrZ
zM43`pCg1R|oE+~VCa(?^N1{qJVVo?j$sdzNC-=JxPgd0tnS8;+bn;F!o_fYCJ(vmv
zT_jLq2;<c-u4aU=YZ&4sAuI-l6!sd1cqtT~G@Qp#!w@e6=W*6BWLdy?2)c@!fuV+h
zFJ2ZVRKu8MGdVC<n42qGih-esAI9hB&URs7C}#3vXkrA5Jxmehl|#~H2iC=ds>>2d
zR|;<pW0oCE2ZF9*1vw#J0Va~dP{R<fI62Q<jw#CtWGExw<au7Ej9|7Vf3^k#Ly>=p
zD@^%nC<CMk%4Dcv$a0$eP*ZqvzPB(-4P%xE$QXWs)l3itjBo{v-jg3{NljiqM-pPZ
zp&;0J{t{n^N(KgO#^a361|LywEK$vr6)?F`OG=`KAs#M^%?zlz$ql|dlQZ0uCTF;b
zP1f*Ll@x--JtIR&ILu*SZ#8O3P2S=w$>;$xfAR}o9=?)zbOi!64DkkVL58ekke69%
z7~+j4i}@*Y!wpOkp1j6ajwwZW@&jKH6@)n{!Z7Pm3}Vc(oBS|Elu>@Notxa`3x2GO
z3E&`~?hg)fyUC4OvXf=~rIa&Zb|dJbnI+LM9^4-<eEAt;Kt?cTPyQGy&CFE8G`S%_
zWb%AnUPc&;hX*O#@+JrB2u~Id5MWfFtPx<&s1D-uGr?R7j^#p-XD46iW?|A4nY<`q
z3e!vG$;N^27%e9&1(mXeFfcF_#crM))WFF2VX{cbHSQ-o0{vc{UK0v?d^f)eS;)*N
zGPx(BKxhF21A``0(KL{H8xXN@GGC-7qxfcvNOmU11(O}3ZKc{k;+-HO7eq{DU|_h#
zobQ`i)H8W{v;(8m<QvhSL?H&<Vk<97%}dTGf|_+d#*k5KvtaCI7RDKqk0x3&&Yt`~
z(M^690|P^qL{NTGeu-~lUSfJ`kzR6QPG(Y3Vo9o7i2ml3ByM)S6(Gx2f(V2IK!FQ!
z>?)8%4~PI;wQTa-Oi8xsApXM1dotA-gEv3P>|u0l0f{s-FfjOOvKE07OHn>ZWG0B1
z10wn%0pJeu6l+;xPHAc}C^IQ26sduv=S<$1t-x5l`BJtMi!8((Zio>xK+^L-1lZV#
zlMM@kC3k{6CWPX#`1I70z_!hE3ryI!4}g>(1QE@X@06)Zp_>7cIRqjOPnIrM(#947
z2!AgFxtyg4<np4`lQYWg8CPsxQQp9!3UMYE!kM?Y(^E?vlS@hya{^N!p)hf>Z;b-u
zw8?oj(o(xXjuysrbjtP3i)&sose@g)85BUme)%Pyxdl0?xv6<2sVS~SMfpXVOb{om
zo4mQ+it*>>clBY67U0yt32{LV$U~(d0&Y;zY!G)H$Vj%L#JrUJ+@fxf$im4rjmC`Z
zn>RG}FfkQ1O}1;1(!`>v=psllSjPzv3!E&MO>S(FVB9fzR*Mwl?#WwQ6d3s@Uu${B
zXs~&2D-$DYR1H&>@Z^QLGLs*)wei(3)-c5L!gA{5`Ni^+XSa(@emqfh@`iSGM#0TD
z+G`oLKmn;KR0Q(CEtce*%z~l`AnU*>r~vHv;)2xF6tAMb$@QJ;>flTSinCjsnRz9t
z>7dkH1Wvo4WUI*x38yoYPjniw$uTo96rY{cmCGePJ#J#$0+-98nv=`B^w@7m%T8dK
z!m)X2*BwUHi6HC1$;%PMasm;pAOhrsTP*nnsd+^UCok(UWwhCRr>Bci4ZjA~<edEC
z)S`uxd-}{7-6r4Z@!u@mKZ{cjlxm9>fy@QDz6dSPfxKS?jz37+n|ynQCF6|AqBEly
zmrX91nZX#c`Q}U&HpYdM|IH6%?4BI3poDS3<f99eY{5n@0hzl7M63r9psZgM3Sxn?
zAJ}SeB!W_5(Rq->B@nTDvdThtwqizB(N9H_3m1B@$*{UIezKXof1xhpipg&m%5#Gg
c1`9~-%+2D9PBZeyb1>R}VgQjv8Vn2!0DjXt$N&HU

delta 2124
zcmX?qg6ZRNCf?J$yj%<n3=HRsdDBHU@~XNqW=%GB+r}uo`IVa+BU26I<cGQ<lM6g}
z8CfRRc_>civ=nA4QJvhVEj#(HkJ#i1I>M736gVa`dFoEC_26M-oGjoYQePxcq6;z<
zgliaAGlFOah8l)=aR`fnA%(4mAzlK7Ckf}V*D%CO!Fe1t3|S^H9)hmo2Ae1i6RBa$
zvVgKDuk_^RO5x0wVqhrZuVI|Lz*B@Tg)7^IfuWemi=l}TA|z155HADO!BE4PWi|O>
zjxZ-TvMwQHT`4?ZMLAxQ{BkgDDIibDPtJ3fW6H7v>1XH7HfLZcnlm|}TWs<ZFG)tQ
zs1RSa1_MKpe~BYZ<Lb#5{Y01<K$<j#8J#CDtP)|$asipZ&%c@pqKc8B2C87Pueb2z
z3r!r85A?H6-svp@HB|s?Du0P5L_Gro$W)Bz325f#R)wiRL>;5g<VGziz8Z#jbzG7x
zH4O0@lM~#uCfoR0OA5l`k&&S!7^bC$G0O#H&SXAc9=?)r4B=J2l8g`q^ZfZ4<0pTN
zkph`&FxkORSsQLjiV)1~8isf+m>~$`QiLYw`N>NntI~t10!K=qjxaMryzFE<H#xRq
z)f$GZn8^<{g(oZe3A2FZ8?|I7yZcKqrc7=u66T+YFd6RtRlYndH4Ir1V12^=;NWJf
zWvXGy$^^yA<SbntW(1p?y96GjS(6{?2~Tzi5M)%He8Np`azTJ3D3?rj2;gD?Md9QJ
z{vzPWThPbCq$xc4Ou&@Mse!K<%_j#2m2SQeRKv*lbh2;Awat2=3z->(CSQms5Sq`x
zz@W)gG?jsYp~wbAESMY=smUn1xh9gGiE;kqmS|h4R*-lHh{y#IQy3T+ZZYTkW)^i%
zz8&qrC^1<k=94JIpj&L^MX7no88EYyV+|QKHiyP;W?`H@nKQ|fan@w#Bsa#Hle>~+
z8Fe?WNaAMKTMjaG1&Bac6b<5n9kmj~>IM;D=PjN5FjJCk8i>DOQkFVn;AV}i9!8~R
zkU$dy1B0I?YmotnlMf<hfQZ>3qHprGY&pi+lfPywFjj6B%W-0ng(&AP0;`-3QZyGt
zfOSupTv`w;xr2d$p-LzyKPkV&H!&|UJ+(+LK0UQ0ux0bZ0uwgw{UGHBKt$7Ig>qFX
zbTdFQ2SLQ4$?@e%+SvSw@ZC~SM6eXOgVe8@yr$fqaoOfK<qa&V5NC2BoOz2oJ+;I!
zxui5PCol!#*$I;;)+oq=!b_70Y{V_5!jxiA?p9DJQUe*ebMm<w3C63NpVz!(VgoyL
z)8uRQ3XE$ff3LS<{Jz<!A&k)i9EY3`n{q(9N<jofHHb9}M63lxKU+~^UP^v$Q5Q&L
z!Q=yt#%!$23=GA=ljU1OHv2XiGsV4R2FYcCyv0X^kwq6k%E9Ix2eH6O4HPK1IEwO1
z5=%1k^KLPQXflJnSG0Zdy%s6PU6X&dC@}I)mTG;*sI-}}jfs&pxP~!H7@Uv%Jvb+4
z#`8=zXs?>wpddf_V7t!b2^!*)r8@W-1vYDS)G}&;f>u+o2;|jUEXg^U1x5WJtHBAP
z0PM};g4EO$ucF?`7dzFJKoNM0Gc&IwHN7aYB((^fTtO)n=Bm?^<-3g7WIzFNY;t&4
zE|>W9sEJVvST2jIPCnPAx0$*74x{P>kQLxW1}dYAoIu<b5CO9G7E69XYF^QT$t=C5
zjFy|Ndb=3a@M~aA&dD!MEm|=7Ri8Pd^JJ@D|ILN{vpDrYX}4%0$Xt-Ki_r2H$je3G
z*oCCP$(A!M8K+M!o*Bisbn>~G8H|CO&1b2wF)o-KvmlVMWAeHMC5-bYD=$>C1sk~-
zWbSGZu?|Gc1QDSi0-V>tR)ZsPCrIoZh`0zMc1><t=+0Ki$SV3NZ}Rzt9&FOAu8g0o
qCd)3;Wn4bldyzahIIXdO)Xvyky67|`e+&ns{U-(xS){?hzyJV(IVCp$

diff --git a/python/ur_simple_control/basics/__pycache__/basics.cpython-311.pyc b/python/ur_simple_control/basics/__pycache__/basics.cpython-311.pyc
index 2e9246e2621ab405a1c970b708cdee5099cb8193..bf9003e76ee7a4f45b1083add2ad0f60642967f1 100644
GIT binary patch
delta 873
zcmX@lcTR|JIWI340|Nttaw%_mB*#QP3C5&}>Yj2bEG-OCJSnU#3{ku(Y%L5?d@1ZL
z3{m_kjKK_=91~kw#F<i<TbU$5TEV!Mt%f0mDTR5mJYy(7OEy@nh$)4&mL-L4ax-IK
zJ$qF%mx6+VLT-Lps+V(qUP)1Yj!%Am0a#EM6@bNZ^NULqk`jwElNACKk|7!t((;QG
zvhp+YN)(C<5|dLE3P5b#l6+k-Lm@Z6Br`uxM<Fq}q%<)Ht}7=$pR+&@Y^s~z=Ie|K
zi~_t23=GB77#J8D7(VbY2#QT+WnRVjZt@1^-As%OlZ#n&>zRTXQka4nG?}Yrf^~u&
z4rZY`Ru?QrzH1@w$|@}`Q7A4+EGj8hD9K1wNLGdVI43{9K%qRdBqP7HL?JP+QXwZl
zJv}oo9inaWDi%vdzsZkT92i+AtFUTo7qc=jFo42Yp$HT?w^+f>E>dM+U@!oAxfSf?
zuY3$V0+Xk*+6l4<TxSuv#3FK$MeGWT*aa4`$uC$<>XX6o2PGI87#Nrt7#KdYF)%Pp
zXGmcPW?0GSx00bqgMopeNE$?dt%5{MNKs;zTYgSXetBkIdVr@3QdAddGB7YWflOit
zyW$25M}rI405to;Ff1%m2U!EQ5KJI!6$K{;bX$vb7#JAbKzg)51W382z+^eLJRwj>
zfE@x>0`kM;iELtArVI=WAdeQWo4k=N(^r;J_5%Z)aAV|W^kn?NfJCY=GID-kfD;^W
L7D5cf0{adCEXmUt

delta 375
zcmX>nbe@lIIWI340|NsC_XN?jJ?s<tBp4$ms(XrXGNiDyFhudBu(mKn@un~aGib6+
z>}wHcNMUMak_2f0<65>Fh7^VrrpcO&q5RC*V6h^m6qZ_+6xPYTjDgH-er}u7m=qZK
zL>L$til;CzFf=gS5D=X_jd>O0m&uMSyE$T*7#M0<YuP6MW6|Ye2xdrO2xib^@|%2~
z)p9Z?n*$^JWG^;tw_6-J`RVZ~naL%$_|r1;5_94+OHzvxOEUBGirE<$7!)9&2;{U|
zthxDRsa{3u3=9lLAZy#f*52jjpS*z0PE<kXx`M$a1%rzUMpqP!F0#lrcy#1Xe$QsY
zq{%n=2Ya3>NZ(3^B54K&2C#X*IBatBQ%ZAE?TQQ;7#J8qMoybNgCo<FjgjR8p9G`q
T2L?D{!^!B$_<;dC2{sb|Ny1rv

diff --git a/python/ur_simple_control/basics/__pycache__/basics.cpython-312.pyc b/python/ur_simple_control/basics/__pycache__/basics.cpython-312.pyc
index 6d6ee6502c796e5009f143ec1dc9030248ebc7b0..4c97f924d4a9e9eaa656a4c4e56ccfcec555404b 100644
GIT binary patch
delta 185
zcmZn{yeq(anwOW0fq{WRxs*3Oaw9K03*&{!qAc^77#TM2Vew>SWSz{$rma}a%D}*&
z00Kpl3=9mnSab8sQoV{)85kH07#J9e6DH@g*>kf9TxSuv$RcuuMQri`HYY}n$;|8q
zjGB{8*iE_B85kIfG{D5<5_VNC9R>ylHxO5A@?!Q1O^``Nnjk(%0-{hF#06W&VUwGm
PQks)$S7bWbg~J&D<$@*7

delta 226
zcmcaB&@RY(nwOW0fq{YHX9Zh&=|*057RGCnMOo%^#4s^1)UwvHZQjP>$;ik)iA~$?
z7DrBgdVES|a>*_Jw9LH3ocPR=)S|?a%>2A!b_NCp1qdjTWME*p#hRO6mg-fc&cMK6
zz`(#zoIcry&0a`B=emNyMFoS)3Pu-MWE(s>@+VJYb7It*e3Q+9QF}5MyD7IO0|P^m
z7MPgq#jeVw$H2hg2IA^Wu4J#!1Q}SQ4dR0&APS{HT#&85IBatBQ%ZAE?TXANOK~^@
E0B^iEegFUf

diff --git a/python/ur_simple_control/basics/basics.py b/python/ur_simple_control/basics/basics.py
index 4f42409..5323bfb 100644
--- a/python/ur_simple_control/basics/basics.py
+++ b/python/ur_simple_control/basics/basics.py
@@ -7,10 +7,10 @@ import numpy as np
 import copy
 import argparse
 from functools import partial
-from ur_simple_control.managers import ControlLoopManager, RobotManager
+from ur_simple_control.managers import getMinimalArgParser, ControlLoopManager, RobotManager
 import time
 
-def moveJControlLoop(q_desired, robot, i, past_data):
+def moveJControlLoop(q_desired, robot : RobotManager, i, past_data):
     """
     moveJControlLoop
     ---------------
@@ -45,9 +45,9 @@ def moveJControlLoop(q_desired, robot, i, past_data):
 # fix this by tuning or whatever else.
 # MOVEL works just fine, so apply whatever's missing for there here
 # and that's it.
-def moveJ(args, robot, q_desired):
+def moveJP(args, robot, q_desired):
     """
-    moveJ
+    moveJP
     ---------------
     most basic P control for joint space point-to-point motion.
     just starts the control loop without any logging.
@@ -60,7 +60,7 @@ def moveJ(args, robot, q_desired):
     # TODO: remove, this isn't doing anything
     #time.sleep(0.01)
     if args.debug_prints:
-        print("MoveJ done: convergence achieved, reached destionation!")
+        print("MoveJP done: convergence achieved, reached destionation!")
 
 
 def jointTrajFollowingPIDControlLoop():
@@ -69,3 +69,133 @@ def jointTrajFollowingPIDControlLoop():
 
 def jointTrajFollowingPID():
     pass
+
+
+def moveJPIControlLoop(q_desired, robot : RobotManager, i, past_data):
+    """
+    PID control for joint space point-to-point motion with approximated joint velocities.
+    """
+
+    # ================================
+    # Initialization
+    # ================================
+    breakFlag = False
+    save_past_dict = {}
+    log_item = {}
+
+    # ================================
+    # Current Joint Positions
+    # ================================
+    q = robot.getQ()[:6]  # Get current joint positions (first 6 joints)
+
+    # ================================
+    # Retrieve Previous States
+    # ================================
+    q_prev = past_data['q_prev'][-1]    # Previous joint positions
+    e_prev = past_data['e_prev'][-1]    # Previous position error
+
+    qd_actual = robot.getQd()[:6]
+
+    # ================================
+    # Compute Position Error
+    # ================================
+    q_error = q_desired - q  # Position error
+
+
+    # ================================
+    # Check for Convergence
+    # ================================
+    if np.linalg.norm(q_error) < 1e-3 and np.linalg.norm(qd_actual) < 1e-3:
+        breakFlag = True  # Convergence achieved
+
+    # ================================
+    # Update Integral of Error
+    # ================================
+    integral_error = past_data['integral_error'][-1]
+    integral_error = np.array(integral_error, dtype=np.float64).flatten()
+    integral_error += q_error * robot.dt  # Accumulate error over time
+
+    # Anti-windup: Limit integral error to prevent excessive accumulation
+    max_integral = 10
+    integral_error = np.clip(integral_error, -max_integral, max_integral)
+
+    # ================================
+    # Save Current States for Next Iteration
+    # ================================
+    save_past_dict['integral_error'] = integral_error  # Save updated integral error
+    save_past_dict['q_prev'] = q                       # Save current joint positions
+    save_past_dict['e_prev'] = q_error                 # Save current position error
+
+    # ================================
+    # Control Gains
+    # ================================
+    Kp = 7.0  # Proportional gain
+    Ki = 0.0  # Integral gain
+
+    # ================================
+    # Compute Control Input (Joint Velocities)
+    # ================================
+    qd = Kp * q_error + Ki * integral_error 
+    #qd[5]=qd[5]*10
+
+    # ================================
+    # Send Joint Velocities to the Robot
+    # ================================
+    robot.sendQd(qd)
+
+    qd = robot.getQd()
+    log_item['qs'] = q
+    log_item['dqs'] = qd[:6]
+    log_item['integral_error'] = integral_error  # Save updated integral error
+    log_item['e_prev'] = q_error                 # Save current position error
+    return breakFlag, save_past_dict, log_item
+
+
+def moveJPI(args, robot, q_desired):
+    assert isinstance(q_desired, np.ndarray)
+    controlLoop = partial(moveJPIControlLoop, q_desired, robot)
+
+    # ================================
+    # Initialization
+    # ================================
+    # Get initial joint positions
+    initial_q = robot.getQ()[:6]
+
+    # Initialize past data for control loop
+    save_past_dict = {
+        'integral_error': np.zeros(robot.model.nq)[:6],
+        'q_prev':         initial_q,
+        'e_prev':         q_desired - initial_q,   # Initial position error (may need to be q_desired - initial_q)
+    }
+
+    # Initialize log item (if logging is needed)
+    log_item = {
+        'qs'            : np.zeros(6),
+        'dqs'           : np.zeros(6),
+        'integral_error': np.zeros(robot.model.nq)[:6],
+        'e_prev'        : q_desired - initial_q,   # Initial position error (may need to be q_desired - initial_q)
+        }  
+
+    # ================================
+    # Create and Run Control Loop Manager
+    # ================================
+    loop_manager = ControlLoopManager(robot, controlLoop, args, save_past_dict, log_item)
+    loop_manager.run()
+
+    # ================================
+    # Debug Printing
+    # ================================
+    if args.debug_prints:
+        print("MoveJPI done: convergence achieved, reached destination!")
+
+if __name__ == "__main__":
+    parser = getMinimalArgParser()
+    args = parser.parse_args()
+    robot = RobotManager(args)
+    robot._step()
+    print(robot.q)
+    q_goal = np.random.random(6) * 2*np.pi - np.pi
+    print(q_goal)
+    #moveJPI(args, robot, q_goal)
+    moveJP(args, robot, q_goal)
+    robot.killManipulatorVisualizer()
diff --git a/python/ur_simple_control/dmp/__pycache__/dmp.cpython-311.pyc b/python/ur_simple_control/dmp/__pycache__/dmp.cpython-311.pyc
index dfdea907d28b992845d18251ccc1b2c9062a2a40..ac6f7a73897befd20cabe6dae3478b5641c2b3b0 100644
GIT binary patch
delta 3820
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
R%qH)*7MpzDx(-~F0s!^AiE{t|

delta 2373
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
Y@dks?1sM7uGugpWY;u5O9Sg`J04VS95&!@I

diff --git a/python/ur_simple_control/managers.py b/python/ur_simple_control/managers.py
index e25f0cd..340d36e 100644
--- a/python/ur_simple_control/managers.py
+++ b/python/ur_simple_control/managers.py
@@ -426,6 +426,8 @@ class RobotManager:
             self.manipulator_visualizer_process = Process(target=manipulatorVisualizer, 
                                                      args=(self.args, self.model, self.collision_model, self.visual_model, self.manipulator_visualizer_queue, ))
             self.manipulator_visualizer_process.start()
+            # give it time to start
+            time.sleep(3)
             if args.debug_prints:
                 print("ROBOT_MANAGER: manipulator_visualizer_process started")
             self.manipulator_visualizer_queue.put(np.zeros(self.model.nq))
@@ -618,7 +620,7 @@ class RobotManager:
         # computeAllTerms is certainly not necessary btw
         # but if it runs on time, does it matter? it makes everything available...
         # (includes forward kinematics, all jacobians, all dynamics terms, energies)
-        # NOTE: it's too slow
+        # NOTE: it's too slow -> has to have pinocchio with multithreading
         #pin.computeAllTerms(self.model, self.data, self.q, self.v_q)
         pin.forwardKinematics(self.model, self.data, self.q, self.v_q)
         self.T_w_e = self.data.oMi[self.JOINT_ID].copy()
@@ -815,11 +817,12 @@ class RobotManager:
             # this one takes all 8 elements of qd since we're still in pinocchio
             # this is ugly, todo: fix
             if len(qd) == 6:
-                qd = qd.reshape((6,))
+                qd = qd_cmd.reshape((6,))
                 qd = list(qd)
                 qd.append(0.0)
                 qd.append(0.0)
                 qd = np.array(qd)
+                self.v_q = qd
             self.q = pin.integrate(self.model, self.q, qd * self.dt)
 
     def openGripper(self):
diff --git a/python/ur_simple_control/optimal_control/optimal_control.py b/python/ur_simple_control/optimal_control/optimal_control.py
index f5c7249..1f5cce5 100644
--- a/python/ur_simple_control/optimal_control/optimal_control.py
+++ b/python/ur_simple_control/optimal_control/optimal_control.py
@@ -3,5 +3,44 @@ import pinocchio as pin
 import crocoddyl
 from ur_simple_control.managers import ControlLoopManager, RobotManager
 
-def IKOCP(robot : RobotManager, goal : pin.SE3):
+def IKOCP(args, robot : RobotManager, goal : pin.SE3):
     state = crocoddyl.StateMultibody(robot.model)
+    # command input IS torque 
+    actuation = crocoddyl.ActuationModelFull(state)
+    # we will be summing 3 different costs
+    runningCostModel = crocoddyl.CostModelSum(state)
+    terminalCostModel = crocoddyl.CostModelSum(state)
+    # cost 1) distance to goal -> SE(3) error
+    framePlacementResidual = crocoddyl.ResidualModelFramePlacement(
+            state,
+            # TODO: check if this is the frame we actually want (ee tip)
+            # the id is an integer and that's what api wants
+            robot.model.getFrameId("tool0"),
+            goal.copy(),
+            state.nv)
+    # cost 2) u residual (actuator cost)
+    uResidual = crocoddyl.ResidualModelControl(state, nu)
+    # cost 3) x residual (overall amount of movement)
+    xResidual = crocoddyl.ResidualModelState(state, x0, nu)
+    # now we put in the costs to our functions
+    # these seem fine 
+    runningCostModel.addCost("gripperPose", goalTrackingCost, 1)
+    runningCostModel.addCost("xReg", xRegCost, 1e-1)
+    runningCostModel.addCost("uReg", uRegCost, 1e-1)
+    terminalCostModel.addCost("gripperPose", goalTrackingCost, 1e3)
+
+    # Next, we need to create an action model for running and terminal knots. The
+    # forward dynamics (computed using ABA) are implemented
+    # inside DifferentialActionModelFreeFwdDynamics.
+    runningModel = crocoddyl.IntegratedActionModelEuler(
+        crocoddyl.DifferentialActionModelFreeFwdDynamics(
+            state, actuation, runningCostModel
+        ),
+        args.ocp_dt,
+    )
+    terminalModel = crocoddyl.IntegratedActionModelEuler(
+        crocoddyl.DifferentialActionModelFreeFwdDynamics(
+            state, actuation, terminalCostModel
+        ),
+        0.0,
+    )
diff --git a/python/ur_simple_control/util/__pycache__/draw_path.cpython-311.pyc b/python/ur_simple_control/util/__pycache__/draw_path.cpython-311.pyc
index 7a563b7a7003b18cc44e56c7becc4c8bc9f83fec..f5b403529722a87c2eb8949e740b11dd19be8972 100644
GIT binary patch
delta 706
zcmX>s_eqv_IWI340|NsC*CX!qi4%Dx8Cxc*YbG!;xHF`%v@oQwE@NU~Sj_}d0m4xn
zDQqnaQJkq<DeT!`(IRmshE(ol3=9mbK?=Y)iie3Il{1xR86yM3YDTaS0|NsiLkd$c
z7;AED+{3}N_yQ9nBm3lw%#w`UlV3A0VU*cCfrW>Wk#F)`R$E5p$+uZ`jRhDO7&Mu0
zG36E9VofY6O02xaQjl1Zp~+Ol!@$6Bi?uAZsHC_U<PZggB0dHNh9dUK)@-tjijyPR
z^ce*vce3@GfxLH1FeS4%IX^EiHMt}{wJbHSq_~I^WCCYOQDS*~W=c+~CL`F)Vvu_k
ziufk`uxm4_Pp)9MWE9xEiM^Onl^dj<CnYthG(EncC^N65_!cXeE|LaWtN<b;Cwp;9
zi$L54u?FV0$(5YSjCzyja<(xFOjhC2*5wDOX9p2row^{FD2M?08R8dK5En#9Pp;vL
zVFOFBZobE5%E%}@S%hbHy%xwx9L1$c1v&X8#YG^c5N~nk7UaZ3{aXYw`W9z#YDs)a
zW=T%!EtcYp{Bp3PHCc;5zA7>WnZulxnO?*TVsR9w=A<T<<QEl#OjG~?u!C-KfI=%E
zu_U9&j)8%}VzM4@rxM6jw>aYCa}zW3;^Q@WZ?VV6r{pKc$KPVjE6pvaERvjjlUJTm
zYw}NC87GJnL7I#7z&53)mc%C(r58iof$INX95%W6DWy57c13RB^uxeVyn1pSpWEbX
Je3>jDdjV1frXm0U

delta 797
zcmew)dsvQlIWI340|Ntt%2CF&ixYVz87E9s*UU*_Okv64$mNXUWMp7saA!ziZDB}Z
zTgJq|u$l>^8ib>`QrKG<qPSCeQaG}~qDA6N45^&U7#J8<gA{;q6fYA)Dt9XHGDZf5
z)r?>v1_lO3h7_h?FxKSUxPgO-N0aduM|x^Wd}2|0@!}m!jM5wo3=Fqea}tY-^KY?$
zL^YXju@tA~q!sZ@zRbLYQFe0$3lAeB|KwIyTSk@1hgo$Q1t))Gl{DuCYb;AGDk&}o
zxk^Eyh@XLhp$KGPm4r)CVtGJfNrrD?USfJ`kzRgYacWL#a*5JpM>c&%!O4Yey^P$G
z|Fen9fkNdLXG&3Gd3<I{PO2tj5y<3XkQWq+_$QmNYcpz0PGGlW6x=+Ey_k`aXEGnB
zq?HWFDn$?>1#$;_abj6&Nkz#m=7OA(Tdc`B`NgT4Okk64v8I-#=9R$RI60A1nNfdo
zD`y*{;A9>yZCwG7DIixDfz8tcam7G{Acz3_i4DX85i*lgxMJAA5^S4~ahWnQicJ2)
zJ-c2T<Oq)9(xif%{F34#kkTTs$GCF~a^jQo^YT)YONu~7-{LGzEr~D5EXhf|#ZsJ+
zUtR?AiY99j56BKPkU7k0ndwD*AQlHC(DI9lSs54@6hHtR$hSB^;ROocB6|h~2FuA}
zyq!uQSKZ=>kIzla%!`lL<h#WlAD@z+93Ov+HLo<cpt4A6@<CpCM(xQDd1W$hX_Xem
z7iZ=c<fMX}S5lOpqnDhMnGGi53-UAbO5#iMA&epxkki0^0@+ri58{HIiyBP7IBatB
kQ%ZAE?TXyNX^(-Sc<*F;J~yEo4E7gL(d1UXOcs!f0e>CC{Qv*}

diff --git a/python/ur_simple_control/util/__pycache__/get_model.cpython-311.pyc b/python/ur_simple_control/util/__pycache__/get_model.cpython-311.pyc
index 625e9afb9c9bf6ff072333dee008f431cf9c1eb8..4e86aaacd804f06577e7d2305969dbbea1a0d4c8 100644
GIT binary patch
delta 21
dcmcbja7BS<IWI340|NuY+uOg=Hu87~002w#2K@j4

delta 21
dcmcbja7BS<IWI340|NuY<a_^8H}ZH0002o#2B`o5

diff --git a/python/ur_simple_control/util/__pycache__/logging_utils.cpython-311.pyc b/python/ur_simple_control/util/__pycache__/logging_utils.cpython-311.pyc
index 11e5dcc03d67ce58afde5d3306cdc033b3d7633e..d3487cec8901f7cebb860803e24fe99105eca82e 100644
GIT binary patch
literal 5911
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

literal 2599
zcmZ3^%ge>Uz`(HY-@nv04hDwDAPx*OK^dP77#J9)Go&!2Fy=5sL1@M(CNQ5liaCX;
zg&~S1g}H?xiZz9$g&~S9g)x{xll3J?yI(Rhh=O7k1_lNY|MN6Pkcl-6E)21vwahgP
zHO!JwB@7HH3^k0cOb9+m)`o$Bp+~F)u7-gjixI|I0COiy08FPaE@Nb1SPfTI#G1lX
z%aX!e%bF)u0vBaq$O5?sqJt%cbq(7xCI*Jpa1$9BQrK%*QaEZ^OE|%bz(fs83MZ<%
zTDB5yuoRfcVgpkQ3=B04H5ew=uq|MR$s^Ot7#J8<!vz=_P;6u++D0bwZA@VZX3*sF
zt76mBPf09EtdfGz`pG$&+3`iCdGQ7YhI$2=$=NxnRq|Nm;uDL~i(v{l^-FRKz~+Q#
zGT!1yt;j4ciO<ijl7)+7HCG9{G_ujRn97qhIc_oK7vEwjNG!>?#RfLK_!dWQVs>gu
zW>N7imi&U$yjyG#x87n&Da|do#hRRxU!1DRev2a~KRrGrGr8mze_Cc<VorQ!NorAI
zNoIcDEf$auZZT)4R^H+Tc{nXICp8{y2Omf#9>E720^$~fB2xhZeiiFy<maa9r{@<J
z<fkMSfq6y<Zcb@lihe;+Vnt@LenC-wR%&udv3_Y$d~s%OK~8FXa(-S(QGSkoL1jrs
zejXNy(vr*^{ha*t^vt~Uco3&pub}c4dvRh}s!x7;kr)F511kdqL-8#J28ITP2mIn6
z7#LYCz(fc04GDz>!gF{psF^LOzo2GzMZ&y;V}fueZwK#JE(Q*+mh$$xrn(6k7un^n
zu*-j7U}LqrAz{+NdqdKygRg_{DF;^%_XO`1Di=8PFLLN#;n2Upp?^cd9HhXugYPRF
zgMi2c-vuTY`8BTaYczP=W#MY^p1?6f<06al6&B?SEXp@nc-sA%{4TPHTwxKpz#;<C
z;<v!%BERMpeodGbmI)abS>&&<$X{TQN7r%ztno7_lVC4bZZI$~w6jfTAhl$vVXR@w
z29-_>MP49w6%zwP7h4Bg8e<A$3kPy}QG-^lxG<pR+gg?qc!|QmkOePEYFJRqqgqz5
z8->wJzZw=SC7(zQC}%SHB_kDF3?SzUGcYiGR$^dan94YvA)TRyA(p$Av4*jesfrC$
zkY<CepUBk16U?B=SOns&WYA>3#iVC&i!t*ScV0<Gd`W(Mc4}%tG04>l3Jpb~3=9mv
zxNLGVi%XL8a|`UM<dSnz6Z1j~f=cuBY;y9G6LX5~^bqnIpachU!jA@q3!>f-w4!iA
z;tcJH`6~o3iD^NEE{J*;i8C;OtY<As%u7$b#gtcYi@CToSChSnkAZ=qh@XLh;g)C~
zB0CnxSLT<-mnY_x6bXXlxRUbobK(<=iV`btu|w1q7s-O`N8~{Vum^5&Ask(#%D}*&
z08%xdfq~%%3Hjm!8v}><1xdY2?0Og2^=^o%UeL6=C}!8eeFNst3!>gzU3chTH1WD(
z;&nmP`=Y4#6;baFuCHti!lF~uW=LHWQn@0e(!qX1So#A4Bc~ad=y1Lvqp~1)j_(Ss
zD>9}X9utB)eLH*~a0@s1gM%m;6j7i=4#J>l2F1<iZQxoMB`q?fFrw8%Oepe<81l?G
zQYRBy>co|bnbFj-rZCm8#)I4kaw`Lv2XZl(SHn`nn#L5&pvmlai>W9nM3c1$)Y>Ql
zRh73`a`F>XZgCZ7=9cC_3SYj0%)I>M<c!Sx`24(_N=>#~Lg11*u_O^v@a84vrrts-
zh{1eb6g9Uv;pH^6oKGxCED`|4KB!WL6w{C-A_Q_kP-&i9evxBdVoqgoW^oayrDFtA
z904vt?}|uVkknoga#6(SiilBz?_B|r32_TTE(&N}5zuPzyvr}zQ$52LUVd>4_E=A-
zyvVJ1g<G+~<$;(~gG-D54Jo+>mn$sdH@Jl-gml<lV37pJu_ikt7+CX4a|<eqK<Tpx
z<U(*E4o<RQ#}r9{at0{hfF1pd!zMRBr8Fnit_b8zP;pQk#lXPuftit!@dg8L0~p?5
p5V`<EHyAh@!0-c$1f%E&1~_5H&nWVN0ZyoJFiL%3z$Czq1pvISZy5jp

diff --git a/python/ur_simple_control/visualize/__pycache__/visualize.cpython-311.pyc b/python/ur_simple_control/visualize/__pycache__/visualize.cpython-311.pyc
index e868ff923241d09bdd682a13b217ddf53f57601d..eecbbf0f43742bce3f6353efdf25edb8bec57e1b 100644
GIT binary patch
delta 6940
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

delta 964
zcmX@q$Jigpx15)ki-CcGVc7)Hw3!MM`6L*dCaM>Ua5AKDv@k>or*O6~M2Vy@1~X`K
zZQN1B#mo@QFnJ=Ev@pjqMh1q}j3BKb%*c?!xjCBKmywZc@=6|gR_+##67|XYW>S-%
z^DJfLn%u}EF?lI(JR{fSx#q^K{GCE6Jd-!_DN6FD@U7ur#>Bv|nh9hK2s1Kt3Z)2u
zWLd$olau*OC52Liv8odRsguGgn<CmNR5tkopNynfia1uy5+Kd2k||Pa_$N2=Z)9dj
zVVG<xpvWX$HTi&mGSeEF$+ZHrnPu0=O_mnyWt5-1QqZ1LF&pgAA_-6^Fe**v75dD`
zHJMR(F-Z63<-);?lX-*$Cv%IMaxerlXsY;CsZ8D|COr9_s0L%zWO1=r#;VDsVwRKF
zi}f<vZ?+W|W#p~mDlI5TEmFuyO)Jsd94~Q|kuhkpsZ^~@6axc8kp%+-!!53)#N_Ps
zqWsdllp-^bsMF+gQpU1*3=9k|3=9m#d~6I1KYlbY++gRv!Y=WFfr-`j>1G9K9X6(E
zOq=}_yBQhXCf`!hWHg+lB0X7NS$6UPEwRY~N&*}y48aUF><f4&KNJ?7Y-Pr;#>mjq
zq0CSs1BwX<R$(ZTWn`#f$O5MmkXVt>WIh!+jYtNNZU|Y<P{AC@P|m2y<#&rEBQY-}
z{m;semwb}~>_aps-%`=xt>R42FHtBiDN-mb@|`TKTEoacd4j5|fj`JMAs`|YL@0p>
zKaiK%$}&^SQ;UjHK^*p!%;JKa#LA+S$%<-*jA@gD)$F+%7#J9qf_y)9@*K6j?7Xag
zj31adC&#OYI$Re~xg?@;QAF*Eh}s1awHqRm6I^fb@b`OndCy?%^y~5K@cSUl$tnHg
zs|W*+EGWGE7?H`zf*R5;7kGRj=mRq&CrBQNWM*RZWBl>sN3kRW1H&N+M?)7yh9lf!
zAW~7mm4o>xJEJQHv!>`|XV>lAplB)rxwgoDGQXPycQ*qA11RSdzh;<h<hH{~g@uvj
Z1792?qwog?B+`jlkr8AqcCrX$GXS3C?pOc-

diff --git a/python/ur_simple_control/visualize/__pycache__/visualize.cpython-312.pyc b/python/ur_simple_control/visualize/__pycache__/visualize.cpython-312.pyc
index 74ae94bdf5b0861593f0609b21e017bba3c7be97..240ee89c04d2fca703a08f0ec3f80304f4b696c7 100644
GIT binary patch
delta 21
ccmdnez__J>k?S-sFBby?1B2DPja*s|07GvDVE_OC

delta 21
ccmdnez__J>k?S-sFBby?1H<XL8@aR`07lRS@c;k-

-- 
GitLab