机器视觉抓取基础:YOLO 目标检测 + 手眼标定完整流程
机器视觉抓取基础:YOLO 目标检测 + 手眼标定完整流程
机械臂想抓东西,光有"手"不行,还得有"眼"和"脑子"——这篇帮你打通从像素到抓取的整条链路。
一、机械臂抓取的视觉需求:抓什么?在哪里?
让机械臂完成一次抓取任务,核心要回答两个问题:
- 抓什么——桌上是苹果还是螺丝?红色杯子还是蓝色盒子?这需要目标检测。
- 在哪里——物体在图像中的像素坐标(u, v)如何映射到机械臂工作空间中的物理坐标(x, y, z)?这需要坐标标定。
没有检测,机械臂不知道目标;没有标定,机械臂不知道往哪伸手。两者缺一不可。
二、YOLO 目标检测在机械臂中的作用
YOLO(You Only Look Once)是目标检测领域的经典算法,它的核心输出是:
- 类别标签(class):告诉你是"杯子"“苹果”“扳手”
- 边界框(bounding box):给出物体在图像中的矩形区域 (x_center, y_center, width, height)
对机械臂来说,边界框的中心点就是物体的像素级粗定位,再配合深度相机或标定转换,就能得到三维物理坐标——这就是"看见→定位→抓取"的第一步。
三、YOLO 原理速览:单阶段检测、网格划分、Anchor Box
面向小白,用最通俗的方式理解 YOLO 的工作方式:
3.1 单阶段检测 vs 两阶段检测
传统两阶段方法(如 Faster R-CNN)先找候选区域,再分类判别,慢但精准。YOLO 是单阶段——一张图进去,直接输出所有检测结果,一步到位,速度飞快。对机械臂这种需要实时响应的场景,YOLO 是首选。
3.2 网格划分
YOLO 把输入图像划分成 S×S 的网格(比如 13×13)。如果某个物体的中心落在某个网格单元内,该网格就负责检测这个物体。每个网格预测若干个边界框及其置信度。
3.3 Anchor Box
不同物体形状各异——杯子瘦高,盒子扁平。Anchor Box 是预设的一组"参考框",代表常见形状比例。每个网格基于 Anchor Box 做偏移预测,从而适应各种形状的目标,不用从头瞎猜。
四、YOLO 版本选择:嵌入式端部署对比
| 特性 | YOLOv5 | YOLOv8 |
|---|---|---|
| 检测精度 | 优秀 | 更优(anchor-free设计) |
| 推理速度 | 快 | 更快(模型结构优化) |
| 模型大小 | 小(nano版~4MB) | 小(nano版~6MB) |
| 训练门槛 | 低,生态成熟 | 低,ultralytics统一API |
| 嵌入式部署 | 生态完善,教程多 | 新一代首选,后处理更简洁 |
推荐:新项目直接用 YOLOv8,ultralytics 库一行代码即可推理,后处理不需要手动解析anchor,部署更省心。老项目维护用 YOLOv5 也完全够用。
五、RK3588 NPU 加速推理:模型转换→rknn→NPU执行
RK3588 内置 6TOPS NPU,推理 YOLO 模型的流程:
YOLOv8 训练 (.pt)
↓ 导出 ONNX
ONNX 模型 (.onnx)
↓ rknn-toolkit2 转换
RKNN 模型 (.rknn)
↓ NPU 推理
检测结果输出
关键步骤:
- 导出 ONNX:
yolo export model=yolov8n.pt format=onnx - 转换 RKNN:用
rknn-toolkit2,配置量化精度(INT8/FP16),生成.rknn文件 - NPU 推理:通过 RKNN Runtime C API 或 Python API 加载模型,输入图像,输出检测框
注意:NPU 对算子支持有限,部分 YOLOv8 后处理算子(如 NMS)可能需要在 CPU 上补齐,需手动拆分模型。
六、像素坐标到物理坐标的转换:为什么需要标定
图像上的像素坐标 (u, v) 是"屏幕坐标",机械臂需要的是"世界坐标" (x, y, z) mm。中间的桥梁就是相机标定——建立像素→物理的映射关系。没有标定,像素坐标就是一组没有物理意义的数字。
七、相机内参标定:焦距与畸变系数
7.1 内参是什么
相机内参描述的是镜头本身的几何特性:
- 焦距 (fx, fy):像素/毫米比例,决定成像缩放
- 畸变系数 (k1, k2, p1, p2…):镜头不是理想透镜,图像会有桶形/枕形畸变
7.2 棋盘格标定法
最经典的标定方法:
- 打印一张棋盘格标定板(如 9×6,格子 25mm)
- 从不同角度拍 15~30 张标定板照片
- OpenCV
calibrateCamera()自动提取角点,计算内参+畸变系数 - 之后用
undistort()校正所有图像,消除畸变
import cv2
import numpy as np
import glob
# 棋盘格参数
CHESS_ROWS = 9
CHESS_COLS = 6
SQUARE_SIZE = 25 # mm
obj_points = [] # 3D 世界坐标
img_points = [] # 2D 图像坐标
objp = np.zeros((CHESS_ROWS * CHESS_COLS, 3), np.float32)
objp[:, :2] = np.mgrid[0:CHESS_ROWS, 0:CHESS_COLS].T.reshape(-1, 2) * SQUARE_SIZE
images = glob.glob("calib_images/*.jpg")
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (CHESS_ROWS, CHESS_COLS), None)
if ret:
obj_points.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1),
(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
img_points.append(corners2)
# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)
print("内参矩阵:\n", mtx)
print("畸变系数:\n", dist)
八、手眼标定概念:相机与机械臂坐标系的关系
手眼标定的目标是求解相机坐标系与机械臂基座坐标系之间的变换矩阵。有了这个矩阵,就能把相机检测到的像素坐标→转换到相机3D坐标→再转换到机械臂坐标系→机械臂就知道往哪动了。
具体方案分两种(下一篇详细实战):眼在手上、眼在手外。这里先理解概念——手眼标定就是在解一个坐标系之间的"翻译字典"。
九、完整视觉抓取流程图
摄像头采集图像
↓
去畸变处理(内参校正)
↓
YOLO 目标检测 → 类别 + 像素边界框
↓
提取物体中心像素坐标 (u, v)
↓
深度相机获取距离 z(或用内参+已知物体尺寸反算)
↓
像素→相机3D坐标(内参反投影)
↓
相机3D→机械臂坐标(手眼标定矩阵)
↓
逆运动学求解 → 6个关节角度
↓
机械臂运动执行抓取
十、代码示例:YOLOv8 检测 + 输出物体中心坐标
from ultralytics import YOLO
import cv2
# 加载模型
model = YOLO("yolov8n.pt")
# 采集图像
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
# YOLO 检测
results = model(frame)
# 提取检测结果
for result in results:
boxes = result.boxes
for box in boxes:
cls_id = int(box.cls[0])
cls_name = model.names[cls_id]
# 边界框 [x_center, y_center, width, height](像素坐标)
x_c, y_c, w, h = box.xywh[0].tolist()
print(f"检测到: {cls_name}, 中心像素坐标: ({x_c:.1f}, {y_c:.1f})")
# 显示结果
annotated = results[0].plot()
cv2.imshow("YOLO Detection", annotated)
cv2.waitKey(0)
cap.release()
十一、嵌入式部署性能数据参考
| 平台 | 模型 | 量化 | 推理耗时 | FPS |
|---|---|---|---|---|
| RK3588 NPU | YOLOv5s | INT8 | ~20ms | ~50 |
| RK3588 NPU | YOLOv8n | INT8 | ~15ms | ~65 |
| RK3588 CPU | YOLOv8n | FP32 | ~200ms | ~5 |
| Jetson Nano | YOLOv5s | FP16 | ~60ms | ~16 |
| x86 GPU (1060) | YOLOv8s | FP32 | ~8ms | ~125 |
可以看出,NPU INT8 量化后推理速度飙升 10 倍以上,这是嵌入式端能跑实时检测的关键。
本篇梳理了从 YOLO 检测到手眼标定的完整理论基础。下一篇直接上手实战——眼在手上和眼在手外两种标定方案的代码实现。
更多推荐
所有评论(0)