跳到主要内容

数字孪生

数字孪生 (Digital Twin) 是物理机器人在虚拟空间的实时映射 — 不仅是 3D 模型的静态展示, 更是位置、速度、力矩等运行状态的双向同步。Darra 数字孪生贯穿 IDE 编程、仿真验证、运行时监控三个阶段。

数字孪生概念

三层架构

┌─────────────────────────────────────────────────────────┐
│ L3 — 应用层 (IDE / HMI / Web) │
│ 3D 视口 / 孪生看板 / 远程监控 / 离线编程 │
├─────────────────────────────────────────────────────────┤
│ L2 — 服务层 (Darra.PLC.Service) │
│ 孪生引擎 / 状态同步 / 数据缓存 / 历史回放 │
├─────────────────────────────────────────────────────────┤
│ L1 — 物理层 (DarraRT_PLC.sys + 伺服驱动器) │
│ 真实机器人 / 传感器 / 执行器 (或仿真驱动) │
└─────────────────────────────────────────────────────────┘
  • L1 物理层: 真实机器人的关节编码器、伺服驱动器、力传感器等
  • L2 服务层: 采集 L1 数据, 以 1~10 ms 周期发布到 IDE 和 HMI
  • L3 应用层: 3D 渲染、数据可视化、离线编程

同步方向

方向数据延迟要求
物理 → 虚拟 (Monitoring)位置、速度、力矩、IO 状态< 50 ms
虚拟 → 物理 (Command)目标位置、轨迹、模式切换< 10 ms (硬实时)
物理 ↔ 虚拟 (Bidirectional)双向同步, 差异即报警< 20 ms

IDE 内 3D 仿真

IDE 3D 视口提供数字孪生的可视化界面。

渲染能力

功能说明
机器人模型导入 URDF / STL / STEP, 自动生成碰撞体
环境模型工装、料框、安全围栏、传送带
坐标系World / Base / Tool / 工件 / 用户坐标
轨迹显示实时轨迹线、路径点、速度/加速度颜色映射
碰撞体BVH 凸包可视化, 碰撞高亮
工作空间可达空间 / 灵巧空间云图
数据叠加关节力矩 / TCP 力 / 功率 / 能耗实时数值
多视角透视 / 正交 / 跟随 / 自由视角

连接模式

模式说明适用场景
离线仿真不连实体, 纯软件运动学 + 轨迹仿真编程阶段, 无实体
在线监控连实体, 只读实时状态运行时监控, 不干预
在线控制连实体, 双向同步调试、远程示教
// 切换 3D 视口连接模式
SetTwinMode(Mode := TWIN_MONITORING); // 在线监控
SetTwinMode(Mode := TWIN_SIMULATION); // 离线仿真
SetTwinMode(Mode := TWIN_COMMAND); // 在线控制 (需安全确认)

实时状态同步

同步数据

数据类别字段周期说明
关节位置 q / 速度 q̇ / 力矩 τ1~10 ms每个关节独立
TCP位置 (x,y,z) / 姿态 (A,B,C)1~10 ms由 FK 计算
工具TCP 力 / 力矩 (Fx,Fy,Fz,Tx,Ty,Tz)5~20 ms需六维力传感器
IODI / DO / AI / AO1~10 ms与 PLC 全局 IO 同步
状态运行模式 / 急停 / 伺服使能 / 报警事件触发变化即推送
能耗功率 / 电流 / 关节温度100 ms趋势监控

数据通道

DarraLink (端口 18821) 是数字孪生数据的主通道:

物理机器人 → 伺服驱动器 → EtherCAT → DarraRT_Eth.sys
→ GlobalIO Section (零拷贝) → Darra.PLC.Service
→ DarraLink (18821) → IDE 3D 视口 / HMI 孪生看板

延迟链路:

典型延迟说明
伺服 → GlobalIO< 100 μs内核态零拷贝
GlobalIO → Service< 200 μs共享内存读
Service → DarraLink< 500 μs用户态序列化
DarraLink → IDE1~5 ms网络 (本地) / 10~50 ms (远程)

状态同步 API

// PLC 程序中读写孪生数据
VAR
TwinData : TWIN_STATE;
JointTorques : ARRAY[1..6] OF LREAL;
END_VAR

// 读取当前孪生状态
TwinData := ReadTwinState(Robot := Robot1);
// TwinData 包含: Joints, TCP, ToolForce, IO, Status, Timestamp

// 读取关节力矩 (需伺服支持)
ReadJointTorques(Robot := Robot1, Torques => JointTorques);

// 写入孪生标签 (显示在 3D 视口)
SetTwinTag(Robot := Robot1, Tag := "当前工件", Value := "Part_A_123");

离线编程与验证

数字孪生使离线编程 (Offline Programming) 成为可能 — 在 3D 环境中编写和验证程序, 然后部署到实体机器人。

离线编程流程

1. 导入环境模型 (工装、夹具、工件 CAD)
2. 在 3D 视口中示教路径点 (鼠标拖拽 / 坐标输入)
3. 生成运动程序 (MOVJ / MOVL / MOVC)
4. 仿真运行, 检查碰撞、奇异、可达性
5. 优化路径 (缩短节拍、减少关节行程)
6. 编译下发到实体机器人
7. 实体首次运行时以低速验证 (25% 速度)

精度保证

离线编程的精度取决于孪生模型与实物的匹配程度:

误差来源典型偏差补偿方式
DH 参数公差±0.5~1 mm运动学标定
工装定位偏差±1~3 mm工装标定 (三点法)
关节柔性 / 重力变形±0.3~2 mm刚度补偿模型
伺服跟踪误差±0.1~0.5 mm动态参数优化

标定后典型精度: 离线编程路径在实机上的 TCP 偏差 < 1 mm (一般工业应用可接受)。

离线编程示例

// 离线编程的完整流程
PROGRAM OfflineProgram

VAR
// 示教路径点 (在 3D 视口中用鼠标采集)
pHome : ROBOT_POSE := {X := 400, Y := 0, Z := 600, A := 0, B := 90, C := 0};
pPick : ROBOT_POSE := {X := 200, Y := 150, Z := 100, A := 0, B := 90, C := 45};
pPlace : ROBOT_POSE := {X := 600, Y := -100, Z := 200, A := 180, B := 90, C := 0};

// 仿真验证结果
bPathValid : BOOL;
cycleTime : LREAL;
maxDist : LREAL;
END_VAR

// --- 仿真验证 ---

// 验证路径: 碰撞 + 奇异 + 可达性
bPathValid := ValidatePath(
Robot := Robot1,
Waypoints := [pHome, pPick, pPlace],
CheckCollision := TRUE,
CheckSingular := TRUE,
CheckReach := TRUE
);

// 预估节拍
cycleTime := EstimateCycleTime(
Robot := Robot1,
Waypoints := [pHome, pPick, pPlace],
Velocity := 80
);

// 检查各段 TCP 轨迹误差
maxDist := GetPathMaxDeviation(
Robot := Robot1,
Waypoints := [pHome, pPick, pPlace]
);

// --- 验证通过后部署 ---
IF bPathValid AND cycleTime < 5.0 THEN
Log.Info('Path valid: cycle = %.1f s, max dev = %.2f mm', cycleTime, maxDist);

// 编译并下发到实体
DeployProgram(Program := "PickPlace", Target := RUNTIME_PHYSICAL);
ELSE
Log.Error('Path validation failed');
END_IF;

预测碰撞检测

数字孪生可以预测未来轨迹上的碰撞, 而非仅检测当前时刻的碰撞。

预测原理

当前时刻 t₀:
机器人位姿 q(t₀)
目标路径 P = [p₁, p₂, ..., pₙ]

预测方法:
1. 沿路径前向采样 N 个未来位姿 (t₀ + Δt, t₀ + 2Δt, ..., t₀ + NΔt)
2. 对每个未来位姿跑 FK → 得到未来 TCP 位姿
3. 对每个未来 TCP 位姿, 检测自碰撞 + 环境碰撞
4. 如果有任何未来位姿碰撞 → 预测碰撞报警
参数默认说明
预测窗口500 ms向前预测的时间窗口
采样间隔50 ms预测窗口内采样 10 个点
预警提前量200 ms提前 200 ms 报警, 留够减速时间

预测碰撞 API

VAR
PredictionResult : PREDICTION_RESULT;
bWillCollide : BOOL;
ttc : LREAL; // Time-To-Collision [ms]
colType : STRING; // 碰撞类型
END_VAR

// 执行碰撞预测
PredictionResult := PredictCollision(
Robot := Robot1,
PlannedPath := CurrentPath,
Window := 500, // 500 ms 预测窗口
SampleRate := 50 // 50 ms 采样间隔
);

bWillCollide := PredictionResult.WillCollide;
ttc := PredictionResult.TimeToCollision;

IF bWillCollide THEN
colType := PredictionResult.CollisionType;

IF ttc < 200 THEN
// 即将碰撞 (< 200 ms)
StopMotion();
Log.Warn('Collision predicted in %.0f ms: %s', ttc, colType);
ELSE
// 可以减速避让
OverrideSpeed(30);
Log.Warn('Collision predicted in %.0f ms, slowing down', ttc);
END_IF;
END_IF;

与运行时碰撞检测的区别

特性运行时碰撞检测孪生预测碰撞检测
检测时机当前周期 (t₀)未来 (t₀ ~ t₀+500ms)
检测对象碰撞体碰撞体 + 路径
响应方式急停预警 / 减速 / 路径重规划
计算开销低 (< 30 μs)中 (< 200 μs)
是否需要路径不需要需要提前规划路径
误报率中 (路径可能变更)

最佳方案: 运行时碰撞检测 + 孪生预测碰撞检测 同时启用, 前者作为最后防线, 后者提供提前预警。

参数表

参数类型单位范围默认说明
TwinModeENUM-SIM / MON / CMDSIMULATION孪生模式
SyncIntervalUDINTms1..10010状态同步周期
PredictionWindowUDINTms100..2000500碰撞预测窗口
PredictionSampleUDINTms10..20050预测采样间隔
PredictionAlarmLeadUDINTms50..500200预警提前量
OfflineDeviationMaxLREALmm0.1..102.0离线编程最大允许偏差
EnableTwinLoggingBOOL--FALSE孪生数据落盘 (用于回放)
TwinLogDurationUDINTmin1..144060孪生日志时长

排错清单

现象原因解决
3D 视口机器人不动未连接或模式错误检查 TwinMode, 确认实体在线
孪生位置与实际偏差大DH 参数未标定运行运动学标定
状态同步延迟高网络或 DarraLink 瓶颈检查网络延迟, 增大 SyncInterval
预测碰撞频繁误报路径规划与实际执行不符确认 PathPlan 与执行路径一致
离线编程精度不足工装定位偏差做工装标定 (三点法)
孪生日志文件过大日志周期太短调大 TwinLogDuration 或关 EnableTwinLogging

最佳实践

  1. 先标定再离线编程: 运动学标定 + 工装标定是离线编程精度的前提。
  2. 预测碰撞 + 运行时碰撞同时开: 预测碰撞做预警, 运行时碰撞做最后防线。
  3. 孪生日志用于故障复盘: 开启孪生日志, 现场故障可回放分析。
  4. 离线编程部署后低速首跑: 新部署的离线程序首跑用 25% 速度, 确认无偏差。
  5. 双向同步慎用: 在线控制模式 (TWIN_COMMAND) 有安全风险, 只在调试时启用。
  6. 孪生看板进 HMI: 现场 HMI 上显示孪生状态, 操作员一目了然。

相关文档