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

Por que o pouso do primeiro estágio do Falcon 9 foi incrível? Veja detalhes

Marcella Duarte

Colaboração para Tilt

03/06/2020 04h00

O lançamento da cápsula Crew Dragon, no último sábado (30), foi um sucesso. Doug Hurley e Bob Behnken, os dois astronautas da Nasa, já estão vivendo na Estação Espacial Internacional (ISS). Mas, enquanto eles chegavam em segurança à orbita, outro procedimento complexo precisava acontecer aqui na Terra: a recuperação do primeiro estágio do foguete Falcon 9.

E ela também foi bem sucedida. O foguete pousou no navio autônomo (droneship) "Of Course I Still Love You", no meio do Oceano Atlântico, também no sábado (30), minutos após a decolagem.

Já o navio retornou com sucesso à base de Cabo Canaveral, na Flórida, com o Falcon 9 a tiracolo, na noite desta terça-feira (2).

Foguetes são caríssimos (o preço do Falcon 9 é estimado em US$ 90 milhões) e, ao mesmo tempo, descartáveis nas viagens espaciais. Chamado de "booster", o primeiro estágio é a parte que impulsiona o lançamento, queimando uma grande quantidade de combustível (sabe aquelas labaredas no lançamento?).

Minutos após a decolagem, ele é desacoplado da cápsula para reduzir o peso e resistência à gravidade da carga principal, e cai de volta à Terra.

O primeiro estágio é também a parte mais pesada —e cara— do foguete. Recuperá-lo é um grande avanço. O Falcon 9 tem um segundo estágio, que realiza manobras, e depois é desacoplado e vira lixo espacial. Outros foguetes têm até um terceiro estágio.

O processo é bem monitorado: além de cálculos precisos, o pedaço de foguete tem propulsores que ajudam a controlar a trajetória de retorno. Ainda assim, não há precisão total. Por isso, um navio fica a postos na área prevista, como um heliporto flutuante.

A SpaceX tem dois droneships em atividade: "Of Course I Still Love You" (OCISLY) e "Just Read the Instructions" (JRtI). Os nomes engraçadinhos são uma referência nerd ao livro de ficção científica "The Player of Games", do escocês Iain M. Banks.

Os dois navios operam no Oceano Atlântico, para servir a Cabo Canaveral no projeto Starlink, em experimentos de empresas privadas na ISS e nas missões da Nasa. Até agora, dos 42 vôos do Falcon 9, 33 pousaram com sucesso no porto aquático —um aproveitamento de 78.6%.

O "Just Read the Instructions" já está se posicionando para o lançamento do novo lote de 60 satélites da Starlink, que deve acontecer nesta quarta-feira (3).

Estas balsas robóticas —chamadas de ASDS, sigla em inglês para navio autônomo para porto de naves— são uma das chaves para um programa espacial mais barato. Os foguetes são recuperados rapidamente e sem danos. Se eles simplesmente caíssem na água ou em terra, precisariam de reformas para serem usados novamente.

A missão "Demo-2" tornou a SpaceX, do excêntrico milionário Elon Musk, a primeira empresa privada a enviar pessoas ao espaço, inaugurando uma nova era da exploração espacial, mais barata e eficiente. Antes disso, astronautas ficaram por nove anos sem decolar de solo norte-americano —nesse meio tempo, foram em foguetes russos.

Agora, a SpaceX ainda precisa trazer os dois astronautas em segurança de volta à Terra —o que deve acontecer em agosto. Este é o primeiro o do Projeto Artemis, coordenado pela Nasa, que quer colocar uma mulher na Lua até 2024. O objetivo final é que humanos pisem pela primeira vez em Marte, um feito previsto para 2030.