graspnetAPI
graspnetAPI copied to clipboard
生成场景碰撞标签
首先感谢你们的杰出工作!
我尝试用数据集里的grasp_label及场景0000来生成场景的collision_label。原本我的想法是直接将整个场景所有物体的点级抓取构建为一个graspGroup,然后调用ModelFreeCollisionDetector函数得到colllision_mask,即为collision_labels。但是当我只将一个物体(id为0)的所有抓取构建为graspGroup,然后调用ModelFreeCollisionDetector函数时,遇到了内存不够的情况:
collision_detector.py", line 75, in detect targets = self.scene_points[np.newaxis,:,:] - T[:,np.newaxis,:] numpy.core._exceptions.MemoryError: Unable to allocate 19.5 TiB for an array with shape (49809600, 17901, 3) and data type float64
然后我将grasp_label里collision为True的抓取排除,都还剩下4332493个抓取,检测时还是会报超内存。这时我只能将这个graspGroup切片,每次50000左右,然后分别检测碰撞,这样会很慢,检测完一个物体都需要7,8个小时。
你们在生成场景的collision_label时,会碰到这样的问题吗?你们是怎么处理的呢?
另外,你们在生成场景的collision_label时ModelFreeCollisionDetector函数里场景点云的voxel_size设为多少呢?approach_dist,collision_thresh, empty_thresh,finger_width,finger_length等这些参数设为多少呢?
你好,是的,生成碰撞标签是很耗时的一项工作,我们在服务器上跑了很久。你使用的话应该直接用我们release的collision标签即可。
感谢您的答复! 我这边想在您提供的数据集上,针对我的应用场景添加几个特定的物体,比如门把手之类的,以提高相应的成功率。 您能否指点一下,该怎么做才能加快这个过程呢?我这样做的速度基本是没法生成场景级的碰撞的,太慢了。
我们当时为了加速开了CPU多线程处理
嗯,我尝试使用多进程处理,现在速度基本能满足需求。
但是我生成的碰撞结果与数据集里的有些差异:1.我生成的碰撞要多许多。2.我生成的挺多无碰撞抓取在桌子下面。3.我生成的抓取不会与机械臂所在区域碰撞,数据集里的无碰撞抓取会与机械臂所在区域碰撞。
下面图1,图2是数据集场景000里物体id0的无碰撞抓取正面和侧面视图。图3,图4是我生成的场景000里物体id0的无碰撞抓取正面和侧面视图。图5是我生成的碰撞与数据集里的碰撞统计情况。
图1
图2
图3
图4
图5
不知道您能否抽空帮我看看是哪里导致了我得到的结果和数据集里的结果之间的差异?
我用的方法大概为:a.将场景000的256个视角的点云拼接,根据各物体信息将该拼接点云去outlier点,然后以0.006下采样。b.对id0物体的所有无碰撞(物体级)抓取进行碰撞检测(场景级),一些参数设为height = 0.02,depth_base = 0.02,finger_width = 0.01,approach_dist = 0.03,collision_thresh=0.05。
gen_collision_test.txt
这是因为采用的场景点云不同,我们直接利用物体点云模型和6D pose重建了场景,而不是把不同视角的点云合在一起,6D pose的标注会影响最后的结果;相机拍到的桌子只是一个面,实际上应该是有厚度的,我们在做碰撞标注的时候也把桌面的等效模型加了进去;在重建场景时没有把机械臂的模型放进去,因而此部分碰撞无法得到。
非常感谢您的解答!原来场景级的碰撞标注是这么做的,我再试试这样做的结果。
@chenxi-wang ,您好,按照您给的方法测试了一下,比之前结果好了不少。但有个疑问是您的碰撞检测是用iou的方式吗?还是直接看有没有任何点云发生碰撞(如collision_detect())?
@chenxi-wang ,另外,还想请教一下生成grasp_label时确定抓取宽度的问题。 抓取宽度生成方式是否是取最小的无碰撞非空抓取? 具体操作为:确定手指夹取方向上点云y的最大值及最小值,以该最大值和最小值离抓取坐标系原点的距离极大者的两倍作为最小的无碰撞抓取宽度。若该抓取宽度大于某一最大阈值(猜测是0.15m),或是该抓取为空抓取(两指之间物体的点云少于10个点),则将抓取宽度设为0。否则,该抓取宽度为最小的无碰撞非空抓取。
@chenxi-wang ,您好,按照您给的方法测试了一下,比之前结果好了不少。但有个疑问是您的碰撞检测是用iou的方式吗?还是直接看有没有任何点云发生碰撞(如collision_detect())?
用的是后者的规则
@chenxi-wang ,另外,还想请教一下生成grasp_label时确定抓取宽度的问题。 抓取宽度生成方式是否是取最小的无碰撞非空抓取? 具体操作为:确定手指夹取方向上点云y的最大值及最小值,以该最大值和最小值离抓取坐标系原点的距离极大者的两倍作为最小的无碰撞抓取宽度。若该抓取宽度大于某一最大阈值(猜测是0.15m),或是该抓取为空抓取(两指之间物体的点云少于10个点),则将抓取宽度设为0。否则,该抓取宽度为最小的无碰撞非空抓取。
大致思路是一样的,有的物体表面变化较大,存在多个值,我们从小到大采样,取最小宽度。
@chenxi-wang ,另外,还想请教一下生成grasp_label时确定抓取宽度的问题。 抓取宽度生成方式是否是取最小的无碰撞非空抓取? 具体操作为:确定手指夹取方向上点云y的最大值及最小值,以该最大值和最小值离抓取坐标系原点的距离极大者的两倍作为最小的无碰撞抓取宽度。若该抓取宽度大于某一最大阈值(猜测是0.15m),或是该抓取为空抓取(两指之间物体的点云少于10个点),则将抓取宽度设为0。否则,该抓取宽度为最小的无碰撞非空抓取。
大致思路是一样的,有的物体表面变化较大,存在多个值,我们从小到大采样,取最小宽度。
感谢您及时的回复!
您说的存在多个值的意思我有点没懂,手指夹取方向上点云y的最大值及最小值不是都只有一个吗?比如下图:
拿杯子举例,如果你从正上方杯壁上一个点来看,可以直接夹住杯壁抓取,也可以加大宽度到把整个杯子握住,如果物体表面起伏变化快,很容易出现多值的情况