From 42ac3667726884f5f627136e5ab850f6c9a8679b Mon Sep 17 00:00:00 2001 From: m-guberina <gubi.guberina@gmail.com> Date: Mon, 10 Mar 2025 08:35:20 +0100 Subject: [PATCH] realyumirobotmanager + dummy publisher and subscriber --- examples/ros/dummy_cmds_pub.py | 83 +++++++++---------- python/smc.egg-info/PKG-INFO | 7 +- python/smc.egg-info/SOURCES.txt | 29 +------ .../smc/robots/implementations/mobile_yumi.py | 32 ++++++- python/smc/robots/utils.py | 4 +- 5 files changed, 77 insertions(+), 78 deletions(-) diff --git a/examples/ros/dummy_cmds_pub.py b/examples/ros/dummy_cmds_pub.py index d9c34f8..0c4653e 100755 --- a/examples/ros/dummy_cmds_pub.py +++ b/examples/ros/dummy_cmds_pub.py @@ -20,12 +20,17 @@ from geometry_msgs.msg import Twist, PoseWithCovarianceStamped from sensor_msgs.msg import JointState from nav_msgs.msg import Odometry from abb_python_utilities.names import get_rosified_name +from rclpy.callback_groups import ReentrantCallbackGroup import numpy as np import argparse -from smc.managers import getMinimalArgParser, ControlLoopManager, RobotManager -from smc.clik.clik import ( - getClikArgs, +from smc.robots.interfaces.whole_body_dual_arm_interface import ( + DualArmWholeBodyInterface, +) +from smc import getMinimalArgParser +from smc.control.control_loop_manager import ControlLoopManager +from smc.control.cartesian_space import getClikArgs +from smc.control.cartesian_space.cartesian_space_point_to_point import ( getClikController, controlLoopClik, moveL, @@ -34,20 +39,12 @@ from smc.clik.clik import ( invKinmQP, moveLDualArm, ) -from smc.optimal_control.get_ocp_args import get_OCP_args -from smc.optimal_control.crocoddyl_mpc import CrocoIKMPC +from smc.control.optimal_control.util import get_OCP_args +from smc.robots.utils import getRobotFromArgs import pinocchio as pin import numpy as np -import rclpy -from sensor_msgs.msg import JointState -from rclpy.callback_groups import ReentrantCallbackGroup -from rclpy.executors import MultiThreadedExecutor -from rclpy.node import Node - -from abb_python_utilities.names import get_rosified_name - # you will need to manually set everything here :( def get_args(): @@ -68,15 +65,16 @@ def get_args(): parser.add_argument("-r", action="append", nargs="*") parser.add_argument("-p", action="append", nargs="*") args = parser.parse_args() - args.robot = "yumi" + args.robot = "myumi" args.save_log = True - args.real_time_plotting = False + args.plotter = True + args.real = True return args class DummyNode(Node): def __init__( - self, args, robot_manager: RobotManager, loop_manager: ControlLoopManager + self, args, robot: DualArmWholeBodyInterface, loop_manager: ControlLoopManager ): super().__init__("dummy_cmds_pub_node") @@ -103,8 +101,8 @@ class DummyNode(Node): # connect to smc ########################################################### - robot_manager.set_publisher_joints_cmd(self._cmd_pub) - self.robot_manager = robot_manager + robot.set_publisher_joints_cmd(self._cmd_pub) + self.robot = robot self.loop_manager = loop_manager self.args = args # give me the latest thing even if there wasn't an update @@ -150,45 +148,44 @@ class DummyNode(Node): # self._t += self._dt def callback_base_odom(self, msg: Odometry): - self.robot_manager.v_q[0] = msg.twist.twist.linear.x - self.robot_manager.v_q[1] = msg.twist.twist.linear.y + self.robot._v[0] = msg.twist.twist.linear.x + self.robot._v[1] = msg.twist.twist.linear.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.v_q[2] = msg.twist.twist.angular.z - self.robot_manager.v_q[3] = 0 # for consistency + self.robot._v[2] = msg.twist.twist.angular.z + self.robot._v[3] = 0 # for consistency print("received /odom") def callback_arms_state(self, msg: JointState): - self.robot_manager.q[0] = 0.0 - self.robot_manager.q[1] = 0.0 - self.robot_manager.q[2] = 1.0 - self.robot_manager.q[3] = 0.0 - self.robot_manager.q[-14:-7] = msg.position[-14:-7] - self.robot_manager.q[-7:] = msg.position[-7:] - self.get_logger().info("jebem ti mamu") + self.robot._q[0] = 0.0 + self.robot._q[1] = 0.0 + self.robot._q[2] = 1.0 + self.robot._q[3] = 0.0 + self.robot._q[-14:-7] = msg.position[-14:-7] + self.robot._q[-7:] = msg.position[-7:] + self.get_logger().info("callback arms state") # def main(args=None): def main(args=None): # evil and makes args unusable but what can you do args_smc = get_args() - # print(args_smc) - rclpy.init(args=args) - - robot = RobotManager(args_smc) + assert args_smc.robot == "myumi" + robot = getRobotFromArgs(args_smc) # you can't do terminal input with ros # goal = robot.defineGoalPointCLI() - goal = pin.SE3.Identity() - goal.translation = np.array([0.3, 0.0, 0.5]) - if robot.robot_name == "yumi": - goal.rotation = np.eye(3) - goal_transform = pin.SE3.Identity() - goal_transform.translation[1] = 0.1 - goal_left = goal_transform.act(goal) - goal_left = goal_transform.inverse().act(goal) - # goal = (goal_left, goal_right) + T_w_absgoal = pin.SE3.Identity() + T_w_absgoal.translation = np.array([0.3, 0.0, 0.5]) + T_absgoal_l = pin.SE3.Identity() + T_absgoal_l.translation = np.array([-0.15, 0.0, 0.0]) + T_absgoal_r = pin.SE3.Identity() + T_absgoal_r.translation = np.array([0.15, 0.0, 0.0]) # loop_manager = CrocoIKMPC(args, robot, goal, run=False) - loop_manager = moveLDualArm(args_smc, robot, goal, goal_transform, run=False) + loop_manager = moveLDualArm( + args_smc, robot, T_w_absgoal, T_absgoal_l, T_absgoal_r, run=False + ) + + rclpy.init(args=args) executor = MultiThreadedExecutor() node = DummyNode(args, robot, loop_manager) diff --git a/python/smc.egg-info/PKG-INFO b/python/smc.egg-info/PKG-INFO index d5f66fa..c91e812 100644 --- a/python/smc.egg-info/PKG-INFO +++ b/python/smc.egg-info/PKG-INFO @@ -1,7 +1,12 @@ Metadata-Version: 2.1 Name: smc -Version: 0.2 +Version: 0.3 Summary: Simple Manipulator Control (SMC) - simplest possible framework for robot control. 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/smc.egg-info/SOURCES.txt b/python/smc.egg-info/SOURCES.txt index 7063d2e..7a0fec2 100644 --- a/python/smc.egg-info/SOURCES.txt +++ b/python/smc.egg-info/SOURCES.txt @@ -76,11 +76,7 @@ smc/control/joint_space/joint_space_trajectory_following.py smc/control/optimal_control/__init__.py smc/control/optimal_control/abstract_croco_ocp.py smc/control/optimal_control/create_pinocchio_casadi_ocp.py -smc/control/optimal_control/croco_mpc_path_following.py -smc/control/optimal_control/croco_mpc_point_to_point.py smc/control/optimal_control/notes.md -smc/control/optimal_control/path_following_croco_ocp.py -smc/control/optimal_control/point_to_point_croco_ocp.py smc/control/optimal_control/util.py smc/logging/__init__.py smc/logging/logger.py @@ -258,9 +254,7 @@ smc/path_generation/starworlds/utils/__init__.py smc/path_generation/starworlds/utils/cg.py smc/path_generation/starworlds/utils/misc.py smc/robots/__init__.py -smc/robots/abstract_simulated_robot.py smc/robots/notes_on_getting_model_from_urdf.md -smc/robots/robotmanager_abstract.py smc/robots/utils.py smc/robots/grippers/__init__.py smc/robots/grippers/abstract_gripper.py @@ -326,31 +320,10 @@ smc/vision/__init__.py smc/vision/vision.py smc/visualization/__init__.py smc/visualization/manipulator_comparison_visualizer.py -smc/visualization/manipulator_visual_motion_analyzer.py -smc/visualization/path_visualizer.py smc/visualization/plotters.py smc/visualization/visualizer.py -smc/visualization/arms/another_debug_dh -smc/visualization/arms/j2n6s300_dh_params -smc/visualization/arms/j2s7s300_dh_params -smc/visualization/arms/kinova_jaco_params -smc/visualization/arms/kuka_lbw_iiwa_dh_params -smc/visualization/arms/lbr_iiwa_jos_jedan_dh -smc/visualization/arms/robot_parameters2 -smc/visualization/arms/testing_dh_parameters -smc/visualization/arms/ur10e_dh_parameters_from_the_ur_site -smc/visualization/arms/ur5e_dh smc/visualization/meshcat_viewer_wrapper/__init__.py smc/visualization/meshcat_viewer_wrapper/colors.py smc/visualization/meshcat_viewer_wrapper/visualizer.py smc/visualization/obsolete_to_be_removed/main.py -smc/visualization/obsolete_to_be_removed/make_run.py -smc/visualization/robot_stuff/InverseKinematics.py -smc/visualization/robot_stuff/drawing.py -smc/visualization/robot_stuff/drawing_for_anim.py -smc/visualization/robot_stuff/follow_curve.py -smc/visualization/robot_stuff/forw_kinm.py -smc/visualization/robot_stuff/inv_kinm.py -smc/visualization/robot_stuff/joint_as_hom_mat.py -smc/visualization/robot_stuff/utils.py -smc/visualization/robot_stuff/webots_api_helper_funs.py \ No newline at end of file +smc/visualization/obsolete_to_be_removed/make_run.py \ No newline at end of file diff --git a/python/smc/robots/implementations/mobile_yumi.py b/python/smc/robots/implementations/mobile_yumi.py index 8c62ce2..f1d6850 100644 --- a/python/smc/robots/implementations/mobile_yumi.py +++ b/python/smc/robots/implementations/mobile_yumi.py @@ -12,6 +12,10 @@ import pinocchio as pin from argparse import Namespace import numpy as np +if find_spec("rclpy"): + from rclpy.time import Time + from sensor_msgs.msg import JointState + class AbstractMobileYuMiRobotManager(DualArmWholeBodyInterface): @@ -115,7 +119,7 @@ class RealMobileYumiRobotManager(AbstractMobileYuMiRobotManager): self.publisher_joints_cmd = publisher_joints_cmd print("set publisher_joints_cmd into RobotManager") - def sendVelocityCommand(self, v): + def sendVelocityCommandToReal(self, v: np.ndarray): # qd_base = qd[:3] # qd_left = qd[3:10] # qd_right = qd[10:] @@ -128,13 +132,35 @@ class RealMobileYumiRobotManager(AbstractMobileYuMiRobotManager): msg = empty_msg msg.header.stamp = Time().to_msg() for i in range(3): - msg.velocity[i] = qd_cmd[i] + msg.velocity[i] = v[i] for i in range(15, 29): - msg.velocity[i] = qd_cmd[i - 12] + msg.velocity[i] = v[i - 12] self.publisher_joints_cmd.publish(msg) # TODO: define set initial pose by reading it from the real robot (well, the appropriate ros2 topic in this case) + def _updateQ(self): + pass + + def _updateV(self): + pass + + def stopRobot(self): + self.sendVelocityCommand(np.zeros(self.model.nv)) + + def setFreedrive(self): + pass + + def unSetFreedrive(self): + pass + + def connectToRobot(self): + pass + + # TODO: create simulated gripper class to support the move, open, close methods - it's a mess now + # in simulation we can just set the values directly + def connectToGripper(self): + pass # TODO: define a separate mobile base for YuMi here diff --git a/python/smc/robots/utils.py b/python/smc/robots/utils.py index c0df4b4..4d53987 100644 --- a/python/smc/robots/utils.py +++ b/python/smc/robots/utils.py @@ -278,9 +278,7 @@ def getRobotFromArgs(args: argparse.Namespace) -> AbstractRobotManager: return SimulatedYuMiRobotManager(args) if args.robot == "myumi": if args.real: - pass - # TODO: finish it - # return RealMobileYuMiRobotManager(args) + return RealMobileYuMiRobotManager(args) else: return SimulatedMobileYuMiRobotManager(args) if args.robot == "mir": -- GitLab