4. 抓取规划基础:从点云/图像到抓取候选的生成流程
抓取规划,说白了就是让机器人知道「怎么伸手去拿」。很多人一上来就调逆运动学、算轨迹,结果发现手伸过去根本抓不住——因为抓取姿态本身就没选对。
这一章,我们聊聊最基础也最关键的一步:如何从传感器数据生成抓取候选。我会以 GPD(Grasp Pose Detection)为主线,带你走一遍完整的流程。
4.1 输入数据:点云 vs 图像
先搞清楚输入是什么。我见过不少团队在数据预处理上栽跟头,白白浪费算力。
| 数据类型 | 优点 | 缺点 | 典型传感器 |
|---|---|---|---|
| 深度图(RGB-D) | 纹理丰富,物体识别强 | 对光照敏感,深度精度有限 | RealSense, Kinect |
| 3D 点云 | 几何信息直接,不受光照影响 | 稀疏、无纹理、计算量大 | 激光雷达, 结构光 |
| 融合数据 | 兼顾几何与纹理 | 标定复杂,数据量大 | RGB-D + 投影 |
4.2 GPD 的核心思想
GPD 的全称是 Grasp Pose Detection,它不依赖物体模型,直接从点云里找「看起来能抓」的位置。怎么找?核心就三步:
- 采样候选点:在点云表面随机撒点,每个点生成一组候选抓取姿态。
- 评估可抓性:用几何特征(比如法向量、曲率、邻域形状)判断这个姿态能不能抓稳。
- 聚类与排序:把相似的候选合并,按得分排序,输出 Top-K 个抓取姿态。
你想想看,这其实很像人类「看一眼就知道能不能拿」的过程——只不过机器人需要显式地算出来。
4.3 从点云到候选:详细流程
下面这张图是我自己整理的 GPD 流程,建议你保存下来对照着看。
4.4 采样策略:随机 vs 均匀
采样这一步很关键。我早期做项目时,直接用随机采样,结果在物体边缘撒了一大堆点,中间反而稀疏——抓取候选全偏了。
后来我改用 体素网格均匀采样,效果好了很多。具体做法:
- 把点云空间划分成固定大小的体素(比如 2cm × 2cm × 2cm)
- 每个体素内只保留一个点(取中心或最近邻)
- 在保留的点上生成候选抓取姿态
4.5 抓取候选的表示
每个抓取候选,本质上是一个 6D 位姿(3 个位置 + 3 个方向)。但 GPD 里常用的是 7 维表示:
grasp_candidate = [x, y, z, qx, qy, qz, qw]
其中 (x, y, z) 是抓取点的位置,一般取在物体表面附近;(qx, qy, qz, qw) 是四元数,表示夹爪的朝向。
嗯,这里要注意:夹爪的朝向不是随便给的。我见过有人直接把四元数设成单位四元数,结果夹爪要么插进物体里,要么悬在半空。正确的做法是:
- 计算采样点的法向量(指向物体外部)
- 让夹爪的接近方向与法向量对齐
- 绕法向量再旋转一个角度(让夹爪避开障碍物)
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 到实际抓取
最后,给你几个我在项目中总结的实用建议:
- 点云质量决定上限:预处理比算法更重要。先做好降采样和离群点滤波,再谈抓取规划。
- 候选数量不是越多越好:500 个候选和 2000 个候选,最终效果差别不大,但计算时间差了好几倍。
- 别忘了夹爪的物理限制:GPD 不会考虑你的夹爪能不能张开那么大——你得自己加一个宽度约束。