一、论文笔记

RGB Matters: Learning 7-DoF Grasp Poses on Monocular RGBD Images

标题:RGB Matters:单RGBD图像学习学习7D抓取姿态
作者团队:上海交通大学(卢策吾)
期刊会议:ICRA
时间:2021
代码https://github.com/GouMinghao/RGB_Matters

1.1 目标问题

现有方法要么生成自由度很少的抓取姿态,要么只将不稳定的深度点云输入。

1.2 方法

大致流程为:

  1. 使用Angle View Net网络生成图像不同位置的抓取器方向 Pimg=(u,v,rx,ry,rz,c)P_{img}=(u,v,r_x,r_y,r_z,c),即图像中坐标的位置,其对应的夹爪旋转姿态,以及置信度。
  2. 对置信度高的预测,结合深度图计算距离和夹爪宽度Pcam=x,y,z,rx,ry,rz,wP_{cam}=x,y,z,rx,ry,rz,w

(0)定义

抓握姿势定义为 (x, y, z, rx, ry, rz, w),其中(x, y, z)代表夹持器的位置,(rx, ry, rz)代表夹持器的旋转,w代表夹持器的宽度。

夹持器本文仅考虑平行夹爪,使用 (h, l, wmax) 定义,三个参数分别代表夹具的 高度、长度和最大宽度。

(1)Angle-View Net

预测像素级的夹持器旋转配置。直接回归四元数不太现实,而且不鲁棒(因为同一个位置进行抓取有不止一个可行的旋转)。

可以使用下面的模型,将方向解耦为接近方向和绕平面的旋转,将夹持器旋转预测作为一个分类问题进行预测,共有VxA类方向。

网络通过将RGB图像栅格化,对于每一个网格,AVN预测一个1维VxA个元素的向量,包含每个方向的置信度。最终得到(VxA)xGHxGW的tensor。AVN最终的输出表示为每个角度的heatmap。

作者在代码中给出的是V=60,A=6的测试。

(2)快速分析搜索

AVN识别了7个自由度的其中五个,但是夹持器的宽度和夹持器沿轴方向的自由度还没有确定。

本文提出了基于碰撞和空抓取检测的快速分析搜索来计算宽度和距离。

通过对从0到Wmax采样,假设抓取器靠近由深度图重建的点云的对应点。过滤掉夹持器占用的空间中存在点、抓取空间没有点的两种情况。

1.3 思考

本文使用了尽可能简单的思路解决抓取预测问题

将末端夹持器的旋转方向通过分类器进行回归计算。

将夹持器位置和宽度通过采样测试逐一排除得到最优解。

思路直观简单,可以尝试。

二、复现过程

2.1 环境搭建

创建虚拟环境

1
2
conda create -n rgb_matters python=3.7
conda activate rgb_matters

下载程序

1
2
git clone https://github.com/GouMinghao/rgb_matters
cd rgb_matters

安装PyTorch1.8.0

1
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge

安装依赖

1
python3 -m pip install -r requirements.txt

2.2 测试Demo

下载作者训练好的模型:Google Drive

在代码目录创建一个weights的目录,然后将下载的模型放入其中,完成后文件夹结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
rgbd_graspnet/
├── check_label_integrity.py
├── train.py
├── train.sh
├── vis_label.py

...

└── weights
├── kn_jitter_79200.pth
├── kn_no_norm_76800.pth
├── kn_norm_63200.pth
├── kn_norm_only_73600.pth
└── rs_norm_56400.pth

三、代码分析

3.1 输出结果分析

(1)热力图获取

使用下面的代码进行预测热力图

1
2
3
4
5
6
7
8
9
10
11
net = RGBNormalNet(num_layers=args.num_layers, use_normal=args.use_normal, normal_only=args.normal_only)
state_dict = torch.load(weights_path)
net.load_state_dict(state_dict["net"], strict=False)
net = net.to(device)
net.eval()

rgb, _ = load_data(rgb_path, depth_path)

rgb = rgb.unsqueeze(0).to(device)

prob_map = net(rgb)

其中的prob_mat是预测的热力图shape=(batch_size, 360, h, w)一共360张热力图(360张包括接近方向v=60和平面内旋转A=6)

(2)夹爪姿态获取

使用convert_grasp()函数从360张热力图中提取夹爪姿态。

夹爪姿态为Grasp实例,包括以下几个参数:

  • score:float类型,抓取得分
  • width:float类型,夹爪宽度
  • height:float类型,夹爪高度
  • depth:float类型,夹爪深度
  • rotation_matrix:shape(3, 3)数组,旋转矩阵
  • translation:shape(3)数组,平移向量
  • object_id:int类型,抓取物体类别

具体参考下面两张图:

image.png