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

Último paraplégico caminha com exoesqueleto que fará primeiro chute da Copa

Do UOL, em São Paulo

16/05/2014 21h42

O neurocientista brasileiro Miguel Nicolelis publicou em sua página do Facebook nesta sexta-feira (16) vídeo com o oitavo voluntário do projeto Andar de Novo caminhando pela primeira vez com o exoesqueleto. As pernas robóticas permitem a um paraplégico andar com movimentos comandados pelo cérebro. Na abertura da Copa do Mundo um dos voluntários paraplégicos irá dar o primeiro chute do jogo de abertura.

"Hoje as 5:30 terminou a caminhada do último dos oito voluntários do projeto Andar de Novo. Depois de meses de treinamento, hoje os últimos dois pacientes caminharam com ajuda do exoesqueleto e puderam desfrutar da sensação de estar andando novamente", contou o pesquisador.

Segundo ele, o voluntário disse ao caminhar: "Quando eu casar, quero emprestar esse exo para entrar na igreja!".

Na quinta (15), a primeira mulher a utilizar o exoesqueleto caminhou um total de 132 os, informou o pesquisador. "Emociona todos os presentes. Mais um momento inesquecível", escreveu na rede social.

Como funciona

Os exoesqueletos chegaram à São Paulo no começo de março e foram para a AACD (Associação de Assistência à Criança Deficiente), onde os pacientes são treinados desde o ano ado para comandar o exoesqueleto. O mais bem adaptado à vestimenta e aos comandos será o escolhido para o chute.

Em 4 de fevereiro, o cientista afirmou que a equipe do projeto em Paris conseguiu fazer ambas as pernas do exoesqueleto se movimentarem ao mesmo tempo, reproduzindo um padrão de caminhada. "Articulações moveram-se perfeitamente, com movimentos fluídos e sem qualquer ruído mecânico. Exo supera primeiro grande teste mecânico e de controle", disse na rede social.

O projeto conta com várias linhas de pesquisa, desde um mundo virtual para treinar os comandos cerebrais até o desenvolvimento de roupas com resposta tátil. 

As mensagens transmitidas pelo cérebro para o resto do corpo, como caminhar, balançar ou parar, são captadas pela estrutura por meio de eletrodos colados na cabeça do voluntário.

Os primeiros testes foram realizadas em experimentos de realidade virtual com uma estrutura robótica estática que permite que os pacientes caminhem sem abandonar a posição inicial em que estão.