Jeffrey Cross
Jeffrey Cross

Mapas topográficos de impressão 3D a partir de dados de ônibus espaciais

Em fevereiro de 2000, a Space Shuttle Endeavor embarcou em uma missão de 11 dias conhecida como SRTM (Shuttle Radar Tomography Mission). Seu objetivo era coletar dados interferométricos RADAR para gerar um banco de dados topográfico digital de alta resolução da Terra. Os dados resultantes são uma coleção de arquivos chamados Digital Elevation Models (DEMs). Esses arquivos contêm elevações em metros acima do nível médio do mar abaixo de 60 graus de latitude. A resolução dos dados é de 1 segundo de arco na América do Norte e 3 segundos de arco na América do Norte e (na maior parte) no restante das massas terrestres da Terra.

NOTA: A partir do outono de 2014, a agência responsável pelos dados SRTM começou a liberar os dados SRTM para o resto do mundo com uma resolução de 1 segundo de arco. O primeiro continente libertado foi a África com as outras regiões do mundo divulgadas nos meses seguintes.

O objetivo deste projeto é converter dados SRTM de elevação de segundo arco em uma superfície 3D que pode ser usada como base para a criação de Mapas de relevo aprimorados usando uma impressora 3D. O software criado para este fim é chamado SRTM2STL. O software lê um arquivo SRTM binário de 3 segundos de arco contendo dados de elevação e o converte em triângulos e grava um arquivo de saída em Standard Tessellation Language (STL), um formato de arquivo 3D comum, em formato binário ou de texto. Depois que um arquivo STL é gerado, ele pode ser facilmente importado para o software de fatiamento fornecido pelo fornecedor de impressoras 3D. O software de fatiamento converte os dados em G-Code, um formato de arquivo usado por impressoras 3D para controlar a impressão.

Dados SRTM

Os dados do segundo arco do SRTM 3 são codificados como dados binários de cumprimento de 16 bits 2 assinados. Em 3 segundos de arco, um quadrado de um grau por um grau da Terra é dividido em 1200 por 1200 pontos de dados. Os dados SRTM são armazenados como 1201 por 1201 pontos. Cada ponto de dados é armazenado como um par de bytes. Esses pares de bytes formam um arquivo de 2.884.802 bytes (1201 x 1201 * 2 bytes por ponto). Cada borda superior e direita dos dados contém os mesmos dados que as bordas esquerda e inferior do quadrado adjacente (1200 + 1). Isso pode ser usado como informação de registro quando os arquivos são concatenados.

Programas

O software para criar arquivos STL, SRTM2STL, é escrito em baunilha simples (muito simples) C. O software pode ser compilado em um programa executável em virtualmente qualquer plataforma, ou seja, qualquer plataforma com um compilador C, por exemplo, gcc.

Algoritmo

O processo de converter os dados SRTM em um arquivo STL começa convertendo cada grupo de 4 pontos em dois triângulos. Cada triângulo requer três pontos triplos x, ye z para definir a localização do triângulo no espaço. Além disso, cada triângulo precisa de um vetor normal x, yez para definir sua orientação no espaço. O vetor normal deve apontar para fora do objeto que está sendo definido de acordo com a Regra da Mão Direita (descrita mais adiante). Os dados resultantes formam a superfície do mapa de relevo.

Além da superfície do mapa de relevo, o programa também tem que criar os quatro lados e um fundo tornando o modelo 3D fechado ou 'à prova d'água'. Isso conclui o modelo 3D que pode ser importado para um visualizador de arquivos STL para inspeção ou fatiamento do software para criar os dados necessários para imprimir em 3D o modelo.

Para dados SRTM contendo 1201 X 1201 pontos de dados, a superfície da área que está sendo criada (junto com os lados e a parte inferior) conterá 5759996 triângulos (ou facetas / polígonos).

Furos de enchimento

Por uma variedade de razões, alguns dos dados nos arquivos SRTM originais estão faltando. Os pontos faltantes são marcados ao tornar o ponto igual ao maior valor negativo possível para um bit 16 ou -32768. Os pontos de dados marcados podem ser facilmente localizados dentro dos dados e, se a opção for selecionada, os furos podem ser preenchidos pelo software. O software implementa um algoritmo linear simples para esse propósito.

O algoritmo de preenchimento linear funciona encontrando um furo nos dados em uma linha na matriz que contém os dados. O algoritmo então procura o próximo ponto de dados na linha que não é um buraco. A inclinação é então calculada entre os dois pontos finais. A elevação é calculada para cada furo com base na inclinação e os furos são preenchidos com o valor computado.

O algoritmo de preenchimento linear tem limitações. Por exemplo, quando muitos dados estão faltando, o programa cria linhas de preenchimento linear longas (que podem parecer ruins). Normalmente, os dados estão faltando por causa do espalhamento do sinal RADAR ao longo de áreas de superfície irregular irregulares. As linhas preenchidas longas lineares geralmente não correspondem muito bem à superfície nesses casos e, portanto, costumam parecer ruins. Um algoritmo melhor para lidar com buracos é um lugar onde melhorias podem ser feitas neste software.

Há outro problema que você pode encontrar com o algoritmo de preenchimento linear (conforme implementado na versão inicial do software). É quando o buraco começa no início ou no final de uma linha (uma borda). Para corrigir os problemas encontrados nessa situação, o usuário deve extrair os dados dos furos que aparecem ao longo da borda. Este é mais um lugar onde há espaço para melhorias no algoritmo original.

Outra maneira de evitar o problema com buracos é baixar arquivos corrigidos. Muito trabalho foi feito pela equipe da SRTM para preencher buracos usando uma variedade de técnicas. Um link para os arquivos corrigidos pode ser encontrado nas referências.

Opções de linha de comando

O programa usa opções de linha de comando para controlar seu comportamento. A sintaxe da linha de comando é a seguinte:

saída de entrada srtm2stl [Opções]

Opções / A - Amplificação - Fator para multiplicar as alturas por. Isso é aplicado antes que o preconceito seja adicionado / subtraído. / B - Bias - deve ser um inteiro. Negativo para abaixar o mapa (fino). / C - Subconjunto de coordenadas - Latitude, Longitude, Latitude, Longitude (minutos decimais). / F - Corrigir furos (preenchimento linear). / N - Altere o nome do sólido nos arquivos STL ASCII. / H + significa imprimir as coordenadas da matriz do furo (dados ausentes). S | s - Subconjunto - Start_Row, Start_Column, Stop_Row, Stop_Column / T + significa saída Formato ASCII / T- significa formato binário de saída. V - Ativar saída detalhada

Criando Polígonos

Cada polígono que forma as facetas da superfície 3D criada por SRTM2STL é composto de 3 coordenadas tridimensionais, X, Y e Z. As coordenadas X e Y representam a longitude e a latitude, enquanto a coordenada Z representa a altura do ponto acima do geóide ou aproximadamente, significa o nível do mar. Para criar a superfície superior do mapa, usamos 4 pontos adjacentes. Por exemplo, se estivermos iniciando nas coordenadas da parte superior esquerda do mapa, usaremos os dois primeiros pontos da primeira linha e os dois primeiros da segunda linha. O primeiro polígono é criado a partir do primeiro ponto da linha 1 e dos dois pontos da linha dois. O segundo polígono é criado a partir do segundo ponto da primeira linha e dos dois pontos da segunda linha. Isso implica que os dois polígonos compartilham uma borda comum e o fazem.

Aqui estão alguns dados de amostra produzidos pelo programa que compõe dois polígonos. Os dados que representam um único polígono são compostos por três conjuntos de pontos. Cada ponto é composto de três coordenadas X, Y e Z. O primeiro polígono neste exemplo é composto desses três pontos:

Ponto 1: 0,000000, 0,000000, 223,000000 Ponto 2: 0,000000, 92,408531, 219,000000 Ponto 3: 68,984360, 0,000000, 182,000000

O segundo polígono é composto dos seguintes três pontos (X, Y e Z):

Ponto 1: 68,984360, 92,408531, 180,000000 Ponto 2: 0,000000, 92,408531, 219,000000 Ponto 3: 68,984360, 0,000000, 182,000000

Assim, a superfície superior é criada a partir de todos os polígonos gerados pelo programa com base nas opções selecionadas. Os dados de elevação são extraídos dos dados do SRTM e armazenados em um array 2D na memória do programa. As distâncias e, portanto, as coordenadas, dos dados de latitude e longitude são criadas pela multiplicação dos índices inteiros das linhas e colunas da matriz pela distância por ponto em cada direção.As distâncias de longitude (norte e sul) são diferentes da latitude (leste e oeste) porque a distância de latitude diminui conforme você vai do equador para os pólos. A distância da latitude (leste e oeste) é calculada para a parte inferior do quadrado de 1 grau por 1 grau. Seria mais preciso recalcular esse valor à medida que você percorre a matriz para que a "conicidade" existente naturalmente seja representada com precisão. Praticamente falando, esta diferença de distância é principalmente imperceptível. Poderia ser adicionado no futuro como uma opção de programa.

Depois que a superfície superior é criada, o programa fecha os lados e o fundo criando pares de polígonos de três pontos, como pode ser visto na figura abaixo.

Cálculos

Uma das coisas necessárias no arquivo STL de saída é normal à superfície de cada polígono. Este vetor aponta para fora do objeto que está sendo criado, isto é, o vetor indica a direção do lado de fora do objeto.

O normal é calculado usando a regra da mão direita. Graficamente isto se parece com isto:

Então, dado que, à medida que você cria os polígonos, sabe onde estão fora e dentro, escolha um vértice do polígono. De acordo com a figura acima, os vetores a e b corresponderão respectivamente ao índice e ao dedo médio, e o vértice é o ponto onde eles começam. Assim, o produto cruzado irá calcular o vetor normal que é representado pelo polegar na imagem acima. O polegar, após esse cálculo, apontará "fora" do objeto.

O cálculo do Produto Cruzado assume que as coordenadas do vértice são (0,0,0). De modo a fazer o cálculo a partir de três conjuntos de coordenadas, os vectores a e b são calculados subtraindo as coordenadas componentes do vértice das coordenadas componentes das extremidades, isto é, as coordenadas das pontas dos dedos na imagem acima. Usaremos essas coordenadas normalizadas para o cálculo do produto cruzado.

Dados três conjuntos de coordenadas que definem um polígono como r, se t onde r é o vértice e, dado que a regra da mão direita é seguida em que r-> s representa o vetor a e r-> t representa o vetor b, então o cálculo dos vetores aeb é o seguinte:

ax = sx - rx ay = sy az az = sz - rz

bx = tx - rx por = ty - ry bz = tz - rz

O produto cruzado, c, é calculado de a e b como:

cx = (ay * bz) - (az * por) cy = (ax * bz) - (az * bx) cz = (ax * por) - (ay * bx)

O Produto Cruzado é gravado no arquivo STL de saída junto com as coordenadas das extremidades do polígono.

Formato de arquivo

Existem dois formatos de arquivo de saída para arquivos STL: texto e binário. O formato de arquivo de texto representa os dados como um arquivo ASCII de texto. Aqui está um exemplo de como um ponto de dados STL se parece como texto:

some_name sólido

faceta normal 61.678 -65.695 -675.324

laço externo

vértice 65708.836 30.839 999.000 vértice 65708.836 61.678 1002.000 vértice 65730.734 30.839 1001.000

endloop

endfacet

finsolid

No exemplo acima, é claro que haveria mais de uma faceta (polígono). Os três números que seguem a faceta normal são as coordenadas do normal para as facetas x, y e z. Cada vértice é uma coordenada de um dos três pontos que representa um canto da faceta e, portanto, cada um deles tem um componente x, y e z.

Formato de arquivo binário STL é muito mais compacto do que o formato de texto. Também é mais difícil de entender se você não "fizer" números binários. No formato binário, cada um dos números é armazenado como um número de ponto flutuante de precisão simples de 32 bits. O arquivo começa com um cabeçalho fixo de 80 bytes, que pode conter qualquer coisa, mas geralmente contém uma breve descrição do arquivo. Em seguida, há um único inteiro de 32 bits que contém o valor do número de triângulos contidos no arquivo. A seguir, quatro conjuntos de três números de ponto flutuante. O primeiro conjunto de flutuadores é o normal para a superfície x, y e z. Depois disso vem os três pontos que descrevem os cantos do triângulo e cada ponto tem três números de ponto flutuante de 32 bits x, ye z.

Conclusão

O código fonte do SRTM2STL está disponível no GitHub. Foi lançado sob a licença GNU. Minha esperança é que os outros modifiquem e ampliem o software. Também espero que os mapas de relevo criados com ele sejam usados ​​tanto para educar quanto para fascinar.

Abaixo estão algumas capturas de tela do software de visualização 3D, juntamente com as peças impressas em 3D. Quanto melhor a resolução da impressora, melhor a saída corresponde ao modelo.

Glaciar Perito Moreno - Argentina

Monte Saint Helens - Oregon

Cratera, lago, oregon

Ação

Deixar Um Comentário