机械臂点云采摘:当我发现 GraspNet 不适合我的项目
机械臂点云采摘:当我发现 GraspNet 不适合我的项目
TL;DR:我的大创项目做烟草采摘,做了两个月发现走错了路—— GraspNet 是给”有夹爪的机械臂”用的,而我的机械臂没有夹爪。 重新定义问题后,我用 RL 预选 + MoveIt 验证 的混合方案救回来了。
一、项目背景:为什么做这个
我是车辆工程专业,大二开始做大创项目,方向是机械臂 + 视觉 + 点云自动化采摘。 具体场景:烟草种植大棚里,机械臂识别烟叶,找到烟叶和茎的连接处,精准靠近。
听起来是个标准的”机器人 + AI”流水线对吧?我一开始也是这么想的。
已完成的模块:
| 模块 | 状态 | 说明 |
|---|---|---|
| 眼在手上相机 | ✅ | 深度相机装在机械臂末端 |
| 点云采集 | ✅ | 能生成场景点云图 |
| MoveIt 路径规划 | ✅ | 机械臂能移动到指定位姿 |
| YOLOv11 检测 | ✅ | 能识别烟叶/果实 |
| 夹爪 | ❌ | 没有,项目不考虑装夹爪 |
最后这一行就是我踩坑的根源。
二、踩坑:GraspNet 为什么帮不了我
当时我最自然的思路:
“点云 + 6-DoF 抓取检测 = 现成的 GraspNet / Contact-GraspNet”
我花了三周读论文、跑代码、看 Contact-GraspNet 的 demo。 直到把它接到我的项目里才发现——输出完全对不上。
GraspNet 输出长这样
# GraspNet / Contact-GraspNet 的输出{ "position": [x, y, z], # 抓取点位置 "orientation": [rx, ry, rz], # 抓取姿态(四元数或欧拉角) "width": 0.08, # ← 夹爪开度! "score": 0.87 # 置信度}width 这个字段是夹爪张开的宽度,单位米。
整个 GraspNet 的 loss、训练数据、6-DoF 检测 head,都是围绕”夹爪怎么合上物体”设计的。
而我的需求
# 我实际需要的输出{ "junction_position": [x, y, z], # 烟叶-茎连接处坐标 "approach_direction": [dx, dy, dz], # 接近方向(3D 单位向量) # 没有 width!没有夹爪!}我的采摘目标是”靠近烟茎连接处”,不是”夹住某个东西”。 没有夹爪,就没有 width 这个概念;GraspNet 的所有训练都没考虑过这种场景。
| 我的情况 | GraspNet 能做的 |
|---|---|
| ❌ 没有夹爪 | ❌ 需要 width(夹爪开度) |
| ❌ 不做抓取动作 | ❌ 输出是”怎么夹”的位姿 |
| ✅ 只需要接近方向 | ❌ 完全不需要这个信息 |
GraspNet 是给有夹爪的机械臂用的,我不需要。
三、重新定义问题
意识到框架不匹配之后,我冷静下来重写了问题定义:
烟叶连接处(圆柱状,~1cm 长) ↓哪个方向接近,机械臂能到达 + 不撞叶子? ↓输出:MoveIt 的 pose(位置 + 姿态)这是一个运动规划问题,不是抓取检测问题。 方向就清楚了——核心是 MoveIt,点云用来打分,方向选择可以更聪明。
四、解决方案:两阶段混合规划
我设计了一个两阶段方案:
全场景点云 ↓[阶段1:方向预选] ← 粗筛,从 12+ 个候选方向里挑 3~5 个 ↓[阶段2:MoveIt 验证] ← 精验,确保物理可行 + 无碰撞 ↓输出:最佳接近 pose阶段 1 的两个选项
方案 A:候选方向采样 + 点云遮挡打分(最简单)
def select_best_approach(junction_point, point_cloud): # 半球面上均匀采样 12 个候选方向 candidates = generate_approach_candidates(junction_point, num=12)
scored = [] for cand in candidates: # 沿方向发射射线,看点云里有多少障碍 occlusion_score = score_occlusion(cand, point_cloud)
# MoveIt 验证运动学可行性 pose = make_grasp_pose(cand['point'], cand['dir']) feasible = arm_group.check_collision(pose)
if feasible: scored.append({'pose': pose, 'score': occlusion_score})
# 选遮挡最少 + 能到达的 return sorted(scored, key=lambda x: x['score'])[0]['pose']方案 B:RL 策略预选 + MoveIt 验证(大创创新点)
全场景点云 ↓RL 策略网络(训练好的) ↓输出:Top-3~5 个候选接近方向 ↓MoveIt 验证为什么引入 RL:
- 候选方向从 12 个降到 3~5 个,MoveIt 验证更快
- RL 学到了”遮挡模式”的统计规律,比暴力采样更聪明
- 这是大创的创新点——纯工程没人会写论文
RL 部分的设计
| 模块 | 内容 |
|---|---|
| State | 点云(降采样)+ 采摘点 3D 坐标 + 茎轴线方向 |
| Action | 接近方向(3 维单位向量) |
| Reward | 成功采摘 = +1,碰撞 = -1 |
| 训练环境 | Gazebo 仿真(Gazebo Plants 插件) |
分工:
- RL = 粗筛(去掉明显不行的方向)
- MoveIt = 精验(保底,确保物理可行)
五、仿真:Gazebo Plants 插件
仿真环境是这个项目里最难找的资源—— 直到我刷到这篇论文:
Gazebo Plants: Simulating Plant-Robot Interaction with Cosserat Rods arXiv:2402.02570,2024 年 2 月
它专门做农业采摘的 Gazebo 仿真,用 Cosserat Rod 仿真茎的柔性(正好是烟茎!)。 还能模拟叶片遮挡、茎弯折。
最惊喜的是它开源(MPL 2.0),代码可以发邮件问作者要。
从真实点云到仿真模型
深度相机采集烟叶点云 (.pcd / .ply) ↓Open3D 泊松重建 → mesh (.obj) ↓转 Gazebo SDF / URDF ↓放进 Gazebo 仿真能做到的:
- ✅ 叶片表面形状真实
- ✅ 茎的走向真实
做不到的:
- ❌ 物理属性(柔性参数)需要手动调
六、技术栈选型的思考
记录一下选型过程,给类似项目的人参考:
ROS1 vs ROS2
- 当前:ROS1 Noetic(双容器解决 Python 版本问题)
- 下一项目:直接起 ROS2 Humble
- 理由:Noetic 2025 年 EOL,Python 3.10+ 兼容性差
短期用双容器隔离 ROS(Python 3.8)和 YOLOv11(Python 3.10)是务实选择。
抓取检测模型
- GraspNet-baseline:数据全、文档好、集成容易(有夹爪时首选)
- Contact-GraspNet:杂乱场景更强,但部署复杂
- PointNetGPD:轻量,ICRA 2019 经典
仿真平台
- Gazebo(ROS 原生,零学习成本)
- Isaac Sim(NVIDIA,性能强但门槛高)
- PyBullet(轻量,快糙猛)
七、踩坑反思
写完这套方案,回头看最大的教训是:
❌ “业内标准方案 = 我该用的方案” 是错觉
GraspNet 在所有 6-DoF 抓取论文里都出现,看起来是”必选”。 但没夹爪就不需要 6-DoF 抓取检测——这件事没有任何论文会写,因为它”显然”。
但显然的事情如果没人讲,新手就会绕远路。
✅ 拆解自己的真实需求再选框架
| 步骤 | 问题 |
|---|---|
| 1 | 我到底要什么输出? |
| 2 | 这个输出需要夹爪吗? |
| 3 | 有没有更简单的方案? |
| 4 | 这个方案的创新点在哪? |
第 2 步是我漏掉的。如果一开始就问”GraspNet 的 width 我用在哪”,三周就省下来了。
🎯 大创 = 工程 + 一点点创新
工程部分(候选采样 + MoveIt 验证)是保底,必须跑通。 创新部分(RL 策略)是论文 / 比赛的核心。 两者要分开规划,不能混着做。
八、接下来的计划
第一阶段(保底): 候选方向采样 + 点云遮挡打分 + MoveIt 验证 → 先让机械臂能跑起来
第二阶段(创新): Gazebo 仿真环境搭建(Gazebo Plants + 烟草模型) RL 策略训练 → 作为大创创新成果
后续(可选): 真实烟草数据验证 论文撰写附:参考资料
论文
- Grasping Trajectory Optimization with Point Clouds —— RL 接近方向策略的参考
- Gazebo Plants: Simulating Plant-Robot Interaction with Cosserat Rods (arXiv:2402.02570) —— 农业采摘仿真
- 《烟草地上部植株三维重构与可视化》(中国农业科学 2013)—— 烟草建模参考
开源项目
- GraspNet-baseline —— 6-DoF 抓取检测(有夹爪时)
- Contact-GraspNet —— 杂乱场景抓取
- PointNetGPD —— 轻量级抓取(ICRA 2019)
- MoveIt Task Constructor —— 任务级运动规划
- Gazebo Plants plugin —— 农业采摘仿真(MPL 2.0)
我的笔记
本项目的所有调研笔记都整理在 Obsidian 仓库里: 《机械臂视觉点云采摘 · 学习总入口》起,分 11 篇专题笔记覆盖 学习指南 / 项目笔记 / 核心论文 / 开源项目 / MoveIt / 阻抗控制 / 代码解读。
写在最后:如果你也在做机械臂 + 视觉项目,先问自己”我到底要什么输出”, 再去查论文。不要被”业内标准方案”绑住手脚。
— zhq,写于 2026 年 6 月 20 日
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!