机器人程序导出 (Professional, Beta)

ℹ️

机器人程序导出仅包含在 realvirtual Professional 中。

⚠️

Beta 功能。 生成的输出是复制粘贴模板,不是完整的、可直接运行的机器人程序。在真实硬件上运行之前,请务必在(虚拟)控制器上加载并验证代码,并以降低的速度覆盖开始。工具、基座/工件、坐标系和 I/O 寻址仍由您在控制器上负责。

ℹ️

此功能在 realvirtual 6.3.4 (Professional) 中添加。

机器人程序导出将您在 realvirtual 中示教的机器人路径(机器人逆运动学)转换为可直接粘贴的控制器代码。它读取 IK Path 的目标,重新求解每个目标,并生成轴角度和笛卡尔位姿作为主要机器人控制器的程序模板。

这是一个用于虚拟调试的离线辅助工具:没有实时连接,也没有自动上传到控制器。您生成文本,复制它(或保存到文件),然后粘贴到控制器的程序编辑器中。

带实时预览的机器人程序导出窗口,位于 IK Path Inspector 按钮旁边

重要:这是模板,不是完成的程序

导出精确地为每个 IK Target 生成一条指令——它不会对目标之间的路径进行采样或插值。机器人精确地遵循您定义的点和位姿。

模板不包含的内容(您在控制器上完成):

  • 校准的工具数据、基座/工件和用户坐标系(导出回退到默认值,如 tool0 / wobj0TOOL_DATA[1] / BASE_DATA[1]UFRAME 0 / UTOOL 1)。
  • 真实信号地址。路径中的信号名称作为注释写入;对于 KUKA 和 Fanuc,使用占位符索引(在控制器上重新映射)。
  • 安全逻辑、程序流程和外部轴值。

所选的模板字符也会写入每个生成文件的头部。

支持的目标

目标输出说明
ABB RAPID.mod 模块MoveAbsJ(基于轴)或 MoveJ/MoveL(笛卡尔),SetDO/WaitDIWaitTime
KUKA KRL.src + .datPTP {E6AXIS}(基于轴)或 LIN/PTP {E6POS}(笛卡尔),$APO.CDIS$OUT[]/WAIT FOR $IN[]
Fanuc TP/LS.ls(ASCII)关节或笛卡尔位置,带 CONFIG 字符串,J/L 移动,DO[]/WAIT DI[]。在 RoboGuide / maketp.exe 中编译为 .tp
SEW MOVI-C / MOVIKIT.srlprg 序列程序原生 MOVIKIT Robotics 程序:PTP_J(关节)/ LIN(笛卡尔 X/Y/Z + RotZ/RotY/RotX),REALVAR I/O 初始化,MotionSet/混合设置,信号写入和 WAIT_TIME。运动学编号和 MotionSet 可配置。复制粘贴模板——在(虚拟)MOVISUITE 控制器上验证
Wandelbots NOVA.py(NOVA Python SDK)或 .ws(Wandelscript)通过 plan_and_execute 执行的 joint_ptp / cartesian_ptp / linear / io_write。位置以 mm 为单位,方向为旋转向量(弧度),关节以弧度为单位。推荐使用 Python SDK;Wandelscript 已被 Wandelbots 弃用,但在过渡期间仍可运行

快速入门

  1. 在场景中选择您的 IK Path(携带 IKPath 组件的 GameObject)。
  2. 通过 Tools > realvirtual > Robot Program Export (Pro) 打开窗口,或点击 IK Path Inspector 底部的 Export Robot Program (Beta)
  3. 从下拉菜单中选择 Target 控制器。
  4. 选择运动模式(见下文)并调整选项。
  5. 点击 Preview 生成代码并查看。
  6. 点击 Copy to Clipboard 粘贴到控制器编辑器中,或点击 Save File… 写入磁盘(KUKA 会将两个文件写入一个文件夹)。

状态行显示生成了多少条指令以及是否发生了任何警告(不可达目标、万向节锁定、缺少运动学)。

选项

Target 选择控制器方言:ABB RAPID、KUKA KRL、Fanuc TP/LS、SEW MOVI-C (.srlprg) 或 Wandelbots NOVA。

Axis-based (MoveAbsJ) – 推荐 启用后,关节移动导出为纯轴目标(ABB MoveAbsJ + jointtarget,KUKA PTP {E6AXIS},Fanuc 关节表示位置,SEW PTP_J)。这是无歧义的,避免了机器人配置问题,因此是推荐的默认值。关闭以获得笛卡尔输出(robtarget / E6POS / X,Y,Z + W,P,R),它产生人类可读的位姿但需要正确的配置数据。SEW 将关节移动输出为 PTP_J,将线性移动输出为 LIN(笛卡尔),与此开关无关。

SEW: Kinematic number / MotionSet 仅限 SEW MOVI-C。运动学编号写入 // KINEMATIC: 头行(机器特定的控制器运动学 ID);MotionSet 发出为 MotionSet := 。两者默认为 1,与您的 MOVISUITE 项目匹配。

ABB: snap speed to predefined v#### 启用后,线速度映射到最近的预定义 ABB 速度值(v5 … v7000)。禁用时,发出具有精确速度的自定义 speeddata。仅适用于 ABB。

Include linked paths (StartNextPath) 禁用时(默认),仅导出所选路径自身的目标。启用后,导出会跟随 StartNextPath 链并将所有链接的路径串联为一个程序。

输出模式

  • 基于轴(推荐) — 精确求解的轴角度,每个目标一次移动,无配置歧义。最适合可靠地将路径部署到控制器。
  • 笛卡尔 — TCP 位姿(位置 + 方向)与推导的机器人配置。在控制器上更可读和可编辑,但您必须为您的单元验证配置(ABB robconf、KUKA S/T、Fanuc CONFIG)。

验证生成的代码

由于没有实时连接,请在部署前在控制器供应商的离线工具中验证输出:

  • ABB — RobotStudio(基础版免费):创建虚拟控制器并加载 .mod
  • KUKA — WorkVisual(免费,语法检查)和 KUKA.OfficeLite(试用,运行真实 KSS/KRL)。导出面向经典 KSS/KRL。
  • Fanuc — RoboGuide(试用):将 .ls 编译为 .tp 并在虚拟工作单元中运行。
  • SEW — 在 MOVISUITE / MOVIKIT Robotics 中加载 .srlprg 序列程序并在(虚拟)控制器上验证;检查 KINEMATIC 编号、MotionSetREALVAR 信号映射是否与您的项目匹配。

realvirtual 内置的正运动学检查是始终可用的第一道验证。

限制

  • Beta — 笛卡尔配置推导在边缘情况下可能出错;基于轴的模式是可靠的路径。
  • 无实时连接 — 仅离线复制粘贴;无程序上传(使用机器人接口进行实时耦合)。
  • 仅 6 轴 — 不导出外部轴/变位器和多机器人程序;ABB/KUKA 外部轴字段写入"未使用"(9E9 / E1..E6 = 0)。
  • 无圆弧移动 — 仅生成点到点和线性移动。
  • SEW 是示教方式,非文本编程 — MOVIKIT Robotics 在控制器上计算逆运动学,其 .srlprg 序列语法未公开文档;导出器复现观察到的程序形式,因此请针对您的 MOVISUITE 项目验证 KINEMATIC/MotionSet/REALVAR 映射和动力学。

扩展:自定义后处理器

导出使用开放架构,因此您可以添加自己的控制器方言或改编现有的。它有两层:

  1. 转换IKPathToProgram.Convert(ikPath) 重新求解路径并产生一个供应商中立的 RobotProgram:一个 RobotMoveInstruction 列表,其中关节角度、右手笛卡尔位置(mm)、旋转四元数、ZYX 欧拉角、速度、混合半径、信号和配置标志都已计算完成。
  2. 格式化RobotPostProcessor 子类将该模型转换为控制器文本。内置的 ABB、KUKA、Fanuc 和 SEW 后处理器都共享此基类。

所有文件位于 Packages/io.realvirtual.professional/Runtime/IK/Export/(基类、模型和转换器)和 Export/Vendors/(各控制器的后处理器)——现有的供应商文件是最好的复制模板。

创建您自己的后处理器

继承 RobotPostProcessor,设置标识属性,并覆盖您需要的钩子。基类驱动生成顺序(头部 → 工具 → 坐标系 → 每个目标一个 MoveJ/MoveL 加上其信号/停留 → 尾部),并将所有内容写入共享的 StringBuilderAddLine(...)):


public class MyControllerPostProcessor : RobotPostProcessor
{
    public override string DisplayName => "My Controller";
    public override string FileExtension => ".txt";
    public override string GetFileName(RobotProgram prog) => prog.Name;

    protected override void Header(RobotProgram prog) => AddLine($"PROGRAM {prog.Name}");
    protected override void Footer(RobotProgram prog) => AddLine("END");

    protected override void MoveJ(RobotMoveInstruction m) =>
        AddLine($"PTP J=[{Fmt(m.JointAngles[0])}, ... ,{Fmt(m.JointAngles[5])}] v={Fmt(m.JointSpeedPct)}%");

    protected override void MoveL(RobotMoveInstruction m) =>
        AddLine($"LIN X={Fmt(m.PositionMm.x)} Y={Fmt(m.PositionMm.y)} Z={Fmt(m.PositionMm.z)} " +
                $"A={Fmt(m.EulerZYXDeg.z)} B={Fmt(m.EulerZYXDeg.y)} C={Fmt(m.EulerZYXDeg.x)} v={Fmt(m.LinSpeedMmS)}");

    protected override void SetDigitalOutput(string signal, bool value) => AddLine($"DOUT {signal}={value}");
    protected override void WaitDigitalInput(string signal, bool value) => AddLine($"WAIT {signal}=={value}");
    protected override void WaitTime(float seconds) => AddLine($"DELAY {Fmt(seconds)}");
}

每个 RobotMoveInstruction 上的有用字段:MoveType(PTP / LIN)、JointAngles[6](度)、PositionMmRotationQuatEulerZYXDegz=A/Yaw、y=B/Pitch、x=C/Roll)、JointSpeedPctLinSpeedMmSLinAccelMmS2BlendRadiusMmEnableBlendingDwellSecSetSignalNameWaitSignalNamePickPlaceSignalName 以及 Config 标志(AbbConfFanucTurnsFlipLowerKukaStatusKukaTurn)。静态 RobotCoordConverter 提供共享的坐标辅助工具(右手转换、ZYX 欧拉角、配置标志)。

如需更多控制,您可以覆盖:

  • Emit(RobotProgram) — 生成多个文件(KUKA 以此方式生成 .src + .dat)。
  • Generate(RobotProgram) — 接管整个布局(ABB 后处理器单独收集声明)。SEW 后处理器则保持基类生成顺序,仅覆盖 Header/Footer 和运动/信号钩子(MoveJ/MoveL/SetDigitalOutput/WaitTime)以发出其 .srlprg 形式。

在窗口中注册

将您的后处理器添加到 RobotProgramExportWindowPackages/io.realvirtual.professional/Runtime/IK/private/Editor/):在 VendorNames 数组中添加一个条目,并在 CreatePostProcessor() 中添加匹配的 case

更改现有后处理器

编辑 Export/Vendors/ 中的相关文件(ABBRapidPostProcessor.csKukaKrlPostProcessor.csFanucLsPostProcessor.csSewPostProcessors.csWandelbotsPostProcessors.cs)——例如更改速度映射、程序头部、坐标系/工具默认值或您单元的信号地址约定。

另请参见