最近在看抓取论文发现评价指标中有+CD和不加CD的两种情况,普遍是+CD的高,然后想问一下这个CD是在哪里设置的?是test.py里面的collision dection吗?collison_thresh>0?不加CD和加分别是什么代码?
3条回答 默认 最新
极客车云 2026-02-26 20:00关注在GraspNet系列论文和官方实现中,碰撞检测(Collision Detection, CD) 主要用于抓取结果的后处理筛选阶段,目的是过滤掉那些与场景中物体或自身发生碰撞的无效抓取姿态,从而提升最终的抓取成功率指标。下面结合官方代码实现详细说明:
一、CD的核心作用
GraspNet的原始网络输出的是大量候选抓取姿态(通常是每个物体前K个得分最高的抓取),其中部分姿态可能存在:
- 抓取器与场景中其他物体碰撞
- 抓取器自身关节碰撞(如手指交叉)
- 抓取器穿透物体模型(不符合物理约束)
CD就是在这些候选姿态中,筛选出完全无碰撞的有效姿态,最终用于计算成功率指标(所以+CD的成功率会更接近真实物理场景,数值通常更高)。
二、在官方代码中的具体位置
GraspNet官方代码(GitHub仓库)中,CD主要在测试阶段的后处理环节实现,核心代码位于以下几个文件:
1. 核心碰撞检测函数
碰撞检测的底层实现位于
graspnetAPI/utils/grasp.py中的Grasp类,核心方法是:def is_collision_free(self, scene_points, collision_thresh=0.01): """ 检测抓取器是否与场景点云碰撞 :param scene_points: 场景点云 (N,3) :param collision_thresh: 碰撞阈值(小于该距离则判定为碰撞) :return: True=无碰撞, False=有碰撞 """ # 生成抓取器的点云模型 gripper_points = self.generate_gripper_points() # 计算场景点与抓取器点的最小距离 dist = np.min(cdist(scene_points, gripper_points), axis=1) # 如果存在任何点距离小于阈值,则判定为碰撞 return np.all(dist > collision_thresh)2. 测试阶段的后处理筛选
在测试脚本
tools/test.py中,当网络输出候选抓取后,会调用碰撞检测进行过滤,核心逻辑如下(简化版):# 加载场景点云和物体信息 scene_points = load_scene_points(scene_id) object_poses = load_object_poses(scene_id) # 网络预测候选抓取(每个物体生成K个抓取) candidate_grasps = model.predict(object_points, object_poses) # 碰撞检测筛选 valid_grasps = [] for grasp in candidate_grasps: # 1. 检测抓取器与自身是否碰撞(如手指交叉) if grasp.self_collision_check(): continue # 2. 检测抓取器与场景物体是否碰撞 if not grasp.is_collision_free(scene_points, collision_thresh=0.01): continue valid_grasps.append(grasp) # 计算成功率(仅用无碰撞的有效抓取) success_rate = calculate_success_rate(valid_grasps, ground_truth)3. 配置参数:
collision_thresh碰撞阈值
collision_thresh是控制碰撞检测严格程度的关键参数,默认值通常为0.01m(1cm),表示当抓取器点云与场景点云的最小距离小于1cm时,判定为碰撞。在官方代码中,这个参数通常在测试脚本的配置文件或命令行参数中设置,例如:
# 在test.py的参数解析中 parser.add_argument('--collision_thresh', type=float, default=0.01, help='Collision threshold in meters')
三、论文中+CD和不加CD的区别
类型 计算方式 数值特点 不加CD 直接使用网络输出的所有候选抓取计算成功率,包含碰撞的无效抓取 数值较低,更接近网络原始输出性能 +CD 先通过碰撞检测过滤无效抓取,再计算剩余有效抓取的成功率 数值较高,更接近真实物理场景的实际抓取效果
四、注意事项
- 训练阶段不涉及CD:CD仅用于测试/推理阶段的后处理,训练时网络学习的是抓取姿态的合理性,不会加入碰撞检测的约束(否则会大幅增加训练成本)。
- 不同抓取器模型的CD实现不同:如果使用自定义抓取器(如二指、三指),需要对应修改
generate_gripper_points()方法,生成符合自身结构的抓取器点云,才能保证碰撞检测的准确性。 - 阈值调整的影响:
collision_thresh过小会导致有效抓取被误过滤,过大则会保留更多碰撞姿态,需要根据实际场景(如物体大小、抓取器精度)调整。
总结
GraspNet中的碰撞检测(CD)是在测试阶段的后处理环节执行的,核心是通过
is_collision_free()方法筛选无碰撞的有效抓取姿态,最终用于计算更贴近真实场景的成功率指标。代码中主要通过test.py中的参数collision_thresh控制检测严格程度。评论 打赏 举报解决 1无用