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

Nasa tenta tirar 'pedra no sapato' do robô Perseverance em Marte; entenda

Imagem feita em 28 de fevereiro mostra os pneus do Perseverance e parte do solo marciano - Nasa/JPL-Caltech
Imagem feita em 28 de fevereiro mostra os pneus do Perseverance e parte do solo marciano Imagem: Nasa/JPL-Caltech

Felipe Mendes

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

19/01/2022 16h58

Sabe quando você compra um tênis novo, começa a sentir um incômodo ao andar e, quando olha, percebe que uma pedrinha ficou presa na sola? Pois a sonda Perseverance, da Nasa, que está em missão em Marte, está com um problema parecido.

Especialistas da agência espacial americana têm atuado desde o final de dezembro para encontrar uma forma de remover alguns detritos presos ao robô que foram identificados durante a extração de uma amostra no planeta vermelho.

De acordo com a Nasa, durante a transferência do bit que continha a amostra para o carrossel de bits do rover (que faz o processamento e envia os dados para a agência), os sensores indicaram a anomalia.

O problema ocorreu durante o chamado "Coring Bit Dropoff", que é quando a broca, com seu tubo que contém a amostra recém-coletada, é guiada para fora da broca percussiva (na extremidade do braço robótico) e para o carrossel de brocas (localizado no chassi do robô). Neste momento, o sensor registrou uma resistência maior que a esperada durante a operação.

Estratégia para retirar o fragmento

Desde a semana ada, a Nasa tem estudado detalhadamente imagens do solo por onde o Perseverance a para, incialmente, compreender os tipos de rocha por onda a sonda vai transitar e observar a possibilidade de mais alguns fragmentos se juntarem ao carrossel de bits no futuro.

Agora, a Nasa decidiu simplesmente girar o carrossel de bits utilizando o braço robótico do Perseverance para que o compartimento solte as pedrinhas. E como a agência espacial saberá se esse movimento deu certo?. Simples: basta olhar novamente para o solo e verificar se existem fragmentos adicionais no local.

"A equipe da Perseverance está explorando todas as facetas do problema para garantir que não apenas nos livremos desses detritos rochosos, mas também evitemos uma recorrência semelhante durante amostragens futuras. Essencialmente, não estamos deixando pedra sobre pedra", escreveu Jennifer Trosper, Gerente de Projetos do Laboratório de Propulsão a Jato da Nasa, no blog oficial da agência.

Se o procedimento der certo, o Perseverance retomará a exploração na rocha que acabou gerando o problema. "Se nossos planos derem certo com nossa mitigação de seixos, podemos muito bem tentar extrair o núcleo de 'Issole' (a rocha da qual esta amostra foi retirada) novamente", disse Trosper.

Apesar do problema, o rover Perseverance é capaz de seguir trabalhando na superfície do planeta. Contudo, como a máquina ainda é relativamente nova em Marte, a agência quer tratar os componentes da melhor forma possível para evitar problemas futuros.

Essa não foi a primeira anomalia encontrada pela Nasa durante a missão. A primeira tentativa de coleta de amostras do solo veio vazia, o que levou a agência espacial americana a testar métodos alternativos para começar a coleta de rochas.

Segundo a Nasa, o robô é equipado com 43 tubos de amostra, sete dos quais foram arquivados até agora. Acredita-se que, até o final da década de 2020, esses tubos sejam enviados de volta para Terra por meio de uma ambiciosa missão chamada Mars Sample Return.