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

Como um aspirador robô detecta sujeira? Entenda a tecnologia por trás

Colaboração para Tilt, em São Paulo

18/11/2021 04h00

Imagine só andar pela sua casa e não encontrar traços de poeira pelo chão. E o melhor: sem precisar fazer qualquer esforço para isso. É justamente esse o principal atrativo dos aspiradores robôs.

Modelos assim são bem desejados por quem gosta de ver a casa limpa, mas não tem tempo ou disposição para faxinas constantes ou, ainda, não quer gastar com a contratação frequente de profissionais de limpeza.

Há uma enorme variedade de opções disponíveis, alguns com funções inteligentes (ou seja, com inteligência artificial), inclusive. Mas você sabe como ele consegue fazer a "mágica" de deixar o chão da sua casa limpo sem que você precise derramar uma gota de suor sequer?

Como funciona?

Aspirador robô: a tecnologia por trás - Arte UOL - Arte UOL
Imagem: Arte UOL

Independentemente do tipo de tecnologia embarcada, o funcionamento dos robôs aspiradores seguem alguns princípios comuns. Além de usar um fluxo de ar para sugar a sujeira do chão, eles costumam contar com escovas giratórias que permitem "agitar" a poeira para que ela seja aspirada — algo útil especialmente quando falamos da limpeza de tapetes.

Um dos principais segredos para o funcionamento do aparelho, no entanto, está na sua capacidade de "ver" o ambiente no qual ele transita. Isso vale para todos os modelos, desde o mais simples.

Isso é possível pela adoção de sensores que fazem o robô "enxergar" o ambiente, evitando pancadas contra paredes e obstáculos ou, ainda, quedas que poderiam danificar o aparelho.

Os sensores mais simples, que estão posicionados ao redor do robô, são chamados de "bumpers" e detectam quando o robô encosta em algum obstáculo que atrapalhe ou impede a sua movimentação.

Um segundo sensor de grande importância é o de borda, que fica na parte inferior do aparelho e detecta caso ele se aproxime de uma escada ou região que possa resultar em queda.

Um terceiro fundamental é o encoder, que fica em cada um dos motores responsáveis pela locomoção do robô. Ele mede a distância percorrida pelas rodas e é fundamental para saber o posicionamento do robô e as regiões que já foram limpas.

Em modelos mais sofisticados, há sensores que não apenas cumprem essa função básica como realizam tarefas mais avançadas, como mapear o ambiente (ou até mais de um, no caso de casas e apartamentos com mais de um andar) e retornar automaticamente para a base para carregamento, sem que o usuário tenha que fazer isso manualmente.

Além disso, há modelos capazes de detectar a quantidade de poeira captada e até com câmeras 3D, capazes de detectar objetos em três dimensões e, com isso, ter uma operação mais precisa.

Por fim, alguns modelos ainda contam com conexão via wi-fi ou Bluetooth, o que permite que ele "converse" com aplicativos específicos de smartphones ou, ainda, assistentes como Alexa e Google Assistente. Essa conectividade permite, por exemplo, comandar o aparelho à distância, criar rotinas específicas de limpeza etc.

Dúvidas comuns

O robô aspirador substitui aspiradores mais "parrudos"?

De maneira geral, a resposta é não. Um robô aspirador permitirá uma limpeza constante e, consequentemente, a tendência é que a casa não acumule pó. Porém, para limpeza mais pesada e profunda, ter um aspirador convencional para esses momentos ainda é o recomendado. Ou usar a boa e velha vassoura e rodo com pano úmido.

Talvez a principal diferença aqui seja o intervalo necessário para que essas limpezas mais pesadas sejam feitas, o que, no final das contas, é uma vantagem considerável.

Há situações nas quais eles não são recomendados?

Esses aparelhos geralmente são incapazes de aspirar água, então o ideal é evitar o seu uso em pisos molhados (a não ser que o modelo de robô venha com a função de ar pano).

Quem tem pets também precisa ficar atento, especialmente caso o animal faça suas necessidades em tapetinhos higiênicos — imagine só o caos caso um robô aspirador e sobre fezes e urina dos bichinhos, não é? Neste caso, o melhor a se fazer é evitar que o robô transite por essas áreas.

Por fim, casas com muitos desníveis mais altos — como degraus — entre os cômodos e ambientes muito apertados tornam os robôs aspiradores menos eficientes.

Nós comparamos

Na segunda edição do Tilt Lab Day, testamos quatro aspiradores robôs: um da Wap, um da Samsung, um da iRobot e um da Multilaser. Eles tinham diferentes preços e funcionalidades, mas o modelo da Samsung venceu como o melhor. O da iRobot levou na categoria melhor custo-benefício.

Confira como cada aparelho se saiu em cada quesito e tire suas dúvidas na live abaixo:

* O UOL pode receber uma parcela das vendas pelos links recomendados neste conteúdo. Preços e ofertas da loja não influenciam os critérios de escolha editorial.

Fontes:

  • Anderson Harayashiki Moreira, professor de Engenharia de Controle e Automação e especialista em Robótica do Instituto Mauá de Tecnologia (IMT)
  • Flamarion Pirtouscheg, gerente de categoria de produtos da Electrolux
  • Reinaldo Bianchi, professor do departamento de Engenharia Elétrica do Centro Universitário FEI