1. 基础数字孪生框架搭建

基础数字孪生框架搭建 学习卡片

任务说明

本案例构建一个最小化的数字孪生框架,包含三个核心组件:物理实体(被仿真的对象)、虚拟模型(物理实体的数字映射)以及数据连接(两者之间的双向数据通道)。框架采用Python实现,通过一个温度控制场景演示:物理实体模拟一个随时间自然冷却的加热器,虚拟模型实时接收物理实体的温度数据并同步状态,同时支持将虚拟模型中的控制指令下发至物理实体。

框架设计

框架由三个类组成:PhysicalEntity(物理实体)、VirtualModel(虚拟模型)和DataConnection(数据连接)。物理实体内部维护真实状态(温度),并按照物理规律(自然冷却)随时间演化;虚拟模型维护与物理实体对应的影子状态,通过数据连接同步更新;数据连接负责双向传输——上行方向将物理实体的状态推送到虚拟模型,下行方向将虚拟模型的控制指令传递给物理实体。三者通过组合方式关联,形成最小闭环。

物理实体 PhysicalEntity 状态: 温度 temp (随时间自然冷却) 方法: update() 方法: apply_command() 传感器上报 虚拟模型 VirtualModel 影子状态: temp (与物理实体同步) 方法: sync() 方法: set_target() 控制指令下发 数据连接 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步仿真过程,验证以下三点:

  1. 状态同步:每一步中“影子温度”列与“物理温度”列数值接近(存在±0.3以内的传感器噪声),说明上行数据连接正常工作;
  2. 控制闭环:当物理温度高于61°C时,控制指令为heat_off,温度逐渐下降;当温度低于59°C时,指令切换为heat_on,温度开始回升——说明下行控制通道生效;
  3. 收敛行为:仿真后期物理温度在目标值60°C附近波动(约±2°C范围内),证明虚拟模型通过数据连接对物理实体实现了有效的闭环调节。

判定标准:程序无异常退出,且上述三点观察结果均成立,即判定案例实现通过。