ZeroTier: acesse o robô de qualquer lugar sem VPN dedicada
A maior parte do trabalho de integração de um robô não acontece com o robô à frente. Acontece num notebook, escrevendo um nó, ajustando parâmetros, revisando logs. Mas o ambiente do logbook desta pesquisa tem um detalhe que complica isso: o computador que hospeda o ROS master (b166er-nuc.local) fica embarcado no robô, no laboratório. Sempre que notebook e NUC estavam em redes físicas diferentes — uma viagem, home office, queda de energia no lab — a conexão simplesmente não existia, e qualquer comando ROS enviado do notebook caia no vazio.
ZeroTier resolve esse problema de um jeito que é surpreendentemente simples de configurar e que funciona transparente o suficiente para o ROS nem perceber que a rede por baixo mudou.
O que é ZeroTier
ZeroTier é uma solução de rede virtual peer-to-peer que cria uma rede Ethernet Layer 2 sobre a internet. Cada dispositivo na rede recebe um endereço IP virtual fixo — fixo no sentido de que não muda entre reconexões — e passa a se comunicar com os outros membros como se todos estivessem na mesma LAN, independente de onde cada um estiver fisicamente.
O que diferencia o ZeroTier de uma VPN convencional é a topologia: em vez de rotear todo o tráfego por um servidor central (o modelo clássico de VPN com OpenVPN ou WireGuard apontando para um host fixo na nuvem), o ZeroTier tenta estabelecer conexões diretas entre os peers e usa a infraestrutura da ZeroTier, Inc. apenas para coordenar a descoberta inicial e para relay de tráfego quando a conexão direta não é possível. Na prática, isso significa latência menor e sem gargalo de largura de banda num servidor intermediário.
A rede é identificada por um Network ID de 16 dígitos hexadecimais (ex: 8056c2e21c000001). Qualquer dispositivo pode ingressar nessa rede com um único comando; o administrador da rede aprova a entrada pelo painel do ZeroTier Central. O plano gratuito suporta até 25 dispositivos por rede — mais do que suficiente para um projeto de robótica de doutorado.
Por que isso importa para pesquisa com ROS
O ROS foi projetado para operar em LAN. O nó mestre (roscore) precisa ser alcançável por todos os outros nós, e cada nó anuncia seu endereço IP para que os outros possam se conectar diretamente. Quando os nós estão em máquinas diferentes, dois problemas aparecem:
ROS_MASTER_URIprecisa apontar para um IP alcançável de qualquer máquina na sessão- Cada nó precisa anunciar um
ROS_IP(ouROS_HOSTNAME) pelo qual outros nós consigam de fato abrir uma conexão de volta
Em LAN com mDNS, o hostname .local resolve isso automaticamente. Mas mDNS não atravessa roteadores nem sai da rede local. ZeroTier resolve os dois problemas ao mesmo tempo: cria uma interface de rede virtual em cada máquina com IPs fixos e roteáveis entre si, e basta configurar o ROS para usar esses IPs. Do ponto de vista do ROS, é como se as duas máquinas fossem vizinhas na mesma rede.
Pré-requisitos
- Conta gratuita em my.zerotier.com para criar e gerenciar a rede
- Acesso root ou sudo nas duas máquinas (NUC e notebook de desenvolvimento)
- Conexão com a internet em ambas durante a configuração inicial; depois, o ZeroTier mantém a conexão mesmo com mudanças de rede física
Passo a passo
1. Criar a rede no ZeroTier Central
Acesse my.zerotier.com, crie uma conta e clique em Create A Network. Um Network ID de 16 caracteres será gerado automaticamente. Anote esse ID — você vai precisar dele em todos os dispositivos que quiser conectar.
Na página da rede, deixe o Access Control como Private (padrão): isso exige que você aprove manualmente cada dispositivo que solicitar entrada, o que evita que qualquer pessoa que descubra o Network ID ingresse sem autorização.
2. Instalar o ZeroTier e ingressar na rede
No Linux (NUC e qualquer máquina com Linux):
# Instala o serviço zerotier-one
curl -s https://install.zerotier.com | sudo bash
# Ingress na rede
sudo zerotier-cli join <SEU_NETWORK_ID>
O serviço zerotier-one é iniciado automaticamente e configurado para subir com o sistema via systemd. Verifique o status:
sudo systemctl status zerotier-one
sudo zerotier-cli status
No macOS (notebook de desenvolvimento):
Baixe o instalador em zerotier.com/download ou instale via Homebrew:
brew install --cask zerotier-one
Após a instalação, o ícone do ZeroTier aparece na barra de menus. Use-o para ingressar na rede, ou via terminal:
sudo zerotier-cli join <SEU_NETWORK_ID>
Autorizar os dispositivos:
Após cada join, volte ao painel do ZeroTier Central e autorize os dispositivos que apareceram na lista (marque o checkbox na coluna Auth). Cada dispositivo receberá um IP virtual fixo — anote o IP atribuído a cada máquina, pois eles são necessários para configurar o ROS.
3. Configurar o ambiente ROS para usar o ZeroTier
O ZeroTier cria uma interface de rede virtual com nome começando em zt (ex: zt7nnhz63y). Depois de autorizado, é possível verificar o IP atribuído:
ip addr show | grep zt
# Ou de forma mais direta:
zerotier-cli listnetworks
Com os IPs dos dois lados em mãos, configure as variáveis de ambiente do ROS. No notebook de desenvolvimento (Shiroi), antes de qualquer comando ROS:
# IP ZeroTier do NUC — onde roda o roscore
export ROS_MASTER_URI=http://<IP_ZEROTIER_DO_NUC>:11311
# IP ZeroTier desta máquina — pelo qual o NUC vai se conectar de volta
export ROS_IP=<IP_ZEROTIER_DO_NOTEBOOK>
No NUC, se o roscore foi configurado como serviço systemd (ver logbook), as variáveis de ambiente do serviço precisam apontar para o IP ZeroTier local:
# Em /etc/ros/env.sh ou no arquivo de serviço do systemd:
ROS_MASTER_URI=http://<IP_ZEROTIER_DO_NUC>:11311
ROS_IP=<IP_ZEROTIER_DO_NUC>
Detecção automática de rede (a abordagem do b166er):
No ros_env.sh do projeto, a escolha entre ZeroTier e mDNS (para quando as duas máquinas estão na mesma LAN) é feita automaticamente: o script verifica se a interface ZeroTier está ativa e com IP atribuído; se sim, usa os IPs do ZeroTier; se não, cai para o hostname .local via mDNS. Isso significa que o mesmo script funciona em qualquer situação sem precisar ser alterado conforme a rede muda.
# Fragmento do padrão de detecção
ZT_IP=$(ip -4 addr show | grep 'inet ' | grep zt | awk '{print $2}' | cut -d/ -f1)
if [ -n "$ZT_IP" ]; then
export ROS_IP="$ZT_IP"
export ROS_MASTER_URI="http://<IP_ZEROTIER_DO_NUC>:11311"
else
# Fallback para mDNS na mesma LAN
export ROS_HOSTNAME="$(hostname).local"
export ROS_MASTER_URI="http://b166er-nuc.local:11311"
fi
Verificando a conexão
Com ZeroTier ativo em ambas as máquinas e ambas autorizadas na rede:
# Do notebook, verificar se o NUC responde pelo IP ZeroTier
ping <IP_ZEROTIER_DO_NUC>
# Verificar se o roscore do NUC está alcançável
rostopic list # deve listar os tópicos do robô
Se rostopic list retornar os tópicos publicados pelo NUC, a configuração está completa. O ROS não sabe (nem precisa saber) que a rede física por baixo é uma VPN virtual — ele trata o caminho ZeroTier como qualquer outra interface de rede.
Problemas comuns
rosnode list ou rostopic list trava sem resposta — quase sempre ROS_IP não está definido no notebook, então os nós locais anunciam o IP da LAN física (que o NUC não consegue alcançar pela rota ZeroTier). Verifique com echo $ROS_IP e confirme que o valor é o IP da interface ZeroTier, não o da Wi-Fi.
Dispositivo não aparece como autorizado no painel — o zerotier-cli join foi executado mas a internet estava indisponível naquele momento. Verifique sudo zerotier-cli status; se mostrar OFFLINE, o problema é conectividade. Após reconectar à internet, o dispositivo aparece automaticamente no painel para autorização.
Latência alta entre os nós ROS — ZeroTier tenta conexão direta mas pode cair em relay (tráfego passando pelos servidores da ZeroTier) quando há NAT simétrico nos dois lados da rede. zerotier-cli peers mostra RELAY na coluna de status quando isso acontece. Solução: configurar port forwarding no roteador de pelo menos um dos lados, ou usar um “moon” (nó de relay próprio).
Interface zt some após reinicialização — o serviço zerotier-one não está habilitado para iniciar com o sistema. Corrija com sudo systemctl enable zerotier-one.
ROS_MASTER_URI aponta para IP ZeroTier mas o NUC muda de IP — isso não deveria acontecer: o ZeroTier atribui IPs fixos por dispositivo dentro da rede gerenciada. Se o IP mudou, é porque a rede foi recriada ou o dispositivo foi removido e readicionado. Anote o IP após a autorização inicial e configure a rede para usar o intervalo de IPs gerenciado.
Quando ZeroTier não é a resposta
ZeroTier introduz uma camada de latência extra em relação a uma LAN física — pequena, mas mensurável. Para aplicações de controle em tempo real onde cada milissegundo importa (laços de controle fechados a alta frequência), operar com o robô físico presente na mesma rede local ainda é a configuração ideal. ZeroTier é a solução para o fluxo de trabalho de desenvolvimento: testar nós, revisar logs, ajustar parâmetros, depurar transformações TF — tudo isso funciona perfeitamente com a latência extra do ZeroTier.
Além disso, quando o objetivo é apenas SSH no NUC (sem ROS), existem alternativas mais simples: Tailscale (baseado em WireGuard, configuração ainda mais rápida) e WireGuard puro (mais trabalho para configurar, sem infraestrutura de terceiros). ZeroTier é a escolha aqui porque o objetivo é fazer o ROS funcionar entre as máquinas, não só ter acesso de terminal.