From 8ff61d1233797883784572eaa8a8897691ec380b Mon Sep 17 00:00:00 2001 From: Your Name <marko.guberina@control.lth.se> Date: Thu, 12 Dec 2024 01:05:51 +0100 Subject: [PATCH] tried to put 2arm references and it was almost ok --- python/examples/cart_pulling.py | 34 ++++++++++-------- .../__pycache__/__init__.cpython-310.pyc | Bin 379 -> 379 bytes .../__pycache__/managers.cpython-310.pyc | Bin 35897 -> 35908 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 192 -> 192 bytes .../basics/__pycache__/basics.cpython-310.pyc | Bin 7100 -> 7100 bytes .../clik/__pycache__/__init__.cpython-310.pyc | Bin 188 -> 188 bytes .../dmp/__pycache__/__init__.cpython-310.pyc | Bin 186 -> 186 bytes .../dmp/__pycache__/dmp.cpython-310.pyc | Bin 9311 -> 9311 bytes .../optimal_control/crocoddyl_mpc.py | 12 ++++--- .../__pycache__/__init__.cpython-310.pyc | Bin 181 -> 181 bytes .../util/__pycache__/__init__.cpython-310.pyc | Bin 167 -> 167 bytes .../__pycache__/get_model.cpython-310.pyc | Bin 7638 -> 7638 bytes .../__pycache__/logging_utils.cpython-310.pyc | Bin 4363 -> 4363 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 172 -> 172 bytes .../__pycache__/visualize.cpython-310.pyc | Bin 8744 -> 8744 bytes 15 files changed, 28 insertions(+), 18 deletions(-) diff --git a/python/examples/cart_pulling.py b/python/examples/cart_pulling.py index 5687c6f..0480c90 100644 --- a/python/examples/cart_pulling.py +++ b/python/examples/cart_pulling.py @@ -87,8 +87,8 @@ def areDualGrippersRelativeToBaseOK(args, goal_transform, robot): #grasp_pose = T_w_base.act(rotate.act(translate)) grasp_pose = T_w_base.act(translate.act(rotate)) - grasp_pose_left = grasp_pose.act(goal_transform) - grasp_pose_right = grasp_pose.act(goal_transform.inverse()) + grasp_pose_left = goal_transform.act(grasp_pose) + grasp_pose_right = goal_transform.inverse().act(grasp_pose) T_w_e_left, T_w_e_right = robot.getT_w_e() SEerror_left = T_w_e_left.actInv(grasp_pose_left) @@ -100,9 +100,9 @@ def areDualGrippersRelativeToBaseOK(args, goal_transform, robot): #if np.linalg.norm(err_vector) < robot.args.goal_error: if (np.linalg.norm(err_vector_left) < 2*1e-1) and (np.linalg.norm(err_vector_right) < 2*1e-1): isOK = True - return isOK, grasp_pose + return isOK, grasp_pose, grasp_pose_left, grasp_pose_right -def cartPullingControlLoop(args, robot : RobotManager, goal, solver_grasp, solver_pulling, +def cartPullingControlLoop(args, robot : RobotManager, goal, goal_transform, solver_grasp, solver_pulling, path_planner : ProcessManager, i : int, past_data): """ cartPulling @@ -128,8 +128,7 @@ def cartPullingControlLoop(args, robot : RobotManager, goal, solver_grasp, solve if robot.robot_name != "yumi": graspOK, grasp_pose = isGripperRelativeToBaseOK(args, robot) else: - goal_transform = pin.SE3.Identity() - graspOK, grasp_pose = areDualGrippersRelativeToBaseOK(args, goal_transform, robot) + graspOK, grasp_pose, grasp_pose_left, grasp_pose_right = areDualGrippersRelativeToBaseOK(args, goal_transform, robot) # NOTE: this keeps getting reset after initial grasp has been completed. # and we want to let mpc cook priority_register[1] = str(int(not graspOK)) # set if not ok @@ -161,14 +160,13 @@ def cartPullingControlLoop(args, robot : RobotManager, goal, solver_grasp, solve if robot.robot_name != "yumi": runningModel.differential.costs.costs['gripperPose'].cost.residual.reference = grasp_pose else: - # MASSIVE TODO: CREATE A DIFFERENT REFERENCE FOR EACH ARM - runningModel.differential.costs.costs['gripperPose_l'].cost.residual.reference = grasp_pose - runningModel.differential.costs.costs['gripperPose_r'].cost.residual.reference = grasp_pose + runningModel.differential.costs.costs['gripperPose_l'].cost.residual.reference = grasp_pose_left + runningModel.differential.costs.costs['gripperPose_r'].cost.residual.reference = grasp_pose_right if robot.robot_name != "yumi": solver_grasp.problem.terminalModel.differential.costs.costs['gripperPose'].cost.residual.reference = grasp_pose else: - solver_grasp.problem.terminalModel.differential.costs.costs['gripperPose_l'].cost.residual.reference = grasp_pose - solver_grasp.problem.terminalModel.differential.costs.costs['gripperPose_r'].cost.residual.reference = grasp_pose + solver_grasp.problem.terminalModel.differential.costs.costs['gripperPose_l'].cost.residual.reference = grasp_pose_left + solver_grasp.problem.terminalModel.differential.costs.costs['gripperPose_r'].cost.residual.reference = grasp_pose_right robot.Mgoal = grasp_pose #breakFlag, save_past_item, log_item = CrocoIKMPCControlLoop(args, robot, solver_grasp, i, past_data) @@ -181,7 +179,6 @@ def cartPullingControlLoop(args, robot : RobotManager, goal, solver_grasp, solve controlLoopClikArmOnly(robot, clikController, i, past_data) else: # TODO: DEFINE SENSIBLE TRANSFOR - goal_transform = pin.SE3.Identity() controlLoopClikDualArmsOnly(robot, clikController, goal_transform, i, past_data) # case 2) @@ -205,6 +202,8 @@ def cartPullingControlLoop(args, robot : RobotManager, goal, solver_grasp, solve # MASSIVE TODO: have two different REFERENCES FOR TWO ARMS # MASSIVE TODO: have two different REFERENCES FOR TWO ARMS # MASSIVE TODO: have two different REFERENCES FOR TWO ARMS +# ----------------> should be doable by just hitting the path with the goal_transform for dual. +# in the whole task there are no differences in left and right arm straigh_line_path = np.linspace(p_ee_l, p_cart, args.past_window_size) # time it the same way the base path is timed time_past = np.linspace(0.0, args.past_window_size * robot.dt, args.past_window_size) @@ -218,7 +217,7 @@ def cartPullingControlLoop(args, robot : RobotManager, goal, solver_grasp, solve if priority_int < 2: # TODO make this one work - breakFlag, save_past_item, log_item = BaseAndEEPathFollowingMPCControlLoop(args, robot, solver_pulling, path_planner, grasp_pose, i, past_data) + breakFlag, save_past_item, log_item = BaseAndEEPathFollowingMPCControlLoop(args, robot, solver_pulling, path_planner, grasp_pose, goal_transform, i, past_data) #BaseAndEEPathFollowingMPCControlLoop(args, robot, solver_pulling, path_planner, i, past_data) p = q[:2] @@ -234,6 +233,13 @@ def cartPullingControlLoop(args, robot : RobotManager, goal, solver_grasp, solve def cartPulling(args, robot : RobotManager, goal, path_planner): + # transfer single arm to dual arm reference + # (instead of gripping the middle grip slightly away from middle) + goal_transform = pin.SE3.Identity() +# TODO: it's cursed and it shouldn't be +# goal_transform.rotation = pin.rpy.rpyToMatrix(0.0, np.pi/2, 0.0) +# TODO: it's cursed and it shouldn't be +# goal_transform.translation[1] = -0.1 ############################ # setup cart-pulling mpc # ############################ @@ -261,7 +267,7 @@ def cartPulling(args, robot : RobotManager, goal, path_planner): us_init = solver_grasp.problem.quasiStatic([x0] * solver_grasp.problem.T) solver_grasp.solve(xs_init, us_init, args.max_solver_iter) - controlLoop = partial(cartPullingControlLoop, args, robot, goal, solver_grasp, solver_pulling, path_planner) + controlLoop = partial(cartPullingControlLoop, args, robot, goal, goal_transform, solver_grasp, solver_pulling, path_planner) log_item = {} q = robot.getQ() diff --git a/python/ur_simple_control/__pycache__/__init__.cpython-310.pyc b/python/ur_simple_control/__pycache__/__init__.cpython-310.pyc index 66a7ae1d673b877c2f76b218972970879116ddcc..b346ab48b3eb5b0bdef663970c9cca16de1e2b0f 100644 GIT binary patch delta 19 acmey(^qYw*pO=@5fq{Wx{icmvg^U0<R|O^j delta 19 acmey(^qYw*pO=@5fq{YH^6ZUVg^U0<yah7= diff --git a/python/ur_simple_control/__pycache__/managers.cpython-310.pyc b/python/ur_simple_control/__pycache__/managers.cpython-310.pyc index 7c773d8c3aa8cc3f72351d40e311f1dd9e64718c..8344427e05627676833671090b0d83c03dc1c605 100644 GIT binary patch delta 790 zcmdlvgXzc&Cf<BrUM>a(28Q*UBGYR&^0tRD#%-P&c8-xzcd}c!!sM0+GrJW26oFPI zNrqb18pafX6ecj6t%hNNWDUzgMn;Ajh6OS;tWcJ04I7A+!W7H^!kU7c-$g8EWPb^= zL{o0^^r(H4qob=B<0fB=j%MRx<YQ#{y4f@)gpqN_<gQpRw%-g43`Kt?--`8NKg7(y zQ1qW+vu>OxJ0t7l@>ESm*2xP~?HMm@ewZ4;%*Zp@D)Td=)MUM^+l-2nxw4(vL>L(u zibN*|XWO!=voJ6eiEo~ky_S(ta`M7fVQ$XSf|SIP)UeDd-N{M0T|%EgHsv!gFlaIr z1%cR~CjZOTVzi#Dndi+YJ-IZ`Sm+B#7+J}e$^UZICO^nyVY3IBFFW~Fo)e?=WZis| z$t&_yC%5HGa65w~7#SF<R3^XAlb?JdKi~2n$Q(wH;{-v35Qq>45n>=hf{}sY7E4NI za!HXCh%W;o<UoY{<bnb(#<0!13*<Q%RVUxB@L}YgtWg=ss4=;z(w;G8@}bHC79~ao zhRFxAB{%z5O=48g1R2I!Se#jvdW)-|v?M++zdSLsWF^#(N|PCD#2IHzmaK7MwA~z6 z<Il!s2eQc#6hxDcHHk1T-+a4i36qjONYoHS7=cV=PfRW>%`8g2#a@(}lbTqZS_IOe z$9QV;h1LVU8X$GrAa$&%xdkPax46<%VKx_;gCs$Q6gh)fCSYYb`H3mTMaCcj0}$Z? zB78u><U4tPhd9?Q_Vm;em&B69+nfKjRWq7_ZO{WLVgTu9E6vNv%*!rv1L?>E5ujKq z(gG<k0}-HLC~}y*zC(xc>Et^dIid<6(Ik*cClJdOM0ie)?Nns+*j(TFm66e8a%uNr GMppok{^Cdg delta 710 zcmX>ygK6gsCf<BrUM>a(1_q_Yk?CF=dE3JnLpDzhJIBbVG1)C#VRB1^nMsLQiA*b# zBttE04P%K!i7c4SR>QDBu7-6XBO^l%!vgslHV`X?DVPC-H3c^Rh*-|Zq^U4@S=2sO z#>!ia<&%@6s~KY^-;a)F;bUa^w%H*jgpqOk<f*Y<oPQV?7>fQfFfdH^ja8h?8K=R1 zkePv@h=FmlMVu!)BirPrR82;<$!k*W8P9KilN!Oy$UWIL^E0F5WXr7Ej0%%Qvz^&Q z85tOg#3sjO+p?*#FfbHJY+jhXmXT3vvVX2Dqt4{q+%BPyAZzj&7#K8}ih@AwkCO%C zgeS}7i8ESFHp%m5l$qR+XFNG4Uv;ufo-l7tYFddM$S65R28PKFd5V)I^W_+2CR^m2 z2z>)-M>gsk*r<v55^PRjEtA*hPqz9GQpE&vm=K5%1`#44LL5X$GBPmSVoAwNE-8`* z@nu1TJcv+WoSfGwK6!G15o74)V+HaYjB1mgRroOSO*XEKWYnD8TWQajJo#*80i*I} zyQ+1Jj9Qc5R?A5$gY;U0>;w~5AXX9s1H;V8Dm5;QcAGP6{Mp#-L5iFv?`u+LT(<dH z(-I~n1CWRjh%g4Zh&?g6ur#wM^%i?kYEEimacYs%<Tb5&j3+1GZau)J2~wvsd10Hl zngxgn(o*CCVwr+8v*zR{rW6;MfCLOdgzMycZCZ@CHgmRDGjfA9>w|<DC--+q3uuFw z<{&}~L^w{~)uF@qWb*Tl98pD(0Lbx0&LEZ>i13=6(W%JjzPYROD<h-n<c99Uj4l9- CiNO{C diff --git a/python/ur_simple_control/basics/__pycache__/__init__.cpython-310.pyc b/python/ur_simple_control/basics/__pycache__/__init__.cpython-310.pyc index 043b8caa77c5bae3e06d5fdbbc08ff8f4f781c35..bc4e2818b028c9a713a54e1a7e4d188e056df7b9 100644 GIT binary patch delta 18 ZcmX@Wcz}^BpO=@5fq{Wx{icar+W;yc1kwNi delta 18 ZcmX@Wcz}^BpO=@5fq{YH((H*`+W;za1l|Au diff --git a/python/ur_simple_control/basics/__pycache__/basics.cpython-310.pyc b/python/ur_simple_control/basics/__pycache__/basics.cpython-310.pyc index 0249803d684c8194126402b59550e820d3f02aae..bd525f88ef2485c470b94afc01afe489688494ed 100644 GIT binary patch delta 19 acmdmEzQ>#^pO=@5fq{Wx{icmvo1_6YAq8y! delta 19 acmdmEzQ>#^pO=@5fq{YH^6ZUVo1_6Yh6Q>6 diff --git a/python/ur_simple_control/clik/__pycache__/__init__.cpython-310.pyc b/python/ur_simple_control/clik/__pycache__/__init__.cpython-310.pyc index db758e965347cd0bbe68439b146cea4c58aec265..46908832b061d8500ffd3ddedf0c04ef12d83254 100644 GIT binary patch delta 18 ZcmdnPxQCG|pO=@5fq{Wx{icarn*b@41jYaW delta 18 ZcmdnPxQCG|pO=@5fq{YH^6ZIRn*b^71k(Tj diff --git a/python/ur_simple_control/dmp/__pycache__/__init__.cpython-310.pyc b/python/ur_simple_control/dmp/__pycache__/__init__.cpython-310.pyc index 3ee65b4a22bb546dcb73a46d96079bc3ae5fa78e..e2215d22c3eadbb5fecdbc20c727397dd704569b 100644 GIT binary patch delta 18 ZcmdnRxQmf1pO=@5fq{Wx{icar8vrRz1i%0Q delta 18 ZcmdnRxQmf1pO=@5fq{YH((H*`8vrSx1k3;c diff --git a/python/ur_simple_control/dmp/__pycache__/dmp.cpython-310.pyc b/python/ur_simple_control/dmp/__pycache__/dmp.cpython-310.pyc index 4956a36b4841594d3d70f849609a714bfd194868..e35fbc28222a465baaca0356405c91375c026a23 100644 GIT binary patch delta 19 acmccbao>Y0pO=@5fq{Wx{icmvp(+48o&|vb delta 19 acmccbao>Y0pO=@5fq{YH^6ZUVp(+490|kx% diff --git a/python/ur_simple_control/optimal_control/crocoddyl_mpc.py b/python/ur_simple_control/optimal_control/crocoddyl_mpc.py index ace01fb..f056d26 100644 --- a/python/ur_simple_control/optimal_control/crocoddyl_mpc.py +++ b/python/ur_simple_control/optimal_control/crocoddyl_mpc.py @@ -216,7 +216,7 @@ def CrocoEndEffectorPathFollowingMPC(args, robot, x0, path_planner): def BaseAndEEPathFollowingMPCControlLoop(args, robot : RobotManager, solver : crocoddyl.SolverBoxFDDP, path_planner : ProcessManager, - grasp_pose, iter_n, past_data): + grasp_pose, goal_transform, iter_n, past_data): """ CrocoPathFollowingMPCControlLoop ----------------------------- @@ -314,6 +314,11 @@ def BaseAndEEPathFollowingMPCControlLoop(args, robot : RobotManager, solver : cr np.interp(s, time_past, path2D_handlebar_1_untimed[:,1]).reshape((-1,1)))) pathSE3_handlebar = path2D_to_SE3(path2D_handlebar_1, args.handlebar_height) + pathSE3_handlebar_left = [] + pathSE3_handlebar_right = [] + for pathSE3 in pathSE3_handlebar: + pathSE3_handlebar_left.append(goal_transform.act(pathSE3)) + pathSE3_handlebar_right.append(goal_transform.inverse().act(pathSE3)) if args.visualize_manipulator: if iter_n % 20 == 0: @@ -333,10 +338,9 @@ def BaseAndEEPathFollowingMPCControlLoop(args, robot : RobotManager, solver : cr runningModel.differential.costs.costs['base_translation' + str(i)].cost.residual.reference = path_base[i] if robot.robot_name != "yumi": runningModel.differential.costs.costs['ee_pose' + str(i)].cost.residual.reference = pathSE3_handlebar[i] - # MASSIVE TODO: actually have different references for left and right arm else: - runningModel.differential.costs.costs['l_ee_pose' + str(i)].cost.residual.reference = pathSE3_handlebar[i] - runningModel.differential.costs.costs['r_ee_pose' + str(i)].cost.residual.reference = pathSE3_handlebar[i] + runningModel.differential.costs.costs['l_ee_pose' + str(i)].cost.residual.reference = pathSE3_handlebar_left[i] + runningModel.differential.costs.costs['r_ee_pose' + str(i)].cost.residual.reference = pathSE3_handlebar_right[i] # idk if that's necessary solver.problem.terminalModel.differential.costs.costs['base_translation'+str(args.n_knots)].cost.residual.reference = path_base[-1] diff --git a/python/ur_simple_control/robot_descriptions/__pycache__/__init__.cpython-310.pyc b/python/ur_simple_control/robot_descriptions/__pycache__/__init__.cpython-310.pyc index 0806428f665ab55390f7bc917ea3c79c554b8034..04a1ccef3f6b4dfc6021b9488af0d53b8e27cf34 100644 GIT binary patch delta 18 ZcmdnWxRsGBpO=@5fq{Wx{icars{tsV1hD`B delta 18 ZcmdnWxRsGBpO=@5fq{YH((H*`s{ttT1ib(N diff --git a/python/ur_simple_control/util/__pycache__/__init__.cpython-310.pyc b/python/ur_simple_control/util/__pycache__/__init__.cpython-310.pyc index ffdca2fdd15c7955b24c823c089a647bc847f159..addfb91192daa6a5085310358c6bcd33c1802a29 100644 GIT binary patch delta 18 ZcmZ3^xSWwIpO=@5fq{Wx{icara{(r`1cv|s delta 18 ZcmZ3^xSWwIpO=@5fq{YH((H*`a{(s^1d{*& diff --git a/python/ur_simple_control/util/__pycache__/get_model.cpython-310.pyc b/python/ur_simple_control/util/__pycache__/get_model.cpython-310.pyc index dd179f150c733a47bda1f946bd294d5c5f4bb05b..48c5c7d75670106ce36c3db1cfd7fcc17c5eed69 100644 GIT binary patch delta 19 acmca+ea)IHpO=@5fq{Wx{icmvXJi37hXus| delta 19 acmca+ea)IHpO=@5fq{YH^6ZUVXJi37>;=*Q diff --git a/python/ur_simple_control/util/__pycache__/logging_utils.cpython-310.pyc b/python/ur_simple_control/util/__pycache__/logging_utils.cpython-310.pyc index e97154fba239571a8fc08725ead074ba7acaab1c..4771e5aa53a3f3ac42dd177e6b27f00d8ec1cb6f 100644 GIT binary patch delta 19 acmeBH>Q>^)=jG*MU|?WaziA^EqaXk)2LvVn delta 19 acmeBH>Q>^)=jG*MU|?XlJbNP-qaXk)Yy>j^ diff --git a/python/ur_simple_control/visualize/__pycache__/__init__.cpython-310.pyc b/python/ur_simple_control/visualize/__pycache__/__init__.cpython-310.pyc index ad7422e9ee45004d7b00debb9d962d34e75cf926..12f837a1d098d83ea0eba85ab02537512288f3d1 100644 GIT binary patch delta 18 ZcmZ3(xQ3A{pO=@5fq{Wx{icarivTBN1eO2* delta 18 ZcmZ3(xQ3A{pO=@5fq{YH((H*`ivTCL1fl={ diff --git a/python/ur_simple_control/visualize/__pycache__/visualize.cpython-310.pyc b/python/ur_simple_control/visualize/__pycache__/visualize.cpython-310.pyc index 31da6f3686755ce93ed26ca5e2cff7bcc988cfa7..d71d90faa69cc38279f576660076700113dcd9ef 100644 GIT binary patch delta 19 acmZ4CvciQcpO=@5fq{Wx{icmva!LR*>IBjN delta 19 acmZ4CvciQcpO=@5fq{YH^6ZUVa!LR+PXylp -- GitLab