4. 抓取规划基础:从点云/图像到抓取候选的生成流程

抓取规划,说白了就是让机器人知道「怎么伸手去拿」。很多人一上来就调逆运动学、算轨迹,结果发现手伸过去根本抓不住——因为抓取姿态本身就没选对。

这一章,我们聊聊最基础也最关键的一步:如何从传感器数据生成抓取候选。我会以 GPD(Grasp Pose Detection)为主线,带你走一遍完整的流程。

4.1 输入数据:点云 vs 图像

先搞清楚输入是什么。我见过不少团队在数据预处理上栽跟头,白白浪费算力。

数据类型 优点 缺点 典型传感器
深度图(RGB-D) 纹理丰富,物体识别强 对光照敏感,深度精度有限 RealSense, Kinect
3D 点云 几何信息直接,不受光照影响 稀疏、无纹理、计算量大 激光雷达, 结构光
融合数据 兼顾几何与纹理 标定复杂,数据量大 RGB-D + 投影
我的习惯: 如果场景简单(比如桌面抓取),直接用深度图就够了。如果场景杂乱、物体堆叠,我建议用点云——几何信息更可靠,不容易被阴影骗到。

4.2 GPD 的核心思想

GPD 的全称是 Grasp Pose Detection,它不依赖物体模型,直接从点云里找「看起来能抓」的位置。怎么找?核心就三步:

  1. 采样候选点:在点云表面随机撒点,每个点生成一组候选抓取姿态。
  2. 评估可抓性:用几何特征(比如法向量、曲率、邻域形状)判断这个姿态能不能抓稳。
  3. 聚类与排序:把相似的候选合并,按得分排序,输出 Top-K 个抓取姿态。

你想想看,这其实很像人类「看一眼就知道能不能拿」的过程——只不过机器人需要显式地算出来。

4.3 从点云到候选:详细流程

下面这张图是我自己整理的 GPD 流程,建议你保存下来对照着看。

GPD 抓取候选生成流程 GPD 抓取候选生成流程 输入点云 预处理(降采样/滤波) 采样候选点(随机/均匀) 生成抓取候选(位置+方向) 评估可抓性(几何特征) 法向量、曲率、 邻域点分布 聚类与排序(Top-K) 输出:抓取姿态列表

4.4 采样策略:随机 vs 均匀

采样这一步很关键。我早期做项目时,直接用随机采样,结果在物体边缘撒了一大堆点,中间反而稀疏——抓取候选全偏了。

后来我改用 体素网格均匀采样,效果好了很多。具体做法:

  • 把点云空间划分成固定大小的体素(比如 2cm × 2cm × 2cm)
  • 每个体素内只保留一个点(取中心或最近邻)
  • 在保留的点上生成候选抓取姿态
关键参数: 体素大小直接影响候选密度。太小了计算量大,太大了容易漏掉小物体。我一般从 1.5cm 开始调,根据物体尺寸上下浮动。

4.5 抓取候选的表示

每个抓取候选,本质上是一个 6D 位姿(3 个位置 + 3 个方向)。但 GPD 里常用的是 7 维表示:

grasp_candidate = [x, y, z, qx, qy, qz, qw]

其中 (x, y, z) 是抓取点的位置,一般取在物体表面附近;(qx, qy, qz, qw) 是四元数,表示夹爪的朝向。

嗯,这里要注意:夹爪的朝向不是随便给的。我见过有人直接把四元数设成单位四元数,结果夹爪要么插进物体里,要么悬在半空。正确的做法是:

  1. 计算采样点的法向量(指向物体外部)
  2. 让夹爪的接近方向与法向量对齐
  3. 绕法向量再旋转一个角度(让夹爪避开障碍物)

4.6 评估可抓性:几何特征

有了候选,怎么判断好不好抓?GPD 用的是 局部几何特征。我常用的特征有:

特征 含义 理想值范围
法向量一致性 邻域内法向量的方差 < 0.1(表面平坦)
曲率 局部表面的弯曲程度 0.01 ~ 0.1(太曲或太平都不好)
邻域点密度 单位体积内的点数 适中(太稀疏说明是噪声)
夹爪开口宽度 夹爪两侧点云的距离 略大于物体厚度
我曾经踩过的坑: 只用法向量一致性做评估,结果在圆柱体表面生成了大量高分候选——但圆柱体根本抓不稳,因为夹爪会打滑。后来我加入了「夹爪开口宽度」和「曲率」两个特征,才把圆柱体过滤掉。

4.7 聚类与排序

评估完之后,你会得到成百上千个候选。直接全送出去肯定不行——计算量太大,而且很多候选其实非常接近。

我一般用 DBSCAN 聚类,把位置和朝向都相近的候选归为一类。然后每类里取得分最高的那个,最后输出 Top-10 或 Top-20。

聚类参数怎么设?

  • eps(邻域半径):一般设 3~5cm,根据物体大小调整
  • min_samples(最小样本数):设 3~5,太少容易产生孤立点

4.8 实战建议:从 GPD 到实际抓取

最后,给你几个我在项目中总结的实用建议:

我的习惯: 不要直接拿 GPD 输出的 Top-1 去抓。我会先做一次「碰撞检测」,看看夹爪在接近过程中会不会撞到其他物体。如果会,就换下一个候选。
  • 点云质量决定上限:预处理比算法更重要。先做好降采样和离群点滤波,再谈抓取规划。
  • 候选数量不是越多越好:500 个候选和 2000 个候选,最终效果差别不大,但计算时间差了好几倍。
  • 别忘了夹爪的物理限制:GPD 不会考虑你的夹爪能不能张开那么大——你得自己加一个宽度约束。