From 4c2438d394907229b84590eec37fde2aad163740 Mon Sep 17 00:00:00 2001
From: marko <marko.guberina@control.lth.se>
Date: Fri, 6 Dec 2024 17:37:50 +0000
Subject: [PATCH] ros2 mir is connected, now we need to align models frames etc
 for it to make sense

---
 COLCON_IGNORE                                 |   0
 python/examples/crocoddyl_mpc.py              |   2 +-
 python/examples/ros2_clik.py                  |  38 +++++
 python/examples/smc_node.py                   | 102 +++++++++++++
 python/ur_simple_control.egg-info/PKG-INFO    |   7 +-
 python/ur_simple_control.egg-info/SOURCES.txt |   5 -
 .../__pycache__/__init__.cpython-310.pyc      | Bin 367 -> 391 bytes
 .../__pycache__/managers.cpython-310.pyc      | Bin 8220 -> 34124 bytes
 .../__pycache__/__init__.cpython-310.pyc      | Bin 196 -> 204 bytes
 .../basics/__pycache__/basics.cpython-310.pyc | Bin 1156 -> 7112 bytes
 .../clik/__pycache__/__init__.cpython-310.pyc | Bin 194 -> 200 bytes
 python/ur_simple_control/clik/clik.py         |  11 +-
 .../dmp/__pycache__/__init__.cpython-310.pyc  | Bin 193 -> 198 bytes
 .../dmp/__pycache__/dmp.cpython-310.pyc       | Bin 6914 -> 9323 bytes
 python/ur_simple_control/managers.py          | 139 ++++++++++--------
 .../optimal_control/__init__.py               |   4 +-
 .../path_generation/planner.py                |   6 +-
 .../star_navigation/robot/mobile_robot.py     |  10 +-
 .../star_navigation.egg-info/PKG-INFO         |   9 +-
 .../star_navigation.egg-info/SOURCES.txt      |   2 -
 .../starworld_tunnel_mpc.egg-info/PKG-INFO    |  10 ++
 .../starworld_tunnel_mpc.egg-info/SOURCES.txt |  30 ++++
 .../dependency_links.txt                      |   1 +
 .../requires.txt                              |   7 +
 .../top_level.txt                             |   4 +
 .../starworlds/starworlds.egg-info/PKG-INFO   |  12 +-
 .../starworlds.egg-info/SOURCES.txt           |   1 -
 .../starworlds.egg-info/requires.txt          |   4 +-
 .../__pycache__/__init__.cpython-310.pyc      | Bin 208 -> 193 bytes
 .../urdf/__pycache__/__init__.cpython-310.pyc | Bin 213 -> 198 bytes
 .../util/__pycache__/__init__.cpython-310.pyc | Bin 194 -> 179 bytes
 .../__pycache__/get_model.cpython-310.pyc     | Bin 1977 -> 5915 bytes
 .../__pycache__/logging_utils.cpython-310.pyc | Bin 1369 -> 4375 bytes
 .../__pycache__/__init__.cpython-310.pyc      | Bin 199 -> 184 bytes
 .../__pycache__/visualize.cpython-310.pyc     | Bin 829 -> 8702 bytes
 35 files changed, 315 insertions(+), 89 deletions(-)
 create mode 100644 COLCON_IGNORE
 create mode 100644 python/examples/ros2_clik.py
 create mode 100644 python/examples/smc_node.py
 create mode 100644 python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/PKG-INFO
 create mode 100644 python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/SOURCES.txt
 create mode 100644 python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/dependency_links.txt
 create mode 100644 python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/requires.txt
 create mode 100644 python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/top_level.txt

diff --git a/COLCON_IGNORE b/COLCON_IGNORE
new file mode 100644
index 0000000..e69de29
diff --git a/python/examples/crocoddyl_mpc.py b/python/examples/crocoddyl_mpc.py
index 3d78e8d..d29008e 100644
--- a/python/examples/crocoddyl_mpc.py
+++ b/python/examples/crocoddyl_mpc.py
@@ -64,7 +64,7 @@ if __name__ == "__main__":
     # and because it is sampled at a much lower frequency
     #followKinematicJointTrajP(args, robot, reference)
 
-    CrocoIKMPC(args, robot, x0, Mgoal)
+    CrocoIKMPC(args, robot, Mgoal)
 
     print("final position:")
     print(robot.getT_w_e())
diff --git a/python/examples/ros2_clik.py b/python/examples/ros2_clik.py
new file mode 100644
index 0000000..be65bc0
--- /dev/null
+++ b/python/examples/ros2_clik.py
@@ -0,0 +1,38 @@
+# PYTHON_ARGCOMPLETE_OK
+import numpy as np
+import time
+import pinocchio as pin
+import argcomplete, argparse
+from functools import partial
+from ur_simple_control.managers import getMinimalArgParser, ControlLoopManager, RobotManager
+from ur_simple_control.clik.clik import getClikArgs, getClikController, controlLoopClik, moveL, compliantMoveL
+
+
+def get_args():
+    parser = getMinimalArgParser()
+    parser.description = 'Run closed loop inverse kinematics \
+    of various kinds. Make sure you know what the goal is before you run!'
+    parser = getClikArgs(parser)
+    argcomplete.autocomplete(parser)
+    args = parser.parse_args()
+    return args
+
+if __name__ == "__main__": 
+    args = get_args()
+    robot = RobotManager(args)
+    print(robot.getT_w_e())
+    Mgoal = robot.defineGoalPointCLI()
+    compliantMoveL(args, robot, Mgoal)
+    #moveL(args, robot, Mgoal)
+    robot.closeGripper()
+    robot.openGripper()
+    if not args.pinocchio_only:
+        robot.stopRobot()
+
+    if args.visualize_manipulator:
+        robot.killManipulatorVisualizer()
+    
+    if args.save_log:
+        robot.log_manager.saveLog()
+    #loop_manager.stopHandler(None, None)
+
diff --git a/python/examples/smc_node.py b/python/examples/smc_node.py
new file mode 100644
index 0000000..7fc29a8
--- /dev/null
+++ b/python/examples/smc_node.py
@@ -0,0 +1,102 @@
+# PYTHON_ARGCOMPLETE_OK
+import rclpy
+from rclpy.node import Node
+from geometry_msgs import msg 
+from rclpy import wait_for_message
+import pinocchio as pin
+import argcomplete, argparse
+from functools import partial
+from ur_simple_control.managers import getMinimalArgParser, ControlLoopManager, RobotManager
+from ur_simple_control.clik.clik import getClikArgs, getClikController, controlLoopClik, moveL, compliantMoveL, controlLoopCompliantClik, invKinmQP
+import threading
+
+
+def get_args():
+    parser = getMinimalArgParser()
+    parser.description = 'Run closed loop inverse kinematics \
+    of various kinds. Make sure you know what the goal is before you run!'
+    parser = getClikArgs(parser)
+    argcomplete.autocomplete(parser)
+    args = parser.parse_args()
+    return args
+
+class ROSCommHandler(Node):
+
+    def __init__(self, args, robot_manager : RobotManager, loop_manager : ControlLoopManager):
+        super().__init__('ROSCommHandler')
+        
+        self.publisher_vel_base = self.create_publisher(msg.Twist, '/cmd_vel', 5)
+        print("created publisher")
+        robot_manager.set_publisher_vel_base(self.publisher_vel_base)
+        
+        qos_prof = rclpy.qos.QoSProfile(
+            reliability=rclpy.qos.QoSReliabilityPolicy.RELIABLE,
+            durability = rclpy.qos.DurabilityPolicy.TRANSIENT_LOCAL,
+            history = rclpy.qos.HistoryPolicy.KEEP_LAST,
+            depth = 1,
+        )
+        self.subscription = self.create_subscription(msg.PoseWithCovarianceStamped, 
+                                            '/amcl_pose', self.pose_callback, qos_prof)
+        #wait_for_message.wait_for_message(msg.PoseWithCovarianceStamped, self, '/amcl_pose')
+        #print("subscribed to /amcl_pose")
+        self.subscription  # prevent unused variable warning
+        self.robot_manager = robot_manager
+        self.loop_manager = loop_manager
+        self.args = args
+
+    def pose_callback(self, mesg):
+        self.robot_manager.q[0] = mesg.pose.pose.position.x
+        self.robot_manager.q[1] = mesg.pose.pose.position.y
+        # TODO: check that z can be used as cos(theta) and w as sin(theta)
+        # (they could be defined some other way or theta could be offset of something)
+        self.robot_manager.q[2] = mesg.pose.pose.orientation.z
+        self.robot_manager.q[3] = mesg.pose.pose.orientation.w
+        
+        #vel_cmd = msg.Twist()
+        print("received new amcl")
+        #self.publisher_vel_base.publish(vel_cmd)
+
+
+
+
+if __name__ == '__main__':
+    rclpy.init()
+    args = get_args()
+    robot = RobotManager(args)
+    goal = robot.defineGoalPointCLI()
+    #goal = pin.SE3.Identity()
+    loop_manager = compliantMoveL(args, robot, goal, run=False)
+    ros_comm_handler = ROSCommHandler(args, robot, loop_manager)
+    
+    thread = threading.Thread(target=rclpy.spin, args=(ros_comm_handler,), daemon=True)
+    thread.start()
+
+    rate = ros_comm_handler.create_rate(250)
+    while rclpy.ok():
+        #msgg = msg.Twist()
+        #print("publisihng")
+        #ros_comm_handler.publisher_vel_base.publish(msgg)
+        breakFlag = ros_comm_handler.loop_manager.run_one_iter(0)
+        rate.sleep()
+        
+
+
+#    if not args.pinocchio_only:
+#        robot.stopRobot()
+#
+#    if args.visualize_manipulator:
+#        robot.killManipulatorVisualizer()
+    
+    if args.save_log:
+        robot.log_manager.saveLog()
+        robot.log_manager.plotAllControlLoops()
+
+    # Destroy the node explicitly
+    # (optional - otherwise it will be done automatically
+    # when the garbage collector destroys the node object)
+    ros_comm_handler.destroy_node()
+    rclpy.shutdown()
+
+
+
+
diff --git a/python/ur_simple_control.egg-info/PKG-INFO b/python/ur_simple_control.egg-info/PKG-INFO
index 84b865b..80d9185 100644
--- a/python/ur_simple_control.egg-info/PKG-INFO
+++ b/python/ur_simple_control.egg-info/PKG-INFO
@@ -1,7 +1,12 @@
 Metadata-Version: 2.1
-Name: ur_simple_control
+Name: ur-simple-control
 Version: 0.1
 Summary: Collection of control algorithms for the UR5e arm based on the ur_rtde interface for communication and pinocchio for calculations.
 Home-page: https://gitlab.control.lth.se/marko-g/ur_simple_control
 Author: Marko Guberina
+License: UNKNOWN
+Platform: UNKNOWN
 License-File: LICENSE.txt
+
+UNKNOWN
+
diff --git a/python/ur_simple_control.egg-info/SOURCES.txt b/python/ur_simple_control.egg-info/SOURCES.txt
index 6ac7661..bf3ed08 100644
--- a/python/ur_simple_control.egg-info/SOURCES.txt
+++ b/python/ur_simple_control.egg-info/SOURCES.txt
@@ -33,14 +33,11 @@ examples/test_crocoddyl_opt_ctrl.py
 examples/__pycache__/robotiq_gripper.cpython-310.pyc
 examples/data/clik_comparison_0.pickle
 examples/data/clik_comparison_1.pickle
-examples/data/clik_run_001.pickle
-examples/data/clik_run_001_args.pickle
 examples/data/fts.png
 examples/data/joint_trajectory.csv
 examples/data/latest_run
 examples/data/latest_run_0
 examples/data/path_in_pixels.csv
-examples/data/test2_0.pickle
 examples/old_or_experimental/clik_old.py
 examples/old_or_experimental/force_mode_api.py
 examples/old_or_experimental/forcemode_example.py
@@ -228,8 +225,6 @@ ur_simple_control/util/grippers/abstract_gripper.py
 ur_simple_control/util/grippers/on_robot/twofg.py
 ur_simple_control/util/grippers/robotiq/robotiq_gripper.py
 ur_simple_control/visualize/__init__.py
-ur_simple_control/visualize/main.py
-ur_simple_control/visualize/make_run.py
 ur_simple_control/visualize/manipulator_comparison_visualizer.py
 ur_simple_control/visualize/manipulator_visual_motion_analyzer.py
 ur_simple_control/visualize/visualize.py
diff --git a/python/ur_simple_control/__pycache__/__init__.cpython-310.pyc b/python/ur_simple_control/__pycache__/__init__.cpython-310.pyc
index b60a7a8093ce7ef6223789fbf696d7cf59504c35..013bf4c3c931ca6dca9274fbad730bf76f14dc35 100644
GIT binary patch
delta 164
zcmaFQ)XvPC&&$ijz`($8cR^tK*@?Wej5-swWu<f3qSzQ2(iu{i7BNP#r!WUIXtKNn
zDbr+|7;hkai@zYTBqKgOH7~U&u_QA;Pm^QfL`8vHY-O3nnfZA|><kPHewrK;x9XUI
z*|*r^;}dgo;^S8`6!9=HK!{&~`WgATsru>p#Rd5(iADO!`8mn?dGTebd1aFo8NFB(
H7<d=~GeRxy

delta 140
zcmZo?e$T|4&&$ijz`($;?pAc_{E57>j2aWQWyKj8(iu{i7BNP#r7#CGXtKNnDbZw|
zm~6nL$u@DBBD0?+`^4)y4!79j;}dgo;^S8`6oHHZ6TcGlGxBp&_0#i<3-VJEi@-c1
a1UIKNFGatgD6t~5c(Ns<7mEx74<i5r1t%i_

diff --git a/python/ur_simple_control/__pycache__/managers.cpython-310.pyc b/python/ur_simple_control/__pycache__/managers.cpython-310.pyc
index e9b96271a7b765d8cd998b4bf188ba6f4beb244c..9450f01b9ff3639106a03cef0cc1522b1ebe61c2 100644
GIT binary patch
literal 34124
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
TOdKkFaSZi*kqq?^D3lKXv0JG;

literal 8220
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

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 7959a39494ca6a0aeb658248bb5a3a205372822a..8edaa2f577ddfd74d815dee53f8265d38c0f2fca 100644
GIT binary patch
delta 138
zcmX@Yc!se)pO=@5fq{YH?t;K{F$M;P#~=<eW@2DqaA06yDCS{cU`Sy|Va#C&VMt*L
zX3%7Q$;iOKpvicPQOi%0@fKTBVsU12@k)jw76t|g@hd_<BR@A)KRv&=AU`FsNIyA0
ZCpkYazAQDbOuw`!zBqGYxi=FJ0{{RLAF==d

delta 138
zcmX@Zc!aS&pO=@5fq{Wx@2%)m5d9cLAY(=b1_lQP28Lo51_p){hF}IwM!%H|MId1W
z@he?FBR@A)KRv&=AU`Fs2+T7=aC1uYQuGUo5-T!`^-GK5i!*Zza#G`y^YbRQJ2SB`
F002@pA<h5*

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 ff88e439ab199e7fe995968252caea7174bd1d85..ecf89b920431584195c255ccc99637ca09fd2338 100644
GIT binary patch
literal 7112
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

delta 653
zcmX?M-omMq&&$ijz`(#@!<LpB&d$K_7{o!wObiSR4h#$o#Ze3sb!<!-8B!Qh7<0Iz
zxH%b8SW;M97@~Mm*izVA7@~Mn7=sx!IbMQv`)M-XVlPN6D#=XD(PWz3#HciRHKUY5
z90LPG3S%uxCPOW24dViag$%W9HEbyiDNL<Qk_@$MlRq*Fb2Dc%6v?Ep)Uu?oPUdG)
z<z(}7d&$PYz>q%q5R)VOE!Lv^r2LY}9L)Cm;tUK7zf$!x@^e%5)ANf9@>3Fvz&s-a
zH>Wf&MZcgZu_Cj0ayql0y$HxJVhjunEQ~CS985fn9E<|2EQ~BHe9T--T#QAM3=9m(
z%pgBNF*^eT1IT)3kj8+?-<ZwyW0-1LYuQTJ7jUF7E@Wh6DB(<DYGwolO)!HdvtN3(
z$U66jRW0^a=Dzu5sa}&`vl#hma@}GnsVqn>;$UE4xW%5Al2}xfSXl%LUa*}-AUkg{
z7nSDSVkybYO})ihoRgYbaErB|C^N4_ll>M;Vo`c=5g!8sLlN)f99FsdTO2w0>G3I<
z$tAb=(=ziCbK)~gQi~ExGV}9_Kp_JmBtX`&=7QW|0P+D30|SE)BM+kh6AvR76AxpN
zDgy(9Cf_a2g3P@9<m8OZ{9DWgnR&NZ^Gb6IDj}|ANzN~*yv31NlwOcnRGfN?Gp#f)
zd2*kWp{Fd!IiMf|8w0Ts&2A2x-29Z%oK!nTkoBP8=V0Mr1VJ7~0Y(l+CMFJc9vJ}2
Ca+a|G

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 22ff463a3a86e96cac507291831172989a59a7cc..c14ed132923a1fd4fe37a2eea6179541d994dc02 100644
GIT binary patch
delta 138
zcmX@ac!IG$pO=@5fq{YH?t;K{5e5c^#~=<eW@2DqaA06yDCS{cU`Sy|Va#C&VMt*L
zX3%7Q$;iOKpvicPQOi%0@fJ&RPG<H>h9VXQ1_<#hOg|$(H&s79zqlYjC9z09IX@>k
ZKQF#4HLpy+v?#tfGq+%3r8^T30|4}sAFlua

delta 138
zcmX@Xc!;q+pO=@5fq{V`Vnui=h<*$rkTD|z1A_wt14A(j0|P?}LokCTqu)w~B9JhG
z_?4=kk)NBYpPpY_ke`xR1m+nbxH+YHDf$IPi4~c}`lUtj#hJMUIjQl<`FRst9hq1d
E00R3VCjbBd

diff --git a/python/ur_simple_control/clik/clik.py b/python/ur_simple_control/clik/clik.py
index c26e75c..25ed089 100644
--- a/python/ur_simple_control/clik/clik.py
+++ b/python/ur_simple_control/clik/clik.py
@@ -376,7 +376,7 @@ def controlLoopCompliantClik(args, robot : RobotManager, i, past_data):
     return breakFlag, save_past_dict, log_item
 
 # add a threshold for the wrench
-def compliantMoveL(args, robot, goal_point):
+def compliantMoveL(args, robot, goal_point, run=True):
     """
     compliantMoveL
     -----
@@ -393,14 +393,17 @@ def compliantMoveL(args, robot, goal_point):
     log_item = {
             'qs' : np.zeros(robot.model.nq),
             'wrench' : np.zeros(6),
-            'tau' : np.zeros(robot.model.nq),
-            'dqs' : np.zeros(robot.model.nq),
+            'tau' : np.zeros(robot.model.nv),
+            'dqs' : np.zeros(robot.model.nv),
         }
     save_past_dict = {
             'wrench': np.zeros(6),
             }
     loop_manager = ControlLoopManager(robot, controlLoop, args, save_past_dict, log_item)
-    loop_manager.run()
+    if run:
+        loop_manager.run()
+    else:
+        return loop_manager
 
 
 def clikCartesianPathIntoJointPath(args, robot, path, \
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 1935145d6fced2a08057f336744c1f3174952a6e..8f623ffcc78243df2a5ee3e73e7c0e561efecc48 100644
GIT binary patch
delta 138
zcmX@ec#N?=pO=@5fq{YH?t;K{VFm_<#~=<eW@2DqaA06yDCS{cU`Sy|Va#C&VMt*L
zX3%7Q$;iOKpvicPQOi%0@fLGRZox{1A{GV)2=OaaKO;XkRX;tyxFA0zu}D8TKPNdq
ZFTN}_uS~zRD84u|w;*R?l`9hu0|4+&AF==d

delta 138
zcmX@cc#yF^pO=@5fq{V`W<_`^h<*$rkTD|z1A_wt14A(j0|P?}LokCTqu)w~B9JhG
z_?4ock)NBYpPpY_ke`xR1m+nbxH+YHDf$IPi4~c}`lUtj#hJMUIjQl<`FRst9GF-b
E00RsmB>(^b

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 0f8c0ab2560a9677153f22c766fe22fa96a859c8..e81144824ae642b3e14a08a19d1224855ba643bb 100644
GIT binary patch
delta 4692
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

delta 2233
zcmaFu(PSo=&&$ijz`(%pHajY{O__n=@#I7nNhdP~28I-d6viBeC`NaN6s8pB7KRk&
zW~L}6cZL*}6xJ4o6xL>@C}wwt6t)!h7KRk|W~L~X6vki%O^%l!<NP)!u-sx~yTwvc
zS&%x}p3U2poq>U&hyz4$f(VeMD;bIu7#J9S#p`F}=cekX=NA{`rz94Ec}56sPHA3>
zenC-UMP~72Mi$}8znN9IIO5|o^D;}~;{_&fXS>MAI=PeGQd5qBf#DWsT4qjad_iJK
zMv*+oB9IMWYl;*>TxkXd2D{0x*%x@RGB7Y`vKOg?L^VK!CWuf45n3QZ8${@U6fqTn
zOvY-Q3<Cp$>*T8()9XRTrGvcA!0^Goh!LcZrwC-)Ew-}alEmcfTdY;7Mft@=+#qv#
zK!h-e-~|!<AVLI0h=K?)5FrjSf)QdhswZx-7Nr)amUuHTFcgCfQefm@ocx^AU!RSE
zfng<65!hUiH7lVm2MeH?!B`bMIh89;!4PDZ5r{xjz*-rfR+<+v`7u|Bnkh&gr%J}+
zSdhHQ<XCPCEk2O5q4t8<kgx}v4T^wU9L1?6@#*=AIZ2cEa~oM%f^=Ge^e`5ILO~O%
z6~so@$_~<6l31Dw(ql7On`fCXDAZs6|NsAg5h%%OvKGN3@fLGxMM04eNU0#mcxFgQ
zT7c3BV<x)M%mu}n8I$FBPeS6+s>k3_U!|*^rT`=`9YMx`v=)I=3Mlaw34lyuPRTEU
z#4>wsVnt?dY3?oN;?mqAu+KqpQv^=;<{<sx#BU683oFDe;AjCEeT%W|7Gnn3O#)yN
zl2+Xq7#Q*<m+=)jf&+*h;ucVvD$)ZP2$C-X8Cb*#;)30WEhZV$$|h^_&yE8HmL?~}
z6nBsga3F(|9XQ2-T?tNrU_-$P5E5*+m{Lk^ag?Rz#1|B$mO-3|h*Fl~lGK9g%}N5C
z%t9bLitIq1WCCY`BD=}9!b*{#*h%kwyLG|$V;k%=rHerM>K1EpMq)uKBtwA16&zsT
zpabVhaMl2M_ZCM^W?peYVsdH`IOy#`jtBc$aPkge8Fz3j>w^Trk-}P(n3tXk33+g!
zgTlDT2_z5B)CM5u@q**v7H3I(a%x^lYEf~K&}3;5IYx)cRw7y=V9$XGP@*l8Wnf_F
zm|P(eBFYRhg#|=_eG2AUO@1h%6|V#m1QjnuphBStWC<j4z`+WR9BYsgTMz+u5jg(9
z5dq4|U`vpK7GXOR0|Nv9<SbEjMyAP=L=);k*&M7;6B;|rDY*qjo*;9<n!p6e-M83E
z3sMqGQa6H13Xmx*j8)uz`614F5OF_EmZCV2ws;Vc03wn>1lRxs0Wzv6k%56>1IQc}
zP{4CA@Gur7PL5@fojhI4k@NYVl^-wpCI#3}zAF~X=rP$^T-gU4qoC|~i?u91H?iUt
zYa)o!WCI6$Q5wi1P=Q&L31Ve|hzt;cW-lmMw{2b}&d&(R1)SjQ2FU>6WD3>^4oa{=
z;7kP$R8Z>H<bv3i1Txuk@-GPuB~<fo38ts!r4}WYq{inamK0?srxx#>>>?S-Shabc
z<XOha`O?~qvXf^^_tt}wa1kidHN}dGK*oVnCVO#VX=-X!>MiEPyvke5xrr6vV(b=k
zW?tGY=G@G@qF|6(a5%6fLK0>GsN`TNE-Wf30w-~><H6nlhldMDgENQ#g~u(H{JhlS
zqBIjwqLoJW4M;^ch{ypExga7BL==FCLJ;9F`L>K3cNB;j10rH4>&UvJr)^M-AD`SV
zYsV-w`IxL>J*afmWJ6CEplE=28>Akb`j7~43Q1vLVAujmA)q|R!NA4D!Op`~1QOL`
zy~UbWnp;o_i91kA1g9skB$6?ps8Ir!eYZGla`RJ4b5iX<HEA&@*K;uN@iEl%DG9Lv
E079#`KmY&$

diff --git a/python/ur_simple_control/managers.py b/python/ur_simple_control/managers.py
index 70e8783..df733ac 100644
--- a/python/ur_simple_control/managers.py
+++ b/python/ur_simple_control/managers.py
@@ -27,6 +27,12 @@ from os import getpid
 from functools import partial
 import pickle
 
+# import ros stuff if you're rosing
+# TODO: add more as needed
+import importlib.util
+if importlib.util.find_spec('rclpy'):
+    from geometry_msgs import msg 
+
 """
 general notes
 ---------------
@@ -80,7 +86,7 @@ def getMinimalArgParser():
     #################################################
     parser.add_argument('--robot', type=str, \
             help="which robot you're running or simulating", default="ur5e", \
-            choices=['ur5e', 'heron', 'herondd', 'gripperlessur5e'])
+            choices=['ur5e', 'heron', 'heronros', 'gripperlessur5e'])
     parser.add_argument('--simulation', action=argparse.BooleanOptionalAction, \
             help="whether you are running the UR simulator", default=False)
     parser.add_argument('--robot-ip', type=str, 
@@ -208,6 +214,7 @@ class ControlLoopManager:
         self.controlLoop = controlLoop
         self.final_iteration = -1 # because we didn't even start yet
         self.args = args
+        self.iter_n = 0
         self.past_data = {}
         # save_past_dict has to have the key and 1 example of what you're saving
         # so that it's type can be inferred (but we're in python so types don't really work).
@@ -230,10 +237,9 @@ class ControlLoopManager:
 
         if self.args.real_time_plotting:
             self.plotter_manager = ProcessManager(args, realTimePlotter, log_item, 0)
-            # give real-time plotter some time to set itself up
-            #self.plotter_manager.sendCommand(log_item)
 
-    def run(self):
+
+    def run_one_iter(self, i):
         """
         run
         ---
@@ -242,56 +248,57 @@ class ControlLoopManager:
         it's the controlLoop's responsibility to break if it achieved it's goals.
         this is done via the breakFlag
         """
+        # NOTE: all required pre-computations are handled here
+        self.robot_manager._step()
+        # TODO make the arguments to controlLoop kwargs or whatever
+        # so that you don't have to declare them on client side if you're not using them
+        breakFlag, latest_to_save_dict, log_item = self.controlLoop(i, self.past_data)
+        self.final_iteration = i
+
+        # update past rolling window
+        # TODO: write an assert assuring the keys are what's been promised
+        # (ideally this is done only once, not every time, so think whether/how that can be avoided)
+        for key in latest_to_save_dict:
+            # remove oldest entry
+            self.past_data[key].popleft()
+            # add new entry
+            self.past_data[key].append(latest_to_save_dict[key])
+        
+        # log the data
+        # check that you can
+        # TODO only need to check this once, pls enforce better
+        #if len(self.log_dict) > 0:
+        for key in log_item:
+                #if key not in self.log_dict.keys():
+                #    raise KeyError("you need to provide log items you promised!")
+                #    break
+            self.log_dict[key].append(log_item[key])
+        
+        # TODO: do it this way if running on the real robot.
+        # but if not, we want to control the speed of the simulation,
+        # and how much we're plotting.
+        # so this should be an argument that is use ONLY if we're in simulation
+        if i % 20 == 0:
+            # don't send what wasn't ready
+            if self.args.visualize_manipulator:
+                self.robot_manager.visualizer_manager.sendCommand({"q" : self.robot_manager.q,
+                                                      "T_w_e" : self.robot_manager.getT_w_e()})
+                if self.robot_manager.robot_name == "heron":
+                    T_base = self.robot_manager.data.oMi[1]
+                    self.robot_manager.visualizer_manager.sendCommand({"T_base" : T_base})
+
+            if self.args.real_time_plotting:
+                # don't put new stuff in if it didn't handle the previous stuff.
+                # it's a plotter, who cares if it's late. 
+                # the number 5 is arbitrary
+                self.plotter_manager.sendCommand(log_item)
+        return breakFlag
+
+    def run(self):
         self.final_iteration = 0
         for i in range(self.max_iterations):
             start = time.time()
-            # NOTE: all required pre-computations are handled here
-            self.robot_manager._step()
-            # TODO make the arguments to controlLoop kwargs or whatever
-            # so that you don't have to declare them on client side if you're not using them
-            breakFlag, latest_to_save_dict, log_item = self.controlLoop(i, self.past_data)
-            self.final_iteration = i
-
-            # update past rolling window
-            # TODO: write an assert assuring the keys are what's been promised
-            # (ideally this is done only once, not every time, so think whether/how that can be avoided)
-            for key in latest_to_save_dict:
-                # remove oldest entry
-                self.past_data[key].popleft()
-                # add new entry
-                self.past_data[key].append(latest_to_save_dict[key])
-            
-            # log the data
-            # check that you can
-            # TODO only need to check this once, pls enforce better
-            #if len(self.log_dict) > 0:
-            for key in log_item:
-                    #if key not in self.log_dict.keys():
-                    #    raise KeyError("you need to provide log items you promised!")
-                    #    break
-                self.log_dict[key].append(log_item[key])
-            
-            # TODO: do it this way if running on the real robot.
-            # but if not, we want to control the speed of the simulation,
-            # and how much we're plotting.
-            # so this should be an argument that is use ONLY if we're in simulation
-            if i % 20 == 0:
-                # don't send what wasn't ready
-                if self.args.visualize_manipulator:
-                    self.robot_manager.visualizer_manager.sendCommand({"q" : self.robot_manager.q,
-                                                          "T_w_e" : self.robot_manager.getT_w_e()})
-                    if self.robot_manager.robot_name == "heron":
-                        T_base = self.robot_manager.data.oMi[1]
-                        self.robot_manager.visualizer_manager.sendCommand({"T_base" : T_base})
-
-                            #if self.robot_manager.manipulator_visualizer_queue.qsize() < 5:
-                            #    self.robot_manager.updateViz({"q" : self.robot_manager.q,
-                            #                              "T_w_e" : self.robot_manager.getT_w_e()})
-                if self.args.real_time_plotting:
-                    # don't put new stuff in if it didn't handle the previous stuff.
-                    # it's a plotter, who cares if it's late. 
-                    # the number 5 is arbitrary
-                    self.plotter_manager.sendCommand(log_item)
+            breakFlag = self.run_one_iter(i)
 
             # break if done
             if breakFlag:
@@ -311,6 +318,7 @@ class ControlLoopManager:
                 # (because i did know about it, just didn't even think of changing it)
                 if not (self.args.pinocchio_only and self.args.fast_simulation):
                     time.sleep(self.robot_manager.dt - diff)
+
         ######################################################################
         # for over
         ######################################################################
@@ -413,9 +421,11 @@ class RobotManager:
         if self.robot_name == "heron":
             self.model, self.collision_model, self.visual_model, self.data = \
                  heron_approximation()
-        if self.robot_name == "herondd":
+        if self.robot_name == "heronros":
             self.model, self.collision_model, self.visual_model, self.data = \
-                 heron_approximationDD()
+                 heron_approximation()
+            #self.publisher_vel_base = create_publisher(msg.Twist, '/cmd_vel', 5)
+            #self.publisher_vel_base = publisher_vel_base
         if self.robot_name == "gripperlessur5e":
             self.model, self.collision_model, self.visual_model, self.data = \
                  getGripperlessUR5e()
@@ -828,11 +838,20 @@ class RobotManager:
 
         # TODO: implement real thing
         if self.robot_name == "heron":
-                self.v_q = qd
-                self.q = pin.integrate(self.model, self.q, qd * self.dt)
-        if self.robot_name == "herondd":
-                self.v_q = qd
-                self.q = pin.integrate(self.model, self.q, qd * self.dt)
+            # y-direction is not possible on heron
+            qd[1] = 0
+            self.q = pin.integrate(self.model, self.q, qd * self.dt)
+        if self.robot_name == "heronros":
+            # y-direction is not possible on heron
+            qd[1] = 0
+            cmd_msg = msg.Twist()
+            cmd_msg.linear.x = qd[0]
+            cmd_msg.angular.z = qd[2]
+            #print("about to publish", cmd_msg)
+            self.publisher_vel_base.publish(cmd_msg)
+            # good to keep because updating is slow otherwise
+            # it's not correct, but it's more correct than not updating
+            #self.q = pin.integrate(self.model, self.q, qd * self.dt)
 
         if self.robot_name == "gripperlessur5e":
             qd_cmd = qd[:6]
@@ -975,6 +994,10 @@ class RobotManager:
             if self.args.debug_prints:
                 print("you didn't select viz")
 
+    def set_publisher_vel_base(self, publisher_vel_base):
+        self.publisher_vel_base = publisher_vel_base
+        print("set publisher into robotmanager")
+
 class ProcessManager:
     """
     ProcessManager
diff --git a/python/ur_simple_control/optimal_control/__init__.py b/python/ur_simple_control/optimal_control/__init__.py
index 569adb6..def8570 100644
--- a/python/ur_simple_control/optimal_control/__init__.py
+++ b/python/ur_simple_control/optimal_control/__init__.py
@@ -1,6 +1,6 @@
 import importlib.util
-if importlib.util.find_spec('casadi'):
-    from .create_pinocchio_casadi_ocp import *
+#if importlib.util.find_spec('casadi'):
+#    from .create_pinocchio_casadi_ocp import *
 from .crocoddyl_mpc import *
 from .crocoddyl_optimal_control import *
 from .get_ocp_args import *
diff --git a/python/ur_simple_control/path_generation/planner.py b/python/ur_simple_control/path_generation/planner.py
index f48dca2..b3caf99 100644
--- a/python/ur_simple_control/path_generation/planner.py
+++ b/python/ur_simple_control/path_generation/planner.py
@@ -18,10 +18,12 @@ from multiprocessing import Queue, Lock, shared_memory
 
 def getPlanningArgs(parser):
     parser.add_argument('--planning-robot-params-file', type=str,
-                        default='/home/gospodar/lund/praxis/projects/ur_simple_control/python/ur_simple_control/path_generation/robot_params.yaml',
+                        #default='/home/gospodar/lund/praxis/projects/ur_simple_control/python/ur_simple_control/path_generation/robot_params.yaml',
+                        default='/home/gospodar/colcon_venv/ur_simple_control/python/ur_simple_control/path_generation/robot_params.yaml',
                         help="path to robot params file, required for path planning because it takes kinematic constraints into account")
     parser.add_argument('--tunnel-mpc-params-file', type=str,
-                        default='/home/gospodar/lund/praxis/projects/ur_simple_control/python/ur_simple_control/path_generation/tunnel_mpc_params.yaml',
+                        #default='/home/gospodar/lund/praxis/projects/ur_simple_control/python/ur_simple_control/path_generation/tunnel_mpc_params.yaml',
+                        default='/home/gospodar/colcon_venv/ur_simple_control/python/ur_simple_control/path_generation/tunnel_mpc_params.yaml',
                         help="path to mpc (in original tunnel) params file, required for path planning because it takes kinematic constraints into account")
     parser.add_argument('--n-pol', type=int,
                         default='0',
diff --git a/python/ur_simple_control/path_generation/star_navigation/robot/mobile_robot.py b/python/ur_simple_control/path_generation/star_navigation/robot/mobile_robot.py
index 0177489..772056d 100644
--- a/python/ur_simple_control/path_generation/star_navigation/robot/mobile_robot.py
+++ b/python/ur_simple_control/path_generation/star_navigation/robot/mobile_robot.py
@@ -5,11 +5,11 @@ import numpy as np
 
 
 class MobileRobot(ABC):
-    def __init__(self, nu, nx, radius, name, u_min=None, u_max=None, x_min=None, x_max=None,
+    def __init__(self, nu, nx, width, name, u_min=None, u_max=None, x_min=None, x_max=None,
                  integration_method='euler'):
         self.nx = nx
         self.nu = nu
-        self.radius = radius
+        self.width = width
         self.name = name
         def valid_u_bound(bound): return bound is not None and len(bound) == self.nu
         def valid_q_bound(bound): return bound is not None and len(bound) == self.nx
@@ -55,15 +55,15 @@ class MobileRobot(ABC):
 #    def init_plot(self, ax=None, color='b', alpha=0.7, markersize=10, **kwargs):
 #        if ax is None:
 #            _, ax = plt.subplots(subplot_kw={'aspect': 'equal'})
-#        if self.radius == 0:
+#        if self.width == 0:
 #            handles = plt.plot(0, 0, '+', color=color, alpha=alpha, markersize=markersize, label=self.name, **kwargs)
 #        else:
-#            handles = [patches.Circle((0, 0), self.radius, color=color, alpha=alpha, label=self.name, **kwargs)]
+#            handles = [patches.Circle((0, 0), self.width, color=color, alpha=alpha, label=self.name, **kwargs)]
 #            ax.add_patch(handles[0])
 #        return handles, ax
 #
 #    def update_plot(self, x, handles):
-#        if self.radius == 0:
+#        if self.width == 0:
 #            handles[0].set_data(*self.h(x))
 #        else:
 #            handles[0].set(center=self.h(x))
diff --git a/python/ur_simple_control/path_generation/star_navigation/star_navigation.egg-info/PKG-INFO b/python/ur_simple_control/path_generation/star_navigation/star_navigation.egg-info/PKG-INFO
index f45c709..21a305d 100644
--- a/python/ur_simple_control/path_generation/star_navigation/star_navigation.egg-info/PKG-INFO
+++ b/python/ur_simple_control/path_generation/star_navigation/star_navigation.egg-info/PKG-INFO
@@ -1,3 +1,10 @@
 Metadata-Version: 2.1
-Name: star_navigation
+Name: star-navigation
 Version: 1.0
+Summary: UNKNOWN
+Home-page: UNKNOWN
+License: UNKNOWN
+Platform: UNKNOWN
+
+UNKNOWN
+
diff --git a/python/ur_simple_control/path_generation/star_navigation/star_navigation.egg-info/SOURCES.txt b/python/ur_simple_control/path_generation/star_navigation/star_navigation.egg-info/SOURCES.txt
index a108d48..bf0f73b 100644
--- a/python/ur_simple_control/path_generation/star_navigation/star_navigation.egg-info/SOURCES.txt
+++ b/python/ur_simple_control/path_generation/star_navigation/star_navigation.egg-info/SOURCES.txt
@@ -1,5 +1,3 @@
-.gitignore
-.gitmodules
 README.md
 setup.py
 config/__init__.py
diff --git a/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/PKG-INFO b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/PKG-INFO
new file mode 100644
index 0000000..c335b98
--- /dev/null
+++ b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/PKG-INFO
@@ -0,0 +1,10 @@
+Metadata-Version: 2.1
+Name: starworld-tunnel-mpc
+Version: 1.0
+Summary: UNKNOWN
+Home-page: UNKNOWN
+License: UNKNOWN
+Platform: UNKNOWN
+
+UNKNOWN
+
diff --git a/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/SOURCES.txt b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/SOURCES.txt
new file mode 100644
index 0000000..0be315e
--- /dev/null
+++ b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/SOURCES.txt
@@ -0,0 +1,30 @@
+README.md
+setup.py
+config/__init__.py
+config/load_config.py
+config/scene.py
+motion_control/__init__.py
+motion_control/soads/__init__.py
+motion_control/soads/soads.py
+motion_control/tunnel_mpc/__init__.py
+motion_control/tunnel_mpc/path_generator.py
+motion_control/tunnel_mpc/tunnel_mpc.py
+motion_control/tunnel_mpc/tunnel_mpc_controller.py
+motion_control/tunnel_mpc/workspace_modification.py
+motion_control/tunnel_mpc_convergence/__init__.py
+motion_control/tunnel_mpc_convergence/path_generator.py
+motion_control/tunnel_mpc_convergence/tunnel_mpc.py
+motion_control/tunnel_mpc_convergence/tunnel_mpc_controller.py
+motion_control/tunnel_mpc_convergence/workspace_modification.py
+robot/__init__.py
+robot/bicycle.py
+robot/mobile_robot.py
+robot/omnidirectional.py
+robot/unicycle.py
+starworld_tunnel_mpc.egg-info/PKG-INFO
+starworld_tunnel_mpc.egg-info/SOURCES.txt
+starworld_tunnel_mpc.egg-info/dependency_links.txt
+starworld_tunnel_mpc.egg-info/requires.txt
+starworld_tunnel_mpc.egg-info/top_level.txt
+visualization/__init__.py
+visualization/scene_gui.py
\ No newline at end of file
diff --git a/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/dependency_links.txt b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/requires.txt b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/requires.txt
new file mode 100644
index 0000000..c75a0c3
--- /dev/null
+++ b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/requires.txt
@@ -0,0 +1,7 @@
+casadi
+matplotlib
+numpy
+opengen
+pyyaml
+scipy
+shapely
diff --git a/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/top_level.txt b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/top_level.txt
new file mode 100644
index 0000000..3242cb5
--- /dev/null
+++ b/python/ur_simple_control/path_generation/starworld_tunnel_mpc/starworld_tunnel_mpc.egg-info/top_level.txt
@@ -0,0 +1,4 @@
+config
+motion_control
+robot
+visualization
diff --git a/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/PKG-INFO b/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/PKG-INFO
index 4dee13f..7043340 100644
--- a/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/PKG-INFO
+++ b/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/PKG-INFO
@@ -1,9 +1,11 @@
 Metadata-Version: 2.1
 Name: starworlds
 Version: 1.0
+Summary: UNKNOWN
+Home-page: UNKNOWN
+License: UNKNOWN
+Platform: UNKNOWN
 License-File: LICENSE
-Requires-Dist: pyyaml
-Requires-Dist: numpy
-Requires-Dist: scipy
-Requires-Dist: matplotlib
-Requires-Dist: shapely
+
+UNKNOWN
+
diff --git a/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/SOURCES.txt b/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/SOURCES.txt
index 853123c..bad8983 100644
--- a/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/SOURCES.txt
+++ b/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/SOURCES.txt
@@ -1,4 +1,3 @@
-.gitignore
 LICENSE
 README.md
 requirements.txt
diff --git a/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/requires.txt b/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/requires.txt
index f849890..16fb717 100644
--- a/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/requires.txt
+++ b/python/ur_simple_control/path_generation/starworlds/starworlds.egg-info/requires.txt
@@ -1,5 +1,5 @@
-pyyaml
+matplotlib
 numpy
+pyyaml
 scipy
-matplotlib
 shapely
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 3c8fc8dc0aef0b7824804dd26c62c026082113cd..654427aae8dcbedf493f3a356f4a6e5732f76014 100644
GIT binary patch
delta 51
zcmcb>c#x4NpO=@5fq{YH?t;Mdi9FWQDf$`txvBc;`NakKDTzh;$@w|S`FZhWsd;4+
G3*!NfR1r}C

delta 66
zcmX@ec!7~8pO=@5fq{YH<%;msi9FU?#rhffxvBc;`NakKDTzg3o)LnZQ<|5eUr>}-
Kky$)3DINg4trqP7

diff --git a/python/ur_simple_control/robot_descriptions/urdf/__pycache__/__init__.cpython-310.pyc b/python/ur_simple_control/robot_descriptions/urdf/__pycache__/__init__.cpython-310.pyc
index 604494c47ace559fed14c143479ef69e2f44abc8..b21ae860d8993fbb7c2b56d3cb77e67b296b9dff 100644
GIT binary patch
delta 51
zcmcc0c#M%JpO=@5fq{YH?t;Mdi9FWQnfe*|xvBc;`NakKDTzh;$@w|S`FZhWsd;4+
G3sV4);}K;5

delta 66
zcmX@cc$JYSpO=@5fq{YH#=7v-i9FU?75W+ZxvBc;`NakKDTzg3o)LnZQ<|5eUr>}-
Kky$)3DFpz%&=&Rp

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 41c97b7686410f2feed21cab462d3e8c926d6c9c..49efa1685621d359f4209efe2cdfd6fac8a86bfa 100644
GIT binary patch
delta 52
zcmX@axS5eRpO=@5fq{YH?t;Md?-O~gq{H+x@^e%5)ANf9@>3Fv^po>*lJoQ8%Tn{o
ICKd()0Ih5i5dZ)H

delta 67
zcmdnYc!-fVpO=@5fq{V`X+?M{!$e*ytyKMt{M=Oi^!(z2{FKBZFwY3V%_+@G(Jv@U
LtjH{$m=p*An>Q9O

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 2850cb14d4726a62def37e709cf6bb52d3b5cf17..f3163af30f2c40fddc884a5ec95aabd5f6cbf222 100644
GIT binary patch
literal 5915
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
C%3cWo

delta 1080
zcmbQOx09bQpO=@5fq{V`L@FuOk9Q)UOuYpI149Z!3S$mK6eE~sied)SEKw|Anl*|w
zg&~D0hb@;qik*=mg*k<#g&~R~g)x{xll3LYFh5PkTdZlBIjP0Tj37P~OEWMqurV+&
zI5RLX6hC2PU?^coVQgkxz?j0ckg=Argei-80ZV-i<3h$-rV@q}=4QrPW{6-7^Fqd2
zmJ-$lZ0QUsEQ>%YSfM;tFpsT-eE~-adlu&ct{S$5j5VwanQGagD%ij(IG{XsFpm>S
zJ?BEk8jgibwOn8o^$aN-U?tpOE<*|@n8$;pfoCCO4fjH(T3)CMF0cwdD32S=<401@
zzmTzpZy{5y08|AJScM>z#|!2O!PM6;;HnW?$XFw|kf~M}s)P@$L<Gv?2lGT>8WwQX
zh%RKT5n0GoD^|l$bRdPHRy>8FRw9L=R<eYB0e1~3aK%g5vv_L6YnV#dvv{-kYFJVP
zdRb~E^FZMMRRPr#Dp|u`Bc8>dB51=<!v$su*)Y`bf?2{g3^f8^mWT~QjWC!cYQs<?
z24;!bFqE(_5U3Gf$XF{?BVHp>BUvMr#uCh+DL#1?v#z{MX_0Aae0gR`Mto6zQhrHh
zVSGknUP`K7X;DgAmCEF~%qn@B%tfFi118e%Nt8{nJ$u9+MUbIEVA}1@96L?s^aHC?
zcem^?wg;;Q6PnEFOP5xCY*GCQ5lr8xA|s%Yv>Bwjadymt0;Aje!3x2I=Hx;a8Ai>?
zePD7mm^{HEBc;ilZuBOO`?Unj6b1%~j`+#b_i0Z42UaA_DkGrDc#EeXF*!RiJvBZh
zv#5Bo8>>8{;N&#cc4hvo{LH+PfSknS)ZEm(lHyw|E{P?Hn$ov8%QA~g6LT`FQa2m1
z<uLN5B$gzuWGFIaU|{%_HrbL#Yw~$^cR^5wEcRnyVBllsVdP-qVVYdat>VMN%)-RN
z$im3QD8bCd0%kFBF(M!jQ;|6X1A`{#EzW|>y!_<kjLiHZ0R{$!TdaAdxdoL)d>}S+
xab<B4_v8s;vKC<FV7rkBGms(<o80`A(wtN~P*fE2FfcH1FmNz}AP*xCD*#(h4^#jE

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 a9d82f13280e4f3e31a0b9ed7c941fa52e5621e6..f3e4e64d35092a39fd51bda1a2b81e6f0f0f1341 100644
GIT binary patch
literal 4375
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
O91I+c5Xi$Q!~y`-8-}0&

literal 1369
zcmd1j<>g{vU|_IeOG`CjXJB{?;vi!t1_lNP1_p*=9R>!56owSW9EK<e%^1a$!j!_?
z!Vtxr!ji(;!Vtxh!j{6`!Vtxp!Whh;$?+0oj$bk}h=O8v1_lNe1_lOakcnvw3=B04
zE)20ewahgPHO!I>DGW7?txS>(Af63FAyW!tElUbhEo%uw4ND4hGgB>F3F88$8ipFS
zg-nbLHEau*7cww1lrYq=BFQqL%BC;`Gib8-RY~dTrzDmn>L=%9X2%zm=EWNr80r;d
zCTHiQR>@<Li%%>{FNP|(#Z;c8$#RP&zaTa578^v<EtZth+=5%I$vOGOshaG!ICApS
z<5Mz|OK$O}W#%R3#AlYI7A2Ns=I7mF0U33RIXkuT7B9%=w9K5;_=3cej9YvlnRo;r
zYzT<ElA(x?fq~&ymVQQlZmNEIesMv5N@5Y1XN2J9l;)-A7ZfE{WESg}7R485<`(3n
z#wX|Jl@#UY=oeI$WaQ^zkti+6%+b%uPfyRxOOFR}iuDRAZ?P9AmZkdSr?Y}0M}&ca
zfrCkmk%gIsk&Bs!kpoQfFct|gFfgFRDH}9SLGfIiLoiNj7;BiaS&B?Rv=l=pLpwtn
zV+vymQwv84Lk(jyqYFbbV=W6fo>>+$*0O?A2p24c)Ud!)hh_~ZW|{qx8KH>_M1hhk
zD1ixs{2;-=z>v;R!w}0+%UHwM!63$v!jR20k*Sa=m_d`V2&4}j%9>2KnDh*8F=no0
zyv3bYk`Z5$AD^9?S^$<T;%8uBxW#3YlUZDnoS$1@rwB3{WRC<xm0WU8YGPh!K~QO)
zo=r}Ea$-)gogPA|Ci5-UqQt!P)LTq>1-F=sOLH~Zia>dwhy!G(XdWVw6vtQQm&TVT
z=9LtIGUP3;r2PDx_{5^3#L8Rj5Ou{6_kg?xbriyONsyz2pmD~*%)uze$i>XTD8$IZ
zR3rn6F_42n0R+OJ7z4!?I2YP5Fo1FpLkeRvQ!NuH4!|sCa11algvA9jC@xZ%YFOi$
z!6Zu!OATupC?J{rZZQ=lg=n%Cfy^udh5jv;oczR;TU^DNxurRfJiu3wnU|lOoROIy
zpP!dgsmXRr2%KROOA;aJKQA#i6*)hE`MfA<ZgIl13pBeWmLwK&GB7|g3nX~J(Io`3
zKd3a%Ex*VyFEOXGII~zA6hfdp#l;ALY)ov79E?S33=9mKY!GL&=9T6aR2GSYOa!HK
paL|EOK+Fbdhp@o5aM<MLr<CTT+JRD1F(}$N7&sU?m^nmvgaAS9QfdGI

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 88efef940c25032d0c34f0ec64c58af7190861fb..66a8209bfd54f39391e1003fc8c1a3e7a66d382b 100644
GIT binary patch
delta 51
zcmX@kxPy@=pO=@5fq{YH?t;Mdi9FWQ(fS$rxvBc;`NakKDTzh;$@w|S`FZhWsd;4+
G3&Q}3xe+Y@

delta 66
zcmdnNc$|?ZpO=@5fq{V`t0y9LB9FCJmVQQlZmNEIesMv5N@5Y1XN2J9l;)-A7ZfE{
KWEM|M3IhO^wH7Y`

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 f4f3e5fc87b29baec3f22e19efb26294ddcf7091..86c35e0c7f317e7d72788853f7280a7d2570a6c3 100644
GIT binary patch
literal 8702
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

literal 829
zcmd1j<>g{vU|`^Hic0;-%)sy%#6iYP3=9ko3=9m#3JeSkDGVu$ISf&ZV45kHIf{jm
zA%!W0xrHH$HH9&lL6hYrNUvWqNEe6&!rTlD3>*v$49*}^&M+`AlrSt{tYOSzTF6+-
zl)_lcoWfYkQo>xr+{{?QT*K1LD9%vJn#oYhR>G3Sx`3^OVF5eHjuMU<hGxcv%nKQ7
z*-JP<Y!`-Ds~DzQj#|zVmIYiT+%>Ev%rzV-%;F3nGnyF}GS;xwaN01G@YFEWa7r>{
z@uo0KGBh)~FvN=2a)IO|8M63lm>{w#3@Hq)Of_6-Op**W>@^&c3^kl7EWIp@426ym
zwF~$cGB7d}s+O=U5CE}K7=jrzS^ZvuJX^%bz`*blL})VIVolD^$uGLanv<B6nxiRr
ziz%<*7F%LbVqSXcExz2uiulZu)S|?a%>2CKTg=5JMYos>a!PJ7CFkB^&Ppx0#gUVl
zS6q;ooO+8nCpGUDXKG$)E=YaqE%xHlq=KCMl3UD~c_p`4AttgGXCxM+-eLhuu;rwt
zr{<;HVkyqZFW2P0#R(FPPf09Eyv34OlwN#`vE&w8UVL(XPBDls$}caz#Sb+VBpP3o
zUw(@{u_8VtGr8mz8`vYow-_^Tae&N-&rYqp#hA5{p-72=f#FxSenx(7s(yNYaY24c
zViA~Ugy80s=B4Nt6eU(<7VDQ5#TRGh7UZPHC+Fvt6y@jW7gUyH<mX|LD9bD^P0Y!x
zO4Wz6^a?6(@qm2dR+OLXl9^lrN>9ZS3=9lBtSn3{i~>w7j8aSjjB<=(j5>^bj694*
zDhvz^nrydN^Gb6IDvQ_{7#MB|<|dYa49Uq%(krM0v2L+J=ps-a0BZqz42e(%Y2>iU
W%}*)KNwovTZ!yR$4h9}Z9yS2TL+CL8

-- 
GitLab