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

Covid-19: cientistas criam robô que distribui remédios e comida a pacientes

Robô para entrega de remédios e comida é feito com placas de Arduíno e Raspberry para processar os algoritmos de controle dos motores e de percepção e inteligência - 3DSoft
Robô para entrega de remédios e comida é feito com placas de Arduíno e Raspberry para processar os algoritmos de controle dos motores e de percepção e inteligência Imagem: 3DSoft

De Tilt, em São Paulo

04/04/2020 00h00

Seis pesquisadores do Laboratório de Robótica Móvel do Instituto de Ciências Matemáticas e de Computação (ICMC) da USP, em São Carlos (SP), criaram o protótipo de um robô autônomo que serve para ajuda profissionais da área da saúde que estão sobrecarregados de trabalho por conta da pandemia provocada pelo coronavírus.

"O objetivo é dar e na distribuição de remédios e alimentos aos pacientes doentes em hospitais e, com isso, além de diminuir a carga de trabalho, também será diminuído o contato entre profissionais da saúde e pessoas com a Covid-19", explica a doutoranda Daniela Ridel.

Ela fundou há dois anos a startup 3DSoft em parceria com os pesquisadores Luis Rosero, Tiago dos Santos e Patrick Shinzato para criar um sensor de baixo custo, adequado à realidade nacional. Depois aram a desenvolver um robô de serviços para entregas, que deveria ficar pronto nos próximos meses.

"Devido ao cenário do coronavírus, fizemos uma mudança radical e criamos o protótipo para ajudar os profissionais da saúde", conta Shinzato.

A primeira coisa que o robô deve fazer é mapear o ambiente em que vai trafegar, em tese uma única vez. Então ele percorre o trajeto que deverá ser realizado, posteriormente, de forma autônoma, coletando dados do ambiente, por meio de sensores, e construindo um mapa do local. Depois que esse mapa é criado, o robô deve, então, conseguir identificar em qual posição do mapa está, estabelecendo uma relação entre o que os sensores estão captando (o que o robô está vendo) e o que reconhece do ambiente (mapa).

Dado que o robô consegue se localizar nesse mapa, é possível escolher qualquer ponto do ambiente e o robô poderá traçar uma rota para chegar até o ponto escolhido, respeitando as áreas que não são navegáveis.

O grupo busca parceiros especializados em saúde, que possam ajudar a equipe a compreender melhor a demanda de quem está na linha de frente do combate ao coronavírus e ajustar o projeto. "Nós temos a capacidade técnica de fazer esse projeto acontecer, no entanto, falta ajuda para que o robô chegue nas mãos de quem precisa", explica Ridel. "O ideal seria um parceiro que conseguisse tanto nos colocar em contato com hospitais quanto investir na montagem de mais robôs. Como todos nós somos da área de computação, precisamos de pessoas com outras habilidades que apresentem o projeto a investidores e a quem mais possa nos ajudar."

Ela estima que, com todos os recursos à disposição, bastariam cerca de dois meses de trabalho para ter um protótipo funcional pronto. O custo unitário da primeira versão do robô foi de cerca de R$ 17 mil, considerando as peças utilizadas para a construção do chassi, que é a base do equipamento, os sensores e a carenagem, que é a peça colocada em cima da base, e pode ser uma superfície plana ou um baú de armazenamento.

"Em larga escala, certamente esse custo seria reduzido significativamente. Além disso, esse conjunto de sensores pode ser alterado de acordo com a aplicação. Por exemplo, se pudéssemos colocar marcadores no chão do hospital para o robô se guiar, seria viável usar um sensor de baixo custo, assim como a carenagem poderá ser modificada de acordo com a aplicação", explica.

"Temos certeza que os tempos atuais chamam atenção para o fato de que a robótica pode auxiliar e muito em situações como a de uma pandemia. Gostaríamos que o protótipo do nosso robô estivesse pronto em uma eventual demanda futura", diz Ridel. (Com Jornal da USP)