Jumeau numérique

Jumeau numérique d'entrepôt pour les opérations logistiques

Comment construire un jumeau numérique d'entrepôt qui suit les mouvements de stock, les AGV et l'état des convoyeurs dans un modèle 3D en direct alimenté par des topics MQTT, avec conception des topics, code et pièges à éviter.

Jumeau numérique d'entrepôt en 3D montrant des racks, des AGV circulant entre les allées et des sections de convoyeur colorées selon leur état en direct
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

Un jumeau numérique d'entrepôt est un modèle 3D ou 2D en direct de votre centre de distribution, dans lequel les stocks se déplacent, les AGV circulent et les convoyeurs changent d'état comme ils le font sur le terrain. Ce guide couvre les cas d'usage qui comptent pour les équipes logistiques, la conception des topics MQTT pour les véhicules, les convoyeurs et les mouvements de stock, et la façon de prototyper un jumeau mis à jour en temps réel.

Ce que montre un jumeau numérique d'entrepôt

Un entrepôt est un système de flux. Les marchandises arrivent, sont stockées, prélevées, emballées et expédiées, et les goulots se déplacent au fil de la journée. Les systèmes traditionnels fragmentent l'image :

  • Le WMS (système de gestion d'entrepôt) connaît les emplacements, les commandes et les niveaux de stock.
  • Le WCS ou les automates connaissent l'état des convoyeurs et des trieurs.
  • Le gestionnaire de flotte sait où se trouvent les AGV et AMR et ce qu'ils font.
  • Les terminaux de scan et la RFID génèrent des événements de mouvement.

Un jumeau numérique d'entrepôt fusionne ces flux dans un seul modèle spatial. Un superviseur voit un bourrage se former au point de convergence 4, trois AGV en file derrière, et la vague d'expédition qui manquera l'heure de départ de son camion si le bourrage dure encore dix minutes. Pour les concepts généraux du jumeau, voir le guide de la technologie du jumeau numérique.

Cas d'usage pour les opérations logistiques

Cas d'usage Données nécessaires Apport du jumeau
Vue d'ensemble en direct État des convoyeurs, positions des AGV, état des portes de quai Image spatiale des zones où le travail circule ou bloque
Détection des congestions et bourrages État des cellules photoélectriques, occupation des zones, longueur des files d'AGV Montre les files qui se forment en amont d'un défaut
Supervision de la flotte d'AGV Position, batterie, mission, codes d'erreur Santé de la flotte et points chauds de trafic sur le plan
Mouvements de stock Événements de scan et RFID avec emplacements Trajet réel du stock par rapport au trajet prévu
Analyse d'adressage Fréquence de prélèvement par emplacement dans le temps Cartes de chaleur qui guident le déplacement des références à forte rotation
Simulation d'implantation Flux historiques rejoués sur une implantation modifiée Estime l'effet du déplacement de postes ou de l'ajout de voies

Les trois premiers sont en temps réel et dépendent de données à faible latence. Les trois derniers s'appuient sur l'historique et c'est là que le jumeau se rentabilise sur plusieurs mois.

Architecture de données avec MQTT

L'architecture la plus propre place un broker MQTT entre chaque source et chaque consommateur :

  1. Convoyeurs et trieurs : les automates ou le WCS publient l'état des zones et les alarmes de bourrage à chaque changement.
  2. AGV et AMR : le gestionnaire de flotte (ou les véhicules eux-mêmes) publie la position et l'état à fréquence fixe, généralement une à quelques fois par seconde.
  3. Événements WMS : un petit adaptateur publie les mouvements de stock (rangement, prélèvement, transfert) sous forme d'événements.
  4. Services du jumeau : des abonnés qui calculent longueurs de file, temps de séjour et scores de congestion, et écrivent l'historique.
  5. Visionneuses du jumeau : des clients navigateur qui s'abonnent en WebSocket sécurisé et animent la scène 3D.

Un broker MQTT managé est bien adapté, car la valeur du jumeau dépend de la disponibilité permanente de cette colonne vertébrale, et les équipes informatiques des entrepôts se concentrent généralement sur le WMS plutôt que sur l'exploitation d'un broker.

Conception des topics

connectmq/<site>/<area>/<asset-type>/<asset-id>/<data-type>

connectmq/dc-east/outbound/conveyor/zone-12/state
connectmq/dc-east/outbound/conveyor/merge-4/alarm
connectmq/dc-east/fleet/agv/agv-03/pose
connectmq/dc-east/fleet/agv/agv-03/status
connectmq/dc-east/inventory/movements

Quelques règles pratiques :

  • État des zones de convoyeur : retenu, QoS 1, publié uniquement en cas de changement.
  • Positions des AGV : non retenues, QoS 0, fréquence fixe. Une mise à jour de position perdue est remplacée un instant plus tard.
  • État et erreurs des AGV : retenus, QoS 1, pour qu'une visionneuse ouverte en cours de poste voie la mission et la batterie actuelles.
  • Mouvements de stock : événements en QoS 1, non retenus, consommés par un service qui tient à jour les positions de stock.

L'article synchronisation d'état d'un jumeau numérique explique ces choix plus en détail.

Pratique : animer un AGV et une zone de convoyeur

Prototypez avec le serveur MQTT public gratuit broker.connectmq.com, réservé aux tests et aux prototypes. Ses limites (10 messages par seconde et par client, 64 Ko par message) conviennent pour quelques véhicules simulés. N'y publiez pas de données opérationnelles réelles, car l'espace public est lisible par tous.

Un simulateur Python pour un AGV qui parcourt une boucle et une zone de convoyeur qui se bloque de temps en temps :

import json
import math
import random
import time
import uuid

import paho.mqtt.client as mqtt

RUN = "wh-44d0"  # remplacez par votre propre identifiant unique
BASE = f"connectmq/demo/{RUN}/dc-east"

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"wh-sim-{uuid.uuid4().hex[:6]}")
client.connect("broker.connectmq.com", 1883, keepalive=30)
client.loop_start()

t = 0.0
battery = 100.0
zone_state = "running"
client.publish(f"{BASE}/outbound/conveyor/zone-12/state", json.dumps({"state": zone_state}), qos=1, retain=True)

while True:
    t += 0.5
    x = 20 + 15 * math.cos(t / 10)
    y = 10 + 6 * math.sin(t / 10)
    heading = (math.degrees(t / 10) + 90) % 360
    battery = max(5.0, battery - 0.01)
    client.publish(f"{BASE}/fleet/agv/agv-03/pose",
                   json.dumps({"x": round(x, 2), "y": round(y, 2), "headingDeg": round(heading, 1), "ts": time.time()}))
    if int(t * 2) % 20 == 0:
        client.publish(f"{BASE}/fleet/agv/agv-03/status",
                       json.dumps({"mission": "replenish-A12", "batteryPct": round(battery, 1)}), qos=1, retain=True)
    new_state = "jammed" if random.random() < 0.02 else ("running" if zone_state == "jammed" and random.random() < 0.2 else zone_state)
    if new_state != zone_state:
        zone_state = new_state
        client.publish(f"{BASE}/outbound/conveyor/zone-12/state", json.dumps({"state": zone_state, "ts": time.time()}),
                       qos=1, retain=True)
        print("zone-12 ->", zone_state)
    time.sleep(0.5)

Dans le navigateur, la visionneuse s'abonne et déplace un objet 3D :

import mqtt from "mqtt";

const base = "connectmq/demo/wh-44d0/dc-east";
const client = mqtt.connect("wss://broker.connectmq.com:8084/mqtt", {
  clientId: "wh-viewer-" + Math.random().toString(16).slice(2, 10),
  protocolVersion: 5,
});

client.on("connect", () => {
  client.subscribe([`${base}/fleet/agv/+/pose`, `${base}/fleet/agv/+/status`, `${base}/outbound/conveyor/+/state`]);
});

client.on("message", (topic, payload) => {
  const data = JSON.parse(payload.toString());
  const parts = topic.split("/");
  if (topic.endsWith("/pose")) {
    const agv = scene.getObjectByName(parts[parts.length - 2]);
    if (agv) {
      agv.position.set(data.x, 0, data.y);
      agv.rotation.y = (-data.headingDeg * Math.PI) / 180;
    }
  } else if (topic.endsWith("/state")) {
    const zone = scene.getObjectByName(parts[parts.length - 2]);
    if (zone) zone.material.color.set(data.state === "jammed" ? 0xd94040 : 0x3fa34d);
  }
});

L'objet scene est votre scène three.js, avec des maillages nommés d'après les identifiants des équipements. Interpoler les positions entre les messages rend le mouvement fluide, même à deux mises à jour par seconde. Voir jumeau numérique avec three.js pour construire la scène, et la démo web de jumeau numérique 3D de ConnectMQ pour un exemple fonctionnel avec un convoyeur et un bras robotisé diffusés en direct via WSS.

Checklist de déploiement

  1. Commencez par une zone, par exemple les convoyeurs d'expédition, où les bourrages sont coûteux et visibles.
  2. Procurez-vous un plan à l'échelle et convenez d'un système de coordonnées unique pour les positions des AGV et le modèle 3D.
  3. Associez chaque zone d'automate et chaque identifiant d'AGV à un nom de maillage dans le modèle.
  4. Publiez les états à chaque changement et les positions à une fréquence fixe et modérée.
  5. Passez à un broker privé en TLS avant de connecter les systèmes réels, avec un identifiant par système source.
  6. Comptez les connexions : chaque AGV, passerelle, service et onglet de visionneuse est un client. Le plan Serverless gratuit en accepte jusqu'à 25 ; le Serverless payant jusqu'à 1 000.
  7. Enregistrez l'historique pour l'analyse d'adressage et d'implantation avec un abonné distinct.
  8. Validez le jumeau par rapport au terrain pendant un poste chargé avant de vous y fier.

Pièges courants

  • Incohérences de coordonnées. L'origine de la carte du gestionnaire de flotte correspond rarement à celle de la CAO. Calibrez avec des points connus.
  • Inonder le broker de positions. Dix véhicules à 20 Hz, c'est inutile pour la visualisation. Deux à cinq mises à jour par seconde avec interpolation donnent un rendu fluide.
  • Traiter les données WMS comme du temps réel. Beaucoup de mises à jour WMS sont regroupées. Affichez leurs horodatages pour que les utilisateurs sachent à quel point les données de stock sont fraîches.
  • Surdimensionner le modèle 3D. De simples boîtes pour les racks et les convoyeurs s'affichent plus vite et sont plus faciles à maintenir.
  • Ignorer les déconnexions. Si le gestionnaire de flotte ou une passerelle d'automate quitte le réseau, le jumeau continue d'afficher les dernières positions et états comme si de rien n'était. Publiez un état en ligne/hors ligne retenu pour chaque source (les messages last will de MQTT sont parfaits pour cela) et grisez les équipements dont la source est hors ligne, afin que les superviseurs n'agissent jamais sur des données figées.
  • Une visionneuse par écran, sans limite. Chaque onglet de navigateur ouvert est un client MQTT distinct. Écrans muraux, ordinateurs portables des superviseurs et tablettes s'additionnent vite : incluez-les dans la planification des limites de connexions.

Bon nombre de ces principes sont communs avec le jumeau numérique d'usine.

Construisez votre jumeau numérique d'entrepôt sur ConnectMQ

ConnectMQ offre à vos automates, à votre gestionnaire de flotte et à vos visionneuses navigateur une colonne vertébrale MQTT unique, avec prise en charge de TLS, WebSocket et MQTT 5. Créez un broker Serverless gratuit sur app.connectmq.com, sans carte bancaire, et utilisez l'explorateur de topics en direct pour observer les topics des AGV et des convoyeurs pendant que vous construisez le jumeau.

Questions fréquentes

Qu'est-ce qu'un jumeau numérique d'entrepôt ?

C'est un modèle numérique vivant d'un entrepôt qui reflète en temps réel les mouvements de stock, les positions des véhicules et l'état des équipements, utilisé pour la supervision, l'analyse et la planification de l'implantation.

À quelle fréquence publier les positions des AGV ?

Pour la visualisation, une à cinq mises à jour par seconde suffisent généralement lorsque la visionneuse interpole entre les positions. La navigation critique pour la sécurité reste du ressort du système de gestion de flotte lui-même.

Un jumeau d'entrepôt peut-il s'intégrer à mon WMS ?

Oui. Un adaptateur lit les événements du WMS via son API ou sa base de données et les publie sur MQTT, de sorte que le jumeau les consomme comme n'importe quelle autre source de données.

Faut-il utiliser des retained messages pour l'état des convoyeurs ?

Oui. Retenir les topics d'état permet à une visionneuse nouvellement ouverte d'afficher immédiatement l'état actuel de chaque zone au lieu d'attendre le prochain changement.

Articles liés

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.