数字孪生
数字孪生 (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 | 需六维力传感器 |
| IO | DI / DO / AI / AO | 1~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 → IDE | 1~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) |
| 是否需要路径 | 不需要 | 需要提前规划路径 |
| 误报率 | 低 | 中 (路径可能变更) |
最佳方案: 运行时碰撞检测 + 孪生预测碰撞检测 同时启用, 前者作为最后防线, 后者提供提前预警。
参数表
| 参数 | 类型 | 单位 | 范围 | 默认 | 说明 |
|---|---|---|---|---|---|
| TwinMode | ENUM | - | SIM / MON / CMD | SIMULATION | 孪生模式 |
| SyncInterval | UDINT | ms | 1..100 | 10 | 状态同步周期 |
| PredictionWindow | UDINT | ms | 100..2000 | 500 | 碰撞预测窗口 |
| PredictionSample | UDINT | ms | 10..200 | 50 | 预测采样间隔 |
| PredictionAlarmLead | UDINT | ms | 50..500 | 200 | 预警提前量 |
| OfflineDeviationMax | LREAL | mm | 0.1..10 | 2.0 | 离线编程最大允许偏差 |
| EnableTwinLogging | BOOL | - | - | FALSE | 孪生数据落盘 (用于回放) |
| TwinLogDuration | UDINT | min | 1..1440 | 60 | 孪生日志时长 |
排错清单
| 现象 | 原因 | 解决 |
|---|---|---|
| 3D 视口机器人不动 | 未连接或模式错误 | 检查 TwinMode, 确认实体在线 |
| 孪生位置与实际偏差大 | DH 参数未标定 | 运行运动学标定 |
| 状态同步延迟高 | 网络或 DarraLink 瓶颈 | 检查网络延迟, 增大 SyncInterval |
| 预测碰撞频繁误报 | 路径规划与实际执行不符 | 确认 PathPlan 与执行路径一致 |
| 离线编程精度不足 | 工装定位偏差 | 做工装标定 (三点法) |
| 孪生日志文件过大 | 日志周期太短 | 调大 TwinLogDuration 或关 EnableTwinLogging |
最佳实践
- 先标定再离线编程: 运动学标定 + 工装标定是离线编程精度的前提。
- 预测碰撞 + 运行时碰撞同时开: 预测碰撞做预警, 运行时碰撞做最后防线。
- 孪生日志用于故障复盘: 开启孪生日志, 现场故障可回放分析。
- 离线编程部署后低速首跑: 新部署的离线程序首跑用 25% 速度, 确认无偏差。
- 双向同步慎用: 在线控制模式 (TWIN_COMMAND) 有安全风险, 只在调试时启用。
- 孪生看板进 HMI: 现场 HMI 上显示孪生状态, 操作员一目了然。