双臂工业机器人:视觉链
Contents
起因
上一篇写完,机器是个聋哑的壮劳力:让干什么干什么,看不见东西。这篇给它加眼睛。立项的时候就把话说死了:客户那两个行业的活,每一件都是新的,尺寸、软硬、重量、面单朝向全随机,制造业那种示教一次重复一年的路子不存在——所以视觉和末端抓手的分量比臂重,臂准到丝,看不见件照样白搭。这篇把视觉这一链从需求写到落地:要看见什么,相机放哪,什么时候才轮到模型上场,三百毫秒的预算怎么藏进节拍。
先想清楚要看见什么
视觉要干的事收窄到三件。第一件,找到件:皮带上的、箱口里的、堆里的,认出来,给个位置。第二件,认得面:面单在哪边——物流的件条码要朝上朝外,抓反了下面扫码全堵。第三件,选抓点:软包没有形状,一件衣服从哪下手抓起来不滑不掉,这是个估计问题,不是个测量问题。
不干的事也说清楚,不然范围收不住:不做外观质检,不做尺寸测量,不做面单内容识别——面单只要找得到位置,读码是扫码枪的事,地址识别是客户自己系统的事。我们只要这台机器看得见、抓得着。
软包有一件宽慰的事:它给不了精确的六维位姿,也不需要。一个硬工件装配要零点几毫米的位姿,一件衣服在箱子里本身就没有确定形状,位姿天然是模糊的——给它抓取点和大概朝向就够了。视觉的精度要求跟着对象走,软塌塌的对手反而松快。
相机放哪,灯怎么办
黑灯车间,名字就说明问题:车间里没有给人看东西的光,机器要自己带。光源不是配角,是视觉的一半——软包外面那层塑料袋一反光,什么模型都瞎。条形 LED 打漫射光,斜着照让反光斑挪出相机视线,这是试出来的,不是算出来的,第一版装的时候多留几个安装位。
相机两台起手。全局相机一台,装立柱顶上俯拍整个工位——立柱那篇说它顶上正好当桁架用,这里再白捡一次:相机桅杆。视野罩住皮带和箱口,件一进视野就触发。近处那台装在抓手附近,干一件最要命的事:量高度。软包堆的高度从上面看是看不出来的,视觉估高度误差二十毫米起步,而抓取高度差十毫米,吸盘要么压瘪件要么悬空吸不上——贴近之后近距离测一次,两毫米以内,这个数才敢下手。
相机支架要跟立柱一样认真设计。视觉误差预算里,相机的支架晃动是一等大户:支架振幅零点几毫米,标定得再好也全毁在它身上,便宜铝型材接长悬臂那种装法不能碰。支架的刚度按立柱的思路算,一阶频率压过三十赫兹,跟整机模态预算接上。
第一版不碰模型
爬坡的第一站是整列好的工位——件在皮带上排着、分得开、面朝上的概率高。这种场景传统视觉就够:打光做匀,轮廓提出来,几何中心一算,抓取点有了。阈值、边缘、模板匹配,几十年的手艺,稳定、可调、坏了看得见原因。第一版上一个神经网络,出问题连原因都问不出来——黑灯车间不能要这种排障。
模型什么时候上场:散堆。件摞着件、叠着、挤着,轮廓分不出来了,就得实例分割上,把每一件从堆里抠出来,顺带给出抓取点。这时候才有深度学习的正当性——每一件都不一样,规则写不过来。
训练数据从哪来:从客户的皮带上来。装好机器先录像不干活,录几天现场,件怎么流、怎么叠、面单怎么歪,全在录像里,拿回来标注。合成的数据补长尾——渲染软包往箱子里撒,要多少有多少,专补真实数据里少见的那种摆法。先真实后合成,顺序不能反,合成数据打底训出来的模型,到现场见真件就露馅。
训练在云上,推理在 NPU
模型这件事,训练和推理是两个世界,得分开说清楚。
训练不在设备上,也不自建 GPU——租云上的 GPU 服务器。道理是训练的活是脉冲式的:现场数据攒一批,训一轮,几小时到几十小时,完事机器还掉。自建一排卡,平时闲着,赶版本的时候又不够,纯资产浪费。按小时租,一次几十上百块,一年下来未必花得掉一张卡的钱。训练管线是自己写的:录像抽帧、标注、按版本管理,训练脚本,在保留集上评估,导出模型——这一套必须攥在自己手里,因为数据闭环在客户的皮带边上,不在任何实验室里。模型的结构可以用公开的,管线不行。
数据怎么回来:现场抓偏的、漏检的、分割黏连的,自动存图,攒批回传。有个细节必须做在前头——面单上是收件人的姓名电话,图像出车间之前先打码,只传裁剪过的失败案例图。这条不是姿态,是客户敢不敢让你接他网络的前提。
设备端永远只有推理。训练好的模型导成 ONNX,过 Rockchip 的工具链转成 RKNN 格式,量化到 INT8——NPU 只吃量化后的模型,精度损失一个点以内,速度翻好几倍。这里有个真实的坑:量化的校准集必须用现场的真实图。拿实验室拍的图去量化,模型到现场准掉两三个点,因为光照和色彩的分布根本不是一回事——校准集就从每天回流的数据里抽,不另拍。
新模型上了设备也不直接顶班,先跑影子模式:只推理、不决策,输出跟在役模型比对一周,数字不落下风才切换。模型文件跟训练批次对应着记:哪批数据训的、评估分多少、现场验证过没有。设备上的模型是个产物,产物就得有来历。
推理这一侧就是 NPU 的全部工作。用的算法都不复杂,这是选型选出来的:检测、分割、抓取点回归,全是训练出来的模型,但全是轻量结构——天生为端侧这个算力档设计的,六百四十乘六百四十的输入,百毫秒上下出结果,快是硬指标,视觉这一环的预算就两百毫秒,藏进臂的搬运路里,超了就是白送节拍。不追学术上那些大模型,那个量级的东西 RK 的 NPU 扛不动,也不需要扛:客户的场景是收敛的,固定工位、有限的件型,简单结构配上足够多的现场数据,比复杂结构配上稀缺数据又快又稳。数据是我们的富余,算力不是,算法选型顺着这个来。
设备上的推理不是拿 Python 跑的,是原生二进制。Python 在训练那侧随便用,实验、评估、可视化都是它的活;设备这一侧一个脚本世界都不要——解释器一拉好几秒,依赖一坏就是一次现场故障,运行时占的内存比模型还大,黑灯车间不吃这一套。推理走 RKNN 的原生接口,前后处理也不给 CPU 添堵:图像缩放和格式转换扔给 Rockchip 的 2D 加速器去干,后处理的筛框和坐标换算用 NEON 指令写。整条链路跟薄执行器一个脾气:二进制,开机就位,时延稳。
两颗芯片的分档,真话是这么说的:同一份模型,RK3576 和 RK3588 都跑得动,因为这份逻辑从头就没打算依赖哪颗芯片多快。分档分在富余上——RK3588 那边算力余量大,相机可以多挂,帧率可以拉高,模型可以加大,乱堆那种一个视野里十几件要逐件分割的活,重的那档扛起来不吃力。立项说的按算力分版本,分的从来不是控制,是这边:相机几路、模型多大、一秒看几眼。
三百毫秒藏进搬运路
节拍篇写过视觉串行的坑:拍完、算完、再动,每件白送几百毫秒。解法在这一篇落地成时间线。全局相机触发拍照,曝光加读出三十毫秒;前处理加推理一百五上下;后处理加坐标变换二十毫秒——加起来两百毫秒出头,全部藏在臂的搬运路上:臂一起飞,拍照触发,飞的路上模型在算,臂还没到,新的目标点已经发下去了。
注意修正走哪条路:不是让 1kHz 的轨迹中途拐弯,那是执行层的禁忌——轨迹一旦发出去就不改道,改的是下一个目标。视觉的修正落在规划层:目标点更新,规划层重出一条短轨迹,环缓冲里接上。上一层的活归上一层,这就是上一篇分层的回报。
那个高度的事也在这里收口:贴近之后近距离测高度,同样走目标点更新的路,最后两毫米的高度修正在最后一段短轨迹里落。
标定和每天的亮圈
视觉落地的真坑不在模型,在标定。像素到相机坐标靠内参,出厂一次;相机到机器人基座靠手眼标定,标定板摆几个位姿、臂走几个点,解一次外参——换镜头、动支架,重标。坐标链条像素一路换到关节,每一环的误差都乘着力臂放大到末端,标定做扎实,比模型多两个点精度值钱。
然后是维护。LED 会老化,亮度一年漂下来几个点,阈值跟着漂,视觉就慢慢变傻——这种慢性的坏,黑灯车间里没人看得见。办法跟零点那篇一个思路:视野角落放一块标准色块,每天上电校验位姿之后,看一眼色块——亮度、白平衡漂没漂,数一比就知道,超了报警。视觉跟零点一样,每天开工前自证一次清白,一秒钟的事,免得带着瞎掉的眼睛干一天。
抓住率是一条命
这些环节最后收在一个数上:首抓成功率。抓十次偏一次,看着不错——放到黑灯车间里就是灾难:一次抓偏,件掉回堆里,堆形变了,视觉重新算,节拍碎一地;更坏的是卡住皮带,整条线停。人工分拣员的首抓率在九成九上下,机器要对齐这个数才敢谈黑灯,达不到就先不黑灯,人在旁边盯着,把失败案例录回来喂模型,一个摆法一个摆法地消。
三步爬坡,每步一个验收线:
| 阶段 | 场景 | 视觉用什么 | 首抓率线 |
|---|---|---|---|
| 一 | 整列皮带 | 传统视觉,无模型 | 99.5% |
| 二 | 半散堆箱口 | 分割模型加现场数据 | 99% |
| 三 | 乱堆与车厢 | 大模型加合成补长尾 | 对齐人工,逐案啃 |
第一行看着最高,其实最容易——整列的场景里它就是常态。第三行最苦,苦在数据不在算法。
接下来
眼睛装上了,最后差手。软包没有形状、里面装的什么不知道、不能使劲夹、面单还娇气——立项就说了末端抓手是第一难题,下一篇正面写它:吸盘阵列、柔性夹、力控怎么配,抓手这一百多毫米里的学问比臂还多。
参考链接
Author 软件开发大郭
LastMod 2026-09-13