给一台真机器建"数字分身":OpenTwins数字孪生平台零基础上手实战
【免费下载链接】opentwinsInnovative open-source platform that specializes in developing next-gen compositional digital twins项目地址: https://gitcode.com/gh_mirrors/op/opentwins
先回答你最关心的问题:OpenTwins 是一个专攻"组合式数字孪生"的开源平台,它把 Eclipse Ditto、Eclipse Hono、InfluxDB、Grafana 等成熟组件拼装成一套完整工具链,让你能用"类型定义 + 自动实例化"的方式,给物理设备建出可以实时联动、层层嵌套的数字分身。本文不堆概念,直接带你把一辆车"搬"进系统。
先理解一件事:数字孪生到底在解决什么
想象你有一台工业机器人,想随时知道它的实时状态、历史趋势,甚至预测它什么时候会出故障。传统做法是:设备数据存一个数据库、监控面板用另一套工具、预测模型再单独搭一套,最后三套数据对不上。
OpenTwins 的思路很朴素——把"这台机器"的所有信息(静态属性 + 动态数据)统一收敛到一个叫Thing的实体里。Thing 是 Eclipse Ditto 提供的抽象概念,用 JSON 描述实体,含静态的 attributes(如型号、位置)和动态的 features(如温度、速度)。平台再帮你把实时数据、模拟数据、AI 预测数据全部接进来,数字孪生就成了这台机器的"唯一查询入口"。
一张图看懂它的五脏六腑
OpenTwins 采用微服务架构,全部组件容器化,官方推荐用 Kubernetes + Helm 管理。看下面这张架构图,记住四类颜色就够了:
- 蓝色(核心):Eclipse Ditto 负责孪生定义与管理,Eclipse Hono 统一接收 MQTT/HTTP/CoAP 等协议数据,MongoDB 存孪生状态,InfluxDB v2 存时间序列数据,Telegraf 负责采集入库,Grafana 是主前端。
- 绿色(组合能力):Extended API for Eclipse Ditto 在原生 API 之上加了一层"类型"与"组合"约束,OpenTwins 的 Grafana 插件则让你在界面上直接操作孪生和类型。这是 OpenTwins 区别于其他方案的核心贡献。
- 黄色(机器学习):Kafka-ML 管理模型生命周期,能持续用数据流做训练和推理;配套服务还能在设备断连时自动用模型"补数据"。
- 红色(3D):Unity 编译成 WebGL 后由 Grafana 面板插件渲染,点击 3D 模型还能联动其他面板。
30分钟实操:给一辆车建立可复现的数字孪生
第一步:一键部署平台
前置条件:Docker、Kubernetes(或 K3s)、Helm v3。本地开发建议用 minikube,配置不低于 4 核 CPU、8GB 内存、40GB 磁盘。然后执行:
helm repo add ertis https://ertis-research.github.io/Helm-charts/ helm upgrade --install opentwins ertis/OpenTwins --wait --dependency-update部署完成后访问 Grafana,进入Administration → Plugins启用 OpenTwins 插件,在配置页填入 Eclipse Ditto 和 Extended API 的地址(服务名分别是opentwins-ditto-nginx和opentwins-ditto-extended-api)。这里提个醒:默认密码是admin/admin,正式使用前务必改掉 Grafana 和 InfluxDB 的默认凭据。
第二步:定义"汽车"和"车轮"两个类型
类型(Type)是数字孪生的模板。打开插件里的Types页面,创建类型example:car,在 features 里加上gps。注意界面右侧会实时生成对应的 Ditto Thing JSON。
接着进入 car 类型的children标签页,创建子类型example:wheel,features 设为velocity和direction,实例数量填 4。这一步是关键——它建立了"一辆车由四个车轮组成"的组合关系。
第三步:一键实例化出 5 个孪生
进入Twins页面,点Create a new twin,选择 car 类型,命名mycar。系统会自动生成 1 个汽车孪生 + 4 个车轮孪生,关系一目了然:
不定义类型也能建孪生,表单里选 from scratch 即可。但强烈建议用类型:它标准化了结构、简化了批量创建,还能保证数据一致性。给未来留条省力的路,值得。
第四步:用 MQTT 注入真实数据
Eclipse Ditto 要求数据按 Ditto Protocol 格式发送。安装时平台已自动建好一条mosquitto-source-connection,订阅telemetry/#主题,所以你只需把消息发到这个主题。下面这段 Python 脚本(先pip install paho-mqtt)每 5 秒模拟一次 GPS 和四轮数据:
import paho.mqtt.client as mqtt, json, random, time client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) client.username_pw_set("your_user", "your_password") # 改成你的凭据 client.connect("localhost", 1883, 60) def pack(twin, value): return {"topic": f"example/{twin}/things/twin/commands/merge", "headers": {"content-type": "application/merge-patch+json"}, "path": "/features", "value": value} while True: t = round(time.time() * 1000) client.publish("telemetry/example/mycar", json.dumps(pack("mycar", { "gps": {"properties": {"latitude": random.uniform(-90, 90), "longitude": random.uniform(-180, 180), "time": t}}}))) for i in range(1, 5): client.publish(f"telemetry/example/mycar:wheel_{i}", json.dumps(pack( f"mycar:wheel_{i}", {"velocity": {"properties": {"value": random.uniform(0, 100), "time": t}}, "direction": {"properties": {"value": random.uniform(-45, 45), "time": t}}}))) time.sleep(5)数据没进孪生?三步排查:先用 MQTT Explorer 确认消息到达 broker;再检查是否连错了 Mosquitto 地址或端口;最后看 Ditto 连接日志http://<ditto-ip>/api/2/connections/mosquitto-source-connection/logs。
第五步:在 Grafana 里把它画出来
数字孪生数据落在 InfluxDB 的opentwinsbucket 里,用 Flux 查询。想看四轮速度对比,新建面板后用这条查询:
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")配上 GPS 当前位置、方向仪表盘和历史轨迹图,最终效果类似这样:
它在哪些场景真的能打,哪些场景别硬上
值得用的地方:
- 组合式设备群:一整条产线 = 若干机器人,每个机器人 = 若干关节,逐层定义类型、一次实例化,天然形成层级关系。
- 需要"真实 + 模拟 + 预测"三路数据对照:比如预测模型给出的故障预警,与真实传感器读数并列展示。
- 轻量边缘场景:官方提供 Lightweight 架构,用 Mosquitto 替代 Kafka、去掉时间序列库和可视化组件,可跑在树莓派上(见文档 docs/docs/overview/architecture.md)。
劝退边界:
- 高频消息慎用 Hono:官方明确指出 Eclipse Hono 在高消息频率下无法正确扩展,此时应让 Ditto 直连 Mosquitto 或 RabbitMQ。
- 不要在纯交互型可视化上期待它:它强在数据联动而非设计稿级 UI。
- 生产环境再等等:文档标注平台仍在开发中,不建议现阶段用于生产。选型前先做 PoC。
避开这五个坑,你的实践就成功了一半
- 不改默认密码:Grafana、InfluxDB 的默认凭据是公开的,先改再部署。
- 把 localhost 当服务地址:集群内部访问要用 ClusterIP 或 NodePort,别在 Grafana 数据源里填 localhost。
- 不建类型直接裸建孪生:单个可行,但几十上百个孪生会失控,维护成本爆炸。
- 忽视消息格式:不是任何 JSON 都能进 Ditto,要么按 Ditto Protocol 发,要么给连接加 JavaScript Mapping 做格式转换(示例见 docs/docs/examples/string-example.mdx)。
- 一次装全量组件:按需部署,边缘设备用
helm install ot ertis/OpenTwins-Lightweight,别为省事背上 K8s 集群的内存开销。
下一步,从"跑通"到"会用"
跑通上面五步,你已经完成了从部署到可视化的最小闭环。继续深入,推荐按这个顺序走:
- 学透组合与类型:docs/docs/guides/definition/ 里的类型创建与 schema 指南,理解图状类型与树状孪生的约束差异。
- 接真实设备:参考树莓派示例 docs/docs/examples/raspberry-example/,用 HTTP API 直接创建孪生和连接。
- 试 3D 联动:用 Unity 编译 WebGL 场景导入 Grafana 面板,文档在 docs/docs/guides/unity/。
- 探索机器学习集成:部署 Kafka-ML,把预测结果写回孪生,实现故障预警闭环(见 docs/docs/guides/fmi/)。
想快速拿到全部代码和文档,直接git clone https://gitcode.com/gh_mirrors/op/opentwins,仓库内docs/docs/就是完整手册,files_for_manual_deploy/目录里还提供了不用 Helm 的裸部署 YAML,适合想彻底搞清楚每个组件怎么连的人。
最后留一个问题给你:如果把这套"类型 + 组合 + 实时同步"的思路迁移到你自己手里的设备,你的第一棵数字孪生树会长成什么样?动手把第一辆车跑起来,答案自然会浮现。
【免费下载链接】opentwinsInnovative open-source platform that specializes in developing next-gen compositional digital twins项目地址: https://gitcode.com/gh_mirrors/op/opentwins
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考