机械臂点云采摘:当我发现 GraspNet 不适合我的项目

2060 字
10 分钟
机械臂点云采摘:当我发现 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 日

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
机械臂点云采摘:当我发现 GraspNet 不适合我的项目
https://zhq183.xyz/posts/zhq/robotic-arm-picking-rl-moveit/
作者
张好奇
发布于
2026-06-20
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
张好奇
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
13
分类
3
标签
23
总字数
15,512
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.12.3
文章许可
CC BY-NC-SA 4.0

文章目录