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

Clone do Ingenuity? China terá seu helicóptero robô para explorar Marte

Protótipo de helicóptero em miniatura para futuras missões em Marte feito na China - Divulgação/Centro Nacional de Ciência Espacial da China
Protótipo de helicóptero em miniatura para futuras missões em Marte feito na China Imagem: Divulgação/Centro Nacional de Ciência Espacial da China

Ryan Woo e Liangping Gao

De Pequim

02/09/2021 14h01Atualizada em 02/09/2021 15h23

A China desenvolve um protótipo de helicóptero miniatura para trabalhos de vigilância em futuras missões em Marte, de acordo com sua agência de ciência espacial, na esteira do pouso histórico de uma sonda robótica no Planeta Vermelho alguns meses atrás.

O protótipo é semelhante na aparência ao helicóptero robótico Ingenuity, desenvolvido pela Agência Aeroespacial dos Estados Unidos (Nasa) para sua missão Perseverance deste ano, segundo uma foto publicada no site do Centro Nacional de Ciência Espacial da China na quarta-feira.

A agência disse que o helicóptero poderia ser uma ferramenta para a exploração subsequente da China em Marte, mas não forneceu detalhes.

A China pousou uma sonda em Marte em maio, sua primeira missão ao planeta, tornando-se o segundo país a fazê-lo depois dos EUA. O Perseverance da Nasa pousou em solo marciano em fevereiro.

Da sonda da Nasa, o Ingenuity fez seu primeiro voo em abril, quando pairou três metros acima da superfície —o primeiro uso bem-sucedido de uma aeronave terrestre em outro planeta.

O desafio para o Ingenuity de 1,8 quilo é a atmosfera tênue do planeta, que só tem 1% da densidade daquela da Terra.

Como o Ingenuity, o protótipo chinês usa duas lâminas de rotor, uma base com sensor e câmera e quatro pernas finas, mas não tem um solar no topo, como sua parente norte-americana, de acordo com a foto.

O Ingenuity já fez mais de 10 excursões desde abril, cobrindo uma distância de mais de dois quilômetros e voando cerca de 20 minutos no total.