Gêmeo digital

Gêmeo Digital de Armazém para Operações Logísticas

Como construir um gêmeo digital de armazém que acompanha a movimentação de estoque, AGVs e estados das esteiras em um modelo 3D ao vivo alimentado por topics MQTT, com design de topics, código e armadilhas.

Gêmeo digital de armazém em 3D mostrando porta-paletes, AGVs circulando entre corredores e trechos de esteira coloridos pelo status ao vivo
Rode isso no seu próprio broker MQTTTenha um broker MQTT privado e gerenciado no plano Free e comece com exemplos de código prontos.
Teste grátis Exemplos de código Sem cartão de crédito

Um gêmeo digital de armazém é um modelo 3D ou 2D ao vivo do seu centro de distribuição, seja um CD de varejo no interior de São Paulo ou um armazém de cooperativa do agronegócio, no qual o estoque se movimenta, os AGVs circulam e as esteiras mudam de estado exatamente como acontece no chão. Este guia aborda os casos de uso que importam para equipes de logística, como projetar topics MQTT para veículos, esteiras e movimentações de estoque e como prototipar um gêmeo que se atualiza em tempo real.

O Que um Gêmeo Digital de Armazém Mostra

Um armazém é um sistema de fluxo. As mercadorias chegam, são armazenadas, separadas, embaladas e expedidas, e os gargalos mudam de lugar ao longo do dia. Os sistemas tradicionais fragmentam essa visão:

  • O WMS (sistema de gerenciamento de armazém) conhece endereços, pedidos e níveis de estoque.
  • O WCS ou os CLPs conhecem os estados das esteiras e dos sorters.
  • O gerenciador de frota sabe onde estão os AGVs e AMRs e o que estão fazendo.
  • Coletores de dados e RFID geram eventos de movimentação.

Um gêmeo digital de armazém reúne esses fluxos em um único modelo espacial. Um supervisor vê um congestionamento se formando no ponto de convergência 4, três AGVs enfileirados atrás dele e a onda de expedição que vai perder o horário de corte do caminhão se o congestionamento durar mais dez minutos. Para os conceitos gerais de gêmeos, veja o guia de tecnologia de gêmeo digital.

Casos de Uso para Operações Logísticas

Caso de uso Dados necessários O que o gêmeo acrescenta
Visão geral do chão ao vivo Estados das esteiras, posições dos AGVs, status das docas Imagem espacial de onde o trabalho está fluindo ou travado
Detecção de congestionamentos e travamentos Estados das fotocélulas, ocupação das zonas, filas de AGVs Mostra as filas se formando a montante de uma falha
Monitoramento da frota de AGVs Posição, bateria, missão, códigos de erro Saúde da frota e pontos críticos de tráfego no layout
Movimentação de estoque Eventos de leitura e RFID com endereços Por onde o estoque realmente passa em comparação com o caminho planejado
Análise de endereçamento (slotting) Frequência de separação por endereço ao longo do tempo Mapas de calor que orientam a realocação dos itens de alto giro
Simulação de layout Fluxos históricos reproduzidos em um layout modificado Estima o efeito de mover estações ou adicionar pistas

Os três primeiros são em tempo real e dependem de dados de baixa latência. Os três últimos usam o histórico e são onde o gêmeo se paga ao longo dos meses.

Arquitetura de Dados com MQTT

A arquitetura mais limpa coloca um broker MQTT entre todas as fontes e todos os consumidores:

  1. Esteiras e sorters: CLPs ou o WCS publicam os estados das zonas e os alarmes de travamento quando mudam.
  2. AGVs e AMRs: o gerenciador de frota (ou os próprios veículos) publica posição e status a uma taxa fixa, normalmente de uma a algumas vezes por segundo.
  3. Eventos do WMS: um pequeno adaptador publica as movimentações de estoque (armazenagem, separação, transferência) como eventos.
  4. Serviços do gêmeo: assinantes que derivam tamanhos de fila, tempos de permanência e índices de congestionamento e gravam o histórico.
  5. Visualizadores do gêmeo: clientes no navegador que assinam via WebSocket seguro e animam a cena 3D.

Um broker MQTT gerenciado é uma boa escolha, porque o valor do gêmeo depende de essa espinha dorsal estar sempre disponível, e as equipes de TI de armazéns normalmente estão focadas no WMS, e não na operação de brokers.

Design de 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

Algumas regras práticas:

  • Estados das zonas das esteiras: retidos, QoS 1, publicados apenas quando mudam.
  • Poses dos AGVs: não retidas, QoS 0, taxa fixa. Uma atualização de posição perdida é substituída logo em seguida.
  • Status e erros dos AGVs: retidos, QoS 1, para que um visualizador aberto no meio do turno veja a missão atual e a bateria.
  • Movimentações de estoque: eventos com QoS 1, não retidos, consumidos por um serviço que mantém as posições de estoque.

O artigo sobre sincronização de estado em gêmeos digitais explica essas escolhas com mais profundidade.

Mão na Massa: Anime um AGV e uma Zona de Esteira

Prototipe usando o servidor MQTT público (gratuito) em broker.connectmq.com. Seus limites (10 mensagens por segundo por cliente, 64 KB por mensagem) são suficientes para alguns veículos simulados. Não publique dados operacionais reais ali, já que o servidor MQTT público pode ser lido por qualquer pessoa e serve apenas para testes e protótipos.

Um simulador em Python para um AGV percorrendo um circuito e uma zona de esteira que ocasionalmente trava:

import json
import math
import random
import time
import uuid

import paho.mqtt.client as mqtt

RUN = "wh-44d0"  # troque pelo seu próprio id exclusivo
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)

No navegador, o visualizador assina os topics e move um objeto 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);
  }
});

O objeto scene é a sua cena three.js, com meshes nomeados de acordo com os IDs dos ativos. Interpolar as poses entre as mensagens torna o movimento suave mesmo com duas atualizações por segundo. Veja gêmeo digital com three.js para construir a cena, e a demo web de gêmeo digital 3D da ConnectMQ para um exemplo funcional com uma esteira e um braço robótico transmitidos ao vivo via WSS.

Checklist de Implantação

  1. Comece por uma área, como as esteiras de expedição, onde os travamentos são caros e visíveis.
  2. Obtenha uma planta baixa em escala e defina um único sistema de coordenadas para as poses dos AGVs e o modelo 3D.
  3. Mapeie cada zona de CLP e cada ID de AGV para um nome de mesh no modelo.
  4. Publique estados quando mudam e poses a uma taxa fixa e moderada.
  5. Migre para um broker privado via TLS antes de conectar sistemas reais, com uma credencial por sistema de origem.
  6. Conte as conexões: cada AGV, gateway, serviço e aba de visualizador é um cliente. O plano Serverless gratuito suporta até 25; o Serverless pago suporta até 1.000.
  7. Registre o histórico para análises de endereçamento e de layout com um assinante separado.
  8. Valide o gêmeo em comparação com o chão do armazém durante um turno movimentado antes de confiar nele.

Armadilhas Comuns

  • Divergências de coordenadas. A origem do mapa do gerenciador de frota raramente coincide com a origem do CAD. Calibre com pontos conhecidos.
  • Inundar o broker com poses. Dez veículos a 20 Hz é desnecessário para visualização. De duas a cinco atualizações por segundo com interpolação já parecem suaves.
  • Tratar os dados do WMS como tempo real. Muitas atualizações do WMS são feitas em lotes. Mostre seus carimbos de tempo para que os usuários saibam quão atualizados estão os dados de estoque.
  • Exagerar no modelo 3D. Caixas simples para porta-paletes e esteiras renderizam mais rápido e são mais fáceis de manter.
  • Ignorar desconexões. Se o gerenciador de frota ou um gateway de CLP cair da rede, o gêmeo continua mostrando as últimas posições e estados como se nada tivesse acontecido. Publique um status online/offline retido por fonte (mensagens last will do MQTT são ideais para isso) e deixe em cinza os ativos cuja fonte está offline, para que os supervisores nunca ajam com base em dados congelados.
  • Um visualizador por tela, sem limite. Cada aba de navegador aberta é um cliente MQTT separado. Painéis de parede, notebooks de supervisores e tablets se acumulam rapidamente, então inclua-os ao planejar os limites de conexões.

Muitos desses padrões são compartilhados com o gêmeo digital de fábrica.

Construa Seu Gêmeo Digital de Armazém na ConnectMQ

Como broker MQTT gerenciado, a ConnectMQ oferece aos seus CLPs, gerenciador de frota e visualizadores no navegador uma única espinha dorsal MQTT com suporte a TLS, WebSocket e MQTT 5. Crie um broker Serverless gratuito em app.connectmq.com, sem cartão de crédito, e use o explorador de topics ao vivo para acompanhar os topics de AGVs e esteiras enquanto constrói o gêmeo.

Perguntas frequentes

O que é um gêmeo digital de armazém?

É um modelo digital ao vivo de um armazém que espelha em tempo real as movimentações de estoque, as posições dos veículos e os estados dos equipamentos, usado para monitoramento, análise e planejamento de layout.

Com que frequência as posições dos AGVs devem ser publicadas?

Para visualização, de uma a cinco atualizações por segundo costumam ser suficientes quando o visualizador interpola entre as posições. A navegação crítica para a segurança permanece dentro do próprio sistema de frota.

Um gêmeo de armazém pode ser integrado ao meu WMS?

Sim. Um adaptador lê os eventos do WMS por meio da API ou do banco de dados dele e os publica no MQTT, para que o gêmeo os consuma como qualquer outra fonte de dados.

Os estados das esteiras devem usar retained messages?

Sim. Reter os topics de estado permite que um visualizador do gêmeo recém-aberto mostre imediatamente o estado atual de cada zona, em vez de esperar pela próxima mudança.

Artigos relacionados

Todos os artigos →

Seu broker MQTT privado está a poucos cliques de distância

Crie uma conta, receba as credenciais do seu broker e conecte seu primeiro dispositivo — sem servidores para instalar, atualizar ou escalar.