在自动化分拣领域,机械臂正逐渐取代传统人工操作。越疆Dobot系列凭借高性价比和开放接口,成为教育、轻工业场景的热门选择。本文将带您实现一个完整的视觉分拣系统——通过摄像头识别物体位置,驱动机械臂完成精准抓取与投放。不同于简单的单点控制,我们将重点解决像素坐标到机械臂坐标的转换这一核心难题,并分享实际项目中的避坑经验。
连接拓扑如下:
code复制摄像头 → USB → 工控机 ← Serial/USB ← Dobot机械臂
bash复制# ROS基础包
sudo apt-get install ros-melodic-cv-bridge ros-melodic-image-transport
# Python库
pip install opencv-python numpy scipy
# Dobot ROS驱动
git clone https://github.com/Dobot-Arm/TCP-IP.git ~/catkin_ws/src/dobot
cd ~/catkin_ws && catkin_make
提示:首次使用需校准机械臂零点,运行
roslaunch dobot DobotServer.launch后执行SetHOMECmd服务。
采用HSV色彩空间阈值法进行简单物体识别:
python复制import cv2
import numpy as np
def detect_object(frame):
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_blue = np.array([90, 50, 50]) # 示例:识别蓝色物体
upper_blue = np.array([130, 255, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if contours:
max_contour = max(contours, key=cv2.contourArea)
M = cv2.moments(max_contour)
cx = int(M["m10"] / M["m00"])
cy = int(M["m01"] / M["m00"])
return (cx, cy) # 返回物体中心坐标
return None
关键参数关系:
| 参数类型 | 描述 | 典型值 |
|---|---|---|
| 像素偏差 | 物体中心与图像中心的X/Y差值 | Δx, Δy (pixels) |
| 比例因子 | 像素到毫米的转换系数 | 0.2 mm/pixel |
| 机械臂坐标 | 笛卡尔坐标系下的目标位置 | (x+Δxscale, y+Δyscale) |
注意:Z轴高度需根据抓取物体厚度单独设定,建议通过实验确定最佳值。
Dobot Magician支持三种运动模式:
分拣场景推荐使用组合模式:
python复制from dobot.srv import SetPTPCmd
def move_to(x, y, z):
# 先以JUMP模式移动到目标上方
ptp_client(3, x, y, z+50, 0)
# 再以MOVL模式直线下降
ptp_client(2, x, y, z, 0)
通过实验测得Dobot Magician在Z=100mm时的安全范围:
python复制SAFE_LIMITS = {
'x': [-200, 200],
'y': [-320, -180], # 避免气泵干涉
'z': [-50, 150]
}
def check_safety(x, y, z):
return (SAFE_LIMITS['x'][0] <= x <= SAFE_LIMITS['x'][1] and
SAFE_LIMITS['y'][0] <= y <= SAFE_LIMITS['y'][1] and
SAFE_LIMITS['z'][0] <= z <= SAFE_LIMITS['z'][1])
mermaid复制graph TD
A[启动摄像头] --> B[检测物体]
B --> C{是否发现物体?}
C -->|是| D[计算像素偏差]
D --> E[转换为机械臂坐标]
E --> F[规划运动路径]
F --> G[执行抓取动作]
G --> H[移动到投放位置]
H --> I[释放物体]
I --> B
C -->|否| B
python复制try:
ptp_client(1, x, y, z, 0)
except rospy.ServiceException:
rospy.logerr("运动指令执行失败")
clear_alarms() # 调用警报清除服务
在物流分拣demo开发中,我们发现三个典型问题及解决方案:
气泵干涉问题
当Y坐标>-180mm时,末端执行器会碰撞到底座气泵。解决方法是在坐标转换层添加硬限制:
python复制y = max(y, -180) if y > 0 else min(y, -180)
视觉-机械臂标定误差
采用9点标定法提升精度:
code复制1. 在机械臂工作范围内放置标定板
2. 控制机械臂依次移动到9个标记点
3. 记录每个点的像素坐标和机械臂坐标
4. 使用cv2.findHomography()计算转换矩阵
物体滑动问题
通过实验确定不同材质的最佳抓取参数:
| 材质 | 夹持力(N) | 停留时间(ms) |
|---|---|---|
| 纸盒 | 8.0 | 500 |
| 塑料 | 6.5 | 300 |
| 金属 | 10.0 | 700 |
这个项目最耗时的部分其实是确定安全工作空间范围。我们最终采用逐点测试法,以5mm为步长记录每个(Z,Y)组合下的机械臂状态,花了整整两天时间绘制出完整的安全区域三维图谱。