;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Estamos obcecados com os vídeos desse robô pet com mais de 700 emoções

Loona: projeto no Kickstarter já arrecadou quase US$ 1 milhão - Divulgação/Jianbo
Loona: projeto no Kickstarter já arrecadou quase US$ 1 milhão Imagem: Divulgação/Jianbo

Barbara Mannara

Colaboração para Tilt, do Rio de Janeiro

21/09/2022 11h47

Influenciadores digitais, abram alas. Há uma nova estrela entrando — e ela tem apenas 17 cm de altura e se desloca sobre quatro rodas. É um robô mascote chamado Loona, que ganhou uma campanha de financiamento coletivo e arrecadou, em uma semana, quase US$ 1 milhão.

O petbot foi criado pela empresa de robótica, KEYi Technology e chama atenção nos vídeos por seu comportamento muito similar ao de um cachorrinho, mas com a vantagem de um enorme visor que expressa mais de 700 emoções.

O robozinho recebe o dono quando chega em casa e corre atrás da bolinha, por exemplo. Mas também é capaz de fazer beatbox ou posar para fotos. Parece coisa de uma animação da Disney ("Esta é a filha de Wall-E e EVA?", pergunta um dos comentários, em referência ao filme de 2008).

Loona vem com câmera HD e tecnologia de reconhecimento facial — para fazer a leitura do rosto, expressão e gestos das pessoas. O reconhecimento de comandos de voz é turbinado pela tecnologia da Amazon Lex — a mesma utilizada na assistente Alexa.

Ela também tem detecção de movimentos em 3D no ambiente. Além disso, Loona entende seu próprio tamanho para não esbarrar nos móveis, acompanhar o dono pela casa e conseguir planejar trajetórias.

Ela pede carinho

Sua estrutura conta ainda com duas pernas e quatro rodinhas, usadas para se locomover pela casa rapidamente — que pode chegar a até 900 rpm (rotações por minuto). Loona pode inclusive se equilibrar em cima de duas rodinhas, como se fosse um cachorrinho pedindo carinho em duas patinhas. Sua estrutura consegue fazer rotações completas, em 360 graus — como se estivesse rodopiando.

O projeto está disponível no Kickstarter — plataforma de investimento colaborativo — e a Loona pode ser encomendada com preço a partir de US$ 299 (cerca de R$ 1.530 em conversão direta e sem taxas).

O kit acompanha uma petbot, carregador USB-C, um ano de garantia, manual e o ao aplicativo para controlar a robô. Por enquanto, o Brasil não está na lista de países liberados para receber o produto, que está previsto para delivery a partir de fevereiro de 2023. Nas projeções futuras, a empresa planeja que Loona também funcione como assistente doméstica — semelhante à Alexa — em abril de 2023.