工业可直接用、能部署到 ModelZoo、能对接机械臂的全套方案,包含:原理、训练、推理、3D 解算、抓取姿态生成,全程一步到位。
一、核心方案(最稳、最常用)
硬件
双目工业相机 / 深度相机(输出:RGB 图 + 深度图 + 点云)
模型
YOLO-3D / YOLOv8-3D(检测物体 + 输出 3D 框中心)
输出
物体 3D 坐标 (X,Y,Z) + 抓取姿态 (Roll,Pitch,Yaw) + 夹爪宽度直接发给机器人抓取。
二、整体流程(5 步搞定)
- 双目相机输出 RGB + 深度图 + 点云
- YOLO-3D 识别物体,输出 2D 框 + 3D 中心偏移
- 深度图 / 点云获取物体真实 Z 距离
- 相机内参 + 外参 → 解算 3D 世界坐标
- 计算最优抓取姿态(角度 + 方向 + 夹爪宽度)
三、训练 YOLO-3D 模型(生成 ModelZoo 推理模型)
1. 安装环境
bash
运行
pip install ultralytics # YOLOv8-3D 官方支持
2. 数据集(双目 / 深度相机采集)
每张图需要:
- RGB 图像
- 对应深度图
- 标注:物体类别 + 2D 框 + 3D 中心点
数据集格式(YOLO-3D)
plaintext
images/
train/001.jpg
labels/
train/001.txt
格式:class_id x y z w h d (x,yz为3D中心相对值)
3. 训练 YOLO-3D
python
运行
from ultralytics import YOLO
# 加载YOLOv8-3D预训练模型
model = YOLO("yolov8-3d.pt")
# 训练
model.train(
data="your_3d_data.yaml",
epochs=100,
imgsz=640,
batch=4,
device=0
)
4. 导出 ModelZoo 推理模型
python
运行
model.export(format="onnx", simplify=True, imgsz=640) # 导出ONNX通用模型
得到 yolo3d.onnx → 可在相机、地平线、嵌入式直接推理。
四、推理:获取物体 3D 真实坐标(核心代码)
python
运行
import cv2
import numpy as np
from ultralytics import YOLO
# ======================
# 1. 加载模型 + 相机参数
# ======================
model = YOLO("yolo3d.onnx")
fx, fy = 500, 500 # 相机内参
cx, cy = 320, 240
# ======================
# 2. 读取双目/深度相机数据
# ======================
rgb = cv2.imread("rgb.jpg")
depth = cv2.imread("depth.png", cv2.IMREAD_UNCHANGED) # 16位深度图
# ======================
# 3. YOLO-3D 推理
# ======================
results = model(rgb)
boxes_3d = results[0].boxes_3d # 3D检测框
# ======================
# 4. 解算真实3D坐标
# ======================
for obj in boxes_3d:
# 像素中心
u, v = obj.center[0], obj.center[1]
# 深度Z(单位:米)
Z = depth[int(v), int(u)] / 1000.0
# 3D坐标(相机坐标系)
X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
print(f"3D位置:X={X:.3f}, Y={Y:.3f}, Z={Z:.3f}")
五、自动生成抓取姿态(机械臂直接可用)
抓取姿态 = 3D 位置 (XYZ) + 旋转角 (RPY)
python
运行
# ======================
# 生成抓取位姿(最终可发给机器人)
# ======================
def get_grasp_pose(X, Y, Z, obj_w, obj_h):
"""
输入:物体3D坐标 + 宽高
输出:抓取位姿 XYZ + RPY + 夹爪宽度
"""
# 抓取点(物体中心上方5mm)
grasp_x = X
grasp_y = Y
grasp_z = Z + 0.005
# 姿态(垂直向下抓取,可根据物体调整角度)
roll = 0.0
pitch = 3.14159
yaw = 0.0
# 夹爪开合宽度(物体宽度 + 5mm余量)
gripper_width = obj_w + 0.005
return [grasp_x, grasp_y, grasp_z, roll, pitch, yaw, gripper_width]
六、最终输出(机器人可直接执行)
plaintext
抓取位姿:
X: 0.235 m
Y: 0.120 m
Z: 0.450 m
Roll: 0.0°
Pitch: 180°
Yaw: 0.0°
夹爪宽度: 0.08 m
七、这套方案优势
✅ 双目相机 + YOLO-3D = 工业最稳组合 ✅ 输出3D 坐标 + 抓取姿态 ,直接抓✅ 模型导出 ONNX,可放入 ModelZoo ✅ 支持 相机 / 地平线 / 嵌入式 部署✅ 抗干扰、速度快、精度高