class ScoopEnv: RIGHT = 0 LEFT = 1 CLOSE = 2 def __init__(self, port=19997): rospy.init_node('env', anonymous=True) self.sim_client = utils.connectToSimulation('127.0.0.1', port) # Create UR5 and restart simulator self.rdd = RDD(self.sim_client, open_force=10, close_force=20) self.ur5 = UR5(self.sim_client, self.rdd) self.nA = 3 self.cube = None self.cube_start_position = [-0.2, 0.9, 0.05] self.cube_size = [0.1, 0.2, 0.04] self.open_position = 0.3 self.state = [0 for _ in range(4 * 60)] self.stateSub = rospy.Subscriber('sim/state', Float32MultiArray, self.stateCallback) def stateCallback(self, msg): data = list(msg.data) self.state = self.state[4:] + data def reset(self): vrep.simxStopSimulation(self.sim_client, VREP_BLOCKING) time.sleep(1) vrep.simxStartSimulation(self.sim_client, VREP_BLOCKING) time.sleep(1) sim_ret, self.cube = utils.getObjectHandle(self.sim_client, 'cube') utils.setObjectPosition(self.sim_client, self.ur5.UR5_target, [-0.2, 0.6, 0.07]) dy = 0.3 * np.random.random() # dy = 0 # dz = 0.1 * np.random.random() - 0.05 current_pose = self.ur5.getEndEffectorPose() target_pose = current_pose.copy() target_pose[1, 3] += dy # target_pose[2, 3] += dz self.ur5.moveTo(target_pose) self.rdd.open(self.open_position) return self.state def step(self, a): if a in [self.RIGHT, self.LEFT]: current_pose = self.ur5.getEndEffectorPose() target_pose = current_pose.copy() if a == self.RIGHT: target_pose[1, 3] -= 0.01 elif a == self.LEFT: target_pose[1, 3] += 0.01 utils.setObjectPosition(self.sim_client, self.ur5.UR5_target, target_pose[:3, 3]) elif a == self.CLOSE: self.rdd.close() sim_ret, cube_orientation = utils.getObjectOrientation( self.sim_client, self.cube) sim_ret, cube_position = utils.getObjectPosition( self.sim_client, self.cube) sim_ret, tip_position = utils.getObjectPosition( self.sim_client, self.ur5.gripper_tip) if np.all(tip_position > (np.array(cube_position) - np.array(self.cube_size))) and \ np.all(tip_position < (np.array(cube_position) + np.array(self.cube_size))) and \ (cube_orientation[0] < -0.02 or cube_position[2] > self.cube_start_position[2] + 0.005): return None, 1, True, None self.rdd.open(self.open_position) # arm is in wrong pose sim_ret, target_position = utils.getObjectPosition( self.sim_client, self.ur5.UR5_target) if target_position[1] < 0.42 or target_position[ 1] > 0.95 or target_position[2] < 0 or target_position[2] > 0.2: print 'Wrong arm position: ', target_position return None, -1, True, None else: # cube in wrong position sim_ret, cube_position = utils.getObjectPosition( self.sim_client, self.cube) while any(np.isnan(cube_position)): res, cube_position = utils.getObjectPosition( self.sim_client, self.cube) if cube_position[0] < self.cube_start_position[0] - self.cube_size[0] or \ cube_position[0] > self.cube_start_position[0] + self.cube_size[0] or \ cube_position[1] < self.cube_start_position[1] - self.cube_size[1] or \ cube_position[1] > self.cube_start_position[1] + self.cube_size[1]: print 'Wrong cube position: ', cube_position return None, 0, True, None # cube is not lifted return self.state, 0, False, None
class SimpleGraspEnv: N = 0 S = 1 E = 2 W = 3 CLOSE = 4 def __init__(self, port=19997): self.sim_client = utils.connectToSimulation('127.0.0.1', port) self.rdd = RDD(self.sim_client, open_force=20, close_force=20) self.ur5 = UR5(self.sim_client, self.rdd) self.nA = 5 self.cube = None self.cube_start_position = [-0.35, 0.7, 0.03] self.cube_size = [0.1, 0.1, 0.1] self.open_position = 0.3 def getState(self): sim_ret, narrow_velocity = utils.getJointPosition( self.sim_client, self.rdd.finger_joint_narrow) sim_ret, narrow_force = utils.getJointForce( self.sim_client, self.rdd.finger_joint_narrow) sim_ret, wide_velocity = utils.getJointPosition( self.sim_client, self.rdd.finger_joint_wide) sim_ret, wide_force = utils.getJointForce(self.sim_client, self.rdd.finger_joint_wide) return narrow_velocity, narrow_force, wide_velocity, wide_force def reset(self): vrep.simxStopSimulation(self.sim_client, VREP_BLOCKING) time.sleep(1) vrep.simxStartSimulation(self.sim_client, VREP_BLOCKING) time.sleep(1) # Generate a cube position = self.cube_start_position # orientation = [np.radians(90), 0, np.radians(90)] orientation = [0, 0, 0] size = self.cube_size mass = 10 color = [255, 0, 0] self.cube = utils.generateShape(self.sim_client, 'cube', 0, size, position, orientation, mass, color) self.rdd.open(self.open_position) utils.setObjectPosition(self.sim_client, self.ur5.UR5_target, [-0.2, 0.5, 0.05]) # time.sleep(1) return self.getState() def step(self, a): if a in [self.N, self.S, self.W, self.E]: current_pose = self.ur5.getEndEffectorPose() target_pose = current_pose.copy() if a == self.N: target_pose[0, 3] += 0.01 elif a == self.S: target_pose[0, 3] -= 0.01 elif a == self.W: target_pose[1, 3] += 0.01 elif a == self.E: target_pose[1, 3] -= 0.01 utils.setObjectPosition(self.sim_client, self.ur5.UR5_target, target_pose[:3, 3]) elif a is self.CLOSE: closed = self.rdd.close() if not closed: sim_ret, cube_position = utils.getObjectPosition( self.sim_client, self.cube) sim_ret, tip_position = utils.getObjectPosition( self.sim_client, self.ur5.gripper_tip) if np.all(tip_position > (np.array(cube_position) - np.array(self.cube_size))) and \ np.all(tip_position < (np.array(cube_position) + np.array(self.cube_size))): return None, 1, True, None self.rdd.open(self.open_position) return self.getState(), 0, False, None
class ScoopEnv: RIGHT = 0 LEFT = 1 UP = 2 DOWN = 3 CLOSE = 4 def __init__(self, port=19997): self.sim_client = utils.connectToSimulation('127.0.0.1', port) # Create UR5 and restart simulator self.rdd = RDD(self.sim_client, open_force=20, close_force=20) self.ur5 = UR5(self.sim_client, self.rdd) self.nA = 5 self.cube = None self.cube_start_position = [-0.2, 0.9, 0.05] self.cube_size = [0.1, 0.2, 0.04] self.open_position = 0.3 def getState(self): sim_ret, narrow_velocity = utils.getJointPosition(self.sim_client, self.rdd.finger_joint_narrow) sim_ret, narrow_force = utils.getJointForce(self.sim_client, self.rdd.finger_joint_narrow) sim_ret, wide_velocity = utils.getJointPosition(self.sim_client, self.rdd.finger_joint_wide) sim_ret, wide_force = utils.getJointForce(self.sim_client, self.rdd.finger_joint_wide) return narrow_velocity, narrow_force, wide_velocity, wide_force def reset(self): vrep.simxStopSimulation(self.sim_client, VREP_BLOCKING) time.sleep(1) vrep.simxStartSimulation(self.sim_client, VREP_BLOCKING) time.sleep(1) # Generate a cube # position = self.cube_start_position # orientation = [np.radians(90), 0, np.radians(90)] # # orientation = [0, 0, 0] # size = self.cube_size # mass = 0.1 # color = [255, 0, 0] # self.cube = utils.importShape(self.sim_client, 'cube', CUBE_MESH, position, orientation, color) # self.cube = utils.generateShape(self.sim_client, 'cube', 0, size, position, orientation, mass, color) # time.sleep(1) sim_ret, self.cube = utils.getObjectHandle(self.sim_client, 'cube') utils.setObjectPosition(self.sim_client, self.ur5.UR5_target, [-0.2, 0.6, 0.07]) # dy = 0.3 * np.random.random() dy = 0 dz = 0.1 * np.random.random() - 0.05 current_pose = self.ur5.getEndEffectorPose() target_pose = current_pose.copy() target_pose[1, 3] += dy target_pose[2, 3] += dz self.ur5.moveTo(target_pose) self.rdd.open(self.open_position) return self.getState() def step(self, a): if a in [self.RIGHT, self.LEFT, self.UP, self.DOWN]: current_pose = self.ur5.getEndEffectorPose() target_pose = current_pose.copy() if a == self.RIGHT: target_pose[1, 3] -= 0.01 elif a == self.LEFT: target_pose[1, 3] += 0.01 elif a == self.UP: target_pose[2, 3] += 0.01 elif a == self.DOWN: target_pose[2, 3] -= 0.01 utils.setObjectPosition(self.sim_client, self.ur5.UR5_target, target_pose[:3, 3]) elif a == self.CLOSE: self.rdd.close() sim_ret, cube_orientation = utils.getObjectOrientation(self.sim_client, self.cube) sim_ret, cube_position = utils.getObjectPosition(self.sim_client, self.cube) sim_ret, tip_position = utils.getObjectPosition(self.sim_client, self.ur5.gripper_tip) if np.all(tip_position > (np.array(cube_position) - np.array(self.cube_size))) and \ np.all(tip_position < (np.array(cube_position) + np.array(self.cube_size))) and \ (cube_orientation[0] < -0.02 or cube_position[2] > self.cube_start_position[2] + 0.005): return None, 1, True, None self.rdd.open(self.open_position) # arm is in wrong pose sim_ret, target_position = utils.getObjectPosition(self.sim_client, self.ur5.UR5_target) if target_position[1] < 0.42 or target_position[1] > 0.95 or target_position[2] < 0 or target_position[2] > 0.2: print 'Wrong arm position: ', target_position return None, -1, True, None else: # cube in wrong position sim_ret, cube_position = utils.getObjectPosition(self.sim_client, self.cube) while any(np.isnan(cube_position)): res, cube_position = utils.getObjectPosition(self.sim_client, self.cube) if cube_position[0] < self.cube_start_position[0] - self.cube_size[0] or \ cube_position[0] > self.cube_start_position[0] + self.cube_size[0] or\ cube_position[1] < self.cube_start_position[1] - self.cube_size[1] or\ cube_position[1] > self.cube_start_position[1] + self.cube_size[1]: print 'Wrong cube position: ', cube_position return None, 0, True, None # cube is not lifted return self.getState(), 0, False, None def planAction(self): sim_ret, target_position = utils.getObjectPosition(self.sim_client, self.ur5.UR5_target) # step 1: move to bottom if target_position[2] > 0.06: return self.DOWN elif target_position[2] < 0.05: return self.UP # step 2: move to left elif target_position[1] < 0.79: return self.LEFT elif target_position[1] > 0.8: return self.RIGHT # step 3: close else: return self.CLOSE