Tutorial: Entender a RF virtual (vRF) por meio do rebaixamento do Aqua usando a Rádio GNU

No Tutorial: Dados de downlink de um satélite público, os dados do satélite Aqua da NASA são recebidos por downlink usando um modem gerenciado, o que significa que o sinal RF bruto recebido do satélite Aqua pela estação terrestre é passado através de um modem gerenciado pelo Azure Orbital. A saída desse modem, que está na forma de bytes, é então transmitida para a VM do usuário. Como parte da etapa Configurar um perfil de contato para uma missão de downlink de satélite público, a Configuração de Demodulação foi definida como Transmissão Direta do Aqua, que foi o que habilitou e configurou o modem gerenciado para demodular/decodificar o sinal RF recebido do Aqua. Usando o conceito vRF, nenhum modem gerenciado é usado e, em vez disso, o sinal RF bruto é enviado para a VM do usuário para processamento. Esse conceito pode se aplicar ao downlink e ao uplink, mas neste tutorial examinamos o processo de downlink. Criamos um vRF, com base na Rádio GNU, que processa o sinal RF bruto e atua como o modem.

Neste guia, você aprenderá a:

  • Entenda as limitações e as compensações do uso do vRF.
  • Configure um perfil de contato por meio de vRF em vez de um modem gerenciado.
  • Processe dados recebidos por downlink do Aqua (na forma de RF bruto) usando a Rádio GNU como o modem, usando uma configuração offline/desenvolvimento e uma configuração em tempo real.

Pré-requisitos

Entender as limitações e as compensações do uso da vRF

Antes de nos aprofundarmos no tutorial, é importante entender como a vRF funciona e como ele se compara ao uso de um modem gerenciado. Com um modem gerenciado, toda a camada física (PHY) ocorre no Azure Orbital, o que significa que o sinal RF é processado imediatamente dentro dos recursos do Azure Orbital e o usuário recebe apenas os bytes de informações produzidos pelo modem. Ao escolher o vRF, não há modem gerenciado e o sinal de RF bruto é transmitido para o usuário a partir do digitalizador da estação terrestre. Essa abordagem permite que o usuário execute seu próprio modem ou capture o sinal RF para processamento posterior.

As vantagens do vRF incluem a capacidade de usar modems aos quais o Azure Orbital não oferece suporte ou não tem acesso. vRF também permite executar o mesmo sinal de RF através de um modem enquanto tenta diferentes parâmetros para otimizar o desempenho. Essa abordagem pode ser usada para reduzir o número de passagens por satélite necessárias durante o teste e acelerar o desenvolvimento. Devido à natureza dos sinais RF brutos, o tamanho do pacote/arquivo normalmente é maior do que os bytes contidos nesse sinal RF, geralmente entre 2-10x maior. Mais dados significam que a taxa de transferência de rede entre a VM e o Azure Orbital pode ser um fator limitante para o vRF.

Ao longo deste tutorial, você aprenderá em primeira mão como a vRF funciona. No final deste tutorial, incluímos vários detalhes específicos de RF e digitalizador que são de interesse para um usuário de vRF.

Função de DIFI dentro da vRF

As estações terrestres do Azure Orbital consistem em digitalizadores que utilizam DIFI para enviar e receber sinais RF digitalizados. O Protocolo de Pacote DIFI, tecnicamente chamado de "IEEE-ISTO Std 4900-2021: Digital IF Interoperability Standard", define uma interface de plano de dados destinada a transmitir e receber dados IF digitalizados (como exemplos de QI) e metadados correspondentes em redes IP padrão. Embora o DIFI seja um padrão "SE", as amostras de QI na banda base também podem ser transmitidas com DIFI, como acontece com o Azure Orbital. O principal caso de uso dos pacotes DIFI é criar uma interface entre digitalizadores de estações terrestres de satélite (transceptores) e modems de software, permitindo a interoperabilidade e combatendo o bloqueio de fornecedores que assola a indústria de satélites.

O Protocolo de Pacote DIFI contém dois tipos de mensagem principais: pacotes de dados e pacotes de contexto. Devido a motivos de hardware herdados, há duas versões diferentes de pacotes de contexto. As estações terrestres do Azure Orbital usam os pacotes de contexto atualizados (DIFI v1.1) para sinais X-Band e o formato herdado para sinais S-Band. Se você estiver usando o pacote gr-difi GNU Radio, certifique-se de selecionar o formato de 108 bytes para a Banda X e o formato de 72 bytes para a Banda S. Para vRFs não-GNU Radio você precisa garantir que a versão correta do DIFI seja usada para pacotes de contexto, a v1.1 pode ser encontrada aqui e a versão legada pode ser inferida de esta seção de código. Mais considerações são incluídas na vRF na Referência ao AOGS no final deste tutorial.

Etapa 1: Usar o AOGS para agendar um contato e coletar dados do Aqua

Primeiro, removemos o modem gerenciado e capturamos os dados RF brutos em um arquivo pcap. Execute as etapas listadas no Tutorial: Dados de downlink do satélite público Aqua da NASA, mas durante a etapa Configurar um perfil de contato para uma missão de downlink do Aqua, deixe a Configuração de Rebaixamento em branco e escolha UDP para Protocolo. Por fim, no final, em vez do socat comando (que captura pacotes TCP), execute sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap para capturar os pacotes UDP em um arquivo pcap.

Observação

As três modificações a seguir são necessárias para oTutorial: Downlink de dados do satélite público Aqua da NASA:

  • Configuração de rebaixamento: deixe em branco
  • Protocolo: escolha o UDP
  • Etapa 8 e 9: em vez disso, use o comando sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap

Após uma passagem de satélite, você deve ter um arquivo /tmp/aqua.pcap de tamanho de 10 a 20 GB (dependendo da elevação máxima). Esse arquivo contém pacotes DIFI que contêm o sinal RF bruto recebido pela estação terrestre, na forma de exemplos de QI.

Etapa 2: extrair os exemplos de QI dos pacotes DIFI

Em seguida, extraimos os exemplos de QI e os salvamos em uma forma mais tradicional, um arquivo de QI binário. As etapas a seguir podem ser executadas em qualquer VM/computador que tenha uma cópia do arquivo aqua.pcap que você criou. Essas etapas envolvem o uso de um script Python curto mantido pelo DIFI Consortium para extrair as amostras de IQ dos pacotes DIFI UDP em um arquivo IQ.

  1. Baixe ou copie o código a seguir em um novo script python.
  2. Edite filename para corresponder onde quer que tenha guardado o seu pcap (/tmp/aqua.pcap).
  3. Execute o script Python usando python3 difi_to_binary_iq.py, e ele deve criar um novo arquivo no mesmo diretório que seu pcap, com uma extensão .cs8. Este arquivo é o arquivo IQ binário, que contém as amostras de RF digitalizadas como inteiros de 8 bits e nada mais. O script leva algum tempo para ser executado e, à medida que é executado, o arquivo fica maior. Quando o script estiver concluído, o arquivo terá aproximadamente o mesmo tamanho que o arquivo pcap. Você pode parar o script antes da conclusão (com control-C) e continuar o tutorial; Toda a duração do contato não é necessária para o restante do tutorial.
  4. (Opcional) Se você quiser visualizar o sinal, instale o Inspectrum usando https://github.com/miek/inspectrum/wiki/Build#building-on-debian-based-distros execute o Inspectrum usando inspectrum /tmp/aqua.pcap.cs8 (usando o caminho para o novo arquivo .cs8). Uma vez na GUI do Inspectrum, você pode ajustar Power Max e Power Min para ver todo o alcance dinâmico do sinal.

Se você também quiser as amostras de QI no formato float32 em vez de int8 (alguns softwares só permitem carregar o formato float32), você pode usar o seguinte trecho do Python:

import numpy as np
samples = np.fromfile('/tmp/aqua.pcap.cs8', np.int8) / 127.0
samples = samples.astype(np.float32)
samples.tofile('/tmp/aqua.pcap.cf32')

Usaremos a versão float32 para a próxima etapa, pois ela simplifica o fluxograma de rádio GNU.

Etapa 3: rebaixar o sinal do Aqua na Rádio GNU

Em seguida, criamos o modem vRF real, baseado na Rádio GNU, usado para rebaixar o sinal do Aqua.

Logo for GNU Radio Free Software Project.

A Rádio GNU é um kit de ferramentas de desenvolvimento de software livre e gratuito que fornece blocos de processamento de sinal e muitos aplicativos de DSP (processamento de sinal digital) de exemplo. Ele pode ser usado com um hardware RF de baixo custo prontamente disponível para criar rádios definidos por software ou sem hardware em um ambiente semelhante a simulação. O GNU Radio é amplamente utilizado em ambientes de pesquisa, indústria, academia, governo e hobbystas para apoiar a pesquisa de comunicações sem fio e sistemas de rádio do mundo real. Neste tutorial, usamos a Rádio GNU para rebaixar o Aqua (ou seja, a Rádio GNU atua como o modem).

Embora a Rádio GNU possa ser usada no modo sem cabeça, neste tutorial, usamos a GUI da Rádio GNU (ou seja, interface da área de trabalho), portanto, você deve copiar /tmp/aqua.pcap.cf32 para uma VM com encaminhamento X11 ou computador com a área de trabalho do Ubuntu 20/22. O comando scp pode ser usado para copiar o arquivo de uma VM no Azure para um computador de desenvolvimento local.

Instalar o Rádio GNU

Se você estiver usando o Ubuntu 22, execute sudo apt-get install gnuradio. Se, em vez disso, você estiver no Ubuntu 20, use os seguintes comandos para instalar a Rádio GNU:

sudo add-apt-repository ppa:gnuradio/gnuradio-releases
sudo apt-get update
sudo apt-get install gnuradio python3-packaging

Verifique se o Rádio GNU foi instalado corretamente e se os gráficos estão funcionando usando gnuradio-companion; uma janela deve aparecer com esta aparência:

Screenshot of the GNU Radio desktop GUI.

Se a árvore de blocos à direita não for exibida, você poderá mostrá-la usando o ícone de lupa no canto superior direito.

Executar o flowgraph do Aqua

Um aplicativo de rádio GNU é chamado de "fluxograma", e normalmente processa ou gera um sinal de RF. O flowgraph inicial a ser usado pode ser baixado aqui. Abra esse arquivo .grc na Rádio GNU e você verá o seguinte flowgraph:

Screenshot of the GNU Radio Aqua flowgraph.

Observação

Para aqueles que não estão interessados nos detalhes de como o flowgraph/modem funciona, você pode ignorar o parágrafo a seguir

O flowgraph começa lendo no arquivo IQ, convertendo-o de inteiros intercalados de 8 bits para o tipo de dados complexo da Rádio GNU e, em seguida, ele faz a reamostragem do sinal para ir do MHz original de 18,75 para 15 MHz, que é um número inteiro de amostras por símbolo. Essa reamostragem pode ser um pouco confusa porque, no Perfil de Contato, especificamos uma largura de banda de 15 MHz. Conforme discutido no final deste tutorial, para sinais X-Band, o digitalizador usa uma taxa de amostragem que é 1,25 vezes a largura de banda especificada. Acontece que neste flowgraph queremos uma taxa de amostragem de 15 MHz, para que tenhamos exatamente dois exemplos por símbolo; portanto, devemos ressample de 18,75 MHz a 15 MHz. Em seguida, temos um bloco AGC (controle de ganho automático) para normalizar o nível de energia do sinal. O filtro de cosseno gerado raiz (RRC) atua como o filtro correspondente. O loop Costas executa a sincronização de frequência para remover quaisquer deslocamentos de frequência pequenos causados por erro oscilador ou correção imperfeita do Doppler. Os próximos três blocos são usados porque o Aqua usa OQPSK (QPSK de deslocamento) em vez do QPSK regular. A sincronização de símbolos é executada para que os símbolos OQPSK sejam amostrados em seus picos. Podemos visualizar essa amostragem do QPSK usando o bloco Coletor de Constelação (uma saída de exemplo é mostrada). O restante do flowgraph intercala as partes reais e imaginárias e as salva como int8's (chars/bytes) que representam os símbolos suaves. Embora possa converter esses símbolos suaves em 1 e 0, o processamento posterior se beneficia de ter os valores de símbolo completos.

Antes de executar o fluxograma, clique duas vezes no bloco Fonte de arquivo e atualize o caminho para corresponder onde você salvou /tmp/aqua.pcap.cf32. Clique no botão Reproduzir na parte superior para executar o flowgraph. Se as etapas anteriores foram bem-sucedidas e o contato do Aqua foi um sucesso, você deverá ver o seguinte gráfico de densidade espectral de energia (PSD) e IQ exibidos:

Screenshot of the GNU Radio Aqua Power Spectral Density (PSD).

Screenshot of the IQ plot of the Aqua signal.

O seu pode variar, com base na força que o sinal foi recebido. Se nenhuma GUI aparecer, verifique a saída da Rádio GNU no canto inferior esquerdo para erros. Se a GUI aparecer, mas se parecer com uma linha barulhenta horizontal (sem corcunda), isso significa que o contato não recebeu o sinal do Aqua. Nesse caso, verifique mais uma vez se o rastreamento automático está habilitado em seu Perfil de Contato e se a frequência central foi inserida corretamente.

O tempo que leva para o GNU Radio terminar é baseado em quanto tempo você deixa o script pcap_to_iq ser executado, combinado com a potência da CPU do seu computador/VM. À medida que o fluxograma é executado, ele está demodulando o sinal de RF armazenado no /tmp/aqua.pcap.cf32 e criando o arquivo /tmp/aqua_out.bin, que contém a saída do modem. Sinta-se à vontade para copiar este arquivo .bin da VM.

Encerramos este tutorial aqui. Se você estiver interessado em decodificar os bytes em imagens, poderá usar as ferramentas da NASA ou ferramentas de código aberto como altillimity/X-Band-Decoders.

(Opcional) Etapa 4: executar o fluxograma da Rádio GNU ao vivo

Este tutorial até este ponto representa a parte de design/teste da criação de um vRF. Transformamos esse fluxograma de Rádio GNU para que ele possa ser executado ao vivo na VM, semelhante a um modem vRF verdadeiro.

Manipular a entrada

Anteriormente, convertemos manualmente o pcap de pacote DIFI em um arquivo de QI binário e, em seguida, carregamos esse arquivo de QI binário na Rádio GNU com o bloco Origem Fink. Podemos simplificar nosso flowgraph usando um bloco dentro de gr-difi (mantido pela Microsoft) projetado para receber pacotes DIFI na Rádio GNU! Esse bloco adicionado exige que instalemos um módulo OOT (rádio fora da árvore) do GNU, que é como um plug-in para a Rádio GNU:

sudo apt-get install python3-pip cmake liborc-dev doxygen
sudo pip install pytest pybind11
cd ~
git clone https://github.com/DIFI-Consortium/gr-difi
cd gr-difi
mkdir build
cd build
cmake -DCMAKE_FIND_ROOT_PATH=/usr ..
make -j4
sudo make install
sudo ldconfig

Após essas etapas, você poderá reabrir a Rádio GNU e ver os novos blocos (DifI Source e DIFI Sink) listados na árvore de blocos. No flowgraph usado durante a seção anterior, execute estas etapas:

  1. Substituir o bloco Fonte de Arquivo por um bloco DIFI Source
  2. Clique duas vezes no bloco DIFI Source para editar seus parâmetros
  3. O endereço IP de origem deve ser o IP da interface eth0 da VM
  4. A porta deve ser 56001, assim como usamos na etapa tcpdump
  5. Defina o Número do Fluxo DIFI como 0. Todos os outros parâmetros podem ser deixados como padrão

Se você quiser testar esse flowgraph em seu computador de desenvolvimento, precisará de uma ferramenta como udpreplay para reproduzir o pcap que gravamos. Caso contrário, você pode aguardar para testar essa parte até que o flowgraph seja usado ao vivo na VM conectada ao Azure Orbital. Essa limitação é um dos motivos pelos quais ajuda a fazer uma gravação do sinal durante a fase de desenvolvimento e teste da vRF.

Manipular a saída

Você pode optar por deixar o Coletor de Arquivos no final e recuperar o arquivo gravado a cada passagem, mas muitos aplicativos exigem streaming dos bytes para fora do modem. Uma opção é usar o TCP Sink Block no lugar do File Sink. O Bloco do Coletor TCP pode ser configurado em um servidor ou no modo cliente, dependendo de qual lado deve fazer a conexão inicial. Defina o Tipo de Entrada como Byte e o Coletor TCP transmite os bytes por uma carga TCP bruta.

O Coletor do ZMQ PUB é outra opção. Ele é uma biblioteca de mensagens que fica na parte superior do TCP ou da IPC (comunicação entre processos), para um comportamento mais complexo, como PUB/SUB.

Se você deixá-lo como um coletor de arquivos, recomendamos adicionar algumas linhas de Python no final do fluxograma (depois que ele terminar) que copia o arquivo criado para um novo local.

Executar o flowgraph no modo sem cabeça

Há uma boa chance de que a VM que recebe o fluxo do Azure Orbital não dê suporte a um ambiente de área de trabalho, o que faz com que a Rádio GNU falhe. Devemos configurar esse flowgraph para evitar o uso de GUIs.

  1. Edite o bloco Opções no canto superior esquerdo
  2. Em Gerar Opções, escolha Nenhuma GUI
  3. Em Opções de Execução, escolha Executar até a Conclusão
  4. Clique em OK

Essas etapas nos permitem executar o flowgraph como um script Python sem GUI e, quando o soquete de entrada fecha, o flowgraph deve terminar automaticamente.

Screenshot of GNU Radio running in Headless Mode.

Executar o flowgraph ao vivo

Depois que o flowgraph for configurado com a Origem DIFI e no modo sem cabeça, poderemos executar o flowgraph ao vivo na VM. No GRC (Complementar de Rádio GNU), sempre que você apertar o botão para reproduzir, um arquivo .py é criado no mesmo diretório. Esse script Python precisa ser copiado para a VM. Se a GNU Radio e gr-difi foram instaladas corretamente, você deverá ser capaz de executar o script Python usando python yourflowgraph.py e aguardar o fluxo DIFI do Azure Orbital iniciar. Você pode se sentir à vontade para adicionar qualquer código Python desejado a esse script Python, como copiar o arquivo resultante para um novo local a cada passagem. Observação: se você regenerar o script Python dentro do GRC, esse novo código Python precisará ser adicionado manualmente novamente.

Se as etapas acima funcionaram, você criou e implantou com sucesso um vRF downlink, baseado no GNU Radio!

vRF dentro da referência ao AOGS

Nesta seção, fornecemos vários detalhes específicos de RF/digitalizador que são de interesse para um usuário ou designer de vRF.

No lado do downlink, uma vRF recebe um sinal do Azure Orbital. Um fluxo DIFI é enviado para a VM do usuário pelo Azure Orbital durante um contato via satélite. Espera-se que o usuário capture o fluxo em tempo real, gravando-o ou processando-o ao vivo. Exemplos incluem o uso de tcpdump, socat ou ingerido diretamente em um modem. Em seguida, estão algumas especificações relacionadas à forma como a estação terrestre do Azure Orbital recebe e processa o sinal:

  • A frequência central é especificada no Perfil de Contato
  • A BW (largura de banda de sinal) é definida no Perfil de Contato e a taxa de exemplo é 1.25*BW para contatos de banda X e 1.125*BW para banda S
  • O fluxo DIFI usa profundidade de 8 bits (2 bytes por exemplo de QI)
  • O modo de ganho do digitalizador é definido para usar o AGC (controle de ganho automático) com um destino de energia de -10 dBFS
  • Nenhuma inversão espectral é usada
  • Nenhum deslocamento de frequência é usado
  • O tamanho da MTU da VM do usuário deve ser definido como 3650 para X-Band e 1500 para S-Band, que é o tamanho máximo do pacote proveniente do Azure Orbital

No lado do uplink, o usuário deve fornecer um fluxo DIFI para o Azure Orbital durante toda a passagem, para que o Azure Orbital transmita. As seguintes observações podem ser de interesse para um designer de vRF de uplink:

  • A frequência central é especificada no Perfil de Contato
  • A taxa de amostragem do sinal é definida por meio do fluxo DIFI (embora uma largura de banda seja fornecida como parte do Perfil de Contato, é puramente para a configuração de rede sob o capô)
  • A profundidade do bit é definida por meio do fluxo DIFI, mas o Azure Orbital espera 8 bits
  • A ID do fluxo DIFI deve ser definida como 0
  • Semelhante ao downlink, o tamanho do MTU deve ser de 1.500 para a Banda S e até 3.650 para a Banda X (a escolha é sua)
  • Nenhuma inversão espectral é usada
  • Nenhum deslocamento de frequência é usado

Próximas etapas

Para implantar facilmente os componentes downstream necessários para receber e processar dados espaciais de observação da Terra usando a Estação Terrestre do Azure Orbital, confira: