def main(args): cfg_file = os.path.join(args.example_config_path, args.primitive) + ".yaml" cfg = get_cfg_defaults() cfg.merge_from_file(cfg_file) cfg.freeze() rospy.init_node('MacroActions') signal.signal(signal.SIGINT, signal_handler) data = {} data['saved_data'] = [] data['metadata'] = {} # parent1, child1 = Pipe() # parent2, child2 = Pipe() # work_queue = Queue() # result_queue = Queue() # p1 = Process(target=worker_yumi, args=(child1, work_queue, result_queue, cfg, args)) # p2 = Process(target=worker_yumi, args=(child2, work_queue, result_queue, cfg, args)) # p1.start() # p2.start() # parent1.send("RESET") # parent2.send("RESET") # print("started workers") # time.sleep(15.0) # embed() # # setup yumi # data_seed = 1 data_seed = args.np_seed np.random.seed(data_seed) yumi_ar = Robot('yumi_palms', pb=True, pb_cfg={'gui': args.visualize}, arm_cfg={'self_collision': False, 'seed': data_seed}) r_gel_id = cfg.RIGHT_GEL_ID l_gel_id = cfg.LEFT_GEL_ID alpha = cfg.ALPHA K = cfg.GEL_CONTACT_STIFFNESS restitution = cfg.GEL_RESTITUION p.changeDynamics( yumi_ar.arm.robot_id, r_gel_id, restitution=restitution, contactStiffness=K, contactDamping=alpha*K, rollingFriction=args.rolling ) p.changeDynamics( yumi_ar.arm.robot_id, l_gel_id, restitution=restitution, contactStiffness=K, contactDamping=alpha*K, rollingFriction=args.rolling ) dynamics_info = {} dynamics_info['contactDamping'] = alpha*K dynamics_info['contactStiffness'] = K dynamics_info['rollingFriction'] = args.rolling dynamics_info['restitution'] = restitution yumi_gs = YumiCamsGS( yumi_ar, cfg, exec_thread=False, sim_step_repeat=args.step_repeat) for _ in range(10): yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) if args.object: obj_id = yumi_ar.pb_client.load_urdf( args.config_package_path + 'descriptions/urdf/'+args.object_name+'.urdf', cfg.OBJECT_POSE_3[0:3], cfg.OBJECT_POSE_3[3:] ) goal_obj_id = yumi_ar.pb_client.load_urdf( args.config_package_path + 'descriptions/urdf/'+args.object_name+'_trans.urdf', cfg.OBJECT_POSE_3[0:3], cfg.OBJECT_POSE_3[3:] ) p.setCollisionFilterPair(yumi_ar.arm.robot_id, goal_obj_id, r_gel_id, -1, enableCollision=False) p.setCollisionFilterPair(obj_id, goal_obj_id, -1, -1, enableCollision=False) p.setCollisionFilterPair(yumi_ar.arm.robot_id, obj_id, r_gel_id, -1, enableCollision=True) p.setCollisionFilterPair(yumi_ar.arm.robot_id, obj_id, 27, -1, enableCollision=True) yumi_ar.pb_client.reset_body( obj_id, cfg.OBJECT_POSE_3[:3], cfg.OBJECT_POSE_3[3:]) yumi_ar.pb_client.reset_body( goal_obj_id, cfg.OBJECT_POSE_3[:3], cfg.OBJECT_POSE_3[3:]) manipulated_object = None object_pose1_world = util.list2pose_stamped(cfg.OBJECT_INIT) object_pose2_world = util.list2pose_stamped(cfg.OBJECT_FINAL) palm_pose_l_object = util.list2pose_stamped(cfg.PALM_LEFT) palm_pose_r_object = util.list2pose_stamped(cfg.PALM_RIGHT) example_args = {} example_args['object_pose1_world'] = object_pose1_world example_args['object_pose2_world'] = object_pose2_world example_args['palm_pose_l_object'] = palm_pose_l_object example_args['palm_pose_r_object'] = palm_pose_r_object example_args['object'] = manipulated_object example_args['N'] = 60 example_args['init'] = True example_args['table_face'] = 0 primitive_name = args.primitive mesh_file = args.config_package_path + 'descriptions/meshes/objects/' + args.object_name + '_experiments.stl' exp_single = SingleArmPrimitives( cfg, yumi_ar.pb_client.get_client_id(), obj_id, mesh_file) if primitive_name == 'grasp' or primitive_name == 'pivot': exp_double = DualArmPrimitives( cfg, yumi_ar.pb_client.get_client_id(), obj_id, mesh_file) exp_running = exp_double else: exp_running = exp_single # setup macro_planner action_planner = ClosedLoopMacroActions( cfg, yumi_gs, obj_id, yumi_ar.pb_client.get_client_id(), args.config_package_path, replan=args.replan, object_mesh_file=mesh_file ) data['metadata']['mesh_file'] = mesh_file data['metadata']['cfg'] = cfg data['metadata']['dynamics'] = dynamics_info data['metadata']['cam_cfg'] = yumi_gs.cam_setup_cfg data['metadata']['step_repeat'] = args.step_repeat delta_z_height = 0.95 with open(args.config_package_path+'descriptions/urdf/'+args.object_name+'.urdf', 'rb') as f: urdf_txt = f.read() data['metadata']['object_urdf'] = urdf_txt data['metadata']['delta_z_height'] = delta_z_height data['metadata']['step_repeat'] = args.step_repeat data['metadata']['seed'] = data_seed metadata = data['metadata'] if args.multi: cuboid_sampler = CuboidSampler( '/root/catkin_ws/src/primitives/objects/cuboids/nominal_cuboid.stl', pb_client=yumi_ar.pb_client) cuboid_fname_template = '/root/catkin_ws/src/primitives/objects/cuboids/' cuboid_manager = MultiBlockManager( cuboid_fname_template, cuboid_sampler, robot_id=yumi_ar.arm.robot_id, table_id=27, r_gel_id=r_gel_id, l_gel_id=l_gel_id) yumi_ar.pb_client.remove_body(obj_id) yumi_ar.pb_client.remove_body(goal_obj_id) cuboid_fname = cuboid_manager.get_cuboid_fname() obj_id, sphere_ids, mesh, goal_obj_id = \ cuboid_sampler.sample_cuboid_pybullet( cuboid_fname, goal=True, keypoints=False) cuboid_manager.filter_collisions(obj_id, goal_obj_id) action_planner.update_object(obj_id, mesh_file) trans_box_lock = threading.RLock() goal_viz = GoalVisual( trans_box_lock, goal_obj_id, action_planner.pb_client, cfg.OBJECT_POSE_3) pickle_path = os.path.join( args.data_dir, primitive_name, args.experiment_name ) if not os.path.exists(pickle_path): os.makedirs(pickle_path) data_manager = DataManager(pickle_path) if args.save_data: with open(os.path.join(pickle_path, 'metadata.pkl'), 'wb') as mdata_f: pickle.dump(metadata, mdata_f) if args.debug: if args.multi: cuboid_sampler.delete_cuboid(obj_id, goal_obj_id, sphere_ids) cuboid_fname = cuboid_manager.get_cuboid_fname() obj_id, sphere_ids, mesh, goal_obj_id = cuboid_sampler.sample_cuboid_pybullet( cuboid_fname, goal=True, keypoints=False) cuboid_manager.filter_collisions(obj_id, goal_obj_id) goal_viz.update_goal_obj(goal_obj_id) p.changeDynamics( obj_id, -1, lateralFriction=0.4 ) action_planner.update_object(obj_id, mesh_file) exp_running.initialize_object(obj_id, cuboid_fname) print('Reset multi block!') else: cuboid_fname = '/root/catkin_ws/src/config/descriptions/meshes/objects/cuboids/realsense_box_experiments.stl' for _ in range(args.num_obj_samples): if primitive_name == 'pull': init_id = exp_running.get_rand_init(ind=2)[-1] obj_pose_final = util.list2pose_stamped(exp_running.init_poses[init_id]) point, normal, face = exp_running.sample_contact(primitive_name) world_pose = exp_running.get_palm_poses_world_frame( point, normal, primitive_name=primitive_name) obj_pos_world = list(p.getBasePositionAndOrientation( obj_id, yumi_ar.pb_client.get_client_id())[0]) obj_ori_world = list(p.getBasePositionAndOrientation( obj_id, yumi_ar.pb_client.get_client_id())[1]) obj_pose_world = util.list2pose_stamped(obj_pos_world + obj_ori_world) contact_obj_frame = util.convert_reference_frame( world_pose, obj_pose_world, util.unit_pose()) example_args['palm_pose_r_object'] = contact_obj_frame example_args['object_pose1_world'] = obj_pose_world obj_pose_final = util.list2pose_stamped(exp_running.init_poses[init_id]) obj_pose_final.pose.position.z = obj_pose_world.pose.position.z/1.175 print("init: ") print(util.pose_stamped2list(object_pose1_world)) print("final: ") print(util.pose_stamped2list(obj_pose_final)) example_args['object_pose2_world'] = obj_pose_final example_args['table_face'] = init_id elif primitive_name == 'grasp': k = 0 have_contact = False contact_face = None while True: x, y, dq, q, init_id = exp_running.get_rand_init() obj_pose_world_nom = exp_running.get_obj_pose()[0] palm_poses_world = exp_running.get_palm_poses_world_frame( init_id, obj_pose_world_nom, [x, y, dq]) # get_palm_poses_world_frame may adjust the # initial object pose, so need to check it again obj_pose_world = exp_running.get_obj_pose()[0] if palm_poses_world is not None: have_contact = True break k += 1 if k >= 10: print("FAILED") break if have_contact: obj_pose_final = exp_running.goal_pose_world_frame_mod palm_poses_obj_frame = {} for key in palm_poses_world.keys(): palm_poses_obj_frame[key] = util.convert_reference_frame( palm_poses_world[key], obj_pose_world, util.unit_pose()) example_args['palm_pose_r_object'] = palm_poses_obj_frame['right'] example_args['palm_pose_l_object'] = palm_poses_obj_frame['left'] example_args['object_pose1_world'] = obj_pose_world example_args['object_pose2_world'] = obj_pose_final example_args['table_face'] = init_id plan = action_planner.get_primitive_plan(primitive_name, example_args, 'right') embed() import simulation for i in range(10): simulation.visualize_object( object_pose1_world, filepath="package://config/descriptions/meshes/objects/cuboids/" + cuboid_fname.split('objects/cuboids')[1], name="/object_initial", color=(1., 0., 0., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) simulation.visualize_object( object_pose2_world, filepath="package://config/descriptions/meshes/objects/cuboids/" + cuboid_fname.split('objects/cuboids')[1], name="/object_final", color=(0., 0., 1., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) rospy.sleep(.1) simulation.simulate(plan, cuboid_fname.split('objects/cuboids')[1]) else: global_start = time.time() face = 0 # exp_double.reset_graph(face) start_time = time.time() success = 0 for trial in range(args.num_trials): k = 0 if args.multi: cuboid_sampler.delete_cuboid(obj_id, goal_obj_id, sphere_ids) cuboid_fname = cuboid_manager.get_cuboid_fname() obj_id, sphere_ids, mesh, goal_obj_id = cuboid_sampler.sample_cuboid_pybullet( cuboid_fname, goal=True, keypoints=False) cuboid_manager.filter_collisions(obj_id, goal_obj_id) goal_viz.update_goal_obj(goal_obj_id) p.changeDynamics( obj_id, -1, lateralFriction=0.4 ) action_planner.update_object(obj_id, mesh_file) exp_running.initialize_object(obj_id, cuboid_fname) print('Reset multi block!') for _ in range(args.num_obj_samples): while True: have_contact = False # sample a random stable pose, and get the corresponding # stable orientation index k += 1 if primitive_name == 'pull': # init_id = exp_running.get_rand_init()[-1] init_id = exp_running.get_rand_init()[-1] # sample a point on the object that is valid # for the primitive action being executed point, normal, face = exp_running.sample_contact( primitive_name=primitive_name) if point is not None: break elif primitive_name == 'grasp': x, y, dq, q, init_id = exp_double.get_rand_init() obj_pose_world_nom = exp_double.get_obj_pose()[0] palm_poses_world = exp_double.get_palm_poses_world_frame( init_id, obj_pose_world_nom, [x, y, dq]) obj_pose_world = exp_double.get_obj_pose()[0] if palm_poses_world is not None: have_contact = True break if k >= 10: print("FAILED") return # for _ in range(10): # yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) if primitive_name == 'pull': # get the full 6D pose palm in world, at contact location palm_pose_world = exp_running.get_palm_poses_world_frame( point, normal, primitive_name=primitive_name) # get the object pose in the world frame # if trial == 0: # parent1.send("OBJECT_POSE") # elif trial == 1: # parent2.send("OBJECT_POSE") obj_pos_world = list(p.getBasePositionAndOrientation( obj_id, yumi_ar.pb_client.get_client_id())[0]) obj_ori_world = list(p.getBasePositionAndOrientation( obj_id, yumi_ar.pb_client.get_client_id())[1]) obj_pose_world = util.list2pose_stamped( obj_pos_world + obj_ori_world) # obj_pose_world = work_queue.get(block=True) # transform the palm pose from the world frame to the object frame contact_obj_frame = util.convert_reference_frame( palm_pose_world, obj_pose_world, util.unit_pose()) # set up inputs to the primitive planner, based on task # including sampled initial object pose and contacts, # and final object pose example_args['palm_pose_r_object'] = contact_obj_frame example_args['object_pose1_world'] = obj_pose_world # obj_pose_final = util.list2pose_stamped(exp_running.init_poses[init_id]) x, y, q, _ = exp_running.get_rand_init(execute=False, ind=init_id) final_nominal = exp_running.init_poses[init_id] final_nominal[0] = x final_nominal[1] = y final_nominal[3:] = q obj_pose_final = util.list2pose_stamped(final_nominal) goal_viz.update_goal_state(final_nominal) obj_pose_final.pose.position.z += cfg.TABLE_HEIGHT example_args['object_pose2_world'] = obj_pose_final example_args['table_face'] = init_id example_args['primitive_name'] = primitive_name example_args['N'] = exp_running.calc_n( obj_pose_world, obj_pose_final) elif primitive_name == 'grasp': if have_contact: obj_pose_final = exp_double.goal_pose_world_frame_mod palm_poses_obj_frame = {} for key in palm_poses_world.keys(): palm_poses_obj_frame[key] = util.convert_reference_frame( palm_poses_world[key], obj_pose_world, util.unit_pose() ) example_args['palm_pose_r_object'] = palm_poses_obj_frame['right'] example_args['palm_pose_l_object'] = palm_poses_obj_frame['left'] example_args['object_pose1_world'] = obj_pose_world example_args['object_pose2_world'] = obj_pose_final example_args['table_face'] = init_id else: continue try: obs, pcd = yumi_gs.get_observation(obj_id=obj_id) start = util.pose_stamped2list(obj_pose_world) goal = util.pose_stamped2list(obj_pose_final) keypoints_start = np.array(exp_running.mesh_world.vertices.tolist()) keypoints_start_homog = np.hstack( (keypoints_start, np.ones((keypoints_start.shape[0], 1))) ) start_mat = util.matrix_from_pose(obj_pose_world) goal_mat = util.matrix_from_pose(obj_pose_final) T_mat = np.matmul(goal_mat, np.linalg.inv(start_mat)) keypoints_goal = np.matmul(T_mat, keypoints_start_homog.T).T[:, :3] contact_obj_frame_dict = {} contact_world_frame_dict = {} nearest_pt_world_dict = {} if primitive_name == 'pull': active_arm, inactive_arm = action_planner.get_active_arm( util.pose_stamped2list(obj_pose_world) ) # get contact (palm pose object frame) contact_obj_frame_dict[active_arm] = util.pose_stamped2list(contact_obj_frame) contact_world_frame_dict[active_arm] = util.pose_stamped2list(palm_pose_world) contact_pos = open3d.utility.DoubleVector(np.array(contact_world_frame_dict[active_arm][:3])) kdtree = open3d.geometry.KDTreeFlann(pcd) # nearest_pt_ind = kdtree.search_knn_vector_3d(contact_pos, 1)[1][0] # nearest_pt_world_dict[active_arm] = np.asarray(pcd.points)[nearest_pt_ind] contact_obj_frame_dict[inactive_arm] = None contact_world_frame_dict[inactive_arm] = None nearest_pt_world_dict[inactive_arm] = None elif primitive_name == 'grasp': for key in palm_poses_obj_frame.keys(): contact_obj_frame_dict[key] = util.pose_stamped2list(palm_poses_obj_frame[key]) contact_world_frame_dict[key] = util.pose_stamped2list(palm_poses_world[key]) contact_pos = open3d.utility.DoubleVector(np.array(contact_world_frame_dict[key][:3])) kdtree = open3d.geometry.KDTreeFlann(pcd) # nearest_pt_ind = kdtree.search_knn_vector_3d(contact_pos, 1)[1][0] # nearest_pt_world_dict[key] = np.asarray(pcd.points)[nearest_pt_ind] result = action_planner.execute(primitive_name, example_args) if result is not None: print('Trial number: ' + str(trial) + ', reached final: ' + str(result[0])) print('Time so far: ' + str(time.time() - start_time)) if result[0]: success += 1 sample = {} sample['obs'] = obs sample['start'] = start sample['goal'] = goal sample['keypoints_start'] = keypoints_start sample['keypoints_goal'] = keypoints_goal sample['transformation'] = util.pose_from_matrix(T_mat) sample['contact_obj_frame'] = contact_obj_frame_dict sample['contact_world_frame'] = contact_world_frame_dict # sample['contact_pcd'] = nearest_pt_world_dict sample['result'] = result if primitive_name == 'grasp': sample['goal_face'] = exp_double.goal_face if args.save_data: data_manager.save_observation(sample, str(trial)) print("Success: " + str(success)) else: continue # data['saved_data'].append(sample) # if trial == 0: # parent1.send("SAMPLE") # elif trial == 1: # parent2.send("SAMPLE") # result = work_queue.get(block=True) # if trial == 0: # parent1.send("SAMPLE") # elif trial == 1: # parent2.send("SAMPLE") # parent1.send("SAMPLE") # parent2.send("SAMPLE") # start = time.time() # done = False # result_list = [] # while (time.time() - start) < cfg.TIMEOUT and not done: # try: # result = result_queue.get(block=True) # result_list.append(result) # if len(result_list) == 2: # done = True # except result_queue.Empty: # continue # time.sleep(0.001) except ValueError as e: print("Value error: ") print(e) # time.sleep(1.0) # pose = util.pose_stamped2list(yumi_gs.compute_fk(yumi_gs.get_jpos(arm='right'))) # pos, ori = pose[:3], pose[3:] # # pose = yumi_gs.get_ee_pose() # # pos, ori = pose[0], pose[1] # # pos[2] -= 0.0714 # pos[2] += 0.001 # r_jnts = yumi_gs.compute_ik(pos, ori, yumi_gs.get_jpos(arm='right')) # l_jnts = yumi_gs.get_jpos(arm='left') # if r_jnts is not None: # for _ in range(10): # pos[2] += 0.001 # r_jnts = yumi_gs.compute_ik(pos, ori, yumi_gs.get_jpos(arm='right')) # l_jnts = yumi_gs.get_jpos(arm='left') # if r_jnts is not None: # yumi_gs.update_joints(list(r_jnts) + l_jnts) # time.sleep(0.1) time.sleep(0.1) for _ in range(10): yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) # for _ in range(10): # j_pos = cfg.RIGHT_INIT + cfg.LEFT_INIT # for ind, jnt_id in enumerate(yumi_ar.arm.arm_jnt_ids): # p.resetJointState( # yumi_ar.arm.robot_id, # jnt_id, # targetValue=j_pos[ind] # ) # yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) # p.resetJointStatesMultiDof( # yumi_ar.arm.robot_id, # yumi_ar.arm.arm_jnt_ids, # targetValues=j_pos) # parent1.send("HOME") # parent2.send("HOME") # time.sleep(1.0) print("TOTAL TIME: " + str(time.time() - global_start))
def main(args): cfg_file = os.path.join(args.example_config_path, args.primitive) + ".yaml" cfg = get_cfg_defaults() cfg.merge_from_file(cfg_file) cfg.freeze() rospy.init_node('MacroActions') data = {} data['saved_data'] = [] data['metadata'] = {} # parent1, child1 = Pipe() # parent2, child2 = Pipe() # work_queue = Queue() # result_queue = Queue() # p1 = Process(target=worker_yumi, args=(child1, work_queue, result_queue, cfg, args)) # p2 = Process(target=worker_yumi, args=(child2, work_queue, result_queue, cfg, args)) # p1.start() # p2.start() # parent1.send("RESET") # parent2.send("RESET") # print("started workers") # time.sleep(15.0) # embed() # # setup yumi yumi_ar = Robot('yumi', pb=True, arm_cfg={ 'render': args.visualize, 'self_collision': False, 'rt_simulation': False }) yumi_ar.arm.set_jpos(cfg.RIGHT_INIT + cfg.LEFT_INIT) gel_id = 12 alpha = 0.01 K = 500 restitution = 0.99 dynamics_info = {} dynamics_info['contactDamping'] = alpha * K dynamics_info['contactStiffness'] = K dynamics_info['rollingFriction'] = args.rolling dynamics_info['restitution'] = restitution p.changeDynamics(yumi_ar.arm.robot_id, gel_id, restitution=restitution, contactStiffness=K, contactDamping=alpha * K, rollingFriction=args.rolling) # setup yumi_gs # yumi_gs = YumiGelslimPybulet(yumi_ar, cfg, exec_thread=args.execute_thread) yumi_gs = YumiCamsGS(yumi_ar, cfg, exec_thread=args.execute_thread) if args.object: box_id = pb_util.load_urdf( args.config_package_path + 'descriptions/urdf/' + args.object_name + '.urdf', cfg.OBJECT_POSE_3[0:3], cfg.OBJECT_POSE_3[3:]) # trans_box_id = pb_util.load_urdf( # args.config_package_path + # 'descriptions/urdf/'+args.object_name+'_trans.urdf', # cfg.OBJECT_POSE_3[0:3], # cfg.OBJECT_POSE_3[3:] # ) # setup macro_planner action_planner = ClosedLoopMacroActions(cfg, yumi_gs, box_id, pb_util.PB_CLIENT, args.config_package_path, replan=args.replan) manipulated_object = None object_pose1_world = util.list2pose_stamped(cfg.OBJECT_INIT) object_pose2_world = util.list2pose_stamped(cfg.OBJECT_FINAL) palm_pose_l_object = util.list2pose_stamped(cfg.PALM_LEFT) palm_pose_r_object = util.list2pose_stamped(cfg.PALM_RIGHT) example_args = {} example_args['object_pose1_world'] = object_pose1_world example_args['object_pose2_world'] = object_pose2_world example_args['palm_pose_l_object'] = palm_pose_l_object example_args['palm_pose_r_object'] = palm_pose_r_object example_args['object'] = manipulated_object # example_args['N'] = 60 # 60 example_args['N'] = calc_n(object_pose1_world, object_pose2_world) # 60 print("N: " + str(example_args['N'])) example_args['init'] = True example_args['table_face'] = 0 primitive_name = args.primitive mesh_file = args.config_package_path + 'descriptions/meshes/objects/' + args.object_name + '_experiments.stl' exp_single = SingleArmPrimitives(cfg, box_id, mesh_file) exp_double = DualArmPrimitives(cfg, box_id, mesh_file) # trans_box_lock = threading.RLock() # goal_viz = GoalVisual( # trans_box_lock, # trans_box_id, # action_planner.pb_client, # cfg.OBJECT_POSE_3) # visualize_goal_thread = threading.Thread( # target=goal_viz.visualize_goal_state) # visualize_goal_thread.daemon = True # visualize_goal_thread.start() data['metadata']['mesh_file'] = mesh_file data['metadata']['cfg'] = cfg data['metadata']['dynamics'] = dynamics_info data['metadata']['cam_cfg'] = yumi_gs.cam_cfg if args.debug: init_id = exp.get_rand_init(ind=2)[-1] obj_pose_final = util.list2pose_stamped(exp.init_poses[init_id]) point, normal, face = exp.sample_contact(primitive_name) # embed() world_pose = exp.get_palm_pose_world_frame( point, normal, primitive_name=primitive_name) obj_pos_world = list( p.getBasePositionAndOrientation(box_id, pb_util.PB_CLIENT)[0]) obj_ori_world = list( p.getBasePositionAndOrientation(box_id, pb_util.PB_CLIENT)[1]) obj_pose_world = util.list2pose_stamped(obj_pos_world + obj_ori_world) contact_obj_frame = util.convert_reference_frame( world_pose, obj_pose_world, util.unit_pose()) example_args['palm_pose_r_object'] = contact_obj_frame example_args['object_pose1_world'] = obj_pose_world obj_pose_final = util.list2pose_stamped(exp.init_poses[init_id]) obj_pose_final.pose.position.z = obj_pose_world.pose.position.z / 1.175 print("init: ") print(util.pose_stamped2list(object_pose1_world)) print("final: ") print(util.pose_stamped2list(obj_pose_final)) example_args['object_pose2_world'] = obj_pose_final example_args['table_face'] = init_id plan = action_planner.get_primitive_plan(primitive_name, example_args, 'right') embed() import simulation for i in range(10): simulation.visualize_object( object_pose1_world, filepath= "package://config/descriptions/meshes/objects/realsense_box_experiments.stl", name="/object_initial", color=(1., 0., 0., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) simulation.visualize_object( object_pose2_world, filepath= "package://config/descriptions/meshes/objects/realsense_box_experiments.stl", name="/object_final", color=(0., 0., 1., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) rospy.sleep(.1) simulation.simulate(plan) else: global_start = time.time() for trial in range(20): k = 0 while True: # sample a random stable pose, and get the corresponding # stable orientation index k += 1 # init_id = exp.get_rand_init()[-1] init_id = exp.get_rand_init(ind=0)[-1] # sample a point on the object that is valid # for the primitive action being executed point, normal, face = exp.sample_contact( primitive_name=primitive_name) if point is not None: break if k >= 10: print("FAILED") return # get the full 6D pose palm in world, at contact location palm_pose_world = exp.get_palm_pose_world_frame( point, normal, primitive_name=primitive_name) # get the object pose in the world frame # if trial == 0: # parent1.send("OBJECT_POSE") # elif trial == 1: # parent2.send("OBJECT_POSE") obj_pos_world = list( p.getBasePositionAndOrientation(box_id, pb_util.PB_CLIENT)[0]) obj_ori_world = list( p.getBasePositionAndOrientation(box_id, pb_util.PB_CLIENT)[1]) obj_pose_world = util.list2pose_stamped(obj_pos_world + obj_ori_world) # obj_pose_world = work_queue.get(block=True) # transform the palm pose from the world frame to the object frame contact_obj_frame = util.convert_reference_frame( palm_pose_world, obj_pose_world, util.unit_pose()) # set up inputs to the primitive planner, based on task # including sampled initial object pose and contacts, # and final object pose example_args['palm_pose_r_object'] = contact_obj_frame example_args['object_pose1_world'] = obj_pose_world obj_pose_final = util.list2pose_stamped(exp.init_poses[init_id]) obj_pose_final.pose.position.z /= 1.18 print("init: ") print(util.pose_stamped2list(object_pose1_world)) print("final: ") print(util.pose_stamped2list(obj_pose_final)) example_args['object_pose2_world'] = obj_pose_final example_args['table_face'] = init_id example_args['primitive_name'] = primitive_name example_args['N'] = calc_n(obj_pose_world, obj_pose_final) print("N: " + str(example_args['N'])) # if trial == 0: # goal_viz.update_goal_state(exp.init_poses[init_id]) try: # get observation (images/point cloud) obs = yumi_gs.get_observation(obj_id=box_id) # get start/goal (obj_pose_world, obj_pose_final) start = util.pose_stamped2list(obj_pose_world) goal = util.pose_stamped2list(obj_pose_final) # get corners (from exp? that has mesh) keypoints_start = np.array(exp.mesh_world.vertices.tolist()) keypoints_start_homog = np.hstack( (keypoints_start, np.ones((keypoints_start.shape[0], 1)))) goal_start_frame = util.convert_reference_frame( pose_source=obj_pose_final, pose_frame_target=obj_pose_world, pose_frame_source=util.unit_pose()) goal_start_frame_mat = util.matrix_from_pose(goal_start_frame) keypoints_goal = np.matmul(goal_start_frame_mat, keypoints_start_homog.T).T # get contact (palm pose object frame) contact_obj_frame = util.pose_stamped2list(contact_obj_frame) contact_world_frame = util.pose_stamped2list(palm_pose_world) contact_pos = open3d.utility.DoubleVector( np.array(contact_world_frame[:3])) kdtree = open3d.geometry.KDTreeFlann(obs['pcd_full']) nearest_pt_ind = kdtree.search_knn_vector_3d(contact_pos, 1)[1][0] nearest_pt_world = np.asarray( obs['pcd_full'].points)[nearest_pt_ind] # embed() result = action_planner.execute(primitive_name, example_args) sample = {} sample['obs'] = obs sample['start'] = start sample['goal'] = goal sample['keypoints_start'] = keypoints_start sample['keypoints_goal'] = keypoints_goal sample['transformation'] = util.pose_stamped2list( goal_start_frame) sample['contact_obj_frame'] = contact_obj_frame sample['contact_world_frame'] = contact_world_frame sample['contact_pcd'] = nearest_pt_world sample['result'] = result sample['planner_args'] = example_args data['saved_data'].append(sample) # if trial == 0: # parent1.send("SAMPLE") # elif trial == 1: # parent2.send("SAMPLE") # result = work_queue.get(block=True) # if trial == 0: # parent1.send("SAMPLE") # elif trial == 1: # parent2.send("SAMPLE") # parent1.send("SAMPLE") # parent2.send("SAMPLE") # start = time.time() # done = False # result_list = [] # while (time.time() - start) < cfg.TIMEOUT and not done: # try: # result = result_queue.get(block=True) # result_list.append(result) # if len(result_list) == 2: # done = True # except result_queue.Empty: # continue # time.sleep(0.001) print("reached final: " + str(result[0])) except ValueError: print("moveit failed!") # time.sleep(0.1) # yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) j_pos = cfg.RIGHT_INIT + cfg.LEFT_INIT for ind, jnt_id in enumerate(yumi_ar.arm.arm_jnt_ids): p.resetJointState(yumi_ar.arm.robot_id, jnt_id, targetValue=j_pos[ind]) # p.resetJointStatesMultiDof( # yumi_ar.arm.robot_id, # yumi_ar.arm.arm_jnt_ids, # targetValues=j_pos) # parent1.send("HOME") # parent2.send("HOME") # time.sleep(1.0) # embed() # embed() print("TOTAL TIME: " + str(time.time() - global_start)) with open('data/sample_data_right_hand_pull.pkl', 'wb') as data_f: pickle.dump(data, data_f)
def main(args): cfg_file = os.path.join(args.example_config_path, args.primitive) + ".yaml" cfg = get_cfg_defaults() cfg.merge_from_file(cfg_file) cfg.freeze() rospy.init_node('MacroActions') signal.signal(signal.SIGINT, signal_handler) data_seed = args.np_seed np.random.seed(data_seed) yumi_ar = Robot('yumi_palms', pb=True, pb_cfg={'gui': args.visualize}, arm_cfg={ 'self_collision': False, 'seed': data_seed }) r_gel_id = cfg.RIGHT_GEL_ID l_gel_id = cfg.LEFT_GEL_ID alpha = cfg.ALPHA K = cfg.GEL_CONTACT_STIFFNESS restitution = cfg.GEL_RESTITUION p.changeDynamics(yumi_ar.arm.robot_id, r_gel_id, restitution=restitution, contactStiffness=K, contactDamping=alpha * K, rollingFriction=args.rolling) p.changeDynamics(yumi_ar.arm.robot_id, l_gel_id, restitution=restitution, contactStiffness=K, contactDamping=alpha * K, rollingFriction=args.rolling) yumi_gs = YumiGelslimPybulet(yumi_ar, cfg, exec_thread=False) for _ in range(10): yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) cuboid_sampler = CuboidSampler( '/root/catkin_ws/src/primitives/objects/cuboids/nominal_cuboid.stl', pb_client=yumi_ar.pb_client) cuboid_fname_template = '/root/catkin_ws/src/config/descriptions/meshes/objects/cuboids/' cuboid_manager = MultiBlockManager(cuboid_fname_template, cuboid_sampler, robot_id=yumi_ar.arm.robot_id, table_id=27, r_gel_id=r_gel_id, l_gel_id=l_gel_id) cuboid_fname = cuboid_manager.get_cuboid_fname() print("Cuboid file: " + cuboid_fname) # cuboid_fname = os.path.join(cuboid_fname_template, 'test_cuboid_smaller_4206.stl') obj_id, sphere_ids, mesh, goal_obj_id = \ cuboid_sampler.sample_cuboid_pybullet( cuboid_fname, goal=True, keypoints=False) cuboid_manager.filter_collisions(obj_id, goal_obj_id) p.changeDynamics(obj_id, -1, lateralFriction=0.4) manipulated_object = None object_pose1_world = util.list2pose_stamped(cfg.OBJECT_INIT) object_pose2_world = util.list2pose_stamped(cfg.OBJECT_FINAL) palm_pose_l_object = util.list2pose_stamped(cfg.PALM_LEFT) palm_pose_r_object = util.list2pose_stamped(cfg.PALM_RIGHT) example_args = {} example_args['object_pose1_world'] = object_pose1_world example_args['object_pose2_world'] = object_pose2_world example_args['palm_pose_l_object'] = palm_pose_l_object example_args['palm_pose_r_object'] = palm_pose_r_object example_args['object'] = manipulated_object example_args['N'] = 60 example_args['init'] = True example_args['table_face'] = 0 primitive_name = args.primitive goal_face = 0 # mesh_file = args.config_package_path + 'descriptions/meshes/objects/' + \ # args.object_name + '_experiments.stl' mesh_file = cuboid_fname exp_single = SingleArmPrimitives(cfg, yumi_ar.pb_client.get_client_id(), obj_id, mesh_file) k = 0 while True: k += 1 if k > 10: print('FAILED TO BUILD GRASPING GRAPH') return try: exp_double = DualArmPrimitives(cfg, yumi_ar.pb_client.get_client_id(), obj_id, mesh_file, goal_face=goal_face) break except ValueError as e: print(e) yumi_ar.pb_client.remove_body(obj_id) yumi_ar.pb_client.remove_body(goal_obj_id) cuboid_fname = cuboid_manager.get_cuboid_fname() print("Cuboid file: " + cuboid_fname) obj_id, sphere_ids, mesh, goal_obj_id = \ cuboid_sampler.sample_cuboid_pybullet( cuboid_fname, goal=True, keypoints=False) cuboid_manager.filter_collisions(obj_id, goal_obj_id) p.changeDynamics(obj_id, -1, lateralFriction=0.4) if primitive_name == 'grasp': exp_running = exp_double else: exp_running = exp_single action_planner = ClosedLoopMacroActions(cfg, yumi_gs, obj_id, yumi_ar.pb_client.get_client_id(), args.config_package_path, replan=args.replan, object_mesh_file=mesh_file) trans_box_lock = threading.RLock() goal_viz = GoalVisual(trans_box_lock, goal_obj_id, action_planner.pb_client, cfg.OBJECT_POSE_3) action_planner.update_object(obj_id, mesh_file) exp_single.initialize_object(obj_id, cuboid_fname) exp_double.initialize_object(obj_id, cuboid_fname, goal_face) print('Reset multi block!') for _ in range(args.num_blocks): for _ in range(args.num_obj_samples): if primitive_name == 'grasp': start_face = exp_double.get_valid_ind() if start_face is None: print('Could not find valid start face') continue plan_args = exp_double.get_random_primitive_args( ind=start_face, random_goal=True, execute=True) elif primitive_name == 'pull': plan_args = exp_single.get_random_primitive_args( ind=None, random_goal=True, execute=True) start_pose = plan_args['object_pose1_world'] goal_pose = plan_args['object_pose2_world'] goal_viz.update_goal_state(util.pose_stamped2list(goal_pose)) if args.debug: import simulation plan = action_planner.get_primitive_plan( primitive_name, plan_args, 'right') for i in range(10): simulation.visualize_object( start_pose, filepath= "package://config/descriptions/meshes/objects/cuboids/" + cuboid_fname.split('objects/cuboids')[1], name="/object_initial", color=(1., 0., 0., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) simulation.visualize_object( goal_pose, filepath= "package://config/descriptions/meshes/objects/cuboids/" + cuboid_fname.split('objects/cuboids')[1], name="/object_final", color=(0., 0., 1., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) rospy.sleep(.1) simulation.simulate(plan, cuboid_fname.split('objects/cuboids')[1]) else: try: result = action_planner.execute(primitive_name, plan_args) if result is not None: print(str(result[0])) except ValueError as e: print("Value error: ") print(e) if args.nice_pull_release: time.sleep(1.0) pose = util.pose_stamped2list( yumi_gs.compute_fk(yumi_gs.get_jpos(arm='right'))) pos, ori = pose[:3], pose[3:] pos[2] += 0.001 r_jnts = yumi_gs.compute_ik(pos, ori, yumi_gs.get_jpos(arm='right')) l_jnts = yumi_gs.get_jpos(arm='left') if r_jnts is not None: for _ in range(10): pos[2] += 0.001 r_jnts = yumi_gs.compute_ik( pos, ori, yumi_gs.get_jpos(arm='right')) l_jnts = yumi_gs.get_jpos(arm='left') if r_jnts is not None: yumi_gs.update_joints(list(r_jnts) + l_jnts) time.sleep(0.1) time.sleep(0.1) for _ in range(10): yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) while True: try: yumi_ar.pb_client.remove_body(obj_id) yumi_ar.pb_client.remove_body(goal_obj_id) cuboid_fname = cuboid_manager.get_cuboid_fname() print("Cuboid file: " + cuboid_fname) obj_id, sphere_ids, mesh, goal_obj_id = \ cuboid_sampler.sample_cuboid_pybullet( cuboid_fname, goal=True, keypoints=False) cuboid_manager.filter_collisions(obj_id, goal_obj_id) p.changeDynamics(obj_id, -1, lateralFriction=0.4) action_planner.update_object(obj_id, mesh_file) exp_single.initialize_object(obj_id, cuboid_fname) exp_double.initialize_object(obj_id, cuboid_fname, goal_face) goal_viz.update_goal_obj(goal_obj_id) break except ValueError as e: print(e)
def main(args): cfg_file = os.path.join(args.example_config_path, args.primitive) + ".yaml" cfg = get_cfg_defaults() cfg.merge_from_file(cfg_file) cfg.freeze() rospy.init_node('MacroActions') signal.signal(signal.SIGINT, signal_handler) data_seed = args.np_seed primitive_name = args.primitive pickle_path = os.path.join(args.data_dir, primitive_name, args.experiment_name) if args.save_data: suf_i = 0 original_pickle_path = pickle_path while True: if os.path.exists(pickle_path): suffix = '_%d' % suf_i pickle_path = original_pickle_path + suffix suf_i += 1 data_seed += 1 else: os.makedirs(pickle_path) break if not os.path.exists(pickle_path): os.makedirs(pickle_path) np.random.seed(data_seed) yumi_ar = Robot('yumi_palms', pb=True, pb_cfg={ 'gui': args.visualize, 'opengl_render': False }, arm_cfg={ 'self_collision': False, 'seed': data_seed }) r_gel_id = cfg.RIGHT_GEL_ID l_gel_id = cfg.LEFT_GEL_ID table_id = cfg.TABLE_ID alpha = cfg.ALPHA K = cfg.GEL_CONTACT_STIFFNESS restitution = cfg.GEL_RESTITUION p.changeDynamics(yumi_ar.arm.robot_id, r_gel_id, restitution=restitution, contactStiffness=K, contactDamping=alpha * K, rollingFriction=args.rolling) p.changeDynamics(yumi_ar.arm.robot_id, l_gel_id, restitution=restitution, contactStiffness=K, contactDamping=alpha * K, rollingFriction=args.rolling) yumi_gs = YumiCamsGS(yumi_ar, cfg, exec_thread=False, sim_step_repeat=args.sim_step_repeat) for _ in range(10): yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) cuboid_sampler = CuboidSampler(os.path.join( os.environ['CODE_BASE'], 'catkin_ws/src/config/descriptions/meshes/objects/cuboids/nominal_cuboid.stl' ), pb_client=yumi_ar.pb_client) cuboid_fname_template = os.path.join( os.environ['CODE_BASE'], 'catkin_ws/src/config/descriptions/meshes/objects/cuboids/') cuboid_manager = MultiBlockManager(cuboid_fname_template, cuboid_sampler, robot_id=yumi_ar.arm.robot_id, table_id=27, r_gel_id=r_gel_id, l_gel_id=l_gel_id) if args.multi: cuboid_fname = cuboid_manager.get_cuboid_fname() # cuboid_fname = '/root/catkin_ws/src/config/descriptions/meshes/objects/cuboids/test_cuboid_smaller_4479.stl' else: cuboid_fname = args.config_package_path + 'descriptions/meshes/objects/' + \ args.object_name + '_experiments.stl' mesh_file = cuboid_fname print("Cuboid file: " + cuboid_fname) if args.goal_viz: goal_visualization = True else: goal_visualization = False obj_id, sphere_ids, mesh, goal_obj_id = \ cuboid_sampler.sample_cuboid_pybullet( cuboid_fname, goal=goal_visualization, keypoints=False) cuboid_manager.filter_collisions(obj_id, goal_obj_id) p.changeDynamics(obj_id, -1, lateralFriction=0.4) # goal_face = 0 goal_faces = [0, 1, 2, 3, 4, 5] from random import shuffle shuffle(goal_faces) goal_face = goal_faces[0] exp_single = SingleArmPrimitives(cfg, yumi_ar.pb_client.get_client_id(), obj_id, cuboid_fname) k = 0 while True: k += 1 if k > 10: print('FAILED TO BUILD GRASPING GRAPH') return try: exp_double = DualArmPrimitives(cfg, yumi_ar.pb_client.get_client_id(), obj_id, cuboid_fname, goal_face=goal_face) break except ValueError as e: print(e) yumi_ar.pb_client.remove_body(obj_id) if goal_visualization: yumi_ar.pb_client.remove_body(goal_obj_id) cuboid_fname = cuboid_manager.get_cuboid_fname() print("Cuboid file: " + cuboid_fname) obj_id, sphere_ids, mesh, goal_obj_id = \ cuboid_sampler.sample_cuboid_pybullet( cuboid_fname, goal=goal_visualization, keypoints=False) cuboid_manager.filter_collisions(obj_id, goal_obj_id) p.changeDynamics(obj_id, -1, lateralFriction=0.4) if primitive_name == 'grasp': exp_running = exp_double else: exp_running = exp_single action_planner = ClosedLoopMacroActions(cfg, yumi_gs, obj_id, yumi_ar.pb_client.get_client_id(), args.config_package_path, replan=args.replan, object_mesh_file=mesh_file) if goal_visualization: trans_box_lock = threading.RLock() goal_viz = GoalVisual(trans_box_lock, goal_obj_id, action_planner.pb_client, cfg.OBJECT_POSE_3) action_planner.update_object(obj_id, mesh_file) exp_single.initialize_object(obj_id, cuboid_fname) dynamics_info = {} dynamics_info['contactDamping'] = alpha * K dynamics_info['contactStiffness'] = K dynamics_info['rollingFriction'] = args.rolling dynamics_info['restitution'] = restitution data = {} data['saved_data'] = [] data['metadata'] = {} data['metadata']['mesh_file'] = mesh_file data['metadata']['cfg'] = cfg data['metadata']['dynamics'] = dynamics_info data['metadata']['cam_cfg'] = yumi_gs.cam_setup_cfg data['metadata']['step_repeat'] = args.sim_step_repeat data['metadata']['seed'] = data_seed data['metadata']['seed_original'] = args.np_seed metadata = data['metadata'] data_manager = DataManager(pickle_path) pred_dir = os.path.join(os.getcwd(), 'predictions') obs_dir = os.path.join(os.getcwd(), 'observations') if args.save_data: with open(os.path.join(pickle_path, 'metadata.pkl'), 'wb') as mdata_f: pickle.dump(metadata, mdata_f) total_trials = 0 successes = 0 for _ in range(args.num_blocks): # for goal_face in goal_faces: for _ in range(1): goal_face = np.random.randint(6) try: print('New object!') exp_double.initialize_object(obj_id, cuboid_fname, goal_face) except ValueError as e: print(e) print('Goal face: ' + str(goal_face)) continue for _ in range(args.num_obj_samples): total_trials += 1 if primitive_name == 'grasp': start_face = exp_double.get_valid_ind() if start_face is None: print('Could not find valid start face') continue plan_args = exp_double.get_random_primitive_args( ind=start_face, random_goal=True, execute=True) elif primitive_name == 'pull': plan_args = exp_single.get_random_primitive_args( ind=goal_face, random_goal=True, execute=True) start_pose = plan_args['object_pose1_world'] goal_pose = plan_args['object_pose2_world'] if goal_visualization: goal_viz.update_goal_state( util.pose_stamped2list(goal_pose)) if args.debug: import simulation plan = action_planner.get_primitive_plan( primitive_name, plan_args, 'right') for i in range(10): simulation.visualize_object( start_pose, filepath= "package://config/descriptions/meshes/objects/cuboids/" + cuboid_fname.split('objects/cuboids')[1], name="/object_initial", color=(1., 0., 0., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) simulation.visualize_object( goal_pose, filepath= "package://config/descriptions/meshes/objects/cuboids/" + cuboid_fname.split('objects/cuboids')[1], name="/object_final", color=(0., 0., 1., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) rospy.sleep(.1) simulation.simulate( plan, cuboid_fname.split('objects/cuboids')[1]) else: success = False attempts = 0 while True: attempts += 1 time.sleep(0.1) for _ in range(10): yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) p.resetBasePositionAndOrientation( obj_id, util.pose_stamped2list(start_pose)[:3], util.pose_stamped2list(start_pose)[3:]) if attempts > 15: break print('attempts: ' + str(attempts)) try: obs, pcd = yumi_gs.get_observation( obj_id=obj_id, robot_table_id=(yumi_ar.arm.robot_id, table_id)) obj_pose_world = start_pose obj_pose_final = goal_pose start = util.pose_stamped2list(obj_pose_world) goal = util.pose_stamped2list(obj_pose_final) start_mat = util.matrix_from_pose(obj_pose_world) goal_mat = util.matrix_from_pose(obj_pose_final) T_mat = np.matmul(goal_mat, np.linalg.inv(start_mat)) transformation = np.asarray(util.pose_stamped2list( util.pose_from_matrix(T_mat)), dtype=np.float32) # model takes in observation, and predicts: pointcloud_pts = np.asarray( obs['down_pcd_pts'][:100, :], dtype=np.float32) obs_fname = os.path.join( obs_dir, str(total_trials) + '.npz') np.savez(obs_fname, pointcloud_pts=pointcloud_pts, transformation=transformation) # embed() got_file = False pred_fname = os.path.join( pred_dir, str(total_trials) + '.npz') start = time.time() while True: try: prediction = np.load(pred_fname) got_file = True except: pass if got_file or (time.time() - start > 300): break time.sleep(0.01) if not got_file: wait = raw_input( 'waiting for predictions to come back online' ) continue os.remove(pred_fname) # embed() ind = np.random.randint(10) # contact_obj_frame_r = prediction['prediction'][ind, :7] # contact_obj_frame_l = prediction['prediction'][ind, 7:] contact_prediction_r = prediction['prediction'][ ind, :7] contact_prediction_l = prediction['prediction'][ ind, 7:] contact_world_pos_r = contact_prediction_r[:3] + np.mean( pointcloud_pts, axis=0) contact_world_pos_l = contact_prediction_l[:3] + np.mean( pointcloud_pts, axis=0) contact_world_pos_pred = {} contact_world_pos_pred[ 'right'] = contact_world_pos_r contact_world_pos_pred[ 'left'] = contact_world_pos_l contact_world_pos_corr = correct_grasp_pos( contact_world_pos_pred, obs['pcd_pts']) contact_world_pos_r = contact_world_pos_corr[ 'right'] contact_world_pos_l = contact_world_pos_corr[ 'left'] contact_world_r = contact_world_pos_r.tolist( ) + contact_prediction_r[3:].tolist() contact_world_l = contact_world_pos_l.tolist( ) + contact_prediction_l[3:].tolist() palm_poses_world = {} # palm_poses_world['right'] = util.convert_reference_frame( # util.list2pose_stamped(contact_obj_frame_r), # util.unit_pose(), # obj_pose_world) # palm_poses_world['left'] = util.convert_reference_frame( # util.list2pose_stamped(contact_obj_frame_l), # util.unit_pose(), # obj_pose_world) palm_poses_world['right'] = util.list2pose_stamped( contact_world_r) palm_poses_world['left'] = util.list2pose_stamped( contact_world_l) # obj_pose_final = self.goal_pose_world_frame_mod`` palm_poses_obj_frame = {} # delta = 10e-3 penetration_delta = 7.5e-3 # delta = np.random.random_sample() * \ # (penetration_delta - 0.5*penetration_delta) + \ # penetration_delta delta = penetration_delta y_normals = action_planner.get_palm_y_normals( palm_poses_world) for key in palm_poses_world.keys(): # try to penetrate the object a small amount palm_poses_world[ key].pose.position.x -= delta * y_normals[ key].pose.position.x palm_poses_world[ key].pose.position.y -= delta * y_normals[ key].pose.position.y palm_poses_world[ key].pose.position.z -= delta * y_normals[ key].pose.position.z palm_poses_obj_frame[ key] = util.convert_reference_frame( palm_poses_world[key], obj_pose_world, util.unit_pose()) # plan_args['palm_pose_r_object'] = util.list2pose_stamped(contact_obj_frame_r) # plan_args['palm_pose_l_object'] = util.list2pose_stamped(contact_obj_frame_l) plan_args[ 'palm_pose_r_object'] = palm_poses_obj_frame[ 'right'] plan_args[ 'palm_pose_l_object'] = palm_poses_obj_frame[ 'left'] plan = action_planner.get_primitive_plan( primitive_name, plan_args, 'right') # import simulation # for i in range(10): # simulation.visualize_object( # start_pose, # filepath="package://config/descriptions/meshes/objects/cuboids/" + # cuboid_fname.split('objects/cuboids')[1], # name="/object_initial", # color=(1., 0., 0., 1.), # frame_id="/yumi_body", # scale=(1., 1., 1.)) # simulation.visualize_object( # goal_pose, # filepath="package://config/descriptions/meshes/objects/cuboids/" + # cuboid_fname.split('objects/cuboids')[1], # name="/object_final", # color=(0., 0., 1., 1.), # frame_id="/yumi_body", # scale=(1., 1., 1.)) # rospy.sleep(.1) # simulation.simulate(plan, cuboid_fname.split('objects/cuboids')[1]) # continue result = action_planner.execute( primitive_name, plan_args) if result is None: continue print('Result: ' + str(result[0]) + ' Pos Error: ' + str(result[1]) + ' Ori Error: ' + str(result[2])) if result[0]: successes += 1 print('Success rate: ' + str(successes * 100.0 / total_trials)) break except ValueError as e: print("Value error: ") print(e) if args.nice_pull_release: time.sleep(1.0) pose = util.pose_stamped2list( yumi_gs.compute_fk(yumi_gs.get_jpos(arm='right'))) pos, ori = pose[:3], pose[3:] pos[2] += 0.001 r_jnts = yumi_gs.compute_ik( pos, ori, yumi_gs.get_jpos(arm='right')) l_jnts = yumi_gs.get_jpos(arm='left') if r_jnts is not None: for _ in range(10): pos[2] += 0.001 r_jnts = yumi_gs.compute_ik( pos, ori, yumi_gs.get_jpos(arm='right')) l_jnts = yumi_gs.get_jpos(arm='left') if r_jnts is not None: yumi_gs.update_joints( list(r_jnts) + l_jnts) time.sleep(0.1) time.sleep(0.1) for _ in range(10): yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) while True: try: yumi_ar.pb_client.remove_body(obj_id) if goal_visualization: yumi_ar.pb_client.remove_body(goal_obj_id) cuboid_fname = cuboid_manager.get_cuboid_fname() print("Cuboid file: " + cuboid_fname) obj_id, sphere_ids, mesh, goal_obj_id = \ cuboid_sampler.sample_cuboid_pybullet( cuboid_fname, goal=goal_visualization, keypoints=False) cuboid_manager.filter_collisions(obj_id, goal_obj_id) p.changeDynamics(obj_id, -1, lateralFriction=0.4) action_planner.update_object(obj_id, mesh_file) exp_single.initialize_object(obj_id, cuboid_fname) # exp_double.initialize_object(obj_id, cuboid_fname, goal_face) if goal_visualization: goal_viz.update_goal_obj(goal_obj_id) break except ValueError as e: print(e)
def main(args): pull_cfg_file = os.path.join(args.example_config_path, 'pull') + ".yaml" pull_cfg = get_cfg_defaults() pull_cfg.merge_from_file(pull_cfg_file) pull_cfg.freeze() grasp_cfg_file = os.path.join(args.example_config_path, 'grasp') + ".yaml" grasp_cfg = get_cfg_defaults() grasp_cfg.merge_from_file(grasp_cfg_file) grasp_cfg.freeze() # cfg = grasp_cfg cfg = pull_cfg rospy.init_node('MultiStep') signal.signal(signal.SIGINT, signal_handler) data_seed = args.np_seed np.random.seed(data_seed) yumi_ar = Robot('yumi_palms', pb=True, pb_cfg={'gui': args.visualize}, arm_cfg={ 'self_collision': False, 'seed': data_seed }) r_gel_id = cfg.RIGHT_GEL_ID l_gel_id = cfg.LEFT_GEL_ID alpha = cfg.ALPHA K = cfg.GEL_CONTACT_STIFFNESS restitution = cfg.GEL_RESTITUION p.changeDynamics(yumi_ar.arm.robot_id, r_gel_id, restitution=restitution, contactStiffness=K, contactDamping=alpha * K, rollingFriction=args.rolling) p.changeDynamics(yumi_ar.arm.robot_id, l_gel_id, restitution=restitution, contactStiffness=K, contactDamping=alpha * K, rollingFriction=args.rolling) yumi_gs = YumiGelslimPybulet(yumi_ar, cfg, exec_thread=False) for _ in range(10): yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT) obj_id = yumi_ar.pb_client.load_urdf( args.config_package_path + 'descriptions/urdf/' + args.object_name + '.urdf', cfg.OBJECT_POSE_3[0:3], cfg.OBJECT_POSE_3[3:]) goal_obj_id = yumi_ar.pb_client.load_urdf( args.config_package_path + 'descriptions/urdf/' + args.object_name + '_trans.urdf', cfg.OBJECT_POSE_3[0:3], cfg.OBJECT_POSE_3[3:]) p.setCollisionFilterPair(yumi_ar.arm.robot_id, goal_obj_id, r_gel_id, -1, enableCollision=False) p.setCollisionFilterPair(obj_id, goal_obj_id, -1, -1, enableCollision=False) p.setCollisionFilterPair(yumi_ar.arm.robot_id, obj_id, r_gel_id, -1, enableCollision=True) p.setCollisionFilterPair(yumi_ar.arm.robot_id, obj_id, 27, -1, enableCollision=True) yumi_ar.pb_client.reset_body(obj_id, cfg.OBJECT_POSE_3[:3], cfg.OBJECT_POSE_3[3:]) yumi_ar.pb_client.reset_body(goal_obj_id, cfg.OBJECT_POSE_3[:3], cfg.OBJECT_POSE_3[3:]) # manipulated_object = None # object_pose1_world = util.list2pose_stamped(cfg.OBJECT_INIT) # object_pose2_world = util.list2pose_stamped(cfg.OBJECT_FINAL) # palm_pose_l_object = util.list2pose_stamped(cfg.PALM_LEFT) # palm_pose_r_object = util.list2pose_stamped(cfg.PALM_RIGHT) # example_args = {} # example_args['object_pose1_world'] = object_pose1_world # example_args['object_pose2_world'] = object_pose2_world # example_args['palm_pose_l_object'] = palm_pose_l_object # example_args['palm_pose_r_object'] = palm_pose_r_object # example_args['object'] = manipulated_object # example_args['N'] = 60 # example_args['init'] = True # example_args['table_face'] = 0 primitive_name = args.primitive face = np.random.randint(6) # face = 3 mesh_file = args.config_package_path + 'descriptions/meshes/objects/cuboids/' + \ args.object_name + '_experiments.stl' cuboid_fname = mesh_file exp_single = SingleArmPrimitives(pull_cfg, yumi_ar.pb_client.get_client_id(), obj_id, mesh_file) exp_double = DualArmPrimitives(grasp_cfg, yumi_ar.pb_client.get_client_id(), obj_id, mesh_file, goal_face=face) action_planner = ClosedLoopMacroActions(cfg, yumi_gs, obj_id, yumi_ar.pb_client.get_client_id(), args.config_package_path, replan=args.replan, object_mesh_file=mesh_file) trans_box_lock = threading.RLock() goal_viz = GoalVisual(trans_box_lock, goal_obj_id, action_planner.pb_client, cfg.OBJECT_POSE_3) multistep_planner = MultiStepManager(cfg, grasp_cfg, pull_cfg) action_planner.update_object(obj_id, mesh_file) exp_single.initialize_object(obj_id, cuboid_fname) exp_double.initialize_object(obj_id, cuboid_fname, face) print('Reset multi block!') for _ in range(args.num_obj_samples): # get grasp sample # start_face_index = np.random.randint(len(grasp_cfg.VALID_GRASP_PAIRS[face])) # start_face = grasp_cfg.VALID_GRASP_PAIRS[face][start_face_index] # grasp_args = exp_double.get_random_primitive_args(ind=start_face, # random_goal=True, # execute=False) # # pull_args_start = exp_single.get_random_primitive_args(ind=cfg.GRASP_TO_PULL[start_face], # random_goal=True) # pull_args_goal = exp_single.get_random_primitive_args(ind=cfg.GRASP_TO_PULL[face], # random_goal=True) # pull_args_start['object_pose2_world'] = grasp_args['object_pose1_world'] # pull_args_goal['object_pose1_world'] = grasp_args['object_pose2_world'] # full_args = [pull_args_start, grasp_args, pull_args_goal] # full_args = [grasp_args] full_args = multistep_planner.get_args(exp_single, exp_double, face, execute=False) # obj_pose_final = exp_running.goal_pose_world_frame_mod # palm_poses_obj_frame = {} # y_normals = action_planner.get_palm_y_normals(palm_poses_world) # delta = 2e-3 # for key in palm_poses_world.keys(): # palm_pose_world = palm_poses_world[key] # # try to penetrate the object a small amount # palm_pose_world.pose.position.x -= delta*y_normals[key].pose.position.x # palm_pose_world.pose.position.y -= delta*y_normals[key].pose.position.y # palm_pose_world.pose.position.z -= delta*y_normals[key].pose.position.z # palm_poses_obj_frame[key] = util.convert_reference_frame( # palm_pose_world, obj_pose_world, util.unit_pose()) valid_subplans = 0 valid_plans = [] for plan_args in full_args: plan = action_planner.get_primitive_plan(plan_args['name'], plan_args, 'right') goal_viz.update_goal_state( util.pose_stamped2list(plan_args['object_pose2_world'])) start_pose = plan_args['object_pose1_world'] goal_pose = plan_args['object_pose2_world'] if args.debug: for _ in range(10): simulation.visualize_object( start_pose, filepath= "package://config/descriptions/meshes/objects/cuboids/" + cuboid_fname.split('objects/cuboids')[1], name="/object_initial", color=(1., 0., 0., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) simulation.visualize_object( goal_pose, filepath= "package://config/descriptions/meshes/objects/cuboids/" + cuboid_fname.split('objects/cuboids')[1], name="/object_final", color=(0., 0., 1., 1.), frame_id="/yumi_body", scale=(1., 1., 1.)) rospy.sleep(.1) simulation.simulate(plan, cuboid_fname.split('objects/cuboids')[1]) else: primitive_name = plan_args['name'] start_joints = {} if primitive_name == 'pull': start_joints['right'] = pull_cfg.RIGHT_INIT start_joints['left'] = pull_cfg.LEFT_INIT elif primitive_name == 'grasp': start_joints['right'] = grasp_cfg.RIGHT_INIT start_joints['left'] = grasp_cfg.LEFT_INIT subplan_valid = action_planner.full_mp_check( plan, primitive_name, start_joints=start_joints) if subplan_valid: print("subplan valid!") valid_subplans += 1 valid_plans.append(plan) else: print("not valid, primitive: " + primitive_name) if valid_subplans == len(full_args) and not args.debug: yumi_ar.pb_client.reset_body( obj_id, util.pose_stamped2list(full_args[0]['object_pose1_world'])[:3], util.pose_stamped2list(full_args[0]['object_pose1_world'])[3:]) for plan_args in full_args: # teleport to start state, to avoid colliding with object during transit primitive_name = plan_args['name'] time.sleep(0.1) for _ in range(10): if primitive_name == 'pull': # yumi_gs.update_joints(pull_cfg.RIGHT_INIT + pull_cfg.LEFT_INIT) yumi_gs.yumi_pb.arm.set_jpos(pull_cfg.RIGHT_INIT + pull_cfg.LEFT_INIT, ignore_physics=True) elif primitive_name == 'grasp': # yumi_gs.update_joints(grasp_cfg.RIGHT_INIT + grasp_cfg.LEFT_INIT) yumi_gs.yumi_pb.arm.set_jpos(grasp_cfg.RIGHT_INIT + grasp_cfg.LEFT_INIT, ignore_physics=True) try: # should update the plan args start state to be the current simulator state result = action_planner.execute(primitive_name, plan_args) if result is not None: print(str(result[0])) except ValueError as e: print("Value error: ") print(e) time.sleep(1.0) if primitive_name == 'pull': pose = util.pose_stamped2list( yumi_gs.compute_fk(yumi_gs.get_jpos(arm='right'))) pos, ori = pose[:3], pose[3:] # pose = yumi_gs.get_ee_pose() # pos, ori = pose[0], pose[1] # pos[2] -= 0.0714 pos[2] += 0.001 r_jnts = yumi_gs.compute_ik(pos, ori, yumi_gs.get_jpos(arm='right')) l_jnts = yumi_gs.get_jpos(arm='left') if r_jnts is not None: for _ in range(10): pos[2] += 0.001 r_jnts = yumi_gs.compute_ik( pos, ori, yumi_gs.get_jpos(arm='right')) l_jnts = yumi_gs.get_jpos(arm='left') if r_jnts is not None: yumi_gs.update_joints(list(r_jnts) + l_jnts) time.sleep(0.1) time.sleep(0.1) for _ in range(10): yumi_gs.update_joints(cfg.RIGHT_INIT + cfg.LEFT_INIT)