1. 课程导论与预备知识
1.1 什么是3D视觉无序抓取?
先说说这个概念。无序抓取,英文叫 Bin Picking,说白了就是——机器人从料筐里,把乱七八糟堆在一起的工件,一个一个捡出来。
你想想看,传统的工业机器人干活,工件得摆得整整齐齐,一个萝卜一个坑。但现实工厂里,哪有那么理想?零件运过来就是散乱堆着的。这时候,机器人就得长眼睛,还得有脑子。
3D视觉就是那双眼睛。它不光能看到工件在哪儿,还能知道它歪了多少、转了多大角度。我最早接触这个项目是在一家汽车零部件厂,他们要抓取刹车盘,堆得跟小山似的。用2D相机根本搞不定,因为工件叠在一起,轮廓都看不清。换了3D相机,问题才解决。
核心定义: 3D视觉无序抓取 = 3D感知 + 位姿估计 + 机器人运动规划,让机器人在无约束环境下自主抓取散乱工件。
1.2 手眼标定的核心意义
有了3D相机,机器人就能看见工件了。但这里有个关键问题:相机看到的坐标,和机器人手臂的坐标,不是一回事。
举个例子。相机告诉你:“工件在点(100, 200, 50)。” 但这个坐标是相机自己定义的。机器人哪知道这个点对应自己手臂的什么位置?
手眼标定,就是干这个的——建立相机坐标系和机器人坐标系之间的数学变换关系。没有这一步,你看到的和抓到的,永远是两码事。
我曾经在一个项目里吃过这个亏。标定参数算错了一个角度,结果机器人每次抓取都偏了5毫米,工件直接撞到料筐壁上。嗯,从那以后,我再也不敢轻视标定这一步了。
| 场景 | 无标定后果 |
|---|---|
| 相机检测到工件在A点 | 机器人去抓B点,空抓 |
| 工件旋转了30° | 机器人按0°抓取,夹爪撞工件 |
| 深度测量偏差2mm | 夹爪未到位,工件滑落 |
避坑指南: 手眼标定不是一次性工作。相机松动、机器人更换末端工具、甚至环境温度变化,都可能导致标定参数失效。我建议每次换产前,至少做一次快速验证。
1.3 课程整体知识图谱与学习路径
这门课一共30章,我把它分成四个阶段。你跟着走,不会乱。
1.4 所需软硬件环境准备
工欲善其事,必先利其器。我把需要准备的东西列出来,你照着清单准备就行。
硬件清单
| 设备 | 推荐型号/规格 | 备注 |
|---|---|---|
| 3D相机 | Ensenso N35 / Photoneo PhoXi / 大恒水星 | 选双目结构光或激光三角法,别用ToF,精度不够 |
| 机器人 | UR5e / 遨博i5 / Fanuc LR Mate | 至少6轴,支持TCP通信 |
| 标定板 | 陶瓷棋盘格 7×9 或 9×11 | 精度0.01mm以上,不要用打印纸 |
| 工控机 | Intel i7以上,16GB RAM,NVIDIA GTX 1060 | 点云处理需要GPU加速 |
我的经验: 标定板千万别省那个钱。我早期用打印纸贴在玻璃上,结果标定误差0.5mm,折腾了两周才发现是标定板变形了。陶瓷标定板虽然贵,但一次投资,终身受益。
软件环境
- 操作系统: Ubuntu 20.04 LTS(ROS Noetic原生支持)
- 机器人中间件: ROS Noetic + MoveIt
- 3D视觉库: PCL 1.12 + OpenCV 4.5 + Halcon(可选)
- 标定工具: easy_handeye(ROS包) / 自研标定程序
- 编程语言: C++11/14 + Python 3.8
# 一键安装核心依赖(Ubuntu 20.04)
sudo apt install ros-noetic-pcl-ros ros-noetic-moveit ros-noetic-easy-handeye
pip3 install numpy opencv-python pyrealsense2
网络与通信
机器人和工控机之间,我建议用有线以太网,别用WiFi。抓取过程中丢一个包,机器人可能就撞了。我遇到过WiFi干扰导致标定数据采集不全,排查了整整一天。
- 机器人IP:192.168.1.100(固定)
- 工控机IP:192.168.1.101(固定)
- 相机IP:192.168.1.102(固定)
- 通信协议:TCP Modbus / ROS Topic
注意: 所有设备IP必须在同一网段,且关闭防火墙。ROS通信依赖多播,防火墙开着会导致节点发现失败。