资讯中心

OpenTwins数字孪生平台实战:用一天时间跑通组合式数字孪生的完整手记

📅 2026/8/20 11:35:55
OpenTwins数字孪生平台实战:用一天时间跑通组合式数字孪生的完整手记
OpenTwins数字孪生平台实战用一天时间跑通组合式数字孪生的完整手记【免费下载链接】opentwinsInnovative open-source platform that specializes in developing next-gen compositional digital twins项目地址: https://gitcode.com/gh_mirrors/op/opentwins假设你面前有一台随时可能罢工的机器传感器在响、PLC 在跑、历史数据散落在三张 Excel 表里而领导明天要看可视化大屏。你需要的不是一个新报表工具而是一个能把物理资产、实时数据、历史曲线和预警逻辑统一装进同一套体系的东西。这就是 OpenTwins 要解决的问题——它是一个专为组合式数字孪生设计的开源平台让你用类型定义、实例化、数据接入、可视化四步把任意物理系统镜像成可查询、可监控、可演进的数字实体。下文以项目从 0 到 1 落地的一天为主线带你走完全程。清晨先想清楚——你要的到底是仪表板还是数字孪生很多团队的第一反应是先上个 Grafana。但仪表板只能回答现在什么状态回答不了三个更难的问题这台设备的身份是什么它和上下游设备的关系是什么数据断了之后系统能不能自己意识到OpenTwins 的定位正是补上这三块。它的核心是 Eclipse Ditto——一个用 JSON 描述孪生实体叫 Thing的开源框架静态信息放attributes动态数据放features。平台在此基础上做了一层扩展 API让你能以**类型type为单位批量管理实体并定义实体之间的组合composition**关系。举个例子定义一个汽车类型声明它由 4 个车轮组成之后每次实例化汽车系统会自动生成 4 个车轮孪生——这比手动复制粘贴 JSON 高效得多也正是组合式数字孪生这个名字的由来。蓝色为核心功能Ditto、Hono、存储、消息中间件、Grafana绿色支持类型组合黄色接入机器学习红色提供 3D 可视化。一句话概括能力清单每一条都值得你在选型时对照自己的需求能力它解决什么通俗理解多协议接入MQTT / AMQP / Kafka / HTTP 共存设备用什么协议都行平台统一收口类型 组合批量建孪生、自动生成子实体像面向对象编程定义类再实例化时序存储InfluxDB v2 存历史曲线数据进来自动落库Grafana 直接查可视化Grafana 插件 Unity 3D2D 面板与 3D 模型可互相联动可插拔扩展Kafka-ML / FMI 仿真预测数据、仿真数据可与真实数据同屏顺带一提如果你只想跑在树莓派这类边缘设备上OpenTwins 还维护了一个轻量级版本OpenTwins-Lightweight用 Mosquitto 替代 Kafka、去掉历史库和可视化组件把资源占用压到很低。架构对比见 docs/docs/overview/architecture.md。上午一条 Helm 命令把平台请上你的机器先交代前提你需要 Docker、Kubernetes本地开发可用 Minikube和 Helm v3。建议给 Minikube 留出至少 4 核、8GB 内存、40GB 磁盘官方推荐配置如下minikube start --cpus 4 --disk-size 40gb --memory 8192 kubectl config use-context minikube接着添加官方 Helm 仓库并一键部署helm repo add ertis https://ertis-research.github.io/Helm-charts/ helm upgrade --install opentwins ertis/OpenTwins --wait --dependency-update等命令跑完用kubectl get pods应该能看到 ditto、hono、grafana、influxdb 等一串 Pod 处于 Running 状态。之后只剩一步接线OpenTwins 的界面是作为Grafana 插件存在的你需要把插件指向 Ditto 的两个服务。先用kubectl get services找到opentwins-grafana、opentwins-ditto-nginx、opentwins-ditto-extended-api三个服务的对外地址Minikube 下用minikube service 服务名 --url获取浏览器打开 Grafana默认账号密码是admin/admin进入Administration → Plugins启用 OpenTwins 插件在插件的 Configuration 标签页填入 Ditto 与 Extended API 的 URL凭据填ditto/ditto默认值保存。至此左侧菜单出现App → OpenTwins平台就绪。部署细节可随时回查 docs/docs/installation/using-helm.mdx。午后用类型画出你的系统再让它自动长出实例下面进入今天的核心实验给一辆车建数字孪生监控它的 GPS 和四个车轮的速度、方向。一共五步每一步都有明确产出。第 1 步定义汽车类型。进入Types页点Create new type在表单里填命名空间example、类型名car把基本信息名称、描述、图片和动态特征gps填进去。表单右侧会实时生成对应的 Ditto Thing JSON大致长这样{ thingId: example:car, policyId: default:basic_policy, attributes: { name: Car, description: Digital twin example }, features: { gps: { properties: { value: null } } } }第 2 步定义车轮类型并挂到汽车下。进入car类型的详情页切到children标签点Create new type创建wheel特征填velocity速度和direction方向。关键一步在表单下方实例数量填 4表示每实例化一辆车就自动创建 4 个车轮。第 3 步实例化。进入Twins页点Create a new twin指定标识为mycar选择car类型提交。系统会自动生成 5 个孪生example:mycar和它的 4 个车轮子孪生example:mycar:wheel_1~wheel_4。提醒一下类型不是必选项——你也可以从零直接建孪生。但有了类型批量创建、数据一致性、后续维护都会轻松一个量级强烈推荐为重复性实体建类型。黄昏给孪生接上心跳数据是怎么流进来的孪生建好时是空壳接下来注入数据。OpenTwins 安装时会自动建好一条名为mosquitto-source-connection的 MQTT 连接订阅telemetry/#下的所有主题所以最快的方式就是把数据发布到 MQTT。数据格式必须遵守 Ditto Protocol——它是一层 JSON 信封告诉 Ditto要改哪个孪生的哪段内容、怎么改。先装依赖然后跑一个 Python 脚本模拟传感器pip install paho-mqtt typing_extensionsimport paho.mqtt.client as mqtt import random, time, json # MQTT 连接信息改为你实际的 Mosquitto 地址和端口NodePort 默认 30511 broker, port localhost, 1883 username, password your_user, your_pass # 按需填写无认证则删掉下一行 client mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) client.username_pw_set(username, password) client.connect(broker, port, 60) def build_msg(name, value): # Ditto Protocol 信封merge 命令合并写入 /features return { topic: example/{}/things/twin/commands/merge.format(name), headers: {content-type: application/merge-patchjson}, path: /features, value: value, } while True: t round(time.time() * 1000) # 毫秒时间戳 # 汽车孪生随机 GPS 位置 gps {gps: {properties: { latitude: random.uniform(-90, 90), longitude: random.uniform(-180, 180), time: t}}} client.publish(telemetry/example/mycar, json.dumps(build_msg(mycar, gps))) # 四个车轮孪生速度 方向 for i in range(1, 5): wheel { velocity: {properties: {value: random.uniform(0, 100), time: t}}, direction: {properties: {value: random.uniform(-45, 45), time: t}}} client.publish(telemetry/example/mycar:wheel_{}.format(i), json.dumps(build_msg(mycar:wheel_{}.format(i), wheel))) time.sleep(5) # 每 5 秒发一轮运行后回到 Twins 列表打开example:mycar会发现gps特征里已经出现实时经纬度四个车轮的数据也在滚动更新。如果你想看消息是否真的到达了 MQTT 这一环用 MQTT Explorer 订阅telemetry/#即可一目了然。如果你的设备不能改报文格式也没关系——Ditto 连接支持JavaScript 映射在连接的 Source/Target 里挂一段mapToDittoProtocolMsg函数就能把任意自定义 JSON 自动翻译成 Ditto Protocol。生产线的非标设备常用这招例子可参考 docs/docs/examples/string-example.mdx。傍晚上线把数据变成能读懂的仪表板数据进来了最后一步是让它看得见。孪生数据通过 Telegraf 落进 InfluxDB v2bucket 名为opentwinsHelm 默认已配好 Grafana 数据源你只需新建面板并写 Flux 查询。比如四个车轮速度对比import strings from(bucket: opentwins) | range(start: v.timeRangeStart, stop: v.timeRangeStop) | filter(fn: (r) r[_measurement] mqtt_consumer) | filter(fn: (r) strings.hasPrefix(v: r[thingId], prefix: example:mycar:wheel_)) | filter(fn: (r) r[_field] value_velocity_properties_value) | map(fn: (r) ({ r with thingId: strings.replace(v: r[thingId], t: example:mycar:, u: , i: 2) })) | keep (columns: [thingId, _value, _time])同样的思路可以拼出当前 GPS 位置GPS 轨迹车轮当前方向等面板。完成后你会得到一张类似下图的驾驶舱式仪表板——到这里你的第一个数字孪生就算真正活了。夜里复盘三个最容易卡住的地方孪生数据不更新卡在哪一环用 MQTT Explorer 订阅telemetry/#验证消息是否到达 Mosquitto。若消息根本发不出去多半是地址/端口配错注意集群环境下 Mosquitto 默认 NodePort 是 30511。若消息在但孪生不变问题出在 Ditto 连接本身去查看连接日志http://ditto-ip:ditto-port/api/2/connections/mosquitto-source-connection/logsDitto 的地址要查 nginx 服务。Pod 一直 CrashLoopBackOff大概率是内存不够。kubectl logs pod-name --previous看日志确认后用kubectl edit deployment 名称调大 resources 限制即可官方 Helm values 里也给了各组件建议值。Grafana 连不上 InfluxDB 数据源先kubectl get svc influxdb确认服务在跑再检查网络策略——数据源地址要用集群内地址ClusterIP而不是 localhost端口是 8086。把同一套玩法复制到别的行业这套类型 → 实例 → 接入 → 可视化的流水线换个场景就是换一层皮。比如智能制造把机器人臂建模为类型state和consumption做特征PLC 网关数据经 MQTT 流入Grafana 上搭产线级监控墙异常时还能用 Kafka-ML 接预测模型做故障预警。智慧能源光伏电站按逆变器建类型电量、温度、故障码入 InfluxDB叠加天气预报数据做发电预测数据流是传感器 → MQTT → Ditto → InfluxDB → Grafana/报警系统。3D 可视化场景Unity 把模型导出为 WebGL借助官方 Grafana 插件嵌入面板点 3D 模型上的部件就能联动刷新其他面板数据适合设备拆解演示或运维培训。接下来该往哪儿走今天这套最小闭环部署、类型、实例、数据、面板对应的官方资料都在项目里可以直接翻快速开始 docs/docs/quickstart.mdx、架构与概念 docs/docs/overview/architecture.md 与 docs/docs/overview/concepts.md、连接配置 docs/docs/guides/connection-creation.mdx还有树莓派示例 docs/docs/examples/raspberry-example/raspberry-example.mdx。想拿到全部源码和文档克隆仓库即可git clone https://gitcode.com/gh_mirrors/op/opentwins。建议你按这样的顺序落地先在本机用今天的五步跑通一个假想设备再挑一台真实设备把 Ditto Protocol 换成 JavaScript 映射接入最后才考虑加 ML 预测或 Unity 3D。别一上来就追求大而全——数字孪生的价值是在一次次数据闭环中长出来的而 OpenTwins 恰好把这条闭环的路修得足够短。【免费下载链接】opentwinsInnovative open-source platform that specializes in developing next-gen compositional digital twins项目地址: https://gitcode.com/gh_mirrors/op/opentwins创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考