1. 项目缘起与整体设计思路
1.1 为什么选IRB260做码垛搬运
IRB260是ABB推出的一款中等负载六轴工业机器人,额定负载12kg,工作半径1.65m,重复定位精度±0.04mm。这个参数放在码垛搬运场景里其实挺微妙的——它不像IRB660那种四轴码垛专用机那样“天生干这活”,但胜在结构紧凑、占地小、价格相对友好,特别适合中小型产线的末端码垛或者工序间搬运。
我接手的这条线是做食品包装箱的码垛,单箱重量8kg左右,码垛高度1.8m,节拍要求每小时不低于600箱。客户原本用的是人工码垛,三个人轮班,累不说,效率还不稳定。选IRB260的原因很简单:负载够用(8kg箱子加夹具约2kg,总负载10kg,留了2kg余量),臂展能覆盖1.8m×1.2m的托盘区域,而且这台机器在二手市场上流通量大,客户预算有限,买新机不现实。
但问题也来了。IRB260的腕部关节(轴5和轴6)在高速码垛时容易产生抖动,尤其是做“抓-提-转-放”这种复合动作时,末端轨迹会偏离。这不是机器人本身的问题,而是码垛路径规划和加速度参数没调好。所以这个项目的核心不是“能不能码”,而是“怎么码得稳、码得快、码得准”。
1.2 工作站优化的三个核心目标
整个优化围绕三个目标展开:节拍提升、轨迹稳定、碰撞规避。
节拍提升不是简单地把速度倍率拉满。IRB260在RobotStudio里的默认运动参数是给通用场景用的,码垛这种“点到点”运动,完全可以用更激进的加速度曲线。但激进的前提是轨迹不能抖,抖了就会掉箱或者撞托盘。
轨迹稳定的关键在于转弯区数据(zone data)的合理设置。很多人调RAPID程序时习惯用fine,觉得精准,但fine意味着机器人必须完全停止再走下一个点,节拍直接崩掉。用z50、z100这些转弯区,机器人可以“圆滑过渡”,但圆滑过头就会切角,末端偏离目标点。这个平衡点得靠实测找。
碰撞规避则是另一个维度。码垛工作站里,机器人本体、夹具、托盘、围栏、甚至旁边的输送线,都是潜在碰撞体。RobotStudio的碰撞检测功能可以提前模拟,但很多人只设了机器人跟托盘的碰撞,忘了夹具跟围栏、线缆跟本体的干涉。我见过一个案例,机器人码到第三层时,夹具上的气管跟围栏立柱蹭上了,气管磨破导致夹具失压,箱子直接砸下来。
1.3 仿真先行:为什么必须在RobotStudio里跑通再上真机
工业机器人调试有个铁律:能在仿真里解决的问题,绝不上真机试。真机试错的成本太高了——撞一次夹具可能几千块,撞一次机器人本体可能几万块,更别说停线造成的产能损失。
RobotStudio的优势在于它跟ABB机器人控制器用的是同一套运动学算法,仿真轨迹跟真机轨迹的偏差在毫米级。这意味着你在软件里看到的碰撞、超程、奇异点,真机上大概率也会遇到。反过来,你在软件里调好的节拍和轨迹,下载到真机后基本能直接跑。
但这个“基本能跑”有个前提:你的仿真模型必须跟真机一致。我见过太多人直接从RobotStudio的库房里拖一个IRB260出来就开始编程,结果真机上夹具重了0.5kg,工具坐标系(TCP)偏了2mm,整个轨迹全废。所以第一步永远是:实测真机的工具重量、重心、TCP位置,然后在RobotStudio里建一个自定义工具。
2. 核心细节解析与实操要点
2.1 工具坐标系标定:别直接用默认值
IRB260的默认工具坐标系(tool0)在法兰盘中心,但实际夹具的TCP肯定不在那儿。码垛场景里,TCP通常设在夹具的抓取中心点,也就是箱子被夹住后的几何中心。
标定TCP的方法有四种:三点法、六点法、直接输入法、自动标定法。我推荐六点法,虽然麻烦点,但精度最高。具体操作是在机器人末端装一个尖点(比如焊丝或者针尖),然后手动示教六个不同姿态,让尖点对准同一个固定参考点。RobotStudio的“工具坐标标定”功能会自动算出TCP相对于法兰盘的位置和姿态。
注意:标定时的六个姿态要尽量分散,不要都在一个小范围内晃。姿态越分散,解算出的TCP越准。我一般会让机器人做“前倾、后仰、左摆、右摆、上抬、下压”六个方向的动作。
标定完还要设置工具重量和重心。这个数据直接影响机器人的动力学计算。如果工具重量设小了,机器人会“以为”自己很轻,加速时冲过头;设大了,又会畏手畏脚。IRB260的负载曲线显示,12kg负载下,重心偏移超过100mm时,允许的加速度会大幅下降。所以夹具设计时尽量让重心靠近法兰盘,别搞太长的悬臂。
2.2 码垛路径规划:从“逐点示教”到“算法生成”
新手做码垛最容易犯的错是一个点一个点地示教。一个托盘码5层,每层6箱,就是30个点,加上取件点、过渡点,轻松上百个示教点。这活儿干一次能累死人,而且换一个托盘规格就得重来。
正确的做法是用RAPID写码垛算法,让机器人自己算位置。核心思路是:定义托盘的原点、箱子的长宽高、码垛层数和每层的排列方式,然后用循环语句生成每个箱子的目标位置。
! 码垛参数定义 CONST num BOX_L := 400; ! 箱子长度 mm CONST num BOX_W := 300; ! 箱子宽度 mm CONST num BOX_H := 200; ! 箱子高度 mm CONST num LAYERS := 5; ! 码垛层数 CONST num COLS := 3; ! 每层列数 CONST num ROWS := 2; ! 每层行数 ! 托盘原点(左下角) CONST robtarget pallet_origin := [[500, 0, 200], [1,0,0,0], [0,0,0,0], [0,0,0,0]]; ! 生成码垛位置 FOR i FROM 1 TO LAYERS DO FOR j FROM 1 TO COLS DO FOR k FROM 1 TO ROWS DO ! 计算目标位置 target := Offs(pallet_origin, (j-1)*BOX_L, (k-1)*BOX_W, (i-1)*BOX_H); ! 执行抓取和放置 PickAndPlace(target); ENDFOR ENDFOR ENDFOR这段代码的关键是Offs函数,它基于一个参考点做偏移。这样你只需要示教一个托盘原点,剩下的位置全由算法生成。换托盘规格时,改几个常量就行,不用重新示教。
但这里有个坑:码垛层数多了之后,机器人末端姿态会越来越别扭。因为箱子是垂直堆叠的,机器人手腕得不断调整角度来保持夹具水平。IRB260的轴5和轴6在极限位置附近容易出奇异点,表现为机器人突然“扭”一下,轨迹完全失控。
解决办法是在码垛路径中加入过渡点,让机器人每码完一层就回到一个“安全姿态”,再开始下一层。这个安全姿态通常是轴5接近0度、轴6接近0度的位置,机器人最灵活。
2.3 转弯区数据(Zone)的取舍:快与准的博弈
RAPID里的运动指令有两种终止方式:fine和zone。fine表示机器人必须精确到达目标点,速度降为零;zone表示机器人可以“路过”目标点,保持速度连续。
码垛场景里,取件点和放置点通常用fine,因为要保证抓取和放置的精度。但中间的过渡点必须用zone,否则机器人每到一个点就停一下,节拍根本起不来。
zone的大小用z加数字表示,比如z10、z50、z100,数字越大,转弯区越大,机器人越“圆滑”,但偏离目标点也越远。这个偏离量不是随机的,而是跟速度有关。速度越快,偏离越大。
我实测过一组数据:IRB260在速度1000mm/s时,z50的偏离量大约是5mm,z100大约是12mm,z200能到25mm。对于码垛来说,5mm的偏离可以接受(箱子之间有间隙),但25mm就可能撞到旁边的箱子。
所以我的经验是:过渡点用z50到z100,取件点和放置点用fine,但放置点前一个点用z10做缓冲。这样既保证了放置精度,又不会让机器人完全停下来。
提示:RobotStudio里可以显示转弯区的实际轨迹。在“仿真”选项卡里打开“轨迹显示”,把“转弯区”勾上,就能看到机器人实际走的路径跟示教点的偏差。
2.4 碰撞检测:别只盯着机器人跟托盘
RobotStudio的碰撞检测功能很强大,但默认设置只检测机器人本体跟场景物体的碰撞。实际上,码垛工作站里需要检测的碰撞对至少有这些:
| 碰撞对 | 风险 | 检测设置 |
|---|---|---|
| 机器人本体 vs 托盘 | 码垛时撞托盘边缘 | 必须开启 |
| 夹具 vs 围栏 | 旋转时夹具甩到围栏 | 必须开启 |
| 气管/线缆 vs 机器人本体 | 线缆缠绕或拉扯 | 建议开启 |
| 机器人 vs 输送线 | 取件时撞输送线 | 必须开启 |
| 箱子 vs 箱子 | 放置时撞已码好的箱子 | 建议开启 |
设置方法是在RobotStudio的“碰撞”面板里,把需要检测的对象拖到“碰撞对”列表里。注意不要把所有对象都设成互相检测,那样计算量太大,仿真会卡。只设真正有风险的碰撞对。
我遇到过一个隐蔽的碰撞:机器人码到第五层时,轴3的肘部跟围栏顶部的横梁干涉了。因为围栏是后来加的,建模时没注意高度。仿真时没开这个碰撞对,真机上直接撞停,机器人报了“碰撞检测”故障。后来在RobotStudio里把围栏横梁加进碰撞对,重新跑了一遍,发现确实会撞,调整了码垛高度才解决。
3. 实操过程与核心环节实现
3.1 工作站搭建:从零到能跑仿真
第一步是导入机器人模型。RobotStudio的“机器人库”里有IRB260的标准模型,直接拖进工作站就行。但要注意选对型号——IRB260有多个变种(IRB260-12、IRB260-15等),负载和臂展不一样。选错了,后面的负载计算全错。
第二步是导入或建模外围设备。托盘、输送线、围栏、夹具,这些可以用RobotStudio自带的建模工具画,也可以从外部导入STEP或IGES格式的3D模型。我一般用SolidWorks画好夹具和托盘,导出STEP,再导入RobotStudio。这样比在RobotStudio里画快得多,而且尺寸准。
第三步是设置工具坐标系。在“建模”选项卡里点“工具”,新建一个工具,输入标定好的TCP位置和姿态,再输入工具重量和重心。然后把工具安装到机器人法兰盘上。
第四步是创建工件坐标系。码垛的目标位置都是相对于托盘定义的,所以要在托盘上建一个工件坐标系(Work Object)。通常设在托盘左下角,Z轴朝上。这样码垛算法里的Offs函数就有参考点了。
第五步是配置IO信号。夹具的开合、输送线的启停、安全门的开关,这些都要跟机器人控制器做信号交互。RobotStudio里可以模拟这些信号,用“仿真”选项卡里的“IO模拟器”就行。
第六步是写RAPID程序。程序结构一般是:主程序初始化→等待取件信号→移动到取件点→抓取→移动到放置点→放置→循环。中间穿插码垛算法和碰撞检测。
3.2 节拍优化:从600箱/小时到780箱/小时
客户最初的要求是600箱/小时,也就是每箱6秒。我第一版程序跑下来只有520箱/小时,每箱6.9秒。差距在哪?我用了RobotStudio的“周期时间分析”功能,把每个动作的耗时列出来:
| 动作 | 耗时(秒) | 占比 |
|---|---|---|
| 等待取件信号 | 0.3 | 4.3% |
| 移动到取件点 | 1.2 | 17.4% |
| 抓取 | 0.5 | 7.2% |
| 移动到放置点 | 2.8 | 40.6% |
| 放置 | 0.8 | 11.6% |
| 返回安全点 | 1.3 | 18.8% |
大头在“移动到放置点”,占了40.6%。这个动作是从取件点(输送线末端)到托盘上方,距离大约1.5米,中间经过两个过渡点。我检查了运动指令,发现过渡点用的是fine,机器人每到一个点就停一下。改成z100后,这个动作的耗时从2.8秒降到1.9秒。
第二个优化点是“返回安全点”。原本的程序是每码完一箱就回到一个固定的安全点,再开始下一箱。这个安全点离取件点和放置点都比较远,来回跑浪费 time。我改成动态安全点:码完一箱后,机器人直接在当前层的高度上平移回取件点上方,不用降到最低。这样返回时间从1.3秒降到0.6秒。
第三个优化点是取件和放置的并行。原本的程序是“抓取→移动→放置→返回→抓取”,串行的。我改成“抓取→移动→放置”的同时,输送线已经在送下一个箱子了。这样等待取件信号的时间从0.3秒降到0.1秒。
三个优化加起来,每箱耗时从6.9秒降到4.6秒,折合782箱/小时,超额完成目标。
注意:节拍优化不能牺牲轨迹稳定性。我试过把速度倍率拉到120%,节拍确实快了,但机器人抖动明显,箱子在夹具里晃,有掉箱风险。后来把速度倍率锁在100%,靠路径优化来提节拍,稳得多。
3.3 轨迹稳定性调试:解决末端抖动
IRB260在高速码垛时,末端抖动主要来自两个地方:关节加速度突变和奇异点附近。
关节加速度突变通常是因为运动指令的加速度参数设得太激进。RAPID里的AccSet指令可以限制加速度,语法是AccSet acc, ramp,其中acc是加速度百分比,ramp是加速度变化率百分比。默认是AccSet 100, 100,我改成AccSet 80, 50后,抖动明显减小,节拍只损失了3%。
奇异点问题更麻烦。IRB260的奇异点主要出现在轴5接近0度时,轴4和轴6会“对齐”,导致机器人失去一个自由度。码垛时,如果箱子是垂直堆叠的,机器人手腕得不断调整角度来保持夹具水平,很容易走到奇异点附近。
解决办法是在码垛路径中避开奇异点。具体做法是:不要让机器人从正上方垂直抓取和放置,而是稍微倾斜一点角度。比如放置时,夹具跟箱子表面成5度角,这样轴5就不会接近0度。代价是箱子放置时会有轻微倾斜,但码垛场景里箱子之间有间隙,5度倾斜完全能接受。
我还在RobotStudio里用了“奇异点检测”功能,把机器人工作空间里的奇异点区域标出来,然后调整码垛路径,让机器人尽量不走那些区域。这个功能在“机器人”选项卡里的“奇异点”面板里。
3.4 真机部署:从仿真到实机的最后一公里
仿真跑通后,下载到真机。但别急着按启动,先做这几件事:
第一,核对工具坐标系。仿真里的TCP是理想值,真机上可能有偏差。用真机的“工具标定”功能重新标一次,把偏差补上。
第二,核对负载数据。仿真里的工具重量是估算的,真机上用称重传感器实测一下。IRB260的负载参数在控制器的“运动”菜单里设置,设错了机器人会报“负载超限”或者“动力学错误”。
第三,低速试跑。把速度倍率降到25%,手动触发一次完整循环,观察机器人有没有异常抖动、碰撞、超程。确认无误后再逐步提速。
第四,检查IO信号。仿真里的IO是模拟的,真机上要确认夹具的开合信号、输送线的启停信号、安全门的开关信号都接对了。我见过一个案例,夹具的开合信号接反了,机器人以为夹住了其实没夹,箱子直接掉下来。
第五,设置安全区域。IRB260的安全区域功能可以限制机器人的运动范围,防止它跑到围栏外面。在控制器的“安全”菜单里设置,通常设成托盘区域加0.5米余量。
4. 常见问题与排查技巧实录
4.1 码垛位置偏移:从“点示教”到“算法生成”的坑
问题现象:码垛到第三层时,箱子位置开始偏移,越往上偏得越厉害。
排查思路:先检查码垛算法里的层高计算。我用的公式是(i-1)*BOX_H,其中BOX_H是箱子高度。但实际箱子有压缩量,每层实际高度比标称高度小2-3mm。码到第五层时,累积误差能到10-15mm。
解决方法:在算法里加一个层高补偿系数。实测每层压缩量后,把BOX_H改成BOX_H - 2。或者更精确的做法是,每码完一层,用机器人末端的传感器测一下实际高度,动态调整下一层的目标位置。
实操心得:箱子压缩量跟箱子材质、码垛压力、环境湿度都有关系。纸箱在潮湿环境下压缩量更大。所以补偿系数不是固定的,最好每批次校准一次。
4.2 机器人报“奇异点”故障:手腕姿态的调整
问题现象:机器人码到第四层时突然报“奇异点”故障,停在半空不动了。
排查思路:用RobotStudio的“奇异点检测”功能回放故障时的姿态,发现轴5角度接近0度,轴4和轴6几乎对齐。
解决方法:调整码垛路径,让机器人放置时手腕稍微倾斜。具体做法是在放置点的姿态里,把轴5的角度从0度改成5度。这样机器人就不会走到奇异点。
如果调整姿态后还是报奇异点,可以在RAPID程序里加一个SingArea指令,语法是SingArea \Wrist,告诉控制器在奇异点附近用腕部奇异点的处理方式。但这个指令会降低轨迹精度,慎用。
4.3 节拍不达标:从“周期时间分析”找瓶颈
问题现象:程序跑下来只有520箱/小时,离目标600箱/小时差得远。
排查思路:用RobotStudio的“周期时间分析”功能,把每个动作的耗时列出来,找占比最大的动作。
解决方法:见3.2节的节拍优化。核心思路是:把fine改成zone,把串行动作改成并行,把固定安全点改成动态安全点。
常见问题速查表:
| 问题 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| 码垛位置偏移 | 层高计算误差 | 实测每层高度 | 加层高补偿系数 |
| 奇异点故障 | 轴5接近0度 | RobotStudio奇异点检测 | 调整手腕姿态或加SingArea |
| 节拍不达标 | 过渡点用fine | 周期时间分析 | 改用zone,优化路径 |
| 末端抖动 | 加速度突变 | 观察抖动时机 | 降低AccSet参数 |
| 碰撞故障 | 碰撞对没设全 | 检查碰撞对列表 | 补充碰撞对 |
| 夹具失压 | 气管磨损 | 检查气管走向 | 调整气管固定方式 |
| IO信号错误 | 信号接反 | 手动触发IO | 核对信号定义 |
4.4 仿真跟真机不一致:模型偏差的排查
问题现象:仿真里跑得好好的,下载到真机后轨迹偏了10mm。
排查思路:先核对工具坐标系。仿真里的TCP是标定值,真机上可能有偏差。再核对负载数据。仿真里的工具重量是估算的,真机上可能更重。
解决方法:在真机上重新标定TCP,重新实测工具重量和重心。然后在RobotStudio里更新工具数据,重新生成轨迹。如果偏差还是大,检查机器人的零点标定。IRB260的零点在出厂时标定过,但运输或碰撞后可能偏移。用真机的“零点标定”功能重新标一次。
实操心得:仿真跟真机的偏差通常在2-3mm以内,超过5mm就有问题。偏差主要来自工具坐标系和负载数据,这两个数据准了,轨迹基本就准了。
4.5 码垛效率的进一步提升:从“单抓”到“双抓”
如果节拍要求更高,单抓已经到极限了,可以考虑双抓。也就是夹具一次抓两个箱子,码垛时一次放两个。这样节拍直接翻倍。
但双抓对夹具设计要求高。两个箱子之间的间距必须精确,否则放下去会撞。而且机器人负载翻倍,IRB260的12kg负载可能不够。如果箱子是8kg,双抓就是16kg,超了。得换IRB460或者IRB660。
如果负载够,双抓的RAPID程序也不复杂。把PickAndPlace函数改成一次处理两个目标位置就行。但要注意两个箱子的放置顺序,先放远的再放近的,否则夹具会撞到已放好的箱子。
5. 项目复盘与个人经验分享
这个项目从仿真到真机跑通,前后花了三周。其中仿真调试占了一周,真机调试占了两周。真机调试的时间主要花在工具标定和节拍优化上。
如果让我重新做一遍,我会在仿真阶段就把工具坐标系和负载数据做得更准。当时为了赶进度,工具重量是估算的,结果真机上发现实际重量比估算多了0.8kg,导致机器人动力学计算偏差,轨迹有点飘。后来重新实测了重量和重心,轨迹才稳下来。
另一个体会是转弯区数据不能一刀切。我一开始把所有过渡点都设成z100,结果有些点偏离太大,箱子放下去歪了。后来改成“关键点用z50,非关键点用z100”,效果好很多。这个“关键”和“非关键”的判断,得靠对码垛工艺的理解——比如箱子之间的间隙小,那放置点附近的转弯区就得小;间隙大,就可以大一点。
最后分享一个RobotStudio的小技巧:用“信号分析器”监控IO信号。在“仿真”选项卡里打开“信号分析器”,把夹具的开合信号、输送线的启停信号加进去,就能看到信号的时间序列。这样能精确知道每个动作的等待时间,对节拍优化很有帮助。我靠这个功能发现取件信号的等待时间比预期长了0.2秒,调整输送线的停止位置后,等待时间降到0.05秒。
这个工作站后续还可以扩展。比如加一个视觉系统,让机器人自动识别箱子的位置和姿态,这样就不用精确示教取件点了。或者加一个力控传感器,让机器人自适应抓取不同重量的箱子。IRB260的控制器支持这些扩展,RobotStudio里也有对应的仿真模块。