简介:工业机器人项目交付前,离线编程与仿真验证是降低调试风险的关键环节。通过建立与真实控制器同源的运动学模型,工程师可以在虚拟环境中完成工作单元搭建、路径示教与干涉检查。坐标系映射、工具TCP标定及外部轴配置直接影响仿真与实机的一致性;而基于KRL程序的节拍统计与碰撞检测,则能提前暴露轨迹错误和超限问题。将仿真结果与WorkVisual协同,可无缝过渡到真实KRC控制器。本文围绕KUKA SIM PRO软件,从坐标系、运动学链到KRL编写与避坑实践,系统梳理了机器人仿真验证的完整方法,帮助集成与调试工程师提升方案可信度。
1. KUKA SIM PRO 不是三维预览器:它把节拍、干涉和 KRL 一起提前交付
做机器人集成的朋友大概率经历过这种场景:机器人还没进场,客户就催着要方案,要求把节拍、干涉区、抓取位置全部验证完。用三维软件拉个模型只能看个大概,真到程序层面,轨迹对不对、会不会撞、节拍够不够,全都答不上来。库卡机器人仿真软件 KUKA SIM PRO 解决的就是这个问题——它不是在电脑上做个好看的展示,而是把控制器侧的运动学、坐标系变换和 KRL 程序逻辑全部带进仿真环境。用它能做工作单元搭建、KRL 离线编程、节拍统计,最后还能把程序搬到真实控制器上接着用。这篇笔记按我拆过的 KUKA SIM PRO 资源包来写,从坐标系到 WorkVisual 协同,再到避坑和轨迹验证,适合做集成方案、现场调试和耍机器人仿真的工程师照着复现。
2. 工作单元建模前必须想清楚的三个层次:坐标系、运动学链与仿真时钟
很多第一次用 KUKA SIM PRO 的人,上来就拖模型、摆位置,结果仿真里看着挺像那么回事,一到现场就翻车。这里面的核心原因不是模型没摆对,而是坐标系、运动学链和时钟周期这三层东西没按真实控制器的规则建立起来。
2.1 仿真与实机轨迹对不齐的核心:坐标系映射
我见过最典型的案例是:仿真里抓手明明已经把工件抓起来了,现场跑同样的程序却差了 2mm,工件直接掉落。排除机械误差后,问题出在坐标系映射上。KUKA SIM PRO 里的坐标系与真实 KSS 系统保持一致,主要有四个:
| 坐标系 | 对应真实控制器概念 | 作用 | 常见错误 |
|---|---|---|---|
| 世界坐标系 | $WORLD | 整个工作单元的地面基准 | 把机器人的基座标硬旋转了 90° |
| 基座标系 | $ROBROOT | 机器人安装底座位置 | 基座没对齐世界坐标,导致落点全偏 |
| 工件坐标系 | $BASE | 工件或工装的基准点 | 工件坐标的 A/B/C 方向没按现场标定 |
| 工具坐标系 | $TOOL | 夹具末端 TCP 位置 | 只填了 X/Y/Z,漏了方向角或旋转顺序 |
在 SIM PRO 中新建工作单元时,我一般会强制按这个顺序操作:先把机器人的 ROBROOT 与世界坐标平行放置,再放工装和工件,最后才定义工具坐标系。这样后续所有 KRL 点位都是基于同一套基准算出来的,导出到 KRC 控制器后,现场只要做一次基准校对就能跑起来。
有一点特别容易被忽略:工件坐标系的 A/B/C 旋转顺序。KSS 里欧拉角用的是 ZYX 顺序,跟很多三维软件的 XYZ 顺序不一样。仿真资源包里如果直接导入了第三方三维模型,哪怕角度值相同,旋转顺序不同也会产生偏差。常见做法是在导入模型后,把工装坐标系的旋转方式手动改成 ZYX,再检查一次工件边缘和机器人基座的平行关系。
2.2 搭工作单元的拼接顺序:机器人选型、工具 TCP、外部轴一个都不能少
KUKA SIM PRO 建立工作单元的逻辑很像组装配件,但顺序有讲究。先加机器人还是先加工件,看起来不影响显示,实际会影响外部轴和工具坐标的引用关系。
我习惯的步骤是:
- 在单元树中先插入地面和机器人本体,选择对应的机器人型号(比如 KR210、KR60 这类,资源包里通常带常见型号的三维模型和运动学参数)。
- 给机器人配置运动学链,确认每个轴的正方向和限位角度跟真实控制器一致。
- 添加外部轴,比如变位机、导轨。外部轴在 SIM PRO 里不能只当普通模型摆着,要单独定义为 E1、E2 运动学链,并设置每个轴的行程和耦合关系。
- 导入周边设备模型,像 PLC 柜、围栏、输送线,这些只需要几何模型,不需要运动学属性。
- 最后才定义工具坐标系和碰撞体。
很多项目搭建工作单元时出现“机器人和变位机不联动”的问题,根本原因就是外部轴只加了模型,没在运动学链里声明。SIM PRO 里外部轴的配置项隐藏在机器人的“机械组”里,必须在添加机器人时就把外部轴挂到同一个机械组,变位机才能跟着机器人坐标系一起做插补。
工具 TCP 的配置要单独说一下。KUKA 真实调试中 TCP 通常用四点法或 ABC 世界坐标法标定,在仿真里直接把这些测量值填进去就行。但注意,工具坐标的原点在法兰坐标系下表示,X/Y/Z 是工具末端相对法兰的位置,A/B/C 是工具姿态相对法兰的旋转。如果资源包里给了现成的工具模型,最好重新核对一遍 TCP 数据,别直接用默认法兰中心,否则抓取点会整体偏移。
2.3 运动学内核与仿真时钟:PTP、LIN/CIRC 在 SIM PRO 里是怎么被算出来的
KUKA SIM PRO 跟普通三维动画软件最本质的区别,是它的运动学求解和真实控制器同源。你在仿真里执行一条 PTP 指令,软件会按各轴独立插补计算;执行 LIN 或 CIRC,则是笛卡尔空间直线和圆弧插补。这套逻辑和 KSS 控制器现场跑程序时几乎一模一样。
这就带来一个好处:仿真程序里如果遇到奇点,SIM PRO 会模拟出与真实控制器一致的停机或报警表现。之前做过一个测试,在某个六轴姿态下发 LIN 指令,仿真到一半提示“轴接近奇点”,换到真实控制器上跑,同样姿态同样指令,确实也在那个位置附近出现了明显的抖动。这说明仿真结果具有参考价值,而不是看看动画而已。
仿真时钟的设置也很关键,直接决定节拍统计准不准。SIM PRO 里的周期通常按控制器的 IPO 周期设置,常见值是 12ms 或者 4ms。我一般会先确认项目现场机器人实际的 IPO 周期,然后在仿真里同步设置。如果仿真周期比真实控制器快,节拍时间会偏短,后面做方案承诺就会翻车。
还有一点,SIM PRO 里的速度倍率默认是 100%,但真实机器人程序里经常有 $VEL 和 $ACC 的百分比设置。仿真时如果不把加速度和速度百分比调成与现场一致,节拍结果大概率对不上。这就是为什么同一个程序,仿真 20 秒,现场可能跑到 28 秒。
3. 复现一个抓取工作站:模型导入、KRL 编写到节拍输出
前面把底层逻辑讲清楚了,这章直接落到实际操作。我拿一个典型的气动抓手搬运工作站做例子,从模型导入开始,到 KRL 程序跑通,再到节拍输出,完整走一遍。
3.1 模型导入与技术对象的层级关系
KUKA SIM PRO 支持导入 STEP、IGES、STL 这类常见三维格式。导入前有一个必须确认的事:单位。三维软件里有的用毫米,有的用米,SIM PRO 内部统一按毫米处理。如果模型导入后尺寸明显不对,优先检查单位换算,而不是缩放模型。
导入后,要在单元树里把模型的层级关系理顺。机器人本体、末端工具、工件、变位机应该分属不同的技术对象,不能全部堆在“几何图形”节点下。正确做法是:
- 机器人在“机器人”节点下;
- 抓手在“工具”节点下;
- 工件在“基座”或“工件”节点下;
- 变位机在“外部轴”节点下。
这样做的原因和碰撞检测有关。SIM PRO 只有在两个不同技术对象之间才能做碰撞检查。如果两个模型都扔在同一个几何节点下,系统会认为它们是一体的,永远不会干涉,仿真安全性就失去意义了。
3.2 定义工具坐标系和碰撞体
导入工具模型后,立刻定义 TCP。我一般直接在 KUKA 的工具表里新建一个工具,把已知的 TCP 数值填进去。需要注意,工具表里的 A/B/C 是以度为单位,别填成弧度,这是非常低级却又容易犯的错。
接着给抓手定义碰撞体。SIM PRO 里的碰撞体可以是模型本身,也可以是用方块、圆柱体近似的简化体。简化体计算快,而且不容易因模型破面导致误报。对于气动夹爪,我用两个长方体分别代表左右手指,再把掌体的模型整个作为碰撞体。碰撞体设置完成后,在仿真菜单里打开碰撞检测开关,并指定检测对象为“工具对工件”和“机器人对围栏”。
这一步直接关系后续干涉区检查是否有效。如果没有碰撞体,程序路径即使撞上围栏,仿真也不会报错。
3.3 写一段能跑的 KRL 抓取逻辑
KUKA SIM PRO 支持直接写 KRL 程序,这是整个资源里最有价值的部分。下面是一段典型的气动抓取程序,可以在 SIM PRO 里直接加载运行:
&ACCESS RVO &REL 5 DEF GRASP() DECL E6POS PICK_APP, PICK, PLACE_APP, PLACE PICK_APP = {X 500, Y 0, Z 500, A 0, B 0, C 0} PICK = {X 500, Y 0, Z 400, A 0, B 0, C 0} PLACE_APP = {X 800, Y 200, Z 500, A 0, B 0, C 0} PLACE = {X 800, Y 200, Z 400, A 0, B 0, C 0} PTP HOME PTP PICK_APP LIN PICK DOUT[2] = TRUE WAIT FOR DIN[2] LIN PICK_APP PTP PLACE_APP LIN PLACE DOUT[2] = FALSE WAIT FOR DIN[3] LIN PLACE_APP PTP HOME END代码逻辑说明:先用 PTP 把机器人从 HOME 点高速移动到抓取接近点,再用 LIN 低速直线下压到工件位置。闭合抓手通过 DOUT[2] 输出,等待 DIN[2] 确认夹紧信号,避免程序空跑。放料侧同理,到达放置点后执行 DOUT[2] = FALSE 打开抓手,再离开。
参数说明:PICK_APP 和 PICK 在 Z 方向差 100mm,目的是给 LIN 留出直线进给距离,避免 PTP 到位后直接反向运动导致路径紊乱。DOUT 与 DIN 是布尔信号,在仿真里通过 I/O 映射表模拟真实 PLC 输入输出。如果现场不需要夹紧确认,可以删掉 WAIT 语句,但我不建议这样做,因为缺少确认信号很容易导致抓取失败后机器人继续执行后续动作。
3.4 节拍时间与干涉区验证步骤
程序跑通后,接下来要做两件事:节拍统计和干涉检查。
在 SIM PRO 的仿真控制面板里选择“运行时间测量”,软件会在每个运动指令之间插入时间标记。运行完成后,输出总节拍时间和每个动作段的耗时。这时一定要检查运动类型:PTP 和 LIN 的速度特性不同,如果所有动作全是 PTP,现场节拍会远远大于仿真。
干涉检查则需要在运行前把碰撞检测打开,并将工具、工件、围栏、基座都加入检测组。运行过程中如果碰撞,仿真会停在碰撞发生的帧上并高亮显示接触位置。这时候不要急着调整路径,先暂停,用测量工具量一下碰撞点到目标位置的距离,再决定是改路径点还是改 TCP 偏移。
表:常见 KRL 运动指令与用途
| 指令 | 用途 | 仿真中观察点 |
|---|---|---|
| PTP | 轴关节运动,用于大范围移动 | 检查轴是否超限位 |
| LIN | 笛卡尔直线运动,用于进给 | 检查轨迹是否穿模 |
| CIRC | 笛卡尔圆弧运动 | 检查圆心位置和半径 |
| LIN_REL | 相对当前位置直线移动 | 检查方向依赖工具姿态 |
4. 从仿真到真实控制器:借助 WorkVisual 把程序搬上 KRC 的通道
仿真做得再漂亮,最终也得落到真实控制器上。KUKA 系工具链里,SIM PRO 和 WorkVisual 经常搭配使用。这章专门讲两者之间的配合。
4.1 导出 KRL 的两种方式:离线导出与在线同步
第一种方式是离线导出。在 SIM PRO 中直接把程序文件保存为 .src 和 .dat,再拷贝到 U 盘或通过以太网传到 KRC 控制器。适合无网络环境或临时调试。
第二种方式是通过 WorkVisual 做在线同步。WorkVisual 是 KUKA 控制器配置和编程的集成环境,可以把 SIM PRO 里的程序归档到 WorkVisual 项目,然后通过控制器连接功能进行在线下载。这种方式适合现场程序版本管理,能避免 U 盘拷贝带来的版本混乱问题。
我一般推荐第二种。因为离线拷贝常常漏掉 .dat 文件里定义的全局变量,到了现场程序一执行就报“变量未定义”。WorkVisual 归档时会自动把相关文件打全。
4.2 控制器配置和系统文件
KUKA SIM PRO 仿真里的机器人和真实控制器的机械参数必须一致,才能保证 KRL 点位直接复用。检查的重点有三个:
- 机器人类型和最大轴行程;
- 外部轴配置;
- 工具号对应关系。
在 WorkVisual 里打开项目后,找到系统配置文件。机器人的型号代码决定了运动学参数,如果仿真资源包里的 KR210 与现场实际 KR210 规格有差异,只能以现场控制器配置为准。外部轴方面,WorkVisual 里每个机械组对应一组运动学链,SIM PRO 中把变位机挂在 E1,这里也要对应 E1 的行程和正方向。
里有一个比较隐蔽的坑:工具号 T1、T2 的对应关系。SIM PRO 里定义的工具号,导出到真实控制器后必须保证工具表里的号一致,否则程序里调用 TOOL_DATA[1] 时,现场抓的可能是另一组数据。这也是离线拷贝程序最常见的现场故障之一。
4.3 信号映射和外设联调
抓取动作依赖的是 I/O 信号,前文 KRL 里用到了 DOUT[2] 和 DIN[2]。这些布尔信号在仿真里是虚拟的,到现场必须映射到真实 PLC 的地址。
常见做法是在 WorkVisual 的 I/O 映射表里做信号绑定。比如 DOUT[2] 对应输出字节的某一位,DIN[2] 对应输入字节的某一位。映射完成后,先在仿真里点击“连接虚拟控制器”,让 SIM PRO 和 WorkVisual 建立在线通信,再逐条测试信号闭合是否正确。
表:本项目 I/O 映射建议
| 信号 | 类型 | 仿真用途 | 现场接线建议 |
|---|---|---|---|
| DOUT[1] | 输出 | 抓手打开 | 接电磁阀线圈 Y1 |
| DOUT[2] | 输出 | 抓手闭合 | 接电磁阀线圈 Y2 |
| DIN[2] | 输入 | 夹紧到位确认 | 接夹爪传感开关 |
| DIN[3] | 输入 | 松开到位确认 | 接夹爪传感开关 |
信号这块最怕的是仿真里信号名和现场不一样,导致联调时逻辑对不上。我的习惯是先在仿真里把 I/O 表导出成 Excel,确认好每一位地址,再拿给电气工程师一起核对,避免双方理解偏差。
5. 避坑手册:KUKA SIM PRO 仿真实操最常踩的五个坑
仿真软件用起来不难,但总有些问题不是看一眼模型就能发现的。这章写我在实际项目里踩过的五个坑,按照现象、原因、解决的顺序逐条拆开。
5.1 坑一:模型看着能走,导出到控制器却提示轴限位错误
现象:仿真里整个工作单元运行流畅,程序拷到真实控制器一执行,立刻报“软限位”。当时我以为是程序问题,反复改点位,实际上问题根本不在点位。
原因:真实控制器里每个轴的软限位角度是出厂设定的,仿真模型的轴行程范围可能比实际控制器大。尤其是一些资源包里的模型没有严格按真实机器人规格校准时,轴 4 或轴 6 的行程比真实控制器多出十几度,路径在仿真里合法,到现场就超限了。
解决:在仿真开始前,对照 KRC 控制器里的轴限位参数,逐个确认 SIM PRO 机器人模型的各轴限位与实际一致。特别注意 A4 和 A6 这种经常到底的轴。如果资源包模型没有限位数据,用控制器参数手工修改一次就能解决。
5.2 坑二:工具 TCP 建错,抓取点在仿真里对准了现场却偏出一截
现象:仿真里抓手完美对准工件中心,现场跑同样程序,抓手中心明显偏向一侧,目测偏差 2 到 3mm。
原因:TCP 的 X/Y/Z 坐标是从法兰中心偏移到抓手中心的矢量。很多人在建模时只填了一个方向的位置偏移,忽略了另外两个方向的偏移。比如 L 型抓手,法兰中心和抓手中心在 X 和 Z 方向都有距离,只填 Z 方向就会出现水平偏移。
解决:在仿真里用“四点法”重新标定 TCP。虽然仿真环境没有真实传感器,但可以通过把工具末端对准工件上一个固定角点,连续记录四个姿态,反算出 TCP。这样算出来的 TCP 比手工测量更接近真实值。
5.3 坑三:外部轴没配置,变位机模型一拖动就散架
现象:给仿真单元加了一个变位机,想让机器人带着变位机一起翻转工件,结果变位机只跟着机器人平移,不执行旋转动作,程序一跑就报错。
原因:外部轴在 SIM PRO 里必须先定义为运动学链,而不是一个普通的三维模型。如果没有挂到机器人的机械组里,系统根本不知道它要跟机器人做耦合插补。
解决:在添加机器人的时候,直接从外部轴库中选择对应的运动学链类型,配置好 E1/E2 的行程和方向。重新加载模型后,变位机就变成了机器人的第六轴之外的附加轴,程序里可以用 E1 直接驱动。这件事必须在搭建工作单元时完成,后期补很难,因为运动学链的挂载顺序会影响整个单元树结构。
5.4 坑四:节拍时间与现场差距过大,忽略了加速度百分比和夹具动作时间
现象:仿真节拍测出来 20 秒,现场实际跑完 28 秒,客户当场质疑方案的节拍承诺。
原因:SIM PRO 默认按 100% 速度和 100% 加速度计算,但真实机器人程序里经常有 $VEL 和 $ACC 百分比限制。另外,SIGNAL 等待时间也容易漏:气动夹具的夹紧动作大约需要 0.3 到 0.5 秒,仿真里的信号是瞬间完成的,现场却要等气缸到位。
解决:在节拍仿真前,先打开程序里的速度设置,确认所有 PTP 和 LIN 指令的速度倍率。再从现场程序里读取 $ACC 的数值,同步到仿真环境。最后把每个 WAIT 语句的等待时间按现场气缸节拍补上,比如 WAIT TIME 0.5 代替单纯等传感器。这样出来的节拍才有说服力。
5.5 坑五:角度单位、奇点保护与零点标定引起的“假”仿真
现象:在仿真里轨迹运行平滑,现场走到同一个姿态时出现 A/B/C 角度突跳,或者机器人直接报“未达到目的地”。
原因:KSS 里位置数据的 A/B/C 用度表示,而部分第三方脚本或数据表用弧度。SIM PRO 导入位置点时如果没做单位换算,视觉上看起来角度相同,实际数值差了 57.3 倍。奇点问题则是 LIN 指令在笛卡尔空间插补时,到了轴角度无法解析的位置,机器人会停下来。
解决:在 SIM PRO 里导入点位时,统一检查单位定义。KRL 源文件里的 6 个轴角度和 A/B/C 都用度数。遇到奇点附近路径,把运动类型从 LIN 改成 PTP,让机器人先绕过奇点区域再恢复直线插补。另外,确认 HOME 点的零点标定和现场一致,尤其是轴 4 和轴 6。
6. 验证仿真可靠性的一个硬习惯:离线轨迹对比
仿真的价值在于可信度。怎么证明 SIM PRO 里跑出来的路径真实可用?我的办法是做一次离线轨迹对比,把仿真轨迹和真实控制器采集的轨迹放在同一张图里比较。
6.1 把仿真轨迹和现场轨迹都导出成带时间戳的 TCP 点列
在 SIM PRO 里运行程序时开启轨迹记录,软件会按每个控制周期记录当前 TCP 的 X/Y/Z/A/B/C 和对应时间戳。导出为 CSV 文件。现场侧,通过真实控制器或 WorkVisual 的在线监视功能采集同样的程序轨迹,同样导出 CSV。
注意两组轨迹必须来自同一个程序文件,且 TCP 参数完全一致。如果现场还没有机器人,这一步也可以用 WorkVisual 里的虚拟控制器代替,把两个虚拟环境的轨迹做对比。
6.2 用 Python 做轨迹误差检查
拿到两组 CSV 后,我用一段小脚本做对齐和误差计算:
import numpy as np import pandas as pd sim = pd.read_csv("sim_traj.csv") real = pd.read_csv("real_traj.csv") # 按时间戳对齐,取真实轨迹时间戳所在行 real_times = real["Time"].values sim_aligned = sim[np.isin(sim["Time"].values, real_times)] common_len = min(len(sim_aligned), len(real)) sim_aligned = sim_aligned.iloc[:common_len] real_aligned = real.iloc[:common_len] # 计算位置误差 pos_err = np.sqrt( (sim_aligned[["X", "Y", "Z"]].values - real_aligned[["X", "Y", "Z"]].values) ** 2 ).sum(axis=1) print(f"最大位置误差: {pos_err.max():.2f} mm") print(f"平均位置误差: {pos_err.mean():.2f} mm")这段代码先把两组数据按时间戳对齐,再计算每个时间点上的位置误差。如果平均误差在 1mm 以内,说明仿真坐标和现场基本一致;如果误差达到 3mm 以上,就要回到坐标系和 TCP 配置里查问题,而不是在现场盲目改程序。
法向角度误差要比位置误差更敏感。A/B/C 每差 0.5°,在 500mm 长的工具末端就会产生 4mm 以上的偏差。遇到姿态误差偏大的情况,我一般会优先检查 WORK 坐标系的方向角标定。
这个习惯后来救了我不止一次。有一次某项目仿真做了两周,方案已经发出去,我顺手跑了这条轨迹对比,发现仿真和虚拟控制器的 C 角度差了 0.8°,查下来是工件坐标系旋转顺序选错了。如果不是提前发现,这个错误到现场至少要多花三天调试。从那以后我每次出仿真方案,都强制跑一遍轨迹对比,确认最大位置误差在 1mm 以内才归档。希望这个习惯对你也有用。
本文还有配套的精品资源,点击获取