Tentando recriar as pulseiras do Coldplay com um Jr. e JS
Oi, pessoal! Tudo bem?
Antes de entrar na parte técnica, deixa eu me apresentar rapidinho. Prazer, me chamo Tobias. Ainda estou nos primeiros passos da minha jornada na área tech, mas a vontade de criar e explorar soluções criativas me trouxe até aqui. Se você gostar desse post ou estiver trabalhando em algo interessante, ficarei feliz em trocar uma ideia!
Hoje quero dividir com vocês uma experiência de projeto que me levou do entusiasmo à frustração (e de volta ao entusiasmo algumas vezes). A ideia parecia genial na minha cabeça, mas a execução... bom, foi um pouco mais complicada. O projeto está aposentado (por enquanto), mas o que aprendi nesse processo fez cada minuto valer a pena.
Ah, se eu cometer algum equívoco técnico ou deixar passar algum detalhe, já peço desculpas! Estou em fase de aprendizado e ficaria muito grato se você puder me corrigir ou complementar nos comentários. Isso me ajuda a aprender e deixa o post ainda mais completo para todo mundo. 😁
Como tudo começou
Estava batendo papo com um amigo quando começamos a falar das Xylobands, aquelas pulseiras que brilham de forma sincronizada nos shows do Coldplay. A conversa estava tranquila até ele soltar uma frase que me deixou sem alternativa: "EU DUVIDO tu recriar isso".
Pronto. Agora era questão de honra.
A ideia? Transformar os celulares das pessoas em pulseiras de luz, sincronizando a lanterna ou a tela em tempo real. A execução, porém, revelou ser mais complexa do que eu imaginava.
Para quem não conhece as pulseiras, esse vídeo mostra o efeito que estamos tentamos replicar. Também existem diversos vídeos que mostram as pulseiras gerando desenhos como corações ou até palavras escritas na multidão.
Requisitos
Antes de sair escrevendo código, primeiro vamos definir nosso objetivo:
- Compatibilidade
Gostaria de abranger o maior número possível de smartphones, então deveria utilizar tecnologias amplamente difundidas; - Praticidade
A simples presença de um grupo de pessoas em um local de forma completamente orgânica deveria permitir criar um evento; - Evitar equipamentos dedicados
Deveria estruturar o projeto para evitar ao máximo hardwares dedicados, o objetivo é usar o máximo que um celular tem a oferecer.
Como eu achei que seria
A minha primeira ideia (e bem ingênua) foi usar GPS. O raciocínio era simples: como a galera vai estar em uma área pequena, posso tratar as coordenadas geográficas como pontos em um plano cartesiano, já que localmente a terra é quase plana. Trunco os valores para as primeiras N casas decimais, ordeno, posiciono em uma matriz e "TAM DAM" tenho basicamente uma tela com vários pixels na memória. Parece razoável, né? Só que não.
Nos testes, a precisão do GPS variava entre 8 e 9 metros (em dias bons). O problema? Para esse projeto, eu precisava de algo na casa dos decímetros. A diferença entre um show incrível e um desastre era, literalmente, uma questão de centímetros. Esse vídeo mostra um breve demo que construí. Aparentemente tudo está mais ou menos funcionando, porém a posição dos "cubinhos" não refletiria em nada as posições verdadeiras das pessoas devido a essa acurácia muito baixa do GPS.
Por mais que nada tenha dado certo, até aqui o saldo do projeto já havia sido positivo. Explorei tecnologias que nunca tinha utilizado, revisei conceitos sobre autenticação e realtime. Gostaria de ter a oportunidade de trocar uma ideia com alguém mais experiente sobre essa parte e entender se existem alternativas melhores do que as escolhi, mas isso é assunto para um outro momento.
Explorando opções
Como o GPS não foi uma solução viável, comecei a explorar outras alternativas. Comecei a pensar em formas de mapear os usuários. Três estratégias vieram à mente:
- Vínculo manual
As pessoas escaneariam QR codes ou digitariam IDs para informar quem estava ao seu lado. Funcionaria, mas é impraticável para grandes multidões, sem contar que tiraria toda a "beleza" do projeto. - Calibração coletiva
Imagine um público inteiro balançando o celular sincronizadamente (tipo uma "ola" de um estádio). O uso de acelerômetro poderia permitir capturar o movimento e mapear as posições em uma matriz, mas a eficácia dependia da coordenação do público. - Distâncias relativas (minha favorita)
Se eu conseguisse medir distâncias entre os celulares, poderia criar um grafo e triangular as posições. Mais dispositivos significariam maior precisão. Parecia promissor... até eu tentar descobrir como, de fato, medir essas distâncias e ainda depois reconstruir as posições com base nas distâncias relativas.
Descobrindo tecnologias
Bom, nesse caso o primeiro passo é descobrir como vamos medir as distâncias entre os usuários.
- BLE (RSSI)
O Bluetooth parecia uma ótima opção devido a alta compatibilidade. Existem diversos projetos onde Beacons são utilizados para medir distâncias usando a força do sinal (RSSI) e estimar distâncias. Porém, tudo que encontrei foram casos onde os Beacons estavam em posições fixas previamente definidas, algo incompatível para esse contexto. - Ultrassom
Interessante, mas confesso que não senti muita confiança. Primeiramente seria necessário organizar os dispositivos para que eles funcionassem como emissores e receptores em intervalos de tempo definidos. Além disso, juntar muitas pessoas é sinônimo de barulho, então por mais que o ultrassom trabalhe em outra frequência, com certeza a interferência do ambiente prejudicará a medição. - UWB (Ultra Wideband)
Preciso, confiável, e com margem de erro de poucos centímetros. A API Nearby Interaction da Apple parecia perfeita! Mas aí veio o balde de água fria: o UWB só é compatível com dispositivos lançados a partir da família do iPhone 11; e como eu preciso estimar distâncias, neste caso utilizando uma tecnologia chamada Extended Distance Measurement (EDM), nos restringimos a dispositivos lançados a partir do Iphone 15. Desta forma, rasgaríamos nosso requisito de compatibilidade.
Reconstruindo as posições
Para fins didáticos, digamos que eu tivesse conseguido medir as distâncias entre celulares. A próxima etapa seria reconstruir suas posições em um espaço tridimensional.
Um dos primeiros desafios que percebi foi o acúmulo de erros. Imagine um evento com milhares de pessoas: medir distâncias relativas envolve pequenos valores de erro. Utilizar algum método que simplesmente percorre os dispositivos, posicionando os que ainda não foram posicionados, acumularia um erro de vários metros, gerando uma reconstrução significativamente equivocada. Em grandes eventos, o erro acumulado poderia fazer com que metade do público fosse parar — virtualmente — do lado de fora do estádio.
Diante disso, resolvi pesquisar sobre algoritmos que pudessem me ajudar a reconstruir esse espaço. Pela primeira vez tive contato com técnicas como Gradiente Descendente, Mínimos Quadrados, Non-Metric Multidimensional Scaling, Filtro de Kalman… Esses métodos são utilizados justamente para minimizar erros acumulados e ajustar o posicionamento dos pontos, seja de forma iterativa ou analítica. São técnicas poderosas que utilizam abordagens diferentes, mas todas elas tem duas características em comum: complexidade computacional e uma matemática sólida por trás. Confesso que ainda não possuo a maturidade matemática e técnica necessária para avaliar se essas estratégias seriam boas opções (ou sequer se resolveriam o problema), mas de qualquer modo a leitura foi muito proveitosa.
Onde cheguei
Embora o projeto não tenha sido completamente implementado (ainda), o processo de pesquisa e desenvolvimento foi extremamente enriquecedor. Aprendi sobre tecnologias emergentes, limitações práticas e, principalmente, sobre a importância de manter os pés no chão — sem deixar de sonhar alto.
Esse projeto não saiu do papel, mas me abriu portas para áreas que eu nem sabia que existiam. Uma das lições mais valiosas que aprendi é que os maiores aprendizados surgem justamente ao enfrentar desafios que nos tiram da zona de conforto. Espero que essa experiência inspire você a encarar aquele projeto meio absurdo que está na sua cabeça. Porque, no fim das contas, é aí que a mágica acontece.
Se curtiu esse post ou quiser trocar uma ideia, estou sempre aberto para conversar!