news 2026/8/22 0:06:57

用普通摄像头+二维码,我们给机械臂装上了“实惠版”的眼睛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用普通摄像头+二维码,我们给机械臂装上了“实惠版”的眼睛

便宜、能用。场景是从桌面抓零件放进模具槽,精度要求不高,±2mm都能接受。但机械臂用久了有累积误差,放不到准确位置。

一、项目背景:要便宜,也要能“看得见”

想做个机械臂抓取平台,预算有限。核心需求:

  1. 能识别桌面上随机位置的小零件(金属块)

  2. 能准确放入模具槽(槽宽比零件大3mm)

  3. 总成本控制在1.5万以内(含机械臂)

用不起激光雷达,也上不了深度相机。最后方案:普通摄像头做识别,二维码做二次定位补偿

二、三步走:识别→抓取→精放

第一步:先教相机认识零件

# 伪代码 - 采集模板 def teach_template(): 相机拍照("空桌面") 把零件放在桌面明显位置 相机拍照("有零件的桌面") # 简单粗暴:背景差分 干净背景 = 读取("空桌面.jpg") 当前画面 = 读取("有零件的桌面.jpg") # 扣出零件轮廓 差分图 = 当前画面 - 干净背景 二值化图 = cv2.threshold(差分图, 30, 255, 二值化) # 找到最大轮廓就是零件 轮廓列表 = cv2.findContours(二值化图) 零件轮廓 = 取面积最大的轮廓(轮廓列表) # 保存为模板 模板 = 从当前画面裁剪(零件轮廓的外接矩形) 保存图片(模板, "零件模板.png") print("教学完成!模板已保存")

第二步:识别并抓取

# 伪代码 - 识别抓取 def pick_and_place(): # 机械臂移到拍照位(固定高度) 机械臂.move_to([x=200, y=200, z=300]) while True: # 拍照识别 当前图像 = 相机.拍照() # 用模板匹配找零件 匹配结果 = cv2.matchTemplate(当前图像, 模板图片) 最小值, 最大值, 最小位置, 最大位置 = cv2.minMaxLoc(匹配结果) if 最大值 < 0.7: # 匹配度阈值 print("没找到零件,换个位置拍") 机械臂.move_to(随机位置()) continue # 计算零件中心像素坐标 零件中心x = 最大位置.x + 模板宽度/2 零件中心y = 最大位置.y + 模板高度/2 # 像素坐标转机械臂坐标(需要标定) 实际坐标 = 像素转世界坐标(零件中心x, 零件中心y) # 计算抓取角度(简单版:用外接矩形角度) 矩形 = cv2.minAreaRect(零件轮廓) 旋转角度 = 矩形[2] # 得到-90~0度的角度 # 执行抓取 机械臂.move_to([实际坐标.x, 实际坐标.y, 300]) # 先到上方 机械臂.旋转夹具(旋转角度) # 调整角度 机械臂.move_to([实际坐标.x, 实际坐标.y, 50]) # 下降 气动夹爪.闭合() 机械臂.move_to([实际坐标.x, 实际坐标.y, 300]) # 抬起 break

这里有个关键:我们的摄像头是固定安装的,不是装在机械臂上的“手眼”。这样便宜,但需要做一次手眼标定——让机械臂走几个点,建立像素坐标和世界坐标的对应关系。

第三步:二维码辅助精准放置

机械臂用久了会有累积误差,直接按坐标放可能偏。我们在模具槽左边贴了个二维码。

# 伪代码 - 二维码定位补偿 def precise_place(): # 先到大致的放置位置 理论放置点 = [x=400, y=300, z=300] 机械臂.move_to(理论放置点) # 拍照找二维码 当前图像 = 相机.拍照() 二维码信息, 二维码坐标 = cv2.QRCodeDetector().detectAndDecode(当前图像) if 二维码坐标 is not None: # 计算二维码中心 二维码中心 = 计算中心点(二维码坐标) # 二维码的实际坐标我们是知道的(贴的时候测量过) 二维码理论像素坐标 = [320, 240] # 相机分辨率640x480时的中心 二维码实际世界坐标 = [395, 295, 0] # 机械臂坐标系下的位置 # 计算偏差 像素偏差x = 二维码中心.x - 二维码理论像素坐标[0] 像素偏差y = 二维码中心.y - 二维码理论像素坐标[1] # 像素偏差转世界偏差(标定时得到的比例) 世界偏差x = 像素偏差x * 0.1 # 1像素=0.1mm 世界偏差y = 像素偏差y * 0.1 # 修正放置位置 实际放置点 = [ 理论放置点[0] - 世界偏差x, 理论放置点[1] - 世界偏差y, 理论放置点[2] ] print(f"检测到偏差:X偏{世界偏差x:.1f}mm, Y偏{世界偏差y:.1f}mm") # 执行放置 机械臂.move_to([实际放置点[0], 实际放置点[1], 300]) 机械臂.move_to([实际放置点[0], 实际放置点[1], 30]) # 下降到槽内 气动夹爪.松开() 机械臂.move_to([实际放置点[0], 实际放置点[1], 300]) # 抬起​

二维码的妙用:每次放置前都看一眼二维码,就知道机械臂现在“跑偏”了多少,实时补偿。相当于给机械臂装了个“定期校准”功能。

如果你也想做低成本视觉引导,记住这几点:

  1. 能固定相机就别用手眼——固定安装标定简单,稳定性好

  2. 背景越简单越好——一块纯色桌布能解决80%识别问题

  3. 二维码是穷人的补偿方案——贴几个二维码,定期看一眼,精度能提升不少

  4. 别追求完美——低预算就是做取舍,先实现功能再优化

这个项目虽然“低配”,但很典型——很多中小厂的第一步自动化就是这样:用成熟便宜的技术,解决实际的小问题。我们做技术外包的,经常就是帮客户在这种“有限条件”下做出“能用就行”的方案。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 0:06:56

RGB-Mini LED 成百吋赛道新标尺,海信凭什么领跑客厅WALL时代?

文 | 螳螂观察作者 | 沈浪当全球电视市场进入存量博弈&#xff0c;百吋及以上超大尺寸却逆势爆发&#xff0c;成为少数保持高增长的高端细分赛道。洛图科技预测&#xff0c;2026年全球百吋电视出货量将突破250万台&#xff0c;中国市场贡献近一半的出货量。这背后&#xff0c;是…

作者头像 李华
网站建设 2026/7/14 16:36:30

Onnxruntime之多个EP类型

ONNX Runtime中不同类型的Execution Provider&#xff0c;主要分成三大类&#xff0c;每类的实现机制和典型代表如下&#xff1a;&#x1f4ca; 三大类Execution Provider对比类别核心机制Kernel注册执行方式典型代表特点编译型EP整个子图编译成二进制只注册D2H/H2D 可能注册F…

作者头像 李华
网站建设 2026/7/14 16:36:17

lsof 查看写入日志文件的进程是什么

在 CentOS 6 中安装 lsof 非常简单&#xff0c;它属于系统基础工具&#xff0c;可通过官方 YUM 源直接安装&#xff0c;以下是完整的安装步骤&#xff08;适配 CentOS 6 环境&#xff09;&#xff1a; 一、安装 lsof&#xff08;root 用户执行&#xff09; 1. 直接安装&#xf…

作者头像 李华
网站建设 2026/7/14 16:36:34

一张图搞定代购!反向海淘黑科技,看图就能买遍中国好物

还在为不知道商品名称、不会中文搜索而烦恼&#xff1f;想代购中国好物&#xff0c;却因关键词不对屡屡碰壁&#xff1f;现在&#xff0c;我们的反向海淘代购系统带来超强图片搜索功能&#xff0c;彻底解决你的购物难题&#xff01;无需产品名、不用输中文&#xff0c;只需上传…

作者头像 李华
网站建设 2026/7/14 16:36:18

G-Helper:华硕笔记本性能管理的轻量革命

G-Helper&#xff1a;华硕笔记本性能管理的轻量革命 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: https://gi…

作者头像 李华
网站建设 2026/7/14 16:36:29

计算机网络期末复习——第5章:链路层 Part Two

目录5.4 交换局域网5.4.1 链路层寻址和ARP5.4.2 以太网5.4.3 链路层交换机5.5.4 虚拟局域网VLAN5.4 交换局域网 5.4.1 链路层寻址和ARP MAC地址 每个主机发送的帧中必须携带表示发送主机和接收主机的地址&#xff0c;又叫LAN地址或物理地址 MAC地址是对网络上各接口的唯一标识…

作者头像 李华