Beispiel #1
0
    def __init__(self, ):
        rospy.on_shutdown(self.clean_shutdown)

        self._rate = 500.0
        self._right_arm = intera_interface.limb.Limb("right")
        self._right_joint_names = self._right_arm.joint_names()

        print("Getting robot state... ")
        self._rs = intera_interface.RobotEnable(CHECK_VERSION)
        self._init_state = self._rs.state().enabled
        print("Enabling robot... ")
        self._rs.enable()

        self.controller = SawyerEEFVelocityController()

        self._right_arm.move_to_neutral(speed=0.1)

        # Getting the base rotation in eef for coordinate frame transformations
        eef_pose_in_base = self._right_arm.endpoint_pose()
        self.eef_quat_in_base = np.array([
            eef_pose_in_base['orientation'].x,
            eef_pose_in_base['orientation'].y,
            eef_pose_in_base['orientation'].z,
            eef_pose_in_base['orientation'].w,
        ])

        self.eef_rot_in_base = T.quat2mat(self.eef_quat_in_base)
        self.base_rot_in_eef = self.eef_rot_in_base.T
    def __init__(self, right_arm):
        # Make sure there is a clean shutdown
        rospy.on_shutdown(self.clean_shutdown)

        # control parameters
        self._rate = 500.0  # Hz

        self._right_arm = right_arm

        self._right_joint_names = self._right_arm.joint_names()

        self.set_neutral()

        #  end-effector initial pose
        eef_pose = self._right_arm.endpoint_pose()
        self.start_eef_pos = np.array([eef_pose['position'].x,
                                       eef_pose['position'].y,
                                       eef_pose['position'].z,
                                       ])
        self.start_eef_quat = np.array([eef_pose['orientation'].x,
                                        eef_pose['orientation'].y,
                                        eef_pose['orientation'].z,
                                        eef_pose['orientation'].w, ])

        self.base_rot_in_eef = T.quat2mat(self.start_eef_quat).T

        self.start_eef_pos = self.calibrate_initial_position()

        # Eef velocity control
        self.controller = SawyerEEFVelocityController()

        # Sin-cos control
        self.period_factor = 0.15
        self.amplitude_factor = 0.1
    def __init__(self, right_arm, reset_goal_pos=False, predefined_goal=None):
        '''
        Creates observations for the Reaching task
        :param right_arm: The intera link object to control the robot.
        :param reset_goal_pos: Whether to reset any pre-existing goal position
        :param predefined_goal:  Use one of the hard coded goal positions to avoid placing the end effector at the goal by hand.
        '''
        self._right_arm = right_arm
        self._joint_names = self._right_arm.joint_names()

        self.previous_joint_vels_array = np.zeros((7, ))

        self._right_arm.move_to_neutral(speed=0.1)

        # Getting the base rotation in eef for coordinate frame transformations
        eef_pose_in_base = self._right_arm.endpoint_pose()
        self.eef_quat_in_base = np.array([
            eef_pose_in_base['orientation'].x,
            eef_pose_in_base['orientation'].y,
            eef_pose_in_base['orientation'].z,
            eef_pose_in_base['orientation'].w,
        ])

        self.eef_rot_in_base = T.quat2mat(self.eef_quat_in_base)
        self.base_rot_in_eef = self.eef_rot_in_base.T

        self.controller = SawyerEEFVelocityController()

        # Predifined, hard-coded, goal positions for fast switching between pre-defined goals.
        #  These vectors correspond to the different positions of eefg in the base frame.
        self.predefined_goals = {
            'goal_1':
            np.array([
                0.44889998342216186, 0.15767033384085796, -0.07223470331644867
            ]),
            'goal_2':
            np.array(
                [0.4064366403627939, 0.2151227875993398,
                 -0.07152062349980176]),
            'goal_3':
            np.array(
                [0.5353834307301527, 0.0993579385905306, -0.072644653035373])
        }

        if (predefined_goal is None):
            self.goal_pos_in_base = self.record_goal_pos(reset_goal_pos)
        elif predefined_goal in self.predefined_goals:
            self.set_predefined_goal(predefined_goal)
        else:
            raise NotImplementedError()
    def __init__(self):
        # Make sure there is a clean shutdown
        rospy.on_shutdown(self.clean_shutdown)
        # Setting up Sawyer
        self._right_arm = intera_interface.limb.Limb("right")
        self._right_joint_names = self._right_arm.joint_names()

        print("Getting robot state... ")
        self._rs = intera_interface.RobotEnable(CHECK_VERSION)
        self._init_state = self._rs.state().enabled
        print("Enabling robot... ")
        self._rs.enable()

        self.set_neutral()

        #  end-effector initial pose
        self.eef_pose = self._right_arm.endpoint_pose()
        self.eef_quat = np.array([
            self.eef_pose['orientation'].x,
            self.eef_pose['orientation'].y,
            self.eef_pose['orientation'].z,
            self.eef_pose['orientation'].w,
        ])

        self.base_rot_in_eef = T.quat2mat(self.eef_quat).T

        # control parameters
        self._rate = 500.0  # Hz

        # Eef velocity control
        self.controller = SawyerEEFVelocityController()

        #Policy parameters
        self.policy_type = 'joint'
        self.line_policy = np.array([0., 0., 0.])
        self.period_factor = 0.15
        self.amplitude_factor = 0.1
class Control(object):
    def __init__(self, right_arm):
        # Make sure there is a clean shutdown
        rospy.on_shutdown(self.clean_shutdown)

        # control parameters
        self._rate = 500.0  # Hz

        self._right_arm = right_arm

        self._right_joint_names = self._right_arm.joint_names()

        self.set_neutral()

        #  end-effector initial pose
        eef_pose = self._right_arm.endpoint_pose()
        self.start_eef_pos = np.array([eef_pose['position'].x,
                                       eef_pose['position'].y,
                                       eef_pose['position'].z,
                                       ])
        self.start_eef_quat = np.array([eef_pose['orientation'].x,
                                        eef_pose['orientation'].y,
                                        eef_pose['orientation'].z,
                                        eef_pose['orientation'].w, ])

        self.base_rot_in_eef = T.quat2mat(self.start_eef_quat).T

        self.start_eef_pos = self.calibrate_initial_position()

        # Eef velocity control
        self.controller = SawyerEEFVelocityController()

        # Sin-cos control
        self.period_factor = 0.15
        self.amplitude_factor = 0.1


    def calibrate_initial_position(self):
        ''' Set the starting position of the end-effector.'''
        rospy.loginfo('Calibrating reaching starting position....')
        if (rospy.has_param('start_reaching_position')):
            return np.array(rospy.get_param('start_reaching_position'))
        else:
            rospy.set_param('manual_arm_move', True)

            rate = rospy.Rate(20)
            while True:
                if(not rospy.get_param('manual_arm_move')):
                    rospy.loginfo('Done')
                    return self.done_moving()
                rate.sleep()

    def done_moving(self):
        ''' Record the current pose of the end effector and end the manual moving.'''
        rospy.loginfo('Recording start pos')
        eef_pose = self._right_arm.endpoint_pose()
        start_eef_pos = np.array([eef_pose['position'].x,
                                  eef_pose['position'].y,
                                  eef_pose['position'].z,
                                  ])

        rospy.set_param('start_reaching_position', start_eef_pos.tolist())

        return start_eef_pos

    def _reset_control_modes(self):
        rate = rospy.Rate(self._rate)
        for _ in xrange(100):
            if rospy.is_shutdown():
                return False
            self._right_arm.exit_control_mode()
            rate.sleep()
        return True

    def get_right_hand_quat(self):
        eef_pose = self._right_arm.endpoint_pose()
        return np.array([eef_pose['orientation'].x,
                         eef_pose['orientation'].y,
                         eef_pose['orientation'].z,
                         eef_pose['orientation'].w, ])

    def get_right_hand_pos(self):
        eef_pose = self._right_arm.endpoint_pose()
        return np.array([eef_pose['position'].x,
                         eef_pose['position'].y,
                         eef_pose['position'].z, ])

    def go_to_pose(self, position, orientation):
        '''Send the end effector to a specified pose'''
        try:
            traj_options = TrajectoryOptions()
            traj_options.interpolation_type = TrajectoryOptions.CARTESIAN
            traj = MotionTrajectory(trajectory_options=traj_options, limb=self._right_arm)

            wpt_opts = MotionWaypointOptions(max_linear_speed=0.6,
                                             max_linear_accel=0.6,
                                             max_rotational_speed=1.57,
                                             max_rotational_accel=1.57,
                                             max_joint_speed_ratio=1.0)
            waypoint = MotionWaypoint(options=wpt_opts.to_msg(), limb=self._right_arm)

            pose = Pose()
            pose.position.x = position[0]
            pose.position.y = position[1]
            pose.position.z = position[2]
            pose.orientation.x = orientation[0]
            pose.orientation.y = orientation[1]
            pose.orientation.z = orientation[2]
            pose.orientation.w = orientation[0]
            poseStamped = PoseStamped()
            poseStamped.pose = pose
            joint_angles = self._right_arm.joint_ordered_angles()
            waypoint.set_cartesian_pose(poseStamped, "right_hand", joint_angles)

            rospy.loginfo('Sending waypoint: \n%s', waypoint.to_string())

            traj.append_waypoint(waypoint.to_msg())

            result = traj.send_trajectory(timeout=10)
            if result is None:
                rospy.logerr('Trajectory FAILED to send')
                return

            if result.result:
                rospy.loginfo('Motion controller successfully finished the trajectory!')
            else:
                rospy.logerr('Motion controller failed to complete the trajectory with error %s',
                             result.errorId)

        except rospy.ROSInterruptException:
            rospy.logerr('Keyboard interrupt detected from the user. Exiting before trajectory completion.')

    def go_to_start(self):
        self.go_to_pose(self.start_eef_pos, self.start_eef_quat)

    def set_neutral(self):
        """
        Sets both arms back into a neutral pose.
        """
        print("Moving to neutral pose...")
        self._right_arm.move_to_neutral(speed = 0.15)

    def clean_shutdown(self):
        print("\nExiting example...")
        # return to normal
        self._reset_control_modes()
        self.set_neutral()
        return True

    def get_control(self, action, max_action = 0.1, safety_max = 0.15):
        '''Convert the action of joint velocity commands.
                Use inverse kinematics to go from end effector cartesian velocities to joint velocities.'''
        action = max_action * action
        current_joint_angles = [self._right_arm.joint_angles()['right_j{}'.format(i)] for i in range(7)]

        # get x,y,z velocity in base frame
        action_in_base = self.base_rot_in_eef.dot(action)
        action_in_base = np.clip(action_in_base, -safety_max, safety_max)

        # Correct for any change in orientation using a proportional controller
        current_right_hand_quat = self.get_right_hand_quat()
        reference_right_hand_quat = self.start_eef_quat
        orn_diff = T.quat_multiply(reference_right_hand_quat, T.quat_inverse(current_right_hand_quat))

        orn_diff_mat = T.quat2mat(orn_diff)
        orn_diff_twice = orn_diff_mat.dot(orn_diff_mat)

        # Construct pose matrix
        pose_matrix = np.zeros((4, 4))
        pose_matrix[:3, :3] = orn_diff_twice
        pose_matrix[:3, 3] = action_in_base
        pose_matrix[3, 3] = 1

        # pose_matrix = T.pose2mat((action_in_base, orn_diff))
        joint_velocities = self.controller.compute_joint_velocities_for_endpoint_velocity(pose_matrix,
                                                                                          current_joint_angles)
        j_v = {}
        for i in range(7):
            key = 'right_j{}'.format(i)
            j_v[key] = joint_velocities[i]
        return j_v

    def get_joints_vel(self):
        joints_vel = np.array([
            self._right_arm.joint_velocity('right_j0'),
            self._right_arm.joint_velocity('right_j1'),
            self._right_arm.joint_velocity('right_j2'),
            self._right_arm.joint_velocity('right_j3'),
            self._right_arm.joint_velocity('right_j4'),
            self._right_arm.joint_velocity('right_j5'),
            self._right_arm.joint_velocity('right_j6'),

        ])
        return joints_vel

    def get_joints_angle(self):
        joints_angle = np.array([
            self._right_arm.joint_velocity('right_j0'),
            self._right_arm.joint_velocity('right_j1'),
            self._right_arm.joint_velocity('right_j2'),
            self._right_arm.joint_velocity('right_j3'),
            self._right_arm.joint_velocity('right_j4'),
            self._right_arm.joint_velocity('right_j5'),
            self._right_arm.joint_velocity('right_j6'),
        ])
        return joints_angle

    def joint_array_from_joint_dict(self, joint_dict):
        joints_array = np.array([
            joint_dict['right_j0'],
            joint_dict['right_j1'],
            joint_dict['right_j2'],
            joint_dict['right_j3'],
            joint_dict['right_j4'],
            joint_dict['right_j5'],
            joint_dict['right_j6'],
        ])
        return joints_array.squeeze()
Beispiel #6
0
class ManualPositioning(object):
    def __init__(self, ):
        rospy.on_shutdown(self.clean_shutdown)

        self._rate = 500.0
        self._right_arm = intera_interface.limb.Limb("right")
        self._right_joint_names = self._right_arm.joint_names()

        print("Getting robot state... ")
        self._rs = intera_interface.RobotEnable(CHECK_VERSION)
        self._init_state = self._rs.state().enabled
        print("Enabling robot... ")
        self._rs.enable()

        self.controller = SawyerEEFVelocityController()

        self._right_arm.move_to_neutral(speed=0.1)

        # Getting the base rotation in eef for coordinate frame transformations
        eef_pose_in_base = self._right_arm.endpoint_pose()
        self.eef_quat_in_base = np.array([
            eef_pose_in_base['orientation'].x,
            eef_pose_in_base['orientation'].y,
            eef_pose_in_base['orientation'].z,
            eef_pose_in_base['orientation'].w,
        ])

        self.eef_rot_in_base = T.quat2mat(self.eef_quat_in_base)
        self.base_rot_in_eef = self.eef_rot_in_base.T

    def get_right_hand_quat(self):
        eef_pose = self._right_arm.endpoint_pose()
        return np.array([
            eef_pose['orientation'].x,
            eef_pose['orientation'].y,
            eef_pose['orientation'].z,
            eef_pose['orientation'].w,
        ])

    def get_right_hand_pos(self):
        eef_pose = self._right_arm.endpoint_pose()
        return np.array([
            eef_pose['position'].x,
            eef_pose['position'].y,
            eef_pose['position'].z,
        ])

    def get_control(self, action, max_action=0.001, safety_max=0.1):
        action = max_action * action
        current_joint_angles = [
            self._right_arm.joint_angles()['right_j{}'.format(i)]
            for i in range(7)
        ]

        # get x,y,z velocity in base frame
        action_in_base = self.base_rot_in_eef.dot(action)
        action_in_base = np.clip(action_in_base, -safety_max, safety_max)

        # Correct for any change in orientation using a proportional controller
        current_right_hand_quat = self.get_right_hand_quat()
        reference_right_hand_quat = self.eef_quat_in_base
        orn_diff = T.quat_multiply(reference_right_hand_quat,
                                   T.quat_inverse(current_right_hand_quat))

        orn_diff_mat = T.quat2mat(orn_diff)
        orn_diff_twice = orn_diff_mat.dot(orn_diff_mat)

        # Construct pose matrix
        pose_matrix = np.zeros((4, 4))
        pose_matrix[:3, :3] = orn_diff_twice
        pose_matrix[:3, 3] = action_in_base
        pose_matrix[3, 3] = 1

        # pose_matrix = T.pose2mat((action_in_base, orn_diff))
        joint_velocities = self.controller.compute_joint_velocities_for_endpoint_velocity(
            pose_matrix, current_joint_angles)
        j_v = {}
        for i in range(7):
            key = 'right_j{}'.format(i)
            j_v[key] = joint_velocities[i]
        return j_v

    def move_eef(self):
        action_size = 0.05
        rate = rospy.Rate(100)
        action = np.array([0.0, 0.0, 0.0])

        print('Move the end-effector  and press d for done')
        print('''\r **Ready. Do one of the following.
                        8 : go forwards in x
                        2 : go backwards in x
                        6 : go forwards in y
                        4 : go backwards in y
                        + : go forwards in z
                        - : go backwards in z
                        h : double speed
                        l : half speed
                        d : finish moving
                        esc : quit
                        ''')
        while not rospy.is_shutdown():
            c = intera_external_devices.getch()

            if c:
                if (c in ['8']):
                    action = np.array([1.0, 0.0, 0.0])
                elif (c in ['2']):
                    action = np.array([-1.0, 0.0, 0.0])
                elif (c in ['6']):
                    action = np.array([0.0, 1.0, 0.0])
                elif (c in ['4']):
                    action = np.array([0.0, -1.0, 0.0])
                elif (c in ['+']):
                    action = np.array([0.0, 0.0, 1.0])
                elif (c in ['-']):
                    action = np.array([0.0, 0.0, -1.0])
                elif (c in ['5']):
                    action = np.array([0.0, 0.0, 0.0])
                elif (c in ['h']):
                    action = np.array([0.0, 0.0, 0.0])
                    action_size = 2 * action_size
                elif (c in ['l']):
                    action = np.array([0.0, 0.0, 0.0])
                    action_size = action_size / 2
                elif c in ['\x1b', '\x03', 'f']:
                    action = np.array([0.0, 0.0, 0.0])
                    rospy.signal_shutdown("Shutting Down...")
                elif c in ['d']:
                    rospy.loginfo('Done Moving')
                    rospy.set_param('manual_arm_move', False)
                    print(self._right_arm.endpoint_pose())
                    return

            joint_vels = self.get_control(action, max_action=action_size)

            # Send contgrol to robot
            self._right_arm.set_joint_velocities(joint_vels)
            rate.sleep()
        return

    def clean_shutdown(self):
        print("\nExiting example...")
        # return to normal
        self._reset_control_modes()
        return True

    def _reset_control_modes(self):
        rate = rospy.Rate(self._rate)
        for _ in xrange(100):
            if rospy.is_shutdown():
                return False
            self._right_arm.exit_control_mode()
            rate.sleep()
Beispiel #7
0
    def __init__(self):
        # Make sure there is a clean shutdown
        rospy.on_shutdown(self.clean_shutdown)

        # control parameters
        self._rate = 500.0  # Hz

        # Setting up the observation subscriber
        self.characterisation_observation = None
        self.observation = None

        self.characterisation_observation_subscriber = rospy.Subscriber('characterisation_observations',
                                                                        pushing_characterisation_observations,
                                                                        self.characterisation_observation_callback,
                                                                        queue_size=1)
        self.observation_subscriber = rospy.Subscriber('observations', numpy_msg(Floats64),
                                                       self.observation_callback,
                                                       queue_size=1)


        while True:
            if (self.characterisation_observation is not None and self.observation is not None):
                break


        # Setting up Sawyer
        self._right_arm = intera_interface.limb.Limb("right")
        self._right_joint_names = self._right_arm.joint_names()

        print("Getting robot state... ")
        self._rs = intera_interface.RobotEnable(CHECK_VERSION)
        self._init_state = self._rs.state().enabled
        print("Enabling robot... ")
        self._rs.enable()

        self.set_neutral()

        #  end-effector initial pose
        eef_pose = self._right_arm.endpoint_pose()
        self.start_eef_pos = np.array([eef_pose['position'].x,
                                       eef_pose['position'].y,
                                       eef_pose['position'].z,
                                       ])
        self.start_eef_quat = np.array([eef_pose['orientation'].x,
                                        eef_pose['orientation'].y,
                                        eef_pose['orientation'].z,
                                        eef_pose['orientation'].w, ])

        self.base_rot_in_eef = T.quat2mat(self.start_eef_quat).T

        if (not rospy.has_param('pushing/start_position')):
            self.start_eef_pos, self.start_eef_quat = self.calibrate_initial_position()
        else:
            self.start_eef_pos = np.array(rospy.get_param('pushing/start_position'))
            self.start_eef_quat = np.array(rospy.get_param('pushing/start_orientation'))

        # Eef velocity control
        self.controller = SawyerEEFVelocityController()

        # Sin-cos control
        self.period_factor = 0.15
        self.amplitude_factor = 0.1
Beispiel #8
0
class Control(object):
    def __init__(self):
        # Make sure there is a clean shutdown
        rospy.on_shutdown(self.clean_shutdown)

        # control parameters
        self._rate = 500.0  # Hz

        # Setting up the observation subscriber
        self.characterisation_observation = None
        self.observation = None

        self.characterisation_observation_subscriber = rospy.Subscriber('characterisation_observations',
                                                                        pushing_characterisation_observations,
                                                                        self.characterisation_observation_callback,
                                                                        queue_size=1)
        self.observation_subscriber = rospy.Subscriber('observations', numpy_msg(Floats64),
                                                       self.observation_callback,
                                                       queue_size=1)


        while True:
            if (self.characterisation_observation is not None and self.observation is not None):
                break


        # Setting up Sawyer
        self._right_arm = intera_interface.limb.Limb("right")
        self._right_joint_names = self._right_arm.joint_names()

        print("Getting robot state... ")
        self._rs = intera_interface.RobotEnable(CHECK_VERSION)
        self._init_state = self._rs.state().enabled
        print("Enabling robot... ")
        self._rs.enable()

        self.set_neutral()

        #  end-effector initial pose
        eef_pose = self._right_arm.endpoint_pose()
        self.start_eef_pos = np.array([eef_pose['position'].x,
                                       eef_pose['position'].y,
                                       eef_pose['position'].z,
                                       ])
        self.start_eef_quat = np.array([eef_pose['orientation'].x,
                                        eef_pose['orientation'].y,
                                        eef_pose['orientation'].z,
                                        eef_pose['orientation'].w, ])

        self.base_rot_in_eef = T.quat2mat(self.start_eef_quat).T

        if (not rospy.has_param('pushing/start_position')):
            self.start_eef_pos, self.start_eef_quat = self.calibrate_initial_position()
        else:
            self.start_eef_pos = np.array(rospy.get_param('pushing/start_position'))
            self.start_eef_quat = np.array(rospy.get_param('pushing/start_orientation'))

        # Eef velocity control
        self.controller = SawyerEEFVelocityController()

        # Sin-cos control
        self.period_factor = 0.15
        self.amplitude_factor = 0.1

    def calibrate_initial_position(self):
        rospy.loginfo('Place the end-effector in the desired starting position and press  d...')

        if (rospy.has_param('pushing/start_position')):
            return np.array(rospy.get_param('pushing/start_position'))
        else:
            rospy.set_param('manual_arm_move', True)

            rate = rospy.Rate(20)
            while True:
                if (not rospy.get_param('manual_arm_move')):
                    rospy.loginfo('Done')
                    return self.done_moving()
                rate.sleep()


    def done_moving(self):
        eef_pose = self._right_arm.endpoint_pose()
        start_eef_pos = np.array([eef_pose['position'].x,
                                       eef_pose['position'].y,
                                       eef_pose['position'].z,
                                       ])
        start_eef_quat = np.array([eef_pose['orientation'].x,
                                   eef_pose['orientation'].y,
                                   eef_pose['orientation'].z,
                                   eef_pose['orientation'].w, ])

        rospy.set_param('pushing/start_position', start_eef_pos.tolist())
        rospy.set_param('pushing/start_orientation', start_eef_quat.tolist())

        return start_eef_pos, start_eef_quat

    def _reset_control_modes(self):
        rate = rospy.Rate(self._rate)
        for _ in xrange(100):
            if rospy.is_shutdown():
                return False
            self._right_arm.exit_control_mode()
            rate.sleep()
        return True

    def get_right_hand_quat(self):
        eef_pose = self._right_arm.endpoint_pose()
        return np.array([eef_pose['orientation'].x,
                         eef_pose['orientation'].y,
                         eef_pose['orientation'].z,
                         eef_pose['orientation'].w, ])

    def get_right_hand_pos(self):
        eef_pose = self._right_arm.endpoint_pose()
        return np.array([eef_pose['position'].x,
                         eef_pose['position'].y,
                         eef_pose['position'].z, ])

    def go_to_pose(self, position, orientation):
        try:
            traj_options = TrajectoryOptions()
            traj_options.interpolation_type = TrajectoryOptions.CARTESIAN
            traj = MotionTrajectory(trajectory_options=traj_options, limb=self._right_arm)

            wpt_opts = MotionWaypointOptions(max_linear_speed=0.6,
                                             max_linear_accel=0.6,
                                             max_rotational_speed=1.57,
                                             max_rotational_accel=1.57,
                                             max_joint_speed_ratio=1.0)
            waypoint = MotionWaypoint(options=wpt_opts.to_msg(), limb=self._right_arm)

            pose = Pose()
            pose.position.x = position[0]
            pose.position.y = position[1]
            pose.position.z = position[2]
            pose.orientation.x = orientation[0]
            pose.orientation.y = orientation[1]
            pose.orientation.z = orientation[2]
            pose.orientation.w = orientation[0]
            poseStamped = PoseStamped()
            poseStamped.pose = pose
            joint_angles = self._right_arm.joint_ordered_angles()
            waypoint.set_cartesian_pose(poseStamped, "right_hand", joint_angles)

            rospy.loginfo('Sending waypoint: \n%s', waypoint.to_string())

            traj.append_waypoint(waypoint.to_msg())

            result = traj.send_trajectory(timeout=10)
            if result is None:
                rospy.logerr('Trajectory FAILED to send')
                return

            if result.result:
                rospy.loginfo('Motion controller successfully finished the trajectory!')
            else:
                rospy.logerr('Motion controller failed to complete the trajectory with error %s',
                             result.errorId)

        except rospy.ROSInterruptException:
            rospy.logerr('Keyboard interrupt detected from the user. Exiting before trajectory completion.')

    def go_to_start(self):
        self.go_to_pose(self.start_eef_pos, self.start_eef_quat)

    def set_neutral(self):
        """
        Sets both arms back into a neutral pose.
        """
        print("Moving to neutral pose...")
        self._right_arm.move_to_neutral(speed = 0.15)

    def clean_shutdown(self):
        print("\nExiting example...")
        # return to normal
        self._reset_control_modes()
        self.set_neutral()
        return True

    def get_control(self, action, safety_max = 0.1):
        current_joint_angles = [self._right_arm.joint_angles()['right_j{}'.format(i)] for i in range(7)]

        z_vel = self.get_right_hand_pos()[2] - self.start_eef_pos[2]
        action = np.concatenate([action, [2 * z_vel]])

        # get x,y,z velocity in base frame
        action_in_base = self.base_rot_in_eef.dot(action)
        action_in_base = np.clip(action_in_base,-safety_max,safety_max)

        # Correct for any change in orientation using a proportional controller
        current_right_hand_quat = self.get_right_hand_quat()
        reference_right_hand_quat = self.start_eef_quat
        orn_diff = T.quat_multiply(reference_right_hand_quat, T.quat_inverse(current_right_hand_quat))

        orn_diff_mat = T.quat2mat(orn_diff)
        orn_diff_twice = orn_diff_mat.dot(orn_diff_mat)

        # Construct pose matrix
        pose_matrix = np.zeros((4, 4))
        pose_matrix[:3, :3] = orn_diff_twice
        pose_matrix[:3, 3] = action_in_base
        pose_matrix[3, 3] = 1

        # pose_matrix = T.pose2mat((action_in_base, orn_diff))
        joint_velocities = self.controller.compute_joint_velocities_for_endpoint_velocity(pose_matrix,
                                                                                          current_joint_angles)
        j_v = {}
        for i in range(7):
            key = 'right_j{}'.format(i)
            j_v[key] = joint_velocities[i]
        return j_v

    def characterisation_observation_callback(self, data):
        self.characterisation_observation = data

    def observation_callback(self, data):
        self.observation = data.data

    def get_observations(self):
        return copy.deepcopy(self.observation), copy.deepcopy(self.characterisation_observation)

    def reset(self):
        rospy.loginfo('Resetting push robot observation publisher')
        self.observation = None
        self.characterisation_observation = None
class Control(object):
    def __init__(self):
        # Make sure there is a clean shutdown
        rospy.on_shutdown(self.clean_shutdown)
        # Setting up Sawyer
        self._right_arm = intera_interface.limb.Limb("right")
        self._right_joint_names = self._right_arm.joint_names()

        print("Getting robot state... ")
        self._rs = intera_interface.RobotEnable(CHECK_VERSION)
        self._init_state = self._rs.state().enabled
        print("Enabling robot... ")
        self._rs.enable()

        self.set_neutral()

        #  end-effector initial pose
        self.eef_pose = self._right_arm.endpoint_pose()
        self.eef_quat = np.array([
            self.eef_pose['orientation'].x,
            self.eef_pose['orientation'].y,
            self.eef_pose['orientation'].z,
            self.eef_pose['orientation'].w,
        ])

        self.base_rot_in_eef = T.quat2mat(self.eef_quat).T

        # control parameters
        self._rate = 500.0  # Hz

        # Eef velocity control
        self.controller = SawyerEEFVelocityController()

        #Policy parameters
        self.policy_type = 'joint'
        self.line_policy = np.array([0., 0., 0.])
        self.period_factor = 0.15
        self.amplitude_factor = 0.1

    def set_policy_type(self, policy_type):
        assert policy_type == 'joint' or policy_type == 'eef_circle' or policy_type == "eef_line"

        self.policy_type = policy_type

    def set_period_amplitude(self, period, amplitude):
        if (period is not None):
            self.period_factor = period
        if (amplitude is not None):
            self.amplitude_factor = amplitude

    def set_line_policy(self, line_policy):
        if (line_policy is not None):
            self.line_policy = line_policy

    def cos_wave(self, elapsed):
        w = self.period_factor * elapsed
        return self.amplitude_factor * math.cos(w * 2 * math.pi)

    def sin_wave(self, elapsed):
        w = self.period_factor * elapsed
        return self.amplitude_factor * math.sin(w * 2 * math.pi)

    def get_policy(self, time, theshold_time=-1.):
        if (self.policy_type == 'joint'):
            return np.array([self.sin_wave(time) for _ in range(7)])

        elif (self.policy_type == 'eef_circle'):
            return np.array([self.sin_wave(time), self.cos_wave(time), 0.0])

        elif (self.policy_type == 'eef_line'):

            if (time < theshold_time):
                return self.line_policy
            else:
                return np.array([0., 0., 0.])

    def _reset_control_modes(self):
        rate = rospy.Rate(self._rate)
        for _ in xrange(100):
            if rospy.is_shutdown():
                return False
            self._right_arm.exit_control_mode()
            rate.sleep()
        return True

    def get_right_hand_quat(self):
        eef_pose = self._right_arm.endpoint_pose()
        return np.array([
            eef_pose['orientation'].x,
            eef_pose['orientation'].y,
            eef_pose['orientation'].z,
            eef_pose['orientation'].w,
        ])

    def set_neutral(self):
        """
        Sets both arms back into a neutral pose.
        """
        print("Moving to neutral pose...")
        self._right_arm.move_to_neutral(speed=0.1)

    def clean_shutdown(self):
        print("\nExiting example...")
        # return to normal
        self._reset_control_modes()
        self.set_neutral()
        return True

    def get_control(self, action, safety_max=0.1):
        current_joint_angles = [
            self._right_arm.joint_angles()['right_j{}'.format(i)]
            for i in range(7)
        ]

        # get x,y,z velocity in base frame
        action_in_base = self.base_rot_in_eef.dot(action)
        action_in_base = np.clip(action_in_base, -safety_max, safety_max)

        # Correct for any change in orientation using a proportional controller
        current_right_hand_quat = self.get_right_hand_quat()
        reference_right_hand_quat = self.eef_quat
        orn_diff = T.quat_multiply(reference_right_hand_quat,
                                   T.quat_inverse(current_right_hand_quat))

        orn_diff_mat = T.quat2mat(orn_diff)
        orn_diff_twice = orn_diff_mat.dot(orn_diff_mat)

        # Construct pose matrix
        pose_matrix = np.zeros((4, 4))
        pose_matrix[:3, :3] = orn_diff_twice
        pose_matrix[:3, 3] = action_in_base
        pose_matrix[3, 3] = 1

        # pose_matrix = T.pose2mat((action_in_base, orn_diff))
        joint_velocities = self.controller.compute_joint_velocities_for_endpoint_velocity(
            pose_matrix, current_joint_angles)
        j_v = {}
        for i in range(7):
            key = 'right_j{}'.format(i)
            j_v[key] = joint_velocities[i]
        return j_v

    def callback(self, data):
        self.control = data.data

        rospy.loginfo(type(self.control))
        rospy.loginfo(self.control)