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

Helicóptero da Nasa está pronto para primeiro voo em Marte

Imagem do helicóptero ingenuity na superfície de Marte feita pelo rover Perseverance - Nasa/JPL-Caltech
Imagem do helicóptero ingenuity na superfície de Marte feita pelo rover Perseverance Imagem: Nasa/JPL-Caltech

Da AFP, em Washington

09/04/2021 19h37

O Ingenuity, helicóptero que a Nasa enviou a Marte, girou suas hélices pela primeira vez, em um teste para seu voo, previsto para a noite deste domingo, o primeiro de uma nave motorizada em outro planeta.

"O helicóptero está bem, parece forte", avaliou nesta sexta-feira o gerente de operações do Ingenuity, Tim Canham, em entrevista coletiva.

O momento foi registrado pelo robô Perseverance, localizado a metros de distância e no qual o helicóptero foi transportado desde que pousou em Marte, em fevereiro, antes de se separar do mesmo, no último fim de semana. A Nasa divulgou um breve videoclipe da nave, de aspecto semelhante a um grande drone, com as hélices girando.

O primeiro voo acontecerá às 2h54 GMT de segunda-feira (11h54 do domingo, em horário de Brasília), segundo a agência espacial americana, e os primeiros dados deverão chegar à Terra às 8h15 GMT (5h15 da segunda-feira, em horário de Brasília). A equipe da Nasa que analisa os primeiros dados fará uma transmissão ao vivo no site da agência.

O primeiro voo levará 40 segundos e será vertical. "Iremos subir a três metros de altura, girar na direção do robô, tirar uma foto e descer", detalhou Canham. A Nasa planeja até cinco voos, de dificuldade crescente, no período de um mês.

Um último teste das hélices deverá ser feito hoje, dessa vez "na velocidade total", informou MiMi Aung, gerente de projeto do helicóptero no Jet Propulsion Laboratory (JPL) da Nasa.

Decolar na atmosfera de Marte é um desafio, já que a mesma possui densidade equivalente a 1% da atmosfera terrestre. Embora a gravidade em Marte seja menor do que na Terra, as equipes da Nasa tiveram que desenvolver uma máquina ultraleve (1,8 kg), cujas hélices irão girar muito mais rapidamente que as de um helicóptero comum.

Sobre as chances de sucesso do voo, "a única incerteza segue sendo o entorno de Marte, incluindo os ventos", apontou Aung. Trata-se de uma experiência de "alto risco", mas com uma "grande recompensa", resumiu.