1. 基础数字孪生框架搭建
任务说明
本案例构建一个最小化的数字孪生框架,包含三个核心组件:物理实体(被仿真的对象)、虚拟模型(物理实体的数字映射)以及数据连接(两者之间的双向数据通道)。框架采用Python实现,通过一个温度控制场景演示:物理实体模拟一个随时间自然冷却的加热器,虚拟模型实时接收物理实体的温度数据并同步状态,同时支持将虚拟模型中的控制指令下发至物理实体。
框架设计
框架由三个类组成:PhysicalEntity(物理实体)、VirtualModel(虚拟模型)和DataConnection(数据连接)。物理实体内部维护真实状态(温度),并按照物理规律(自然冷却)随时间演化;虚拟模型维护与物理实体对应的影子状态,通过数据连接同步更新;数据连接负责双向传输——上行方向将物理实体的状态推送到虚拟模型,下行方向将虚拟模型的控制指令传递给物理实体。三者通过组合方式关联,形成最小闭环。
代码实现
import random
import time
class PhysicalEntity:
"""物理实体:模拟一个自然冷却的加热器"""
def __init__(self, initial_temp=80.0, ambient_temp=25.0, cooling_rate=0.05):
self.temp = initial_temp # 当前温度(真实状态)
self.ambient = ambient_temp # 环境温度
self.rate = cooling_rate # 冷却系数
self.heating = False # 加热开关状态
def update(self):
"""物理规律演化:未加热时自然冷却,加热时升温"""
if self.heating:
self.temp += 2.0 # 加热功率
else:
self.temp -= self.rate * (self.temp - self.ambient)
self.temp = round(self.temp, 2)
def apply_command(self, cmd):
"""接收来自虚拟模型的控制指令"""
if cmd == "heat_on":
self.heating = True
elif cmd == "heat_off":
self.heating = False
def read_sensor(self):
"""传感器读数(模拟测量噪声)"""
noise = random.uniform(-0.3, 0.3)
return round(self.temp + noise, 2)
class VirtualModel:
"""虚拟模型:物理实体的数字映射"""
def __init__(self):
self.temp = None # 影子温度
self.target_temp = 60.0 # 目标温度
self.last_sync_time = None
def sync(self, sensor_value):
"""与物理实体同步状态"""
self.temp = sensor_value
self.last_sync_time = time.time()
def decide_command(self):
"""根据影子状态与目标值产生控制指令"""
if self.temp is None:
return "heat_off"
if self.temp < self.target_temp - 1.0:
return "heat_on"
elif self.temp > self.target_temp + 1.0:
return "heat_off"
return "heat_off" # 在目标范围内保持现状
class DataConnection:
"""数据连接:双向传输通道"""
def __init__(self, physical, virtual):
self.physical = physical
self.virtual = virtual
def upload(self):
"""上行:物理实体 → 虚拟模型"""
sensor_data = self.physical.read_sensor()
self.virtual.sync(sensor_data)
return sensor_data
def download(self):
"""下行:虚拟模型 → 物理实体"""
cmd = self.virtual.decide_command()
self.physical.apply_command(cmd)
return cmd
def run_simulation(steps=20, interval=0.1):
"""运行数字孪生仿真循环"""
# 初始化组件
physical = PhysicalEntity(initial_temp=80.0)
virtual = VirtualModel()
conn = DataConnection(physical, virtual)
print("=== 数字孪生仿真开始 ===")
print(f"{'步数':<4} {'物理温度':>8} {'影子温度':>8} {'控制指令':>10}")
print("-" * 36)
for step in range(1, steps + 1):
# 1. 物理实体演化
physical.update()
# 2. 上行同步:物理 → 虚拟
sensor = conn.upload()
# 3. 下行控制:虚拟 → 物理
cmd = conn.download()
# 4. 输出当前状态
print(f"{step:<4} {physical.temp:>8.2f} {virtual.temp:>8.2f} {cmd:>10}")
time.sleep(interval)
print("=== 仿真结束 ===")
if __name__ == "__main__":
run_simulation(steps=15, interval=0.05)
运行与验证
运行方式:将上述代码保存为 digital_twin.py,在Python 3.6+环境中执行 python digital_twin.py。
验证方法:观察控制台输出的15步仿真过程,验证以下三点:
- 状态同步:每一步中“影子温度”列与“物理温度”列数值接近(存在±0.3以内的传感器噪声),说明上行数据连接正常工作;
- 控制闭环:当物理温度高于61°C时,控制指令为
heat_off,温度逐渐下降;当温度低于59°C时,指令切换为heat_on,温度开始回升——说明下行控制通道生效; - 收敛行为:仿真后期物理温度在目标值60°C附近波动(约±2°C范围内),证明虚拟模型通过数据连接对物理实体实现了有效的闭环调节。
判定标准:程序无异常退出,且上述三点观察结果均成立,即判定案例实现通过。