EnerOS v0.37.0
发布日期:2026-05-23
版本代号:TwinX
Git Tag:v0.37.0
支持状态:稳定(Stable)
Crate 总数:90(新增 6 个)
测试用例数:11400+(新增 700)
概述
EnerOS v0.37.0「TwinX」是数字孪生增强专题版本,将 EnerOS 的数字孪生能力从「二维数据映射」升级为「三维可视化 + 物理仿真 + 沉浸式交互」的完整数字孪生体系。本版本使 EnerOS 能够构建与物理电网 1:1 对应的三维数字孪生体,支撑运维巡检、培训演练、方案预演等场景。
TwinX 版本的核心设计哲学是「虚实同步 + 物理一致」——数字孪生体不仅在外观上与物理设备一致,在行为上也遵循物理定律。孪生体的状态变化由实时数据驱动,孪生体的操作预演由物理仿真保障,确保「在数字空间看到的就是物理空间发生的,在数字空间操作的预演结果就是物理空间操作的结果」。
本版本引入五大核心能力:三维可视化引擎、物理仿真集成、AR/VR 接口、实时同步框架、孪生场景编排。所有能力均通过 eneros-twinx、eneros-twinx-3d、eneros-twinx-physics、eneros-twinx-arvr、eneros-twinx-sync 五个新 crate 实现。
关键数据
| 指标 | 数值 | 说明 |
|---|---|---|
| 三维场景加载 | 1.2s | 1000 设备 |
| 实时同步延迟 | 50ms | 状态刷新 |
| 物理仿真帧率 | 60 FPS | 实时渲染 |
| AR 端到端延迟 | 35ms | 含渲染 |
| 新增 Crate | 6 | 孪生相关 |
| 新增测试 | 700+ | 含 80 个端到端 |
新特性
1. 三维可视化引擎
新增 eneros-twinx-3d crate,提供基于 WebGPU 的三维渲染引擎,支持变电站、线路、设备的精细化三维建模与实时渲染。
三维场景构建
use eneros_twinx_3d::{Scene3D, SceneBuilder, Camera, Lighting};
let mut scene = SceneBuilder::new()
.background(Environment::Sky)
.lighting(Lighting::sun_position(now()))
.camera(Camera::orbit().target(0.0, 10.0, 0.0).distance(50.0))
.build().await?;
// 从拓扑自动生成三维场景
scene.load_from_topology(&network).await?;
// 加载设备三维模型
scene.load_model("transformer-110kv", "/models/transformer.glb").await?;
scene.load_model("breaker-vacuum", "/models/breaker.glb").await?;
// 绑定设备实例到三维对象
for equipment in &network.equipments {
scene.bind_instance(equipment.id, &equipment.model_3d, equipment.position)?;
}
scene.start_render().await?;
三维对象属性
| 属性 | 类型 | 说明 |
|---|---|---|
| geometry | Mesh | 三维几何体 |
| material | PBR | 物理材质 |
| transform | Matrix4x4 | 位置/旋转/缩放 |
| animation | Skeleton | 骨骼动画 |
| interaction | Collider | 碰撞检测 |
| metadata | JSON | 设备信息 |
状态驱动的可视化
// 设备状态实时驱动三维外观
scene.on_state_change(|device_id, state| {
let obj = scene.get_object(device_id)?;
match state {
DeviceState::Energized => obj.set_material(Material::emissive(Color::green())),
DeviceState::Deenergized => obj.set_material(Material::standard(Color::gray())),
DeviceState::Fault => {
obj.set_material(Material::emissive(Color::red()));
obj.start_animation("alarm_blink")?;
}
DeviceState::Maintenance => obj.set_material(Material::emissive(Color::yellow())),
}
}).await?;
// 实时数据驱动动态效果
scene.bind_data("transformer-001", "temperature", |obj, temp| {
// 温度越高,绕组发光越强
let intensity = (temp - 40.0) / 60.0;
obj.set_emissive_intensity(intensity.max(0.0));
}).await?;
2. 物理仿真集成
新增 eneros-twinx-physics crate,将物理仿真引擎集成到数字孪生体中,使三维场景中的设备行为符合物理定律。
仿真能力
| 仿真类型 | 引擎 | 应用场景 | 精度 |
|---|---|---|---|
| 刚体动力学 | rapier | 设备运动、碰撞 | 高 |
| 流体力学 | 自研 | 油流、气流 | 中 |
| 电磁场 | FEM | 电磁场分布 | 高 |
| 热力学 | FDM | 温度场分布 | 中 |
| 声学 | ray-tracing | 噪声传播 | 中 |
物理仿真示例
use eneros_twinx_physics::{PhysicsWorld, RigidBody, Collider};
let mut physics = PhysicsWorld::new();
physics.gravity(Vec3::new(0.0, -9.81, 0.0));
// 模拟开关操作的运动学
let breaker = RigidBody::dynamic()
.mass(5.0)
.collider(Collider::box_(0.2, 0.5, 0.2))
.build();
physics.add_body(breaker);
// 模拟开关分闸过程
physics.apply_force("breaker-arm", Vec3::new(0.0, 500.0, 0.0));
let trajectory = physics.simulate(Duration::milliseconds(100)).await?;
// 用于运维培训:观察分闸过程中的机械应力
for step in &trajectory {
println!("t={:.3}s position={:?} stress={:.1} N",
step.time, step.position, step.stress);
}
3. AR/VR 接口
新增 eneros-twinx-arvr crate,提供增强现实(AR)与虚拟现实(VR)接口,支持运维人员通过沉浸式设备与数字孪生体交互。
AR 巡检
use eneros_twinx_arvr::{ArSession, ArConfig, Overlay};
let ar = ArSession::new(ArConfig {
device: ArDevice::Hololens3,
anchor_strategy: AnchorStrategy::SpatialMapping,
hand_tracking: true,
voice_commands: true,
}).await?;
// 启动 AR 巡检
ar.start_inspection(StationId::from("SS-110-01")).await?;
// 设备信息叠加
ar.on_gaze(|device_id| {
let info = phm.get_profile(device_id).await?;
ar.show_overlay(Overlay::info_panel()
.title(&info.name)
.field("健康评分", format!("{:.1}", info.health_score.value))
.field("温度", format!("{:.1} C", info.current_temp))
.field("负荷率", format!("{:.1}%", info.load_rate))
.anchor(device_id))?;
}).await?;
// 语音命令
ar.on_voice("显示内部结构", |_| {
ar.set_xray_mode(true); // 透视内部结构
}).await?;
ar.on_voice("回放上次故障", |_| {
ar.replay_event("fault-2026-05-20-001");
}).await?;
VR 培训
use eneros_twinx_arvr::{VrSession, VrScenario};
let vr = VrSession::new(VrConfig {
device: VrDevice::Quest3,
teleport: true,
physics_interaction: true,
}).await?;
// 加载培训场景
vr.load_scenario(VrScenario::switch_operation_training()).await?;
// 学员操作评估
vr.on_action(|action| {
match action {
Action::ApproachDevice(id) => log::info!("接近设备 {}", id),
Action::OpenSwitch(id) => {
// 校验操作顺序
if !procedure.check_step("verify_deenergized")? {
vr.show_warning("请先验电!");
return;
}
vr.execute_switch_operation(id).await?;
}
Action::Complete => {
let score = procedure.evaluate();
vr.show_result(score);
}
}
}).await?;
AR/VR 能力对比
| 能力 | AR | VR | 说明 |
|---|---|---|---|
| 现实叠加 | 支持 | 不支持 | AR 核心能力 |
| 沉浸场景 | 部分 | 完全 | VR 核心能力 |
| 手势交互 | 支持 | 支持 | 两者均支持 |
| 语音控制 | 支持 | 支持 | 两者均支持 |
| 多人协作 | 支持 | 支持 | 共享空间 |
4. 实时同步框架
新增 eneros-twinx-sync crate,保障数字孪生体与物理电网的实时同步,支持亚秒级状态刷新。
同步架构
use eneros_twinx_sync::{SyncEngine, SyncConfig, SyncSource};
let sync = SyncEngine::new(&ctx)
.config(SyncConfig {
refresh_rate: 20, // 20 FPS
max_latency: Duration::milliseconds(100),
interpolation: true, // 帧间插值
extrapolation: false, // 禁止外推
priority: PriorityBy::Criticality,
})
.source(SyncSource::PmuStream { resolution: Duration::milliseconds(20) })
.source(SyncSource::ScadaPolling { interval: Duration::seconds(2) })
.source(SyncSource::TopologyEvents { realtime: true })
.build().await?;
// 启动实时同步
sync.start().await?;
// 同步状态监控
sync.on_metrics(|m| {
println!("同步延迟: {:.0}ms, 丢帧: {}, FPS: {:.1}",
m.latency_p99, m.dropped_frames, m.actual_fps);
}).await?;
同步优先级
| 数据类型 | 优先级 | 刷新频率 | 说明 |
|---|---|---|---|
| 保护动作 | 最高 | 实时 | 立即同步 |
| 开关状态 | 高 | 100ms | 拓扑变更 |
| 电压电流 | 中 | 20ms | PMU 数据 |
| 设备温度 | 低 | 5s | 缓变数据 |
| 环境数据 | 最低 | 60s | 气象数据 |
5. 孪生场景编排
新增 eneros-twinx crate(孪生核心),提供场景编排能力,支持预演、回放、对比等高级场景。
操作预演
use eneros_twinx::{ScenarioEngine, Scenario, ScenarioResult};
let engine = ScenarioEngine::new(&ctx);
// 构建操作预演场景
let scenario = Scenario::new("switch-maintenance-001")
.description("110kV 母线 5 检修转操作")
.step(Step::verify_deenergized(BusId::from(5)))
.step(Step::ground(BusId::from(5)))
.step(Step::maintenance_window(Duration::hours(4)))
.step(Step::remove_ground(BusId::from(5)))
.step(Step::energize(BusId::from(5)));
// 在孪生体中预演
let result: ScenarioResult = engine.dry_run(&scenario).await?;
println!("预演结果:");
println!(" 预计耗时: {:?}", result.estimated_duration);
println!(" 影响范围: {} 台设备", result.affected_devices);
println!(" 风险评估: {:?}", result.risk_level);
println!(" 约束检查: {}", if result.constraints_ok { "通过" } else { "违规" });
if result.has_warnings() {
for w in &result.warnings {
println!(" 警告: {}", w);
}
}
历史回放
// 回放某次故障事件
let replay = engine.replay_event("fault-2026-05-20-001")
.speed(0.5) // 0.5 倍速
.show_data_overlay(true)
.highlight_cascade(true) // 高亮连锁故障路径
.start().await?;
场景对比
// 对比两种调度方案的执行效果
let comparison = engine.compare(
Scenario::from_schedule(schedule_a),
Scenario::from_schedule(schedule_b),
).await?;
println!("方案对比:");
println!("{:<15} {:<15} {:<15}", "指标", "方案A", "方案B");
println!("{:<15} {:<15.0} {:<15.0}", "成本(元)", a.cost, b.cost);
println!("{:<15} {:<15.1}% {:<15.1}%", "消纳率", a.renewable, b.renewable);
println!("{:<15} {:<15.2} {:<15.2}", "网损(MW)", a.loss, b.loss);
改进
- 拓扑引擎:支持三维坐标属性,设备位置自动定位
- 时序引擎:孪生同步专用通道,延迟降低 60%
- 设备模型:新增 150+ 设备的三维模型模板
- 安全网关:孪生操作预演与实际控制严格隔离
- 可观测性:孪生体状态接入 Grafana 三维仪表盘
Bug 修复
- 修复
eneros-twinx-3d在大规模场景下帧率骤降的问题(#3703) - 修复
eneros-twinx-physics刚体仿真在高速碰撞时穿透的问题(#3710) - 修复
eneros-twinx-arvrAR 锚点在弱光环境下丢失的问题(#3716) - 修复
eneros-twinx-sync网络抖动时帧间插值异常的问题(#3722) - 修复
eneros-twinx场景回放在跨时区时时间轴错误的问题(#3728)
破坏性变更
Scene3D::load_from_topology:参数新增coordinate_system选项PhysicsWorld::simulate:返回类型从Trajectory改为Result<Trajectory>ArSession::start_inspection:参数从&str改为StationId
升级指南
- 更新
Cargo.toml中的eneros依赖至0.37.0 - 安装三维模型资源包:
eneros twinx install-models - 在
eneros.toml中配置 AR/VR 设备连接 - 运行
eneros twinx build-scene构建三维场景
致谢
感谢 36 位贡献者提交的 550+ 个 commit,以及三维建模团队提供的设备模型资源。