diff --git a/COLCON_IGNORE b/COLCON_IGNORE
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/python/examples/crocoddyl_mpc.py b/python/examples/crocoddyl_mpc.py
index 3d78e8df1587d127d2826f2d742f82af6f67e755..d29008e8b02e99e69ae4171ede21d462252ef8c4 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 0000000000000000000000000000000000000000..be65bc01e0deb01b0186eb9f0ad67c13c69c99cb
--- /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 0000000000000000000000000000000000000000..7fc29a86c4eb2704004a979e7cd7ef544bdb6404
--- /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 84b865bdb559c9c6924c033eb1baba2982422ea7..80d9185ea780b3c481dad3d7bacf8213c104c6a0 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 6ac766121c788ec1d445bbbec43e5015235151f4..bf3ed08977ae3f5773625f56e8e8db1824a507a8 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
Binary files a/python/ur_simple_control/__pycache__/__init__.cpython-310.pyc and b/python/ur_simple_control/__pycache__/__init__.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/__pycache__/managers.cpython-310.pyc and b/python/ur_simple_control/__pycache__/managers.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/basics/__pycache__/__init__.cpython-310.pyc and b/python/ur_simple_control/basics/__pycache__/__init__.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/basics/__pycache__/basics.cpython-310.pyc and b/python/ur_simple_control/basics/__pycache__/basics.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/clik/__pycache__/__init__.cpython-310.pyc and b/python/ur_simple_control/clik/__pycache__/__init__.cpython-310.pyc differ
diff --git a/python/ur_simple_control/clik/clik.py b/python/ur_simple_control/clik/clik.py
index c26e75c9ffe7dc58398453c5816f08b85e6f88ef..25ed089ba69942c8f005f0625a87707c0c728b75 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
Binary files a/python/ur_simple_control/dmp/__pycache__/__init__.cpython-310.pyc and b/python/ur_simple_control/dmp/__pycache__/__init__.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/dmp/__pycache__/dmp.cpython-310.pyc and b/python/ur_simple_control/dmp/__pycache__/dmp.cpython-310.pyc differ
diff --git a/python/ur_simple_control/managers.py b/python/ur_simple_control/managers.py
index 70e8783c25401084bb70c7741593b4353053d1bb..df733acfd49f789012812efcd66287fff25aeee7 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 569adb6a237941a26870d3ebd68f85937dacedf2..def857098a0e15e46693d661a0b1744ace405aac 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 f48dca2fca2573f98152a4dfae84776c88ba14a6..b3caf99830613dface09cb63378d4e37e9ed58ea 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 01774898e12eb7e3aba235b9e662276522e720ca..772056d31d8fee4925631d0a826df6bfbb310afd 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 f45c70919684dc135f35391ab63f8d9e19989cbb..21a305dc4d6e70e9b3fda722cf1e3cd64d5275d1 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 a108d483e9240fcd5282f5f14888656a3c3e862d..bf0f73b58d66077ae4694538ff3f9339bc797597 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 0000000000000000000000000000000000000000..c335b9889a6cd24920756fa4ba62ccd215516f12
--- /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 0000000000000000000000000000000000000000..0be315e9b16ce2ac41854e6f504645a804a3ed61
--- /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 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc
--- /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 0000000000000000000000000000000000000000..c75a0c3a268cd969c655a6052e60cad8589bab36
--- /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 0000000000000000000000000000000000000000..3242cb585c2d47f3c9b545aaa444cc3bf839cc74
--- /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 4dee13fc6c070e01a3bca7b804984f6d9645b9f5..70433406afc348c8d243871e3bac6a7fc3c41903 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 853123cb2e00b78f079beab8e29ceb9251e378d7..bad89832078a424410d19018171475813882ed9a 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 f849890421afe2baa719e8822ed041b4c0ea68da..16fb7174f640ff4a00107b606bbf4abef70ae6e2 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
Binary files a/python/ur_simple_control/robot_descriptions/__pycache__/__init__.cpython-310.pyc and b/python/ur_simple_control/robot_descriptions/__pycache__/__init__.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/robot_descriptions/urdf/__pycache__/__init__.cpython-310.pyc and b/python/ur_simple_control/robot_descriptions/urdf/__pycache__/__init__.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/util/__pycache__/__init__.cpython-310.pyc and b/python/ur_simple_control/util/__pycache__/__init__.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/util/__pycache__/get_model.cpython-310.pyc and b/python/ur_simple_control/util/__pycache__/get_model.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/util/__pycache__/logging_utils.cpython-310.pyc and b/python/ur_simple_control/util/__pycache__/logging_utils.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/visualize/__pycache__/__init__.cpython-310.pyc and b/python/ur_simple_control/visualize/__pycache__/__init__.cpython-310.pyc differ
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
Binary files a/python/ur_simple_control/visualize/__pycache__/visualize.cpython-310.pyc and b/python/ur_simple_control/visualize/__pycache__/visualize.cpython-310.pyc differ