Example #1
0
 def _pub_joint_torques(self, torques):
     joint_state = JointState()
     joint_state.effort = tuple(torques)
     self.joint_pub.publish(joint_state)
        delta_q = jacobian_inv * delta_x

        q_1_delta = delta_q[0][0]
        q_2_delta = delta_q[1][0]
        q_3_delta = delta_q[2][0]
        self.q_1 = self.q_1 + q_1_delta
        self.q_2 = self.q_2 + q_2_delta
        self.q_3 = self.q_3 + q_3_delta


rf = quad_leg(-a_global, -b_global, q_1_nom, q_2_nom, q_3_nom, l_1_global)
lf = quad_leg(a_global, -b_global, q_1_nom, q_2_nom, q_3_nom, -l_1_global)
rb = quad_leg(-a_global, -b_global, q_1_nom, q_2_nom, q_3_nom, l_1_global)
lb = quad_leg(a_global, -b_global, q_1_nom, q_2_nom, q_3_nom, -l_1_global)

hello_str = JointState()
hello_str.header = Header()
hello_str.name = [
    'shoulder_joint_lf', 'elbow_joint_lf', 'wrist_joint_lf', 'ankle_joint_lf',
    'shoe_joint_lf', 'shoulder_joint_rf', 'elbow_joint_rf', 'wrist_joint_rf',
    'ankle_joint_rf', 'shoe_joint_rf', 'shoulder_joint_lb', 'elbow_joint_lb',
    'wrist_joint_lb', 'fffankle_joint_lb', 'shoe_joint_lb',
    'shoulder_joint_rb', 'elbow_joint_rb', 'wrist_joint_rb', 'ankle_joint_rb',
    'shoe_joint_rb'
]
hello_str.velocity = []
hello_str.effort = []


def callback(data):
    rf.set_nom_position()
Example #3
0
 def joint_publish(self, q):
     joint_command = JointState()
     joint_command.header.stamp = rospy.Time.now()
     joint_command.name = ['joint1', 'joint2']
     joint_command.position = q
     self.joint_pub.publish(joint_command)
    def __init__(self,
                 prefix="",
                 gripper="",
                 interface='eth0',
                 jaco_ip="10.66.171.15",
                 dof=""):
        """
        Constructor
        """

        # Setup a lock for accessing data in the control loop
        self._lock = threading.Lock()

        # Assume success until posted otherwise
        rospy.loginfo('Starting JACO2 control')
        self.init_success = True

        self._prefix = prefix
        self.iface = interface
        self.arm_dof = dof

        # List of joint names
        if ("6dof" == self.arm_dof):
            self._joint_names = [
                self._prefix + '_shoulder_pan_joint',
                self._prefix + '_shoulder_lift_joint',
                self._prefix + '_elbow_joint', self._prefix + '_wrist_1_joint',
                self._prefix + '_wrist_2_joint',
                self._prefix + '_wrist_3_joint'
            ]
        elif ("7dof" == self.arm_dof):
            self._joint_names = [
                self._prefix + '_shoulder_pan_joint',
                self._prefix + '_shoulder_lift_joint',
                self._prefix + '_arm_half_joint',
                self._prefix + '_elbow_joint',
                self._prefix + '_wrist_spherical_1_joint',
                self._prefix + '_wrist_spherical_2_joint',
                self._prefix + '_wrist_3_joint'
            ]

        else:
            rospy.logerr(
                "DoF needs to be set 6 or 7, cannot start SIArmController")
            return

        self._num_joints = len(self._joint_names)

        # Create the hooks for the API
        if ('left' == prefix):
            self.api = KinovaAPI('left', self.iface, jaco_ip, '255.255.255.0',
                                 24000, 24024, 44000, self.arm_dof)
        elif ('right' == prefix):
            self.api = KinovaAPI('right', self.iface, jaco_ip, '255.255.255.0',
                                 25000, 25025, 55000, self.arm_dof)
        else:
            rospy.logerr(
                "prefix needs to be set to left or right, cannot start the controller"
            )
            return

        if not (self.api.init_success):
            self.Stop()
            return

        self.api.SetCartesianControl()
        self._position_hold = False
        self.estop = False

        # Initialize the joint feedback
        pos = self.api.get_angular_position()
        vel = self.api.get_angular_velocity()
        force = self.api.get_angular_force()
        self._joint_fb = dict()
        self._joint_fb['position'] = pos[:self._num_joints]
        self._joint_fb['velocity'] = vel[:self._num_joints]
        self._joint_fb['force'] = force[:self._num_joints]

        if ("kg2" == gripper) or ("rq85" == gripper):
            self._gripper_joint_names = [
                self._prefix + '_gripper_finger1_joint',
                self._prefix + '_gripper_finger2_joint'
            ]
            self.num_fingers = 2
        elif ("kg3" == gripper):
            self._gripper_joint_names = [
                self._prefix + '_gripper_finger1_joint',
                self._prefix + '_gripper_finger2_joint',
                self._prefix + '_gripper_finger3_joint'
            ]
            self.num_fingers = 3

        if (0 != self.num_fingers):
            self._gripper_fb = dict()
            self._gripper_fb['position'] = pos[self.
                                               _num_joints:self._num_joints +
                                               self.num_fingers]
            self._gripper_fb['velocity'] = vel[self.
                                               _num_joints:self._num_joints +
                                               self.num_fingers]
            self._gripper_fb['force'] = force[self.
                                              _num_joints:self._num_joints +
                                              self.num_fingers]

        # Register the publishers and subscribers
        self.last_cartesian_vel_cmd_update = rospy.get_time() - 0.5
        # X, Y, Z, ThetaX, ThetaY, ThetaZ, FingerVel
        self._last_cartesian_vel_cmd = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
        self._cartesian_vel_cmd_sub = rospy.Subscriber(
            "/movo/%s_arm/cartesian_vel_cmd" % self._prefix,
            JacoCartesianVelocityCmd, self._update_cartesian_vel_cmd)

        self.last_angular_vel_cmd_update = rospy.get_time() - 0.5
        self._last_angular_vel_cmd = [0.0
                                      ] * (self._num_joints + self.num_fingers)
        if "6dof" == self.arm_dof:
            self._angular_vel_cmd_sub = rospy.Subscriber(
                "/movo/%s_arm/angular_vel_cmd" % self._prefix,
                JacoAngularVelocityCmd6DOF, self._update_angular_vel_cmd)
        elif "7dof" == self.arm_dof:
            self._angular_vel_cmd_sub = rospy.Subscriber(
                "/movo/%s_arm/angular_vel_cmd" % self._prefix,
                JacoAngularVelocityCmd7DOF, self._update_angular_vel_cmd)
        else:
            # Error condition
            rospy.logerr("DoF needs to be set 6 or 7, was {}".format(
                self.arm_dof))
            self.Stop()
            return

        self._gripper_vel_cmd = 0.0
        self._ctl_mode = SIArmController.TRAJECTORY
        self.api.set_control_mode(KinovaAPI.ANGULAR_CONTROL)
        self._jstpub = rospy.Publisher("/movo/%s_arm_controller/state" %
                                       self._prefix,
                                       JointTrajectoryControllerState,
                                       queue_size=10)
        self._jstmsg = JointTrajectoryControllerState()
        self._jstmsg.header.seq = 0
        self._jstmsg.header.frame_id = ''
        self._jstmsg.header.stamp = rospy.get_rostime()
        self._jspub = rospy.Publisher("/movo/%s_arm/joint_states" %
                                      self._prefix,
                                      JointState,
                                      queue_size=10)
        self._jsmsg = JointState()
        self._jsmsg.header.seq = 0
        self._jsmsg.header.frame_id = ''
        self._jsmsg.header.stamp = rospy.get_rostime()
        self._jsmsg.name = self._joint_names

        self._actfdbk_pub = rospy.Publisher("/movo/%s_arm/actuator_feedback" %
                                            self._prefix,
                                            KinovaActuatorFdbk,
                                            queue_size=10)
        self._actfdbk_msg = KinovaActuatorFdbk()
        self._jsmsg.header.seq = 0
        self._jsmsg.header.frame_id = ''
        self._jsmsg.header.stamp = rospy.get_rostime()

        if (0 != self.num_fingers):
            self._gripper_vel_cmd_sub = rospy.Subscriber(
                "/movo/%s_gripper/vel_cmd" % self._prefix, Float32,
                self._update_gripper_vel_cmd)
            self._gripper_jspub = rospy.Publisher(
                "/movo/%s_gripper/joint_states" % self._prefix,
                JointState,
                queue_size=10)
            self._gripper_jsmsg = JointState()
            self._gripper_jsmsg.header.seq = 0
            self._gripper_jsmsg.header.frame_id = ''
            self._gripper_jsmsg.header.stamp = rospy.get_rostime()
            self._gripper_jsmsg.name = self._gripper_joint_names

        # Set initial parameters for the controller
        if (0 != self.num_fingers):
            self._gripper_pid = [None] * self.num_fingers
            for i in range(self.num_fingers):
                self._gripper_pid[i] = JacoPID(5.0, 0.0, 0.8)
            self._gripper_vff = DifferentiateSignals(
                self.num_fingers, self._gripper_fb['position'])
            self._gripper_rate_limit = RateLimitSignals(
                [FINGER_ANGULAR_VEL_LIMIT] * self.num_fingers,
                self.num_fingers, self._gripper_fb['position'])

        if ("6dof" == self.arm_dof):
            self._arm_rate_limit = RateLimitSignals(JOINT_6DOF_VEL_LIMITS,
                                                    self._num_joints,
                                                    self._joint_fb['position'])

        if ("7dof" == self.arm_dof):
            self._arm_rate_limit = RateLimitSignals(JOINT_7DOF_VEL_LIMITS,
                                                    self._num_joints,
                                                    self._joint_fb['position'])

        self._arm_vff_diff = DifferentiateSignals(self._num_joints,
                                                  self._joint_fb['position'])

        self._pid = [None] * self._num_joints

        for i in range(self._num_joints):
            self._pid[i] = JacoPID(5.0, 0.0, 0.8)

        self.pause_controller = False

        self._init_ext_joint_position_control()
        self._init_ext_gripper_control()

        # Update the feedback once to get things initialized
        self._update_controller_data()

        # Start the controller
        rospy.loginfo("Starting the %s controller" % self._prefix)
        self._done = False
        self._t1 = rospy.Timer(rospy.Duration(0.01), self._run_ctl)
    def __init__(self):
        rospy.init_node('arm_tracker')

        # Initialize the move_group API
        moveit_commander.roscpp_initialize(sys.argv)

        rospy.on_shutdown(self.shutdown)

        # Initialize the move group for the right arm
        self.right_arm = moveit_commander.MoveGroupCommander(GROUP_NAME_ARM)

        self.right_arm.set_planner_id("RRTkConfigDefault")

        # Keep track of the last target pose
        self.last_target_pose = PoseStamped()

        # Set the right arm reference frame
        self.right_arm.set_pose_reference_frame(REFERENCE_FRAME)

        # Allowing replanning slows things down
        self.right_arm.allow_replanning(False)

        # Set a position tolerance in meters
        self.right_arm.set_goal_position_tolerance(0.01)

        # Set an orientation tolerance in radians
        self.right_arm.set_goal_orientation_tolerance(0.05)

        self.right_arm.set_planning_time(0.02)

        # Set max acceleration and velocity scaling (0-1)
        self.right_arm.set_max_acceleration_scaling_factor(1.0)

        self.right_arm.set_max_velocity_scaling_factor(1.0)

        # What is the end effector link?
        self.end_effector_link = self.right_arm.get_end_effector_link()

        # Track how many times are given a request
        self.request_count = 0

        # Track how many requests are successful
        self.move_count = 0

        # Use Cartesian planning?
        self.cartesian = True

        # How close is close enough? (Radians for joint angles)
        self.close_enough = 0.01

        #self.joint_names = self.right_arm.get_joint_names()

        # Monitor the current joint states
        self.joint_states = JointState()

        rospy.wait_for_message('joint_states', JointState)

        self.joint_states_subscriber = rospy.Subscriber(
            'joint_states', JointState, self.update_joint_states, queue_size=1)

        # Use queue_size=1 so we don't pile up outdated target messages
        self.target_subscriber = rospy.Subscriber('target_pose',
                                                  PoseStamped,
                                                  self.update_target_pose,
                                                  queue_size=1)

        rospy.loginfo("Ready for action!")
 def initialize(self):
     self.msg = JointState()
     return True
Example #7
0
def update_simulation(world, sim, d_time):
    # This code manually updates the visualization while doing other stuff for ROS: publishing joint_states, floating
    # frame's tf, publishing touch data, object pose and twist

    # Creating the present robot
    present_robot = world.robot(world.numRobots() - 1)

    # Creating the joints name array
    joint_names_array = []
    for i in joints_dict:
        joint_names_array.append(joints_dict[i])

    # Creating the JointState msg to be published
    joints_msg = JointState()
    joints_msg.name = joint_names_array
    joints_msg.effort = []
    joints_msg.velocity = []

    # Creating a TransformStamped
    static_transform_stamped = geometry_msgs.msg.TransformStamped()
    static_transform_stamped.header.frame_id = world_frame_name

    # Creating the Int8 msg for touch publishing and the touch memory
    touch_msg = Int8()
    touch_memory = []

    vis.add("world", world)
    vis.show()
    t0 = time.time()
    sim_time = d_time

    print 'The sim time in main is ', d_time

    # Publishing all what is needed for adaptive grasping and calling it
    publish_joints(present_robot, joints_msg)
    publish_palm(present_robot, static_transform_stamped)
    publish_object(world, static_transform_stamped)

    # Waiting and calling the adaptive grasping
    rospy.wait_for_service(adaptive_grasping_service_name)
    if not call_adaptive_grasping(True):
        return

    # Waiting for a message in the hand and palm command topics
    # This is to avoid the integration in adaptive_controller crashing
    rospy.wait_for_message(hand_topic, Float64, 3.0)
    rospy.wait_for_message(arm_topic, Twist, 3.0)

    while vis.shown():

        # Simulating and updating visualization
        vis.lock()
        sim.simulate(sim_time)
        sim.updateWorld()
        vis.unlock()

        # Publishing joint states, palm frame and object frame, pose and twist
        publish_joints(present_robot, joints_msg)
        publish_palm(present_robot, static_transform_stamped)
        publish_object(world, static_transform_stamped)

        # Getting the new touch id and publishing it while checking for algorithm stopping conditions
        force_palm, num_contacts = check_contacts(world, sim, touch_memory,
                                                  touch_msg)
        syn_now = sim.controller(0).getSensedConfig()[34]

        # Stopping adaptive grasping if stopping conditions (too much force on palm or too many contacts)
        print 'The stop adaptive bool is ', global_vars.stop_adaptive_command
        if force_palm or num_contacts >= max_num_contacts or syn_now > global_vars.syn_closed or global_vars.stop_adaptive_command.data:
            if global_vars.is_adaptive_running:
                if not call_adaptive_grasping(False):
                    return

        # Sleeping a little bit
        t1 = time.time()
        time.sleep(max(0.01 - (t1 - t0), 0.001))
        t0 = t1

    return
Example #8
0
    def __init__(self, use_moveit=False):
        # self.is_stopping = False

        rospy.loginfo('Starting the Franka interface!')
        rospy.init_node("deeprobot_franka_interface")
        # self.rate = rospy.Rate(30) # 30 Hz
        self.rate = rospy.Rate(100)  # 100 Hz
        self.curr_velo_pub = rospy.Publisher(
            '/joint_velocity_node_controller/joint_velocity',
            JointVelocity,
            queue_size=1)
        self.curr_pos_pub = rospy.Publisher(
            '/joint_position_node_controller/joint_position',
            JointPosition,
            queue_size=1)
        # self.pc = PandaCommander(group_name='panda_arm_hand')
        self.joint_names = {
            'left_s0', 'left_s1', 'left_e0', 'left_e1', 'left_w0', 'left_w1',
            'left_w2'
        }
        self.index_corr = {
            'left_s0': 1,
            'left_s1': 2,
            'left_e0': 3,
            'left_e1': 4,
            'left_w0': 5,
            'left_w1': 6,
            'left_w2': 7
        }  # the index correspondence

        self.bridge = cv_bridge.CvBridge()
        self.curr_im = np.zeros((3, 480, 640))
        self.control_accuracy = 0.01
        self.use_moveit = use_moveit
        if self.use_moveit:
            self.cs = ControlSwitcher({
                'moveit':
                'position_joint_trajectory_controller',
                'velocity':
                'joint_velocity_node_controller'
            })
            rospy.wait_for_message('move_group/status', GoalStatusArray)
            self.panda_moveit_commander = MoveGroupCommander('panda_arm')
        else:
            self.cs = ControlSwitcher({
                'position':
                'joint_position_node_controller',
                'velocity':
                'joint_velocity_node_controller'
            })
        self.cs.switch_controller('velocity')
        self.target_joint_state = JointState()
        self.target_joint_state.name = [
            "panda_joint1", "panda_joint2", "panda_joint3", "panda_joint4",
            "panda_joint5", "panda_joint6", "panda_joint7"
        ]
        self.target_joint_state.position = [
            -1.29, -0.26, -0.27, -2.34, 0.12, 2.10, 0.48
        ]
        self.robot_state = None
        self.curr_joint_angles = None
        self.ROBOT_ERROR_DETECTED = False
        self.image_sub = rospy.Subscriber("/camera/color/image_raw", Image,
                                          self.__updateCurrRGBImage)
        self.robot_state_sub = rospy.Subscriber(
            '/franka_state_controller/franka_states',
            FrankaState,
            self.__robot_state_callback,
            queue_size=1)

        # magic constant: joint speed :)
        # self.interface.set_joint_position_speed(0.9)

        # if moveToInitial: self.initCam()

        # initialize the desired position with the current position
        # angles = self.interface.joint_angles()
        # self.desired_joint_pos = { key: angles[key] for key in self.joint_names }
        rospy.loginfo('Initialization finished!')
Example #9
0
    def test_multisensor_pose_jacobian(self):
        configA = yaml.load('''
                chain_id: chainA
                before_chain: [transformA]
                dh_link_num:  1
                after_chain:  [transformB]
            ''')

        configB = yaml.load('''
                chain_id: chainB
                before_chain: [transformA]
                dh_link_num:  1
                after_chain:  [transformB]
            ''')

        robot_params = RobotParams()
        robot_params.configure(
            yaml.load('''
            dh_chains:
              chainA:
              - [ 0, 0, 1, 0 ]
              chainB:
              - [ 0, 0, 2, 0 ]
            tilting_lasers: {}
            rectified_cams: {}
            transforms:
                transformA: [0, 0, 0, 0, 0, 0]
                transformB: [0, 0, 0, 0, 0, 0]
            checkerboards:
              boardA:
                corners_x: 2
                corners_y: 2
                spacing_x: 1
                spacing_y: 1
            '''))

        free_dict = yaml.load('''
            dh_chains:
              chainA:
              - [ 1, 0, 0, 0 ]
              chainB:
              - [ 0, 0, 0, 0 ]
            tilting_lasers: {}
            rectified_cams: {}
            transforms:
                transformA: [0, 0, 0, 0, 0, 0]
                transformB: [0, 0, 0, 0, 0, 0]
            checkerboards:
              boardA:
                spacing_x: 0
                spacing_y: 0
            ''')

        sensorA = ChainSensor(
            configA,
            ChainMeasurement(chain_id="chainA",
                             chain_state=JointState(position=[0])), "boardA")

        sensorB = ChainSensor(
            configB,
            ChainMeasurement(chain_id="chainB",
                             chain_state=JointState(position=[0])), "boardA")

        multisensor = MultiSensor(None)
        multisensor.sensors = [sensorA, sensorB]
        multisensor.checkerboard = "boardA"

        pose_param_vec = numpy.array([0, 0, 0, 0, 0, 0])
        calc = ErrorCalc(robot_params, free_dict, [])

        expanded_param_vec = robot_params.deflate()
        free_list = robot_params.calc_free(free_dict)
        opt_param_mat = expanded_param_vec[numpy.where(free_list), 0].copy()
        opt_param = numpy.array(opt_param_mat)[0]

        J = calc.multisensor_pose_jacobian(opt_param, pose_param_vec,
                                           multisensor)

        print J
Example #10
0
 def reset_goal(self):
     state = JointState()
     state.name = op3_module_names
     state.position = np.zeros(len(op3_module_names))
     self.link_states_publisher.publish(state)
Example #11
0
 def publish_action2(self, action):
     state = JointState()
     state.name = op3_module_names
     state.position = action[:len(op3_module_names)]
     self.link_states_publisher.publish(state)
def poppy_node():
    #start node
    rospy.init_node('poppy_node')
    rate = rospy.Rate(10)

    #from creature param, create creature object
    creature = rospy.get_param(rospy.get_name() + '/creature',
                               'poppy-humanoid')
    global poppy

    if creature.endswith(".json"):
        import pypot.robot
        poppy = pypot.robot.from_config(creature)
    else:
        libraryName = creature.replace('-', '_')

        objectName = creature.replace('-', " ")
        objectName = objectName.title()
        objectName = objectName.replace(" ", "")

        from importlib import import_module

        mod = import_module(libraryName)
        met = getattr(mod, objectName)

        poppy = met()

    #set motors info as params
    for m in poppy.motors:
        rospy.set_param(rospy.get_name() + '/motor/' + m.name + '/id', m.id)
        rospy.set_param(rospy.get_name() + '/motor/' + m.name + '/model',
                        m.model)
        rospy.set_param(rospy.get_name() + '/motor/' + m.name + '/direct',
                        m.direct)
        rospy.set_param(rospy.get_name() + '/motor/' + m.name + '/offset',
                        m.offset)
        rospy.set_param(rospy.get_name() + '/motor/' + m.name + '/upper_limit',
                        m.upper_limit)
        rospy.set_param(rospy.get_name() + '/motor/' + m.name + '/lower_limit',
                        m.lower_limit)

    #create publishers for motors present_position, present_speed, present_load and goal_position and goal_speed and max_torque
    pubs = {}

    pubs[rospy.get_name() + '/motors/read_present'] = rospy.Publisher(
        rospy.get_name() + '/motors/read_present', JointState, queue_size=10)
    pubs[rospy.get_name() + '/motors/read_goal'] = rospy.Publisher(
        rospy.get_name() + '/motors/read_goal', JointState, queue_size=10)

    #subscribe to topic to change the goal_position, goal_speed and compliance
    rospy.Subscriber(rospy.get_name() + '/motors/write', JointState,
                     JointStateWrite)

    for p in poppy.primitives:
        rospy.Subscriber(rospy.get_name() + '/primitive/' + p.name + '/start',
                         String,
                         usePrimitive,
                         callback_args=[p.name, "start"])
        rospy.Subscriber(rospy.get_name() + '/primitive/' + p.name + '/stop',
                         String,
                         usePrimitive,
                         callback_args=[p.name, "stop"])

    while not rospy.is_shutdown():

        msg = JointState()
        msg.name = []
        msg.position = []
        msg.velocity = []
        msg.effort = []

        for m in poppy.motors:
            msg.name.append(m.name)
            msg.position.append(m.present_position)
            msg.velocity.append(m.present_speed)
            msg.effort.append(m.present_load)

        pubs[rospy.get_name() + '/motors/read_present'].publish(msg)

        msg = JointState()
        msg.name = []
        msg.position = []
        msg.velocity = []
        msg.effort = []

        for m in poppy.motors:
            msg.name.append(m.name)
            msg.position.append(m.goal_position)
            msg.velocity.append(m.goal_speed)
            msg.effort.append(m.max_torque)

        pubs[rospy.get_name() + '/motors/read_goal'].publish(msg)

        rate.sleep()
Example #13
0
def get_joint_state(cont):
    joints = JointState()
    joints.header.stamp = rospy.get_rostime()
    joints.name = ["left_wheel", "right_wheel"]
    joints.velocity = cont
    return joints
#!/usr/bin/env python

import rospy
#from std_msgs.msg import String
from sensor_msgs.msg import JointState
#from std_msgs.msg import Float64MultiArray
from cisst_msgs.msg import vctDoubleVec

pub = rospy.Publisher('my_tor_node2', JointState)  #, queue_size=10
msg = JointState()


def callback(data):
    tup = data.data
    rospy.loginfo(rospy.get_caller_id())
    print(tup)
    msg.header.seq = 0
    msg.header.stamp.secs = 0
    msg.header.stamp.nsecs = 0
    msg.header.frame_id = ''
    msg.name = []
    msg.position = []
    msg.velocity = []
    msg.effort = tup
    print(msg.effort)
    pub.publish(msg)


def tor_listener():

    # In ROS, nodes are uniquely named. If two nodes with the same
Example #15
0
		data=''
		begin=time.time()
		while 1:
			#if you got some data, then timeout break 
			if total_data and time.time()-begin>timeout:
				break
			#if you got no data at all, wait a little longer
			elif time.time()-begin>timeout*2:
				break
			try:
				data=self.labview_sock.recv(8192)
				if data:
					total_data.append(data)
					begin=time.time()
			except:
				pass
		return ''.join(total_data)
		
		
if __name__ == '__main__':
	rospy.init_node('labview_server')
	server = LabviewServer()
	while not rospy.is_shutdown():
		msg_ros = JointState()
		data = server.recv_timeout()
		if data:
			#~ fmt = '<IiiI5sIIssIssIssIssIssIssIssssI7d'
			#~ msg_py = struct.unpack(fmt, data[:struct.calcsize(fmt)])
			#~ print msg_py
			print msg_ros.deserialize(data)
Example #16
0
    def test_full_jacobian(self):
        configA = yaml.load('''
                chain_id: chainA
                before_chain: [transformA]
                dh_link_num:  1
                after_chain:  []
            ''')

        configB = yaml.load('''
                chain_id: chainB
                before_chain: []
                dh_link_num:  1
                after_chain:  [transformB]
            ''')

        robot_params = RobotParams()
        robot_params.configure(
            yaml.load('''
            dh_chains:
              chainA:
              - [ 0, 0, 1, 0 ]
              chainB:
              - [ 0, 0, 2, 0 ]
            tilting_lasers:
              laserB:
                before_joint: [0, 0, 0, 0, 0, 0]
                after_joint:  [0, 0, 0, 0, 0, 0]
            rectified_cams: {}
            transforms:
                transformA: [0, 0, 0, 0, 0, 0]
                transformB: [0, 0, 0, 0, 0, 0]
            checkerboards:
              boardA:
                corners_x: 2
                corners_y: 2
                spacing_x: 1
                spacing_y: 1
              boardB:
                corners_x: 1
                corners_y: 1
                spacing_x: 1
                spacing_y: 1
            '''))

        free_dict = yaml.load('''
            dh_chains:
              chainA:
              - [ 1, 0, 0, 0 ]
              chainB:
              - [ 0, 0, 0, 0 ]
            tilting_lasers:
              laserB:
                before_joint: [1, 0, 0, 0, 0, 0]
                after_joint:  [0, 0, 0, 0, 0, 0]
            rectified_cams: {}
            transforms:
                transformA: [0, 0, 0, 0, 0, 0]
                transformB: [1, 0, 0, 0, 0, 0]
            checkerboards:
              boardA:
                spacing_x: 1
                spacing_y: 1
              boardB:
                spacing_x: 0
                spacing_y: 0
            ''')

        sensorA = ChainSensor(
            configA,
            ChainMeasurement(chain_id="chainA",
                             chain_state=JointState(position=[0])), "boardA")
        sensorB = ChainSensor(
            configB,
            ChainMeasurement(chain_id="chainB",
                             chain_state=JointState(position=[0])), "boardB")
        laserB = TiltingLaserSensor(
            {'laser_id': 'laserB'},
            LaserMeasurement(laser_id="laserB",
                             joint_points=[JointState(position=[0, 0, 2])]))

        multisensorA = MultiSensor(None)
        multisensorA.sensors = [sensorA]
        multisensorA.checkerboard = "boardA"
        multisensorA.update_config(robot_params)

        multisensorB = MultiSensor(None)
        multisensorB.sensors = [sensorB, laserB]
        multisensorB.checkerboard = "boardB"
        multisensorB.update_config(robot_params)

        poseA = numpy.array([1, 0, 0, 0, 0, 0])
        poseB = numpy.array([2, 0, 0, 0, 0, 0])

        calc = ErrorCalc(robot_params, free_dict, [multisensorA, multisensorB])

        expanded_param_vec = robot_params.deflate()
        free_list = robot_params.calc_free(free_dict)
        opt_param_mat = expanded_param_vec[numpy.where(free_list), 0].copy()
        opt_param = numpy.array(opt_param_mat)[0]
        opt_all_vec = concatenate([opt_param, poseA, poseB])

        print "Calculating Sparse"
        J = calc.calculate_jacobian(opt_all_vec)
        numpy.savetxt("J_sparse.txt", J, fmt="% 4.3f")

        #import code; code.interact(local=locals())

        print "Calculating Dense"
        from scipy.optimize.slsqp import approx_jacobian
        J_naive = approx_jacobian(opt_all_vec, calc.calculate_error, 1e-6)
        numpy.savetxt("J_naive.txt", J_naive, fmt="% 4.3f")

        self.assertAlmostEqual(numpy.linalg.norm(J - J_naive), 0.0, 6)
Example #17
0
def main():
    print "INITIALIZING TORSO NODE IN SIMULATION MODE BY MARCOSOFT..."
    ###Connection with ROS
    global pubGoalReached
    rospy.init_node("torso")
    br = tf.TransformBroadcaster()
    jointStates = JointState()
    jointStates.name = [
        "spine_connect", "waist_connect", "shoulders_connect",
        "shoulders_left_connect", "shoulders_right_connect"
    ]
    jointStates.position = [0.0, 0.0, 0.0, 0.0, 0.0]

    rospy.Subscriber("/hardware/torso/goal_pose", Float32MultiArray,
                     callbackGoalPose)
    rospy.Subscriber("/hardware/torso/goal_rel_pose", Float32MultiArray,
                     callbackRelPose)
    pubJointStates = rospy.Publisher("/joint_states", JointState, queue_size=1)
    pubCurrentPose = rospy.Publisher("/hardware/torso/current_pose",
                                     Float32MultiArray,
                                     queue_size=1)
    pubGoalReached = rospy.Publisher("/hardware/torso/goal_reached",
                                     Bool,
                                     queue_size=1)

    loop = rospy.Rate(60)

    global goalSpine
    global goalWaist
    global goalShoulders
    global spine
    global waist
    global shoulders
    global newGoal
    goalSpine = 0.0
    goalWaist = 0.0
    goalShoulders = 0.0
    spine = 0
    waist = 0
    shoulders = 0
    speedSpine = 0.005
    speedWaist = 0.1
    speedShoulders = 0.1
    msgCurrentPose = Float32MultiArray()
    msgGoalReached = Bool()
    msgCurrentPose.data = [0, 0, 0]
    newGoal = False

    while not rospy.is_shutdown():
        deltaSpine = goalSpine - spine
        deltaWaist = goalWaist - waist
        deltaShoulders = goalShoulders - shoulders
        if deltaSpine > speedSpine:
            deltaSpine = speedSpine
        if deltaSpine < -speedSpine:
            deltaSpine = -speedSpine
        if deltaWaist > speedWaist:
            deltaWaist = speedWaist
        if deltaWaist < -speedWaist:
            deltaWaist = -speedWaist
        if deltaShoulders > speedShoulders:
            deltaShoulders = speedShoulders
        if deltaShoulders < -speedShoulders:
            deltaShoulders = -speedShoulders

        spine += deltaSpine
        waist += deltaWaist
        shoulders += deltaShoulders
        jointStates.header.stamp = rospy.Time.now()
        jointStates.position = [
            spine, waist, shoulders, -shoulders, -shoulders
        ]
        pubJointStates.publish(jointStates)

        msgCurrentPose.data[0] = spine
        msgCurrentPose.data[1] = waist
        msgCurrentPose.data[2] = shoulders
        pubCurrentPose.publish(msgCurrentPose)

        if newGoal and abs(goalSpine - spine) < 0.02 and abs(
                goalWaist - waist) < 0.05 and abs(goalShoulders -
                                                  shoulders) < 0.05:
            newGoal = False
            msgGoalReached.data = True
            pubGoalReached.publish(msgGoalReached)

        loop.sleep()
Example #18
0
    def test_single_sensor(self):
        config = yaml.load('''
                chain_id: chainA
                before_chain: [transformA]
                dh_link_num:  1
                after_chain:  [transformB]
            ''')

        robot_params = RobotParams()
        robot_params.configure(
            yaml.load('''
            dh_chains:
              chainA:
              - [ 0, 0, 1, 0 ]
              chainB:
              - [ 0, 0, 2, 0 ]
            tilting_lasers: {}
            rectified_cams: {}
            transforms:
                transformA: [0, 0, 0, 0, 0, 0]
                transformB: [0, 0, 0, 0, 0, 0]
            checkerboards:
              boardA:
                corners_x: 2
                corners_y: 2
                spacing_x: 1
                spacing_y: 1
            '''))

        free_dict = yaml.load('''
            dh_chains:
              chainA:
              - [ 1, 0, 1, 0 ]
              chainB:
              - [ 0, 0, 0, 0 ]
            tilting_lasers: {}
            rectified_cams: {}
            transforms:
                transformA: [1, 0, 0, 0, 0, 0]
                transformB: [0, 0, 0, 0, 0, 0]
            checkerboards:
              boardA:
                spacing_x: 1
                spacing_y: 1
            ''')

        chainM = ChainMeasurement(chain_id="chainA",
                                  chain_state=JointState(position=[0]))

        sensor = ChainSensor(config, chainM, "boardA")
        sensor.update_config(robot_params)

        target_pts = matrix([[1, 2, 1, 2], [0, 0, 1, 1], [0, 0, 0, 0],
                             [1, 1, 1, 1]])

        calc = ErrorCalc(robot_params, free_dict, [])

        expanded_param_vec = robot_params.deflate()
        free_list = robot_params.calc_free(free_dict)
        opt_param_mat = expanded_param_vec[numpy.where(free_list), 0].copy()
        opt_param = numpy.array(opt_param_mat)[0]

        J = calc.single_sensor_params_jacobian(opt_param, target_pts, sensor)

        print J
def callback(transform):

    rospy.loginfo(rospy.get_name() + "\nI'm doing ik\n")

    # receive desired end effector positions in mm + theta
    X = transform.translation.x
    Y = transform.translation.y
    Z = transform.translation.z
    Theta = transform.rotation.w
    print transform.translation
    print transform.rotation
    # kinematic constants in mm
    E1, E2, RB, B2, A, B, D = 29.239, 29.239, 55.48, 34.1675, 111.76, 53.98, 8.255
    J = []  # motor positions in radians
    counter = 0
    for m in range(0, 4):
        if m == 0:
            xg = -Y - E1 * (math.sin(Theta) - math.cos(Theta)) + E2
            yg = X + E1 * (math.cos(Theta) + math.sin(Theta)) - B2
            zg = Z
        elif m == 1:
            xg = X + E1 * (math.cos(Theta) + math.sin(Theta)) + E2
            yg = Y + E1 * (math.sin(Theta) - math.cos(Theta)) + B2
            zg = Z
        elif m == 2:
            xg = Y - E1 * (math.sin(Theta) - math.cos(Theta)) + E2
            yg = -X + E1 * (math.cos(Theta) + math.sin(Theta)) - B2
            zg = Z
        elif m == 3:
            xg = -X + E1 * (math.cos(Theta) + math.sin(Theta)) + E2
            yg = -Y + E1 * (math.sin(Theta) - math.cos(Theta)) + B2
            zg = Z

        print "xg " + repr(xg) + " yg " + repr(yg) + " zg " + repr(zg)

        temp = math.pow((A - 2 * D) * (A - 2 * D) - yg * yg, 0.5)
        aPrimeSquared = (temp + 2 * D) * (temp + 2 * D)
        c = math.pow((xg - RB) * (xg - RB) + zg * zg, 0.5)
        #print (-aPrimeSquared+B*B+c*c)/(2*B*c)

        try:
            alpha = math.acos((-aPrimeSquared + B * B + c * c) / (2 * B * c))
            print "worked " + repr(
                (-aPrimeSquared + B * B + c * c) / (2 * B * c))
            counter = counter + 1
        except ValueError:
            print "acos domain error " + repr(
                (-aPrimeSquared + B * B + c * c) / (2 * B * c))
            break
        else:
            beta = math.atan2(zg, xg - RB)
            J.append(beta - alpha)
    print "J:"
    for j in J:
        print " " + repr(j)  # publish sensor_msgs/JointState to cmd_pos topic

    if counter == 4:
        # publish the 4 motor positions in radians
        motors = ("1_A", "1_B", "2_A", "2_B")
        velocity = [0, 0, 0, 0]
        effort = [0, 0, 0, 0]
        pub = rospy.Publisher('cmd_pos', JointState)
        header = Header(0, rospy.get_rostime(), "")
        jointState = JointState(header=header,
                                name=motors,
                                position=J,
                                velocity=velocity,
                                effort=effort)
        pub.publish(jointState)
 def publish_joint_states(self, position):
     joint_states = JointState()
     joint_states.header.stamp = rospy.Time.now()
     joint_states.name = self._joint_names
     joint_states.position = position
     self._joint_states_pub.publish(joint_states)
    def __init__(self, bot_name="NoName"):
        # bot name 
        self.name = bot_name
        print("self.name", self.name)
        self.ImgDebug = False

        # velocity publisher
        self.vel_pub = rospy.Publisher('cmd_vel', Twist,queue_size=1)
        # navigation publisher
        self.client = actionlib.SimpleActionClient('move_base',MoveBaseAction)

        # Lidar
        self.scan = LaserScan()
        topicname_scan = "scan"
        self.lidar_sub = rospy.Subscriber(topicname_scan, LaserScan, self.lidarCallback)
        self.front_distance = DISTANCE_TO_ENEMY_INIT_VAL # init
        self.front_scan = DISTANCE_TO_ENEMY_INIT_VAL
        self.back_distance = DISTANCE_TO_ENEMY_INIT_VAL # init
        self.back_scan = DISTANCE_TO_ENEMY_INIT_VAL

        # usb camera
        self.img = None
        self.camera_preview = True
        self.bridge = CvBridge()
        topicname_image_raw = "image_raw"
        self.image_sub = rospy.Subscriber(topicname_image_raw, Image, self.imageCallback)
        self.red_angle = COLOR_TARGET_ANGLE_INIT_VAL # init
        self.blue_angle = COLOR_TARGET_ANGLE_INIT_VAL # init
        self.green_angle = COLOR_TARGET_ANGLE_INIT_VAL # init
        self.red_distance = DISTANCE_TO_ENEMY_INIT_VAL # init

        # FIND_ENEMY status 
        self.find_enemy = FIND_ENEMY_SEARCH
        self.find_wait = 0
        self.enemy_direct = 1

        # joint
        self.joint = JointState()
        self.joint_sub = rospy.Subscriber('joint_states', JointState, self.jointstateCallback)
        self.wheel_rot_r = 0
        self.wheel_rot_l = 0
        self.moving = False

        # twist
        self.x = 0;
        self.th = 0;

        # war status
        topicname_war_state = "war_state"
	self.war_state = rospy.Subscriber(topicname_war_state, String, self.stateCallback)
        self.my_score = 0
        self.enemy_score = 0
        self.act_mode = ActMode.BASIC

        # odom
        topicname_odom = "odom"
	self.odom = rospy.Subscriber(topicname_odom, Odometry, self.odomCallback)

        # amcl pose
        topicname_amcl_pose = "amcl_pose"
	self.amcl_pose = rospy.Subscriber(topicname_amcl_pose, PoseWithCovarianceStamped, self.AmclPoseCallback)
        
        # time
        self.time_start = time.time()
Example #22
0
def QuadMain():

    quadcm_m = 1.0
    quadmotor_m = 1.0
    ball_m = 2.5

    dt = 0.01  # timestep set to 10ms

    # Create a new trep system - 6 generalized coordinates for quadrotor: x,y,z,roll,pitch,yaw
    system = trep.System()
    trep.potentials.Gravity(system, name="Gravity")

    quadz = trep.Frame(system.world_frame, trep.TZ, "quadz")
    quady = trep.Frame(quadz, trep.TY, "quady")
    quadx = trep.Frame(quady, trep.TX, "quadx")

    quadrx = trep.Frame(quadx, trep.RX, "quadrx", kinematic=True)
    quadry = trep.Frame(quadrx, trep.RY, "quadry", kinematic=True)
    # quadrz = trep.Frame(quadry,trep.RZ,"quadrz")
    quadx.set_mass(quadcm_m)  # central point mass

    #    # define motor positions and mass
    #    quad1 = trep.Frame(quadrz,trep.CONST_SE3,((1,0,0),(0,1,0),(0,0,1),(3,0,0)),"quad1")
    #    quad1.set_mass(quadmotor_m)
    #    quad2 = trep.Frame(quadrz,trep.CONST_SE3,((1,0,0),(0,1,0),(0,0,1),(-3,0,0)),"quad2")
    #    quad2.set_mass(quadmotor_m)
    #    quad3 = trep.Frame(quadrz,trep.CONST_SE3,((1,0,0),(0,1,0),(0,0,1),(0,3,0)),"quad3")
    #    quad3.set_mass(quadmotor_m)
    #    quad4 = trep.Frame(quadrz,trep.CONST_SE3,((1,0,0),(0,1,0),(0,0,1),(0,-3,0)),"quad4")
    #    quad4.set_mass(quadmotor_m)

    # define ball frame
    ballrx = trep.Frame(quadx, trep.RX, "ballrx", kinematic=False)
    ballry = trep.Frame(ballrx, trep.RY, "ballry", kinematic=False)
    ball = trep.Frame(ballry, trep.CONST_SE3,
                      ((1, 0, 0), (0, 1, 0), (0, 0, 1), (0, 0, -1)), "ballcm")
    ball.set_mass(ball_m)

    # set thrust vector with input u1
    trep.forces.BodyWrench(system,
                           quadry, (0, 0, 'u1', 0, 0, 0),
                           name='wrench1')

    #    # set four thrust vectors with inputs u1,u2,u3,u4
    #    trep.forces.BodyWrench(system,quad1,(0,0,'u1',0,0,0),name='wrench1')
    #    trep.forces.BodyWrench(system,quad2,(0,0,'u2',0,0,0),name='wrench2')
    #    trep.forces.BodyWrench(system,quad3,(0,0,'u3',0,0,0),name='wrench3')
    #    trep.forces.BodyWrench(system,quad4,(0,0,'u4',0,0,0),name='wrench4')

    # set quadrotor initial altitude at 3m
    system.get_config("quadz").q = 3.0

    # Now we'll extract the current configuration into a tuple to use as
    # initial conditions for a variational integrator.
    q0 = system.q

    # Create and initialize the variational integrator
    mvi = trep.MidpointVI(system)
    mvi.initialize_from_configs(0.0, q0, dt, q0)

    # These are our simulation variables.
    q = mvi.q2
    t = mvi.t2
    #    u0=tuple([(4*quadmotor_m+quadcm_m+ball_m)/4*9.8,(4*quadmotor_m+quadcm_m+ball_m)/4*9.8,(4*quadmotor_m+quadcm_m+ball_m)/4*9.8,(4*quadmotor_m+quadcm_m+ball_m)/4*9.8])
    #    u=[u0]

    u0 = np.array([(quadcm_m + ball_m) * 9.8])
    u = tuple(u0)

    # start ROS node to broadcast transforms to rviz
    rospy.init_node('quad_simulator')
    broadcaster = tf.TransformBroadcaster()
    pub = rospy.Publisher('config', Float32MultiArray)
    statepub = rospy.Publisher('joint_states', JointState)

    jointstates = JointState()
    configs = Float32MultiArray()

    # subscribe to joystick topic from joy_node
    rospy.Subscriber("joy", Joy, joycall)

    r = rospy.Rate(100)  # simulation rate set to 100Hz

    # PD control variables
    P = 200
    D = 20

    # Simulator Loop
    while not rospy.is_shutdown():

        # reset simulator if trigger pressed
        if buttons[0] == 1:
            mvi.initialize_from_configs(0.0, q0, dt, q0)

#        # calculate thrust inputs
#        u1 = u0[0] + P*(q[4]+0.1*axis[0]) + D*system.configs[4].dq - P*(q[0]-3.0) - D*system.configs[0].dq
#        u2 = u0[1] - P*(q[4]+0.1*axis[0]) - D*system.configs[4].dq - P*(q[0]-3.0) - D*system.configs[0].dq
#        u3 = u0[2] - P*(q[3]+0.1*axis[1]) - D*system.configs[3].dq - P*(q[0]-3.0) - D*system.configs[0].dq
#        u4 = u0[3] + P*(q[3]+0.1*axis[1]) + D*system.configs[3].dq - P*(q[0]-3.0) - D*system.configs[0].dq
#        u = tuple([u1,u2,u3,u4])

        k = np.array([0.1 * axis[1], 0.1 * axis[0]])

        # advance simluation one timestep using trep VI
        mvi.step(mvi.t2 + dt, u, k)
        q = mvi.q2
        t = mvi.t2
        configs.data = tuple(q) + u

        jointstates.header.stamp = rospy.Time.now()
        jointstates.name = ["q1ballrx", "q1ballry"]
        jointstates.position = [q[3], q[4]]
        jointstates.velocity = [system.configs[5].dq, system.configs[6].dq]

        # send transform data to rviz
        broadcaster.sendTransform(
            (q[2], q[1], q[0]),
            tf.transformations.quaternion_from_euler(0, 0, 0),
            rospy.Time.now(), "quad1", "world")
        broadcaster.sendTransform(
            (0, 0, 0), tf.transformations.quaternion_from_euler(q[5], q[6], 0),
            rospy.Time.now(), "quadr", "quad1")
        statepub.publish(jointstates)
        pub.publish(configs)
        r.sleep()
Example #23
0
def set_arm_joint(pub, joint_target):
    joint_state = JointState()
    joint_state.position = tuple(joint_target)
    rospy.loginfo('Going to arm joint position: {}'.format(joint_state.position))
    pub.publish(joint_state)
    def run(self):

        rate = rospy.Rate(10)  # 10hz

        while not rospy.is_shutdown():
            page = raw_input('Enter page: ')
            if page == "recode":
                motionPath = []
                plan = ["init", 'PourStart', "init"]
                self.engine.setPlan(plan)
                s = time.time()
                while self.engine.isRunning:

                    e = time.time()
                    if (e - s) > self.recodeTime:

                        ## recode Path
                        motionPath.append(self.joint_states)
                        s = time.time()
                        self.engine.run()

                motionPath = np.array(motionPath)

                np.save(
                    os.path.dirname(__file__) + "/PathData/path.npy",
                    motionPath)

            rate.sleep()

            if page == "learn":
                jname = [
                    "l_arm_sh_p1", "l_arm_sh_r", "l_arm_sh_p2", "l_arm_el_y",
                    "l_arm_wr_r", "l_arm_wr_y", "l_arm_wr_p"
                ]
                self.engine.set_direct_control(jname)
                motionPath = np.load(
                    os.path.dirname(__file__) + "/PathData/path.npy")



                dmp = dmp_discrete.DMPs_discrete(n_dmps=7,\
                                       n_bfs=500, \
                                       ay=np.ones(7)*10.0,\
                                       dt = 1.0/len(motionPath),\
                                       )

                dmp.imitate_path(motionPath.T, plot=False)

                dmp.reset_state()
                dmp.y0 = motionPath[0]
                dmp.goal = motionPath[-1]
                y, dy, ddy = dmp.rollout()

                joint = JointState()
                joint.name = jname
                for i in range(len(motionPath)):
                    joint.position = y[i]
                    self.engine.set_joint(joint)
                    time.sleep(self.recodeTime)

            if page == "load":
                jname = [
                    "l_arm_sh_p1", "l_arm_sh_r", "l_arm_sh_p2", "l_arm_el_y",
                    "l_arm_wr_r", "l_arm_wr_y", "l_arm_wr_p"
                ]
                joint = JointState()
                joint.name = jname

                motionPath = np.load(
                    os.path.dirname(__file__) + "/PathData/path.npy")

                for i in range(len(motionPath)):
                    joint.position = motionPath[i]
                    self.engine.set_joint(joint)
                    time.sleep(self.recodeTime)
Example #25
0
        print "No data for " + name


if __name__ == "__main__":

    joint_state_pub = rospy.Publisher('joint_states', JointState, queue_size=1)

    rospy.init_node('real_joint_state_publisher', anonymous=True)

    rate = rospy.Rate(100)

    rospy.wait_for_service('/gazebo/get_joint_properties')

    while not rospy.is_shutdown():

        joint_state_msg = JointState()
        joint_state_msg.header.stamp = rospy.Time.now()

        try:
            get_joint_data = rospy.ServiceProxy('/gazebo/get_joint_properties',
                                                GetJointProperties)

            populate_joint_state_msg(joint_state_msg, get_joint_data, "joint1")
            populate_joint_state_msg(joint_state_msg, get_joint_data, "joint2")

            print "Publishing data for both joints"

        except rospy.ServiceException, e:
            print "Service call failed: %s" % e

        #zeroing out the estimates
    def __init__(self,
                 prefix="",
                 gripper="",
                 interface='eth0',
                 jaco_ip="10.66.171.15",
                 dof=""):
        """
        Setup a lock for accessing data in the control loop
        """
        self._lock = threading.Lock()
        """
        Assume success until posted otherwise
        """
        rospy.loginfo('Starting JACO2 control')
        self.init_success = True

        self._prefix = prefix
        self.iface = interface
        self.arm_dof = dof
        """
        List of joint names
        """
        if ("6dof" == self.arm_dof):
            self._joint_names = [
                self._prefix + '_shoulder_pan_joint',
                self._prefix + '_shoulder_lift_joint',
                self._prefix + '_elbow_joint', self._prefix + '_wrist_1_joint',
                self._prefix + '_wrist_2_joint',
                self._prefix + '_wrist_3_joint'
            ]
        elif ("7dof" == self.arm_dof):
            self._joint_names = [
                self._prefix + '_shoulder_pan_joint',
                self._prefix + '_shoulder_lift_joint',
                self._prefix + '_arm_half_joint',
                self._prefix + '_elbow_joint',
                self._prefix + '_wrist_spherical_1_joint',
                self._prefix + '_wrist_spherical_2_joint',
                self._prefix + '_wrist_3_joint'
            ]

        else:
            rospy.logerr(
                "DoF needs to be set 6 or 7, cannot start SIArmController")
            return

        self._num_joints = len(self._joint_names)
        """
        Create the hooks for the API
        """
        if ('left' == prefix):
            self.api = KinovaAPI('left', self.iface, jaco_ip, '255.255.255.0',
                                 24000, 24024, 44000, self.arm_dof)
        elif ('right' == prefix):
            self.api = KinovaAPI('right', self.iface, jaco_ip, '255.255.255.0',
                                 25000, 25025, 55000, self.arm_dof)
        else:
            rospy.logerr(
                "prefix needs to be set to left or right, cannot start the controller"
            )
            return

        if not (self.api.init_success):
            self.Stop()
            return

        self.api.SetCartesianControl()
        self._position_hold = False
        self.estop = False
        """
        Initialize the joint feedback
        """
        pos = self.api.get_angular_position()
        vel = self.api.get_angular_velocity()
        force = self.api.get_angular_force()
        self._joint_fb = dict()
        self._joint_fb['position'] = pos[:self._num_joints]
        self._joint_fb['velocity'] = vel[:self._num_joints]
        self._joint_fb['force'] = force[:self._num_joints]

        if ("kg2" == gripper):
            self._gripper_joint_names = [
                self._prefix + '_gripper_finger1_joint',
                self._prefix + '_gripper_finger2_joint'
            ]
            self.num_fingers = 2
        elif ("kg3" == gripper):
            self._gripper_joint_names = [
                self._prefix + '_gripper_finger1_joint',
                self._prefix + '_gripper_finger2_joint',
                self._prefix + '_gripper_finger3_joint'
            ]
            self.num_fingers = 3

        if (0 != self.num_fingers):
            self._gripper_fb = dict()
            self._gripper_fb['position'] = pos[self.
                                               _num_joints:self._num_joints +
                                               self.num_fingers]
            self._gripper_fb['velocity'] = vel[self.
                                               _num_joints:self._num_joints +
                                               self.num_fingers]
            self._gripper_fb['force'] = force[self.
                                              _num_joints:self._num_joints +
                                              self.num_fingers]
        """
        Register the publishers and subscribers
        """
        self.last_teleop_cmd_update = rospy.get_time() - 0.5
        self._teleop_cmd_sub = rospy.Subscriber(
            "/movo/%s_arm/cartesian_vel_cmd" % self._prefix,
            JacoCartesianVelocityCmd, self._update_teleop_cmd)

        self._gripper_cmd = 0.0
        self._ctl_mode = AUTONOMOUS_CONTROL
        self._jstpub = rospy.Publisher("/movo/%s_arm_controller/state" %
                                       self._prefix,
                                       JointTrajectoryControllerState,
                                       queue_size=10)
        self._jstmsg = JointTrajectoryControllerState()
        self._jstmsg.header.seq = 0
        self._jstmsg.header.frame_id = ''
        self._jstmsg.header.stamp = rospy.get_rostime()
        self._jspub = rospy.Publisher("/movo/%s_arm/joint_states" %
                                      self._prefix,
                                      JointState,
                                      queue_size=10)
        self._jsmsg = JointState()
        self._jsmsg.header.seq = 0
        self._jsmsg.header.frame_id = ''
        self._jsmsg.header.stamp = rospy.get_rostime()
        self._jsmsg.name = self._joint_names

        self._actfdbk_pub = rospy.Publisher("/movo/%s_arm/actuator_feedback" %
                                            self._prefix,
                                            KinovaActuatorFdbk,
                                            queue_size=10)
        self._actfdbk_msg = KinovaActuatorFdbk()
        self._jsmsg.header.seq = 0
        self._jsmsg.header.frame_id = ''
        self._jsmsg.header.stamp = rospy.get_rostime()

        if (0 != self.num_fingers):
            self._teleop_gripper_cmd_sub = rospy.Subscriber(
                "/movo/%s_gripper/vel_cmd" % self._prefix, Float32,
                self._update_teleop_gripper_cmd)
            self._gripper_jspub = rospy.Publisher(
                "/movo/%s_gripper/joint_states" % self._prefix,
                JointState,
                queue_size=10)
            self._gripper_jsmsg = JointState()
            self._gripper_jsmsg.header.seq = 0
            self._gripper_jsmsg.header.frame_id = ''
            self._gripper_jsmsg.header.stamp = rospy.get_rostime()
            self._gripper_jsmsg.name = self._gripper_joint_names
        """
        This starts the controller in cart vel mode so that teleop is active by default
        """
        if (0 != self.num_fingers):
            self._gripper_pid = [None] * self.num_fingers
            for i in range(self.num_fingers):
                self._gripper_pid[i] = JacoPID(5.0, 0.0, 0.8)
            self._gripper_vff = DifferentiateSignals(
                self.num_fingers, self._gripper_fb['position'])
            self._gripper_rate_limit = RateLimitSignals(
                [FINGER_ANGULAR_VEL_LIMIT] * self.num_fingers,
                self.num_fingers, self._gripper_fb['position'])

        if ("6dof" == self.arm_dof):
            self._arm_rate_limit = RateLimitSignals(JOINT_6DOF_VEL_LIMITS,
                                                    self._num_joints,
                                                    self._joint_fb['position'])

        if ("7dof" == self.arm_dof):
            self._arm_rate_limit = RateLimitSignals(JOINT_7DOF_VEL_LIMITS,
                                                    self._num_joints,
                                                    self._joint_fb['position'])

        self._arm_vff_diff = DifferentiateSignals(self._num_joints,
                                                  self._joint_fb['position'])

        self._pid = [None] * self._num_joints

        for i in range(self._num_joints):
            self._pid[i] = JacoPID(5.0, 0.0, 0.8)
        """
        self._pid[0] = JacoPID(5.0,0.0,0.8)
        self._pid[1] = JacoPID(5.0,0.0,0.8)
        self._pid[2] = JacoPID(5.0,0.0,0.8)
        self._pid[3] = JacoPID(5.0,0.0,0.8)
        self._pid[4] = JacoPID(5.0,0.0,0.8) 
        self._pid[5] = JacoPID(5.0,0.0,0.8)
        """

        self.pause_controller = False

        self._init_ext_joint_position_control()
        self._init_ext_gripper_control()
        """
        Set temporary tucked position after homing
        """
        """
        if 'left' == self._prefix:
            self._arm_cmds['position'][1]+= deg_to_rad(80.0)
            self._arm_cmds['position'][2]+= deg_to_rad(50.0)
            self._arm_cmds['position'][4]-= deg_to_rad(90.0)
        else:
            self._arm_cmds['position'][1]-= deg_to_rad(80.0)
            self._arm_cmds['position'][2]-= deg_to_rad(50.0)
            self._arm_cmds['position'][4]+= deg_to_rad(90.0)
        """
        """
        Update the feedback once to get things initialized
        """
        self._update_controller_data()
        """
        Start the controller
        """
        rospy.loginfo("Starting the %s controller" % self._prefix)
        self._done = False
        self._t1 = rospy.Timer(rospy.Duration(0.01), self._run_ctl)
Example #27
0
def main():
    rospy.init_node('jointInterface', anonymous=True)
    rate = rospy.Rate(CONTROL_LOOP_FREQ)
    global device
    global command_queue
    # Find and connect to the stepper motor controller
    port = sys.argv[1]
    s = serial.Serial(port=port, baudrate=COMM_DEFAULT_BAUD_RATE, timeout=0.05)
    print s.BAUDRATES
    device = BLDCControllerClient(s)
    for key in mapping:
        device.leaveBootloader(key)
    pubArray = {}
    pubCurrArray = {}
    subArray = {}
    for key in mapping:
        pubArray[key] = rospy.Publisher("/DOF/" + mapping[key] + "_State",
                                        JointState,
                                        queue_size=10)
        pubCurrArray[key] = rospy.Publisher("/DOF/" + mapping[key] +
                                            "_Current",
                                            Float32,
                                            queue_size=10)
        subArray[key] = rospy.Subscriber("/DOF/" + mapping[key] + "_Cmd",
                                         Float64,
                                         makeSetCommand(key),
                                         queue_size=1)

    # Set up a signal handler so Ctrl-C causes a clean exit
    def sigintHandler(signal, frame):
        # device.setParameter('iq_s', 0)   ###############################################################--> must fix at some point
        # device.setControlEnabled(False) ################################################################--> must fix at some point
        print 'quitting'
        sys.exit()

    signal.signal(signal.SIGINT, sigintHandler)

    # Set current to zero, enable current control loop
    for key in mapping:
        # device.setParameter(key, 'id_s', 0)
        # device.setParameter(key, 'iq_s', 0)
        device.setControlEnabled(
            key, 0
        )  ########################### change to 1 when you want to actually control

    #angle = 0.0   # Treat the starting position as zero
    #last_mod_angle = getEncoderAngleRadians(device)
    start_time = time.time()
    time_previous = start_time
    angle_previous_mod = {}
    angle_accumulated = {}
    time.sleep(1)
    for key in mapping:
        angle_previous_mod[key] = getEncoderAngleRadians(device, key)
        angle_accumulated[key] = 0.0

    r = rospy.Rate(30)
    while not rospy.is_shutdown():
        for key in mapping:
            try:
                # Compute the desired setpoint for the current time
                jointName = mapping[key]

                loop_start_time = time.time()
                mod_angle = getEncoderAngleRadians(device, key)
                delta_time = loop_start_time - time_previous
                time_previous = loop_start_time
                delta_angle = (mod_angle - angle_previous_mod[key] +
                               math.pi) % (2 * math.pi) - math.pi
                angle_previous_mod[key] = mod_angle
                angle_accumulated[key] = angle_accumulated[key] + delta_angle

                jointMsg = JointState()
                jointMsg.name = [jointName]
                jointMsg.position = [mod_angle]
                #jointMsg.velocity = [device.getVelocity(key)]
                jointMsg.effort = [0.0]
                pubArray[key].publish(jointMsg)
                print("name: " + jointName + "  position: " +
                      str(jointMsg.position))
                time.sleep(
                    max(
                        0.0, loop_start_time + 1.0 / CONTROL_LOOP_FREQ -
                        time.time()))

                currMsg = Float32()
                currMsg.data = float(0)
                pubCurrArray[key].publish(currMsg)
            except Exception as e:
                print(e)
                pass
            if key in command_queue:
                device.setDuty(key, command_queue[key])
        command_queue = {}
        r.sleep()
#!/usr/bin/env python3
import rospy
from sensor_msgs.msg import JointState
import math
from inverse_problem_srv.srv import publish_cmd, publish_cmdResponse
import numpy as np

jointPub = rospy.Publisher('/angle_robot/joint_states_kinematic',
                           JointState,
                           queue_size=100)

currentState = JointState()
last_gripper = 0
currentState.position = [0, 0, 0, 0, 0, 0]
maxVelocity = 1.5
gripper_vel = 2
gripper_pos = 20
countOfJoint = 6
iter_time = 0.01
gripperEf = 0


def realize_of_principle(goalPoseMsg, jointName, timeOfWay):
    global currentState
    q = []
    time = []
    time.append(0)
    i = 0
    k = 0
    start = np.array(currentState.position[0:countOfJoint - 1])
    end = np.array(goalPoseMsg)
Example #29
0
    def handle(self):
        self.socket_lock = threading.Lock()
        self.last_joint_states = None
        setConnectedRobot(self)
        print "Handling a request"
        try:
            buf = self.recv_more()
            if not buf: return

            while True:
                #print "Buf:", [ord(b) for b in buf]

                # Unpacks the message type
                mtype = struct.unpack_from("!i", buf, 0)[0]
                buf = buf[4:]
                #print "Message type:", mtype

                if mtype == MSG_OUT:
                    # Unpacks string message, terminated by tilde
                    i = buf.find("~")
                    while i < 0:
                        buf = buf + self.recv_more()
                        i = buf.find("~")
                        if len(buf) > 2000:
                            raise Exception(
                                "Probably forgot to terminate a string: %s..."
                                % buf[:150])
                    s, buf = buf[:i], buf[i + 1:]
                    log("Out: %s" % s)

                elif mtype == MSG_JOINT_STATES:
                    while len(buf) < 3 * (6 * 4):
                        buf = buf + self.recv_more()
                    state_mult = struct.unpack_from("!%ii" % (3 * 6), buf, 0)
                    buf = buf[3 * 6 * 4:]
                    state = [s / MULT_jointstate for s in state_mult]

                    msg = JointState()
                    msg.header.stamp = rospy.get_rostime()
                    msg.name = joint_names
                    msg.position = [0.0] * 6
                    for i, q_meas in enumerate(state[:6]):
                        msg.position[i] = q_meas + joint_offsets.get(
                            joint_names[i], 0.0)
                    msg.velocity = state[6:12]
                    msg.effort = state[12:18]
                    self.last_joint_states = msg
                    pub_joint_states.publish(msg)

                elif mtype == MSG_WRENCH:
                    while len(buf) < (6 * 4):
                        buf = buf + self.recv_more()
                    state_mult = struct.unpack_from("!%ii" % (6), buf, 0)
                    buf = buf[6 * 4:]
                    state = [s / MULT_wrench for s in state_mult]
                    wrench_msg = WrenchStamped()
                    wrench_msg.header.stamp = rospy.get_rostime()
                    wrench_msg.wrench.force.x = state[0]
                    wrench_msg.wrench.force.y = state[1]
                    wrench_msg.wrench.force.z = state[2]
                    wrench_msg.wrench.torque.x = state[3]
                    wrench_msg.wrench.torque.y = state[4]
                    wrench_msg.wrench.torque.z = state[5]
                    pub_wrench.publish(wrench_msg)

                elif mtype == MSG_QUIT:
                    print "Quitting"
                    raise EOF("Received quit")
                elif mtype == MSG_WAYPOINT_FINISHED:
                    while len(buf) < 4:
                        buf = buf + self.recv_more()
                    waypoint_id = struct.unpack_from("!i", buf, 0)[0]
                    buf = buf[4:]
                    print "Waypoint finished (not handled)"
                else:
                    raise Exception("Unknown message type: %i" % mtype)

                if not buf:
                    buf = buf + self.recv_more()
        except EOF, ex:
            print "Connection closed (command):", ex
            setConnectedRobot(None)
Example #30
0
 def _pub_joint_velocities(self, velocities):
     joint_state = JointState()
     joint_state.velocity = tuple(velocities)
     self.joint_pub.publish(joint_state)