机器人程序导出 (Professional, Beta)
机器人程序导出仅包含在 realvirtual Professional 中。
Beta 功能。 生成的输出是复制粘贴模板,不是完整的、可直接运行的机器人程序。在真实硬件上运行之前,请务必在(虚拟)控制器上加载并验证代码,并以降低的速度覆盖开始。工具、基座/工件、坐标系和 I/O 寻址仍由您在控制器上负责。
此功能在 realvirtual 6.3.4 (Professional) 中添加。
机器人程序导出将您在 realvirtual 中示教的机器人路径(机器人逆运动学)转换为可直接粘贴的控制器代码。它读取 IK Path 的目标,重新求解每个目标,并生成轴角度和笛卡尔位姿作为主要机器人控制器的程序模板。
这是一个用于虚拟调试的离线辅助工具:没有实时连接,也没有自动上传到控制器。您生成文本,复制它(或保存到文件),然后粘贴到控制器的程序编辑器中。

重要:这是模板,不是完成的程序
导出精确地为每个 IK Target 生成一条指令——它不会对目标之间的路径进行采样或插值。机器人精确地遵循您定义的点和位姿。
模板不包含的内容(您在控制器上完成):
- 校准的工具数据、基座/工件和用户坐标系(导出回退到默认值,如
tool0/wobj0、TOOL_DATA[1]/BASE_DATA[1]、UFRAME 0/UTOOL 1)。 - 真实信号地址。路径中的信号名称作为注释写入;对于 KUKA 和 Fanuc,使用占位符索引(在控制器上重新映射)。
- 安全逻辑、程序流程和外部轴值。
所选的模板字符也会写入每个生成文件的头部。
支持的目标
| 目标 | 输出 | 说明 |
|---|---|---|
| ABB RAPID | .mod 模块 | MoveAbsJ(基于轴)或 MoveJ/MoveL(笛卡尔),SetDO/WaitDI,WaitTime |
| KUKA KRL | .src + .dat | PTP {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 弃用,但在过渡期间仍可运行 |
快速入门
- 在场景中选择您的 IK Path(携带
IKPath组件的 GameObject)。 - 通过 Tools > realvirtual > Robot Program Export (Pro) 打开窗口,或点击 IK Path Inspector 底部的 Export Robot Program (Beta)。
- 从下拉菜单中选择 Target 控制器。
- 选择运动模式(见下文)并调整选项。
- 点击 Preview 生成代码并查看。
- 点击 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、KUKAS/T、FanucCONFIG)。
验证生成的代码
由于没有实时连接,请在部署前在控制器供应商的离线工具中验证输出:
- ABB — RobotStudio(基础版免费):创建虚拟控制器并加载
.mod。 - KUKA — WorkVisual(免费,语法检查)和 KUKA.OfficeLite(试用,运行真实 KSS/KRL)。导出面向经典 KSS/KRL。
- Fanuc — RoboGuide(试用):将
.ls编译为.tp并在虚拟工作单元中运行。 - SEW — 在 MOVISUITE / MOVIKIT Robotics 中加载
.srlprg序列程序并在(虚拟)控制器上验证;检查KINEMATIC编号、MotionSet和REALVAR信号映射是否与您的项目匹配。
realvirtual 内置的正运动学检查是始终可用的第一道验证。
限制
- Beta — 笛卡尔配置推导在边缘情况下可能出错;基于轴的模式是可靠的路径。
- 无实时连接 — 仅离线复制粘贴;无程序上传(使用机器人接口进行实时耦合)。
- 仅 6 轴 — 不导出外部轴/变位器和多机器人程序;ABB/KUKA 外部轴字段写入"未使用"(
9E9/E1..E6 = 0)。 - 无圆弧移动 — 仅生成点到点和线性移动。
- SEW 是示教方式,非文本编程 — MOVIKIT Robotics 在控制器上计算逆运动学,其
.srlprg序列语法未公开文档;导出器复现观察到的程序形式,因此请针对您的 MOVISUITE 项目验证KINEMATIC/MotionSet/REALVAR映射和动力学。
扩展:自定义后处理器
导出使用开放架构,因此您可以添加自己的控制器方言或改编现有的。它有两层:
- 转换 —
IKPathToProgram.Convert(ikPath)重新求解路径并产生一个供应商中立的RobotProgram:一个RobotMoveInstruction列表,其中关节角度、右手笛卡尔位置(mm)、旋转四元数、ZYX 欧拉角、速度、混合半径、信号和配置标志都已计算完成。 - 格式化 —
RobotPostProcessor子类将该模型转换为控制器文本。内置的 ABB、KUKA、Fanuc 和 SEW 后处理器都共享此基类。
所有文件位于 Packages/io.realvirtual.professional/Runtime/IK/Export/(基类、模型和转换器)和 Export/Vendors/(各控制器的后处理器)——现有的供应商文件是最好的复制模板。
创建您自己的后处理器
继承 RobotPostProcessor,设置标识属性,并覆盖您需要的钩子。基类驱动生成顺序(头部 → 工具 → 坐标系 → 每个目标一个 MoveJ/MoveL 加上其信号/停留 → 尾部),并将所有内容写入共享的 StringBuilder(AddLine(...)):
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](度)、PositionMm、RotationQuat、EulerZYXDeg(z=A/Yaw、y=B/Pitch、x=C/Roll)、JointSpeedPct、LinSpeedMmS、LinAccelMmS2、BlendRadiusMm、EnableBlending、DwellSec、SetSignalName、WaitSignalName、PickPlaceSignalName 以及 Config 标志(AbbConf、FanucTurns、Flip、Lower、KukaStatus、KukaTurn)。静态 RobotCoordConverter 提供共享的坐标辅助工具(右手转换、ZYX 欧拉角、配置标志)。
如需更多控制,您可以覆盖:
Emit(RobotProgram)— 生成多个文件(KUKA 以此方式生成.src+.dat)。Generate(RobotProgram)— 接管整个布局(ABB 后处理器单独收集声明)。SEW 后处理器则保持基类生成顺序,仅覆盖Header/Footer和运动/信号钩子(MoveJ/MoveL/SetDigitalOutput/WaitTime)以发出其.srlprg形式。
在窗口中注册
将您的后处理器添加到 RobotProgramExportWindow(Packages/io.realvirtual.professional/Runtime/IK/private/Editor/):在 VendorNames 数组中添加一个条目,并在 CreatePostProcessor() 中添加匹配的 case。
更改现有后处理器
编辑 Export/Vendors/ 中的相关文件(ABBRapidPostProcessor.cs、KukaKrlPostProcessor.cs、FanucLsPostProcessor.cs、SewPostProcessors.cs、WandelbotsPostProcessors.cs)——例如更改速度映射、程序头部、坐标系/工具默认值或您单元的信号地址约定。