;(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

Robô humanoide interage com doentes de coronavírus e reduz desgaste médico

Robô Cloud Ginger foi usado durante a epidemia de coronavírus na China - Reprodução
Robô Cloud Ginger foi usado durante a epidemia de coronavírus na China Imagem: Reprodução

Thiago Varella

Colaboração para Tilt

29/03/2020 04h00

Com o aumento no número de casos de coronavírus nos Estados Unidos, os americanos estão buscando soluções robóticas para limitar o contato de pessoas saudáveis com os pacientes infectados. O robô Cloud Ginger é capaz de, por exemplo, trocar a roupa de cama ou medir a temperatura de pacientes.

O Cloud Ginger, também conhecido como XR-1, tem um aspecto meio humano, mas ao mesmo tempo, não se parece exatamente com uma pessoa. Isso é proposital. A ideia é a de fazer com que as pessoas sintam-se acolhidas por ele, sem se sentirem desconfortáveis.

A empresa americana CloudMinds, fabricante do Cloud Ginger, doou 14 humanoides para ajudar no hospital de campanha de Wuchang, na província de Hubei —a mesma onde fica Wuhan, local onde surgiu os primeiros casos do novo vírus.

"Quando projetamos o robô de serviço XR-1 Cloud Ginger, esperávamos criar um design emocionalmente intuitivo para se conectar com os consumidores, além de quebrar a barreira entre humanos e a frieza da tecnologia e das máquinas", afirmou Bill Cui, gerente de design industrial da CloudMinds, em entrevista ao site Fast Company.

Cloud Ginger tem olhos grandes, um sorrisinho na boca e um visual que lembra o de um desenho animado. Seu peito e seus braços são cobertos com um tecido, não apenas para dar mais, digamos, calor, mas também para resolver um problema de dissipação de calor e melhorar a amplitude de movimentos do robô.

O humanoide também é craque em interagir com humanos. Cloud Ginger simula o modo de falar de qualquer pessoa, gesticulando os braços durante um bate-papo e fazendo contato visual. Até a voz do robô foi projetada para se aproximar do padrão humano.

Uma das funções do robô é a de fazer companhia aos doentes de covid-19 que estão isolados, sem contato com outros humanos. Por isso, Cloud Ginger é capaz de dançar e de estimular a prática de exercícios físicos simples, como alongamentos.

Segundo Bill Cui, o robô funciona 24 horas por dia e foi capaz de reduzir o desgaste da equipe médica do hospital de campanha de Wuchang, onde foi empregado.

SIGA TILT NAS REDES SOCIAIS