def open_npy_and_obj(name_to_open_): """从路径指定的npy文件中读取并返回 npy_m_: 抓取序列(只是针对某单个物体的抓取序列) obj_: 待抓取物体的模型mesh(单个模型) ply_name_: 待抓取物体的路径 object_name_: 待抓取物体的名称 """ npy_m_ = np.load(name_to_open_) file_dir = home_dir + "/PointNetGPD/data/ycb_meshes_google/" object_name_ = name_to_open_.split("/")[-1][:-4] #object_name_=object_name_.split("_")[-1][:-3] print(object_name_) ply_name_ = file_dir + object_name_ + "/google_512k/nontextured.ply" if not check_pcd_grasp_points: of = ObjFile(file_dir + object_name_ + "/google_512k/nontextured.obj") sf = SdfFile(file_dir + object_name_ + "/google_512k/nontextured.sdf") mesh = of.read() sdf = sf.read() obj_ = GraspableObject3D(sdf, mesh) else: cloud_path = home_dir + "/dataset/ycb_rgbd/" + object_name_ + "/clouds/" pcd_files = glob.glob(cloud_path + "*.pcd") obj_ = pcd_files obj_.sort() return npy_m_, obj_, ply_name_, object_name_
def test_contacts(self): num_samples = 128 mu = 0.5 num_faces = 8 num_grasps = NUM_TEST_CASES of = ObjFile(OBJ_FILENAME) sf = SdfFile(SDF_FILENAME) mesh = of.read() sdf = sf.read() obj = GraspableObject3D(sdf, mesh) gripper = RobotGripper.load(GRIPPER_NAME) ags = UniformGraspSampler(gripper, CONFIG) grasps = ags.generate_grasps(obj, target_num_grasps=num_grasps) for grasp in grasps: success, c = grasp.close_fingers(obj) if success: c1, c2 = c # test friction cones fc1_exists, fc1, n1 = c1.friction_cone(num_cone_faces=num_faces, friction_coef=mu) if fc1_exists: self.assertEqual(fc1.shape[1], num_faces) alpha = np.tile(fc1.T.dot(c1.normal), [3,1]).T w = np.tile(c1.normal.reshape(3,1), [1,8]).T tan_vecs = fc1.T - alpha * w self.assertTrue(np.allclose(np.linalg.norm(tan_vecs, axis=1), mu)) fc2_exists, fc2, n2 = c2.friction_cone(num_cone_faces=num_faces, friction_coef=mu) if fc2_exists: self.assertEqual(fc2.shape[1], num_faces) alpha = np.tile(fc2.T.dot(c2.normal), [3,1]).T w = np.tile(c2.normal.reshape(3,1), [1,8]).T tan_vecs = fc2.T - alpha * w self.assertTrue(np.allclose(np.linalg.norm(tan_vecs, axis=1), mu)) # test reference frames T_contact1_obj = c1.reference_frame(align_axes=True) self.assertTrue(np.allclose(T_contact1_obj.z_axis, c1.in_direction)) self.assertTrue(np.allclose(T_contact1_obj.translation, c1.point)) for i in range(num_samples): theta = 2 * i * np.pi / num_samples v = np.cos(theta) * T_contact1_obj.x_axis + np.sin(theta) * T_contact1_obj.y_axis self.assertLessEqual(v[0], T_contact1_obj.x_axis[0]) T_contact2_obj = c2.reference_frame(align_axes=True) self.assertTrue(np.allclose(T_contact2_obj.z_axis, c2.in_direction)) self.assertTrue(np.allclose(T_contact2_obj.translation, c2.point)) for i in range(num_samples): theta = 2 * i * np.pi / num_samples v = np.cos(theta) * T_contact2_obj.x_axis + np.sin(theta) * T_contact2_obj.y_axis self.assertLessEqual(v[0], T_contact2_obj.x_axis[0])
def open_npy_and_obj(name_to_open_): npy_m_ = np.load(name_to_open_) file_dir = home_dir + "/PointNetGPD/data/ycb-tools/models/ycb/" object_name_ = name_to_open_.split("/")[-1][:-4] ply_name_ = file_dir + object_name_ + "/google_512k/nontextured.ply" if not check_pcd_grasp_points: of = ObjFile(file_dir + object_name_ + "/google_512k/nontextured.obj") sf = SdfFile(file_dir + object_name_ + "/google_512k/nontextured.sdf") mesh = of.read() sdf = sf.read() obj_ = GraspableObject3D(sdf, mesh) else: cloud_path = home_dir + "/dataset/ycb_rgbd/" + object_name_ + "/clouds/" pcd_files = glob.glob(cloud_path + "*.pcd") obj_ = pcd_files obj_.sort() return npy_m_, obj_, ply_name_, object_name_
def test_antipodal_grasp_sampler(self): of = ObjFile(OBJ_FILENAME) sf = SdfFile(SDF_FILENAME) mesh = of.read() sdf = sf.read() obj = GraspableObject3D(sdf, mesh) gripper = RobotGripper.load(GRIPPER_NAME) ags = AntipodalGraspSampler(gripper, CONFIG) grasps = ags.generate_grasps(obj, target_num_grasps=NUM_TEST_CASES) # test with raw force closure function for i, grasp in enumerate(grasps): success, c = grasp.close_fingers(obj) if success: c1, c2 = c self.assertTrue(PointGraspMetrics3D.force_closure(c1, c2, CONFIG['sampling_friction_coef']))
def test_find_contacts(self): of = ObjFile(OBJ_FILENAME) sf = SdfFile(SDF_FILENAME) mesh = of.read() sdf = sf.read() obj = GraspableObject3D(sdf, mesh) surface_points, _ = obj.sdf.surface_points(grid_basis=False) indices = np.arange(surface_points.shape[0]) for i in range(NUM_TEST_CASES): np.random.shuffle(indices) c1 = surface_points[0,:] c2 = surface_points[1,:] w = np.linalg.norm(c1 - c2) + 1e-2 g = ParallelJawPtGrasp3D.grasp_from_endpoints(c1, c2, width=w) success, c = g.close_fingers(obj) if success: c1_est, c2_est = c np.assertTrue(np.allclose(c1, c1_est, atol=1e-3, rtol=0.1)) np.assertTrue(np.allclose(c2, c2_est, atol=1e-3, rtol=0.1))
def test_force_closure(self): of = ObjFile(OBJ_FILENAME) sf = SdfFile(SDF_FILENAME) mesh = of.read() sdf = sf.read() obj = GraspableObject3D(sdf, mesh) for i in range(NUM_TEST_CASES): contacts, normals, _, mu, _ = random_force_closure_test_case(antipodal=True) c1 = Contact3D(obj, contacts[:,0]) c1.normal = normals[:,0] c2 = Contact3D(obj, contacts[:,1]) c2.normal = normals[:,1] self.assertTrue(PointGraspMetrics3D.force_closure(c1, c2, mu, use_abs_value=False)) for i in range(NUM_TEST_CASES): contacts, normals, _, mu, _ = random_force_closure_test_case(antipodal=False) c1 = Contact3D(obj, contacts[:,0]) c1.normal = normals[:,0] c2 = Contact3D(obj, contacts[:,1]) c2.normal = normals[:,1] self.assertFalse(PointGraspMetrics3D.force_closure(c1, c2, mu, use_abs_value=False))
def open_pickle_and_obj(name_to_open_): pickle_names_ = get_pickle_file_name( home_dir + "/code/grasp-pointnet/dex-net/apps/generated_grasps") suggestion_pickle = fuzzy_finder(name_to_open_, pickle_names_) if len(suggestion_pickle) != 1: print("Pickle file suggestions:", suggestion_pickle) exit("Name error for pickle file!") pickle_m_ = pickle.load(open(suggestion_pickle[0], 'rb')) file_dir = home_dir + "/dataset/ycb_meshes_google/objects" file_list_all = get_file_name(file_dir) new_sug = re.findall(r'_\d+', suggestion_pickle[0], flags=0) new_sug = new_sug[0].split('_') new_sug = new_sug[1] suggestion = fuzzy_finder(new_sug, file_list_all) # very dirty way to support name with "-a, -b etc." if len(suggestion) != 1: new_sug = re.findall(r'_\d+\W\w', suggestion_pickle[0], flags=0) new_sug = new_sug[0].split('_') new_sug = new_sug[1] suggestion = fuzzy_finder(new_sug, file_list_all) if len(suggestion) != 1: exit("Name error for obj file!") object_name_ = suggestion[0][len(file_dir) + 1:] ply_name_ = suggestion[0] + "/google_512k/nontextured.ply" if not check_pcd_grasp_points: of = ObjFile(suggestion[0] + "/google_512k/nontextured.obj") sf = SdfFile(suggestion[0] + "/google_512k/nontextured.sdf") mesh = of.read() sdf = sf.read() obj_ = GraspableObject3D(sdf, mesh) else: cloud_path = home_dir + "/code/grasp-pointnet/pointGPD/data/ycb_rgbd/" + object_name_ + "/clouds/" pcd_files = glob.glob(cloud_path + "*.pcd") obj_ = pcd_files obj_.sort() return pickle_m_, obj_, ply_name_, object_name_
def antipodal_grasp_sampler(self): of = ObjFile(OBJ_FILENAME) sf = SdfFile(SDF_FILENAME) mesh = of.read() sdf = sf.read() obj = GraspableObject3D(sdf, mesh) gripper = RobotGripper.load(GRIPPER_NAME) ags = AntipodalGraspSampler(gripper, CONFIG) grasps = ags.generate_grasps(obj, target_num_grasps=10) quality_config = GraspQualityConfigFactory.create_config( CONFIG['metrics']['force_closure']) quality_fn = GraspQualityFunctionFactory.create_quality_function( obj, quality_config) q_to_c = lambda quality: CONFIG['quality_scale'] i = 0 vis.figure() vis.mesh(obj.mesh.trimesh, style='surface') for grasp in grasps: print(grasp.frame) success, c = grasp.close_fingers(obj) if success: c1, c2 = c fn_fc = quality_fn(grasp).quality true_fc = PointGraspMetrics3D.force_closure( c1, c2, quality_config.friction_coef) #print(grasp) T_obj_world = RigidTransform(from_frame='obj', to_frame='world') color = plt.get_cmap('hsv')(q_to_c(CONFIG['metrics']))[:-1] T_obj_gripper = grasp.gripper_pose(gripper) #vis.grasp(grasp,grasp_axis_color=color,endpoint_color=color) i += 1 #T_obj_world = RigidTransform(from_frame='obj',to_frame='world') vis.show(False)
def open_pickle_and_obj(object_to_display): pickle_names_ = get_pickle_file_name(grasps_dir) suggestion_pickle = fuzzy_finder(object_to_display['object_name'], pickle_names_) if len(suggestion_pickle) != 1: print("Pickle file suggestions:", suggestion_pickle) exit("Name error for pickle file!") pickle_m_ = pickle.load(open(suggestion_pickle[0], 'rb')) object_name_ = object_to_display['object_name'] ply_name_ = object_to_display['obj_file'].replace('.obj', '.stl') if not check_pcd_grasp_points: of = ObjFile(object_to_display['obj_file']) sf = SdfFile(object_to_display['sdf_file']) mesh = of.read() sdf = sf.read() obj_ = GraspableObject3D(sdf, mesh) else: cloud_path = home_dir + "/code/grasp-pointnet/pointGPD/data/ycb_rgbd/" + object_name_ + "/clouds/" pcd_files = glob.glob(cloud_path + "*.pcd") obj_ = pcd_files obj_.sort() return pickle_m_, obj_, ply_name_, object_name_
def test_grasp_quality_functions(self): num_grasps = NUM_TEST_CASES of = ObjFile(OBJ_FILENAME) sf = SdfFile(SDF_FILENAME) mesh = of.read() sdf = sf.read() obj = GraspableObject3D(sdf, mesh) gripper = RobotGripper.load(GRIPPER_NAME) ags = UniformGraspSampler(gripper, CONFIG) grasps = ags.generate_grasps(obj, target_num_grasps=num_grasps) # test with grasp quality function quality_config = GraspQualityConfigFactory.create_config(CONFIG['metrics']['force_closure']) quality_fn = GraspQualityFunctionFactory.create_quality_function(obj, quality_config) for i, grasp in enumerate(grasps): success, c = grasp.close_fingers(obj) if success: c1, c2 = c fn_fc = quality_fn(grasp).quality true_fc = PointGraspMetrics3D.force_closure(c1, c2, quality_config.friction_coef) self.assertEqual(fn_fc, true_fc)
def test_init_graspable(self): of = ObjFile(OBJ_FILENAME) sf = SdfFile(SDF_FILENAME) mesh = of.read() sdf = sf.read() obj = GraspableObject3D(sdf, mesh)
def worker(i, sample_nums, grasp_amount, good_grasp): object_name = file_list_all[i][len(home_dir) + 35:] print('a worker of task {} start'.format(object_name)) yaml_config = YamlConfig(home_dir + "/code/grasp-pointnet/dex-net/test/config.yaml") gripper_name = 'robotiq_85' gripper = RobotGripper.load( gripper_name, home_dir + "/code/grasp-pointnet/dex-net/data/grippers") grasp_sample_method = "antipodal" if grasp_sample_method == "uniform": ags = UniformGraspSampler(gripper, yaml_config) elif grasp_sample_method == "gaussian": ags = GaussianGraspSampler(gripper, yaml_config) elif grasp_sample_method == "antipodal": ags = AntipodalGraspSampler(gripper, yaml_config) elif grasp_sample_method == "gpg": ags = GpgGraspSampler(gripper, yaml_config) elif grasp_sample_method == "point": ags = PointGraspSampler(gripper, yaml_config) else: raise NameError("Can't support this sampler") print("Log: do job", i) if os.path.exists(str(file_list_all[i]) + "/google_512k/nontextured.obj"): of = ObjFile(str(file_list_all[i]) + "/google_512k/nontextured.obj") sf = SdfFile(str(file_list_all[i]) + "/google_512k/nontextured.sdf") else: print("can't find any obj or sdf file!") raise NameError("can't find any obj or sdf file!") mesh = of.read() sdf = sf.read() obj = GraspableObject3D(sdf, mesh) print("Log: opened object", i + 1, object_name) force_closure_quality_config = {} canny_quality_config = {} fc_list_sub1 = np.arange(2.0, 0.75, -0.4) fc_list_sub2 = np.arange(0.5, 0.36, -0.05) fc_list = np.concatenate([fc_list_sub1, fc_list_sub2]) for value_fc in fc_list: value_fc = round(value_fc, 2) yaml_config['metrics']['force_closure']['friction_coef'] = value_fc yaml_config['metrics']['robust_ferrari_canny'][ 'friction_coef'] = value_fc force_closure_quality_config[ value_fc] = GraspQualityConfigFactory.create_config( yaml_config['metrics']['force_closure']) canny_quality_config[ value_fc] = GraspQualityConfigFactory.create_config( yaml_config['metrics']['robust_ferrari_canny']) good_count_perfect = np.zeros(len(fc_list)) count = 0 minimum_grasp_per_fc = grasp_amount while np.sum(good_count_perfect < minimum_grasp_per_fc) != 0: grasps = ags.generate_grasps(obj, target_num_grasps=sample_nums, grasp_gen_mult=10, vis=False, random_approach_angle=True) count += len(grasps) for j in grasps: tmp, is_force_closure = False, False for ind_, value_fc in enumerate(fc_list): value_fc = round(value_fc, 2) tmp = is_force_closure is_force_closure = PointGraspMetrics3D.grasp_quality( j, obj, force_closure_quality_config[value_fc], vis=False) if tmp and not is_force_closure: if good_count_perfect[ind_ - 1] < minimum_grasp_per_fc: canny_quality = PointGraspMetrics3D.grasp_quality( j, obj, canny_quality_config[round(fc_list[ind_ - 1], 2)], vis=False) good_grasp.append((j, round(fc_list[ind_ - 1], 2), canny_quality)) good_count_perfect[ind_ - 1] += 1 break elif is_force_closure and value_fc == fc_list[-1]: if good_count_perfect[ind_] < minimum_grasp_per_fc: canny_quality = PointGraspMetrics3D.grasp_quality( j, obj, canny_quality_config[value_fc], vis=False) good_grasp.append((j, value_fc, canny_quality)) good_count_perfect[ind_] += 1 break print('Object:{} GoodGrasp:{}'.format(object_name, good_count_perfect)) object_name_len = len(object_name) object_name_ = str(object_name) + " " * (25 - object_name_len) if count == 0: good_grasp_rate = 0 else: good_grasp_rate = len(good_grasp) / count print('Gripper:{} Object:{} Rate:{:.4f} {}/{}'.format( gripper_name, object_name_, good_grasp_rate, len(good_grasp), count))
def worker(i, sample_nums, grasp_amount, good_grasp): #主要是抓取采样器以及打分 100 20 """ brief: 对制定的模型,利用随机采样算法,进行抓取姿态的检测和打分 param [in] i 处理第i个mesh模型 param [in] sample_nums 每个对象模型返回的目标抓取数量 param [in] grasp_amount """ #截取目标对象名称 object_name = file_list_all[i][len(home_dir) + 35:] print('a worker of task {} start'.format(object_name)) #读取初始配置文件,读取并在内存中复制了一份 yaml_config = YamlConfig(home_dir + "/code/dex-net/test/config.yaml") #设置夹名称 gripper_name = 'panda' #根据设置的夹爪名称加载夹爪配置 gripper = RobotGripper.load(gripper_name, home_dir + "/code/dex-net/data/grippers") #设置抓取采样的方法 grasp_sample_method = "antipodal" if grasp_sample_method == "uniform": ags = UniformGraspSampler(gripper, yaml_config) elif grasp_sample_method == "gaussian": ags = GaussianGraspSampler(gripper, yaml_config) elif grasp_sample_method == "antipodal": #使用对映点抓取,输入夹爪与配置文件 ags = AntipodalGraspSampler(gripper, yaml_config) elif grasp_sample_method == "gpg": ags = GpgGraspSampler(gripper, yaml_config) elif grasp_sample_method == "point": ags = PointGraspSampler(gripper, yaml_config) else: raise NameError("Can't support this sampler") print("Log: do job", i) #设置obj模型文件与sdf文件路径 if os.path.exists(str(file_list_all[i]) + "/google_512k/nontextured.obj") and os.path.exists( str(file_list_all[i]) + "/google_512k/nontextured.sdf"): of = ObjFile(str(file_list_all[i]) + "/google_512k/nontextured.obj") sf = SdfFile(str(file_list_all[i]) + "/google_512k/nontextured.sdf") else: print("can't find any obj or sdf file!") raise NameError("can't find any obj or sdf file!") #根据路径读取模型与sdf文件 mesh = of.read() sdf = sf.read() #构建抓取模型类 obj = GraspableObject3D(sdf, mesh) print("Log: opened object", i + 1, object_name) ######################################### #设置 force_closure_quality_config = {} #设置力闭合 字典 canny_quality_config = {} #生成一个起点是2.0终点是0.75 步长为-0.4 (递减)的等距数列fc_list_sub1 (2.0, 0.75, -0.4) fc_list_sub1 = np.arange(2.0, 0.75, -0.3) #生成一个起点是0.5终点是0.36 步长为-0.05的等距数列fc_list_sub2 (0.5, 0.36, -0.05) fc_list_sub2 = np.arange(0.5, 0.36, -0.1) #将上面两个向量接起来,变成一个长条向量,使用不同的步长,目的是为了在更小摩擦力的时候,有更多的分辨率 fc_list = np.concatenate([fc_list_sub1, fc_list_sub2]) print("判断摩擦系数") print(fc_list) for value_fc in fc_list: #对value_fc保留2位小数,四舍五入 value_fc = round(value_fc, 2) #更改内存中配置中的摩擦系数,而没有修改硬盘中的yaml文件 yaml_config['metrics']['force_closure']['friction_coef'] = value_fc yaml_config['metrics']['robust_ferrari_canny'][ 'friction_coef'] = value_fc #把每个摩擦力值当成键, force_closure_quality_config[ value_fc] = GraspQualityConfigFactory.create_config( yaml_config['metrics']['force_closure']) canny_quality_config[ value_fc] = GraspQualityConfigFactory.create_config( yaml_config['metrics']['robust_ferrari_canny']) #####################准备开始采样############################ #填充一个与摩擦数量相同的数组,每个对应的元素都是0 good_count_perfect = np.zeros(len(fc_list)) count = 0 #设置每个摩擦值需要计算的最少抓取数量 (根据指定输入值20) minimum_grasp_per_fc = grasp_amount #如果每个摩擦系数下,有效的抓取(满足力闭合或者其他判断标准)小于要求值,就一直循环查找,直到所有摩擦系数条件下至少都存在20个有效抓取 while np.sum(good_count_perfect < minimum_grasp_per_fc) != 0: #开始使用antipodes sample获得对映随机抓取,此时并不判断是否满足力闭合,只是先采集满足夹爪条件的抓取 #如果一轮多次随机采样之后,发现无法获得指定数量的随机抓取,就会重复迭代计算3次,之后放弃,并把已经找到的抓取返回来 grasps = ags.generate_grasps(obj, target_num_grasps=sample_nums, grasp_gen_mult=10, max_iter=10, vis=False, random_approach_angle=True) count += len(grasps) #循环对每个采样抓取进行判断 for j in grasps: tmp, is_force_closure = False, False #循环对某个采样抓取应用不同的抓取摩擦系数,判断是否是力闭合 for ind_, value_fc in enumerate(fc_list): value_fc = round(value_fc, 2) tmp = is_force_closure #判断在当前给定的摩擦系数下,抓取是否是力闭合的 is_force_closure = PointGraspMetrics3D.grasp_quality( j, obj, force_closure_quality_config[value_fc], vis=False) #假设当前,1号摩擦力为1.6 抓取不是力闭合的,但是上一个0号摩擦系数2.0 条件下抓取是力闭合的 if tmp and not is_force_closure: #当0号2.0摩擦系数条件下采样的good抓取数量还不足指定的最低数量20 if good_count_perfect[ind_ - 1] < minimum_grasp_per_fc: #以0号摩擦系数作为边界 canny_quality = PointGraspMetrics3D.grasp_quality( j, obj, canny_quality_config[round(fc_list[ind_ - 1], 2)], vis=False) good_grasp.append((j, round(fc_list[ind_ - 1], 2), canny_quality)) #在0号系数的good抓取下计数加1 good_count_perfect[ind_ - 1] += 1 #当前抓取j的边界摩擦系数找到了,退出摩擦循环,判断下一个抓取 break #如果当前1号摩擦系数1.6条件下,该抓取j本身就是力闭合的,且摩擦系数是列表中的最后一个(所有的摩擦系数都判断完了) elif is_force_closure and value_fc == fc_list[-1]: if good_count_perfect[ind_] < minimum_grasp_per_fc: #以当前摩擦系数作为边界 canny_quality = PointGraspMetrics3D.grasp_quality( j, obj, canny_quality_config[value_fc], vis=False) good_grasp.append((j, value_fc, canny_quality)) good_count_perfect[ind_] += 1 #当前抓取j关于当前摩擦系数1.6判断完毕,而且满足所有的摩擦系数,就换到下一个摩擦系数 break print('Object:{} GoodGrasp:{}'.format(object_name, good_count_perfect)) #判断 object_name_len = len(object_name) object_name_ = str(object_name) + " " * (25 - object_name_len) if count == 0: good_grasp_rate = 0 else: good_grasp_rate = len(good_grasp) / count print('Gripper:{} Object:{} Rate:{:.4f} {}/{}'.format( gripper_name, object_name_, good_grasp_rate, len(good_grasp), count))
if __name__ == '__main__': home_dir = os.environ['HOME'] file_dir = home_dir + "/dataset/ycb_meshes_google/objects" mlab.figure(bgcolor=(1.0, 1.0, 1.0), fgcolor=(0.7, 0.7, 0.7)) file_list_all = get_file_name(file_dir) object_numbers = file_list_all.__len__() i = 0 # index of objects to define which object to show if os.path.exists(str(file_list_all[i]) + "/google_512k/nontextured.obj"): of = ObjFile(str(file_list_all[i]) + "/google_512k/nontextured.obj") sf = SdfFile(str(file_list_all[i]) + "/google_512k/nontextured.sdf") else: print("can't find any obj or sdf file!") raise NameError("can't find any obj or sdf file!") mesh = of.read() sdf = sf.read() graspable = GraspableObject3D(sdf, mesh) print("Log: opened object") begin_time = time.time() surface_points, _ = graspable.sdf.surface_points(grid_basis=False) all_p = surface_points method = "voxel" if method == "random": surface_points = surface_points[np.random.choice( surface_points.shape[0], 1000, replace=False)] surface_normal = [] elif method == "voxel": surface_points = surface_points.astype(np.float32) p = pcl.PointCloud(surface_points) voxel = p.make_voxel_grid_filter() voxel.set_leaf_size(*([graspable.sdf.resolution * 5] * 3))
def worker(i, sample_nums, grasp_amount, good_grasp): object_name = file_list_all[i][len(home_dir) + 48:-12] print('a worker of task {} start'.format(object_name)) yaml_config = YamlConfig(home_dir + "/Projects/PointNetGPD/dex-net/test/config.yaml") gripper_name = 'robotiq_85' gripper = RobotGripper.load( gripper_name, home_dir + "/Projects/PointNetGPD/dex-net/data/grippers") grasp_sample_method = "antipodal" if grasp_sample_method == "uniform": ags = UniformGraspSampler(gripper, yaml_config) elif grasp_sample_method == "gaussian": ags = GaussianGraspSampler(gripper, yaml_config) elif grasp_sample_method == "antipodal": ags = AntipodalGraspSampler(gripper, yaml_config) elif grasp_sample_method == "gpg": ags = GpgGraspSampler(gripper, yaml_config) elif grasp_sample_method == "point": ags = PointGraspSampler(gripper, yaml_config) else: raise NameError("Can't support this sampler") print("Log: do job", i) if os.path.exists(str(file_list_all[i]) + "/nontextured.obj"): of = ObjFile(str(file_list_all[i]) + "/nontextured.obj") sf = SdfFile(str(file_list_all[i]) + "/nontextured.sdf") else: print("can't find any obj or sdf file!") raise NameError("can't find any obj or sdf file!") mesh = of.read() sdf = sf.read() obj = GraspableObject3D(sdf, mesh) print("Log: opened object", i + 1, object_name) force_closure_quality_config = {} canny_quality_config = {} fc_list_sub1 = np.arange(2.0, 0.75, -0.4) fc_list_sub2 = np.arange(0.5, 0.36, -0.05) fc_list = np.concatenate( [fc_list_sub1, fc_list_sub2]) # 摩擦系数列表 fc_list [2. 1.6 1.2 0.8 0.5 0.45 0.4 ] print("fc_list", fc_list, "fc_list[-1]", fc_list[-1]) for value_fc in fc_list: value_fc = round(value_fc, 2) yaml_config['metrics']['force_closure']['friction_coef'] = value_fc yaml_config['metrics']['robust_ferrari_canny'][ 'friction_coef'] = value_fc force_closure_quality_config[ value_fc] = GraspQualityConfigFactory.create_config( yaml_config['metrics']['force_closure']) canny_quality_config[ value_fc] = GraspQualityConfigFactory.create_config( yaml_config['metrics']['robust_ferrari_canny']) good_count_perfect = np.zeros(len(fc_list)) count = 0 minimum_grasp_per_fc = grasp_amount # 各个摩擦系数生成一些抓取 while np.sum(good_count_perfect < minimum_grasp_per_fc ) != 0 and good_count_perfect[-1] < minimum_grasp_per_fc: print("[INFO]:good | mini", good_count_perfect, minimum_grasp_per_fc) print("[INFO]:good < mini", good_count_perfect < minimum_grasp_per_fc, np.sum(good_count_perfect < minimum_grasp_per_fc)) grasps = ags.generate_grasps( obj, target_num_grasps=sample_nums, grasp_gen_mult=10, # 生成抓取姿态 vis=False, random_approach_angle=True) # 随机调整抓取方向 print("\033[0;32m%s\033[0m" % "[INFO] Worker{} generate {} grasps.".format(i, len(grasps))) count += len(grasps) for j in grasps: # 遍历生成的抓取姿态, 判断是否为力闭合, 及其对应的摩擦系数 tmp, is_force_closure = False, False for ind_, value_fc in enumerate(fc_list): # 为每个摩擦系数分配抓取姿态 value_fc = round(value_fc, 2) tmp = is_force_closure is_force_closure = PointGraspMetrics3D.grasp_quality( j, obj, # 依据摩擦系数 value_fc 评估抓取姿态 force_closure_quality_config[value_fc], vis=False) print("[INFO] is_force_closure:", is_force_closure, "value_fc:", value_fc, "tmp:", tmp) if tmp and not is_force_closure: # 前一个摩擦系数下为力闭合, 当前摩擦系数下非力闭合, 即找到此抓取对应的最小摩擦系数 print("[debug] tmp and not is_force_closure") if good_count_perfect[ind_ - 1] < minimum_grasp_per_fc: canny_quality = PointGraspMetrics3D.grasp_quality( j, obj, canny_quality_config[round(fc_list[ind_ - 1], 2)], vis=False) good_grasp.append( (j, round(fc_list[ind_ - 1], 2), canny_quality)) # 保存前一个抓取 good_count_perfect[ind_ - 1] += 1 break elif is_force_closure and value_fc == fc_list[ -1]: # 力闭合并且摩擦系数最小 print( "[debug] is_force_closure and value_fc == fc_list[-1]") if good_count_perfect[ind_] < minimum_grasp_per_fc: canny_quality = PointGraspMetrics3D.grasp_quality( j, obj, canny_quality_config[value_fc], vis=False) good_grasp.append((j, value_fc, canny_quality)) good_count_perfect[ind_] += 1 break print('Worker:', i, 'Object:{} GoodGrasp:{}'.format(object_name, good_count_perfect)) object_name_len = len(object_name) object_name_ = str(object_name) + " " * (25 - object_name_len) if count == 0: good_grasp_rate = 0 else: good_grasp_rate = len(good_grasp) / count print( 'Worker:', i, 'Gripper:{} Object:{} Rate:{:.4f} {}/{}'.format( gripper_name, object_name_, good_grasp_rate, len(good_grasp), count))