Tutorial: Entenda o RF virtual (vRF) através da demodulação do Aqua usando o GNU Radio

No Tutorial: Dados de downlink de um satélite público, os dados do satélite Aqua da NASA são downlinked usando um modem gerenciado, o que significa que o sinal de 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 Aqua Direct Broadcast, que é o que habilitava e configurava o modem gerenciado para demodular/decodificar o sinal de RF recebido do Aqua. Usando o conceito vRF, nenhum modem gerenciado é usado e, em vez disso, o sinal de RF bruto é enviado para a VM do usuário para processamento. Este conceito pode ser aplicado tanto ao downlink quanto ao uplink, mas neste tutorial examinamos o processo de downlink. Criamos um vRF, baseado no GNU Radio, que processa o sinal de RF bruto e atua como o modem.

Neste guia, ficará a saber como:

  • Entenda as limitações e compensações do uso do vRF.
  • Configure um perfil de contato através do vRF em vez de um modem gerenciado.
  • Processe dados downlinked do Aqua (na forma de RF bruto) usando GNU Radio como modem, usando uma configuração offline/desenvolvimento e uma configuração em tempo real.

Pré-requisitos

  • Tutorial completo : Downlink dados do satélite público Aqua da NASA, pois este tutorial pressupõe que você já configurou a espaçonave e a VM.

Compreender as limitações e compensações do uso do vRF

Antes de nos aprofundarmos no tutorial, é importante entender como o 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 de RF é imediatamente processado dentro dos recursos do Azure Orbital e o usuário recebe apenas os bytes de informações produzidos pelo modem. Ao escolher 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. Esta abordagem permite ao usuário executar seu próprio modem, ou capturar o sinal de 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. Esta abordagem pode ser usada para reduzir o número de passagens de satélite necessárias durante os testes e acelerar o desenvolvimento. Devido à natureza dos sinais de RF brutos, o tamanho do pacote / arquivo é normalmente maior do que os bytes contidos nesse sinal de RF; geralmente entre 2-10x maior. Mais dados significa 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ê aprende em primeira mão como o 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 vRF.

Papel do DIFI dentro do vRF

As estações terrestres do Azure Orbital consistem em digitalizadores que utilizam DIFI para enviar e receber sinais de RF digitalizados. O DIFI Packet Protocol, tecnicamente referido como "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 amostras IQ) e metadados correspondentes em redes IP padrão. Embora o DIFI seja um padrão "IF", as amostras de QI na banda base também podem ser transmitidas com DIFI, como é 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 a dependência do fornecedor que assola a indústria de satélites.

O DIFI Packet Protocol contém dois tipos de mensagens principais: pacotes de dados e pacotes de contexto. Devido a razões de hardware herdadas, existem 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 de Banda X e o formato herdado para sinais de Banda S. Se você estiver usando o pacote gr-difi GNU Radio, você quer ter certeza de selecionar o formato de 108 bytes para X-Band e o formato de 72 bytes para S-band. Para vRFs não-GNU Radio você precisa garantir que a versão correta do DIFI seja usada para pacotes de contexto, v1.1 pode ser encontrada aqui e a versão legada pode ser inferida a partir desta seção de código. Mais considerações estão incluídas no vRF dentro da Referência AOGS no final deste tutorial.

Passo 1: Use o AOGS para agendar um contato e coletar dados do Aqua

Primeiro, removemos o modem gerenciado e capturamos os dados brutos de RF em um arquivo pcap. Execute as etapas listadas no Tutorial: Downlink dados do satélite público Aqua da NASA, mas durante a etapa Configurar um perfil de contato para uma missão de downlink Aqua deixe a Configuração de Demodulação 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 para um arquivo pcap.

Nota

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

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

Depois de uma passagem de satélite, você deve ter um arquivo /tmp/aqua.pcap de tamanho 10-20 GB (dependendo da elevação máxima). Este arquivo contém pacotes DIFI contendo o sinal de RF bruto recebido pela estação terrestre, na forma de amostras de QI.

Passo 2: Extraia as amostras de QI dos pacotes DIFI

Em seguida, extraímos as amostras de QI e as salvamos em uma forma mais tradicional; um arquivo IQ 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 QI dos pacotes DIFI UDP em um arquivo IQ.

  1. Faça o download 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 do seu pcap, com uma .cs8 extensão. 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 e execute o Inspectrum usando inspectrum /tmp/aqua.pcap.cs8 (usando o caminho para o novo .cs8 arquivo). Uma vez na GUI do Inspectrum, você pode ajustar Power Max e Power Min ver a faixa dinâmica completa do sinal.

Se você também gostaria das 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 o próximo passo, pois simplifica o fluxograma GNU Radio.

Passo 3: Desmodular o sinal Aqua no GNU Radio

Em seguida, criamos o modem vRF real, baseado no GNU Radio, usado para desmodular o sinal Aqua.

Logo for GNU Radio Free Software Project.

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

Embora o GNU Radio possa ser usado no modo sem cabeça, neste tutorial we1 usamos a GUI do GNU Radio (ou seja, interface de desktop), então você deve copiar /tmp/aqua.pcap.cf32 para uma VM com encaminhamento X11 ou computador com desktop Ubuntu 20/22. O comando scp pode ser usado para copiar o arquivo de uma VM no Azure para uma máquina de desenvolvimento local.

Instalar o GNU Radio

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 o GNU Radio:

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

Verifique se o GNU Radio foi instalado corretamente e se os gráficos estão funcionando usando gnuradio-companionuma janela que se parece com isto:

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.

Execute o fluxograma Aqua

Um aplicativo GNU Radio é chamado de "flowgraph", e normalmente processa ou gera um sinal de RF. O fluxograma inicial a utilizar pode ser descarregado aqui. Abra este .grc arquivo dentro do GNU Radio e você verá o seguinte fluxograma:

Screenshot of the GNU Radio Aqua flowgraph.

Nota

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

O fluxograma começa lendo o arquivo IQ, convertendo-o de inteiros intercalados de 8 bits para o tipo de dados complexo do GNU Radio, em seguida, ele refaz a amostragem do sinal para ir dos 18,75 MHz originais para 15 MHz, que é um número inteiro de amostras por símbolo. Essa nova amostra pode ser um pouco confusa porque no Perfil de Contato especificamos uma largura de banda de 15 MHz. Como discutido mais no final deste tutorial, para sinais de banda X o digitalizador usa uma taxa de amostragem que é 1,25 vezes a largura de banda especificada. Acontece que neste fluxograma queremos uma taxa de amostragem de 15 MHz, de modo que temos exatamente duas amostras por símbolo; portanto, devemos refazer a amostragem de 18,75 MHz para 15 MHz. Em seguida, temos um bloco de controle de ganho automático (AGC), para normalizar o nível de potência do sinal. O filtro de cosseno elevado pela raiz (RRC) atua como o filtro correspondente. O loop Costas executa a sincronização de frequência para remover qualquer pequeno deslocamento de frequência causado por erro do oscilador ou correção imperfeita do Doppler. Os próximos três blocos são usados porque Aqua usa QPSK offset (OQPSK) em vez de QPSK regular. A sincronização de símbolos é então executada para que os símbolos OQPSK sejam amostrados em seus picos. Podemos visualizar esta amostragem de QPSK usando o bloco Constellation Sink (um exemplo de saída é mostrado). O restante do fluxograma intercala as partes real e imaginária, e as salva como int8's (chars/bytes) que representam os símbolos suaves. Embora possa converter esses símbolos suaves para 1 e 0, o processamento posterior se beneficia de ter os valores completos do símbolo.

Antes de executar o fluxograma, clique duas vezes no bloco Fonte do arquivo e atualize o caminho para corresponder onde quer que você tenha salvo./tmp/aqua.pcap.cf32 Clique no botão de reprodução na parte superior para executar o fluxograma. Se as etapas anteriores foram bem-sucedidas e seu contato Aqua foi um sucesso, você verá a seguinte densidade espectral de potência (PSD) e gráfico de QI 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 intensidade do sinal recebido. Se nenhuma GUI apareceu, verifique se há erros na saída do GNU Radio no canto inferior esquerdo. Se a GUI aparecer, mas se assemelhar a uma linha horizontal barulhenta (sem corcunda), significa que o contato não recebeu o sinal Aqua. Nesse caso, verifique se o rastreamento automático está ativado no seu Perfil de Contato e se a frequência central foi inserida corretamente.

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

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

(Opcional) Passo 4: Executar o fluxograma GNU Radio ao vivo

Este tutorial até este ponto representa a parte de design/teste da criação de um vRF. Nós transformamos este fluxograma GNU Radio para que ele possa ser executado ao vivo na VM, assemelhando-se a um verdadeiro modem vRF.

Manipular a entrada

Anteriormente, convertemos manualmente o pacote DIFI pcap para um arquivo IQ binário e, em seguida, carregamos esse arquivo IQ binário no GNU Radio com o bloco Fink Source. Podemos simplificar nosso fluxograma usando um bloco dentro do gr-difi (mantido pela Microsoft) projetado para receber pacotes DIFI no GNU Radio! Este bloco adicionado requer que instalemos um módulo GNU Radio out-of-tree (OOT), que é como um plugin para GNU Radio:

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 estas etapas, você deve ser capaz de reabrir o GNU Radio e ver os novos blocos (DIFI Source e DIFI Sink) listados na árvore de blocos. No fluxograma usado na seção anterior, execute estas etapas:

  1. Substitua o bloco Fonte do arquivo por um bloco Fonte DIFI
  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 sua VM
  4. A porta deve ser 56001, assim como usamos na etapa tcpdump
  5. Defina DIFI Stream Number como 0. Todos os outros parâmetros podem ser deixados padrão

Se você quiser testar este fluxograma em sua máquina de desenvolvimento, você precisa de uma ferramenta como udpreplay para reproduzir o pcap que gravamos. Caso contrário, você pode esperar para testar essa parte até que o fluxograma seja usado ao vivo na VM conectada ao Azure Orbital. Esta limitação é uma razão pela qual ajuda a fazer uma gravação do sinal durante a fase de desenvolvimento e teste do 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 Bloco de Coletor TCP no lugar do Coletor de Arquivos. O bloco TCP Sink pode ser configurado em um modo de servidor ou 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 em uma carga TCP bruta.

ZMQ PUB Sink é outra opção, que é uma biblioteca de mensagens que fica em cima do TCP ou comunicação entre processos (IPC), 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.

Execute o fluxograma no modo sem cabeça

Há uma boa chance de que a VM que recebe o fluxo do Azure Orbital não ofereça suporte a um ambiente de desktop, o que faz com que o GNU Radio falhe. Devemos configurar este fluxograma para evitar o uso de GUIs.

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

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

Screenshot of GNU Radio running in Headless Mode.

Executar o fluxograma ao vivo

Uma vez que o fluxograma é configurado com a fonte DIFI e no modo sem cabeça, podemos executar o fluxograma ao vivo na VM. No GNU Radio Companion (GRC), toda vez que você aperta o botão play, um arquivo .py é criado no mesmo diretório. Esse script Python precisa ser copiado para a VM. Se o GNU Radio e o gr-difi foram instalados corretamente, você deve ser capaz de executar o script Python usando python yourflowgraph.py e ele aguarda o fluxo DIFI do Azure Orbital para iniciar. Você pode se sentir à vontade para adicionar qualquer código Python que desejar a esse script Python, como copiar o arquivo resultante para um novo local a cada passagem. Nota: se você regenerar o script Python dentro do GRC, esse novo código Python deve ser adicionado manualmente novamente.

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

vRF dentro da referência 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, um vRF recebe um sinal do Azure Orbital. Um fluxo DIFI é enviado para a VM do usuário pelo Azure Orbital durante um contato de 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. A seguir estão algumas especificações relacionadas a como a estação terrestre do Azure Orbital recebe e processa o sinal:

  • A frequência central é especificada no Perfil de Contato
  • A largura de banda do sinal (BW) é definida no Perfil de Contato, e a taxa de amostragem é 1.25*BW para contatos da Banda X e 1.125*BW da Banda S
  • O fluxo DIFI usa profundidade de 8 bits (2 bytes por amostra de QI)
  • O modo de ganho do digitalizador está configurado para usar controle automático de ganho (AGC) com um alvo de potência 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 de 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 notas podem ser de interesse para um designer vRF de uplink:

  • A frequência central é especificada no Perfil de contato
  • A taxa de amostragem do sinal é definida através do fluxo DIFI (mesmo que uma largura de banda é fornecida como parte do perfil de contato, é puramente para a configuração de rede sob o capô)
  • A profundidade de bits é definida através do fluxo DIFI, mas o Azure Orbital espera 8 bits
  • O ID do fluxo DIFI deve ser definido como 0
  • Semelhante ao downlink, o tamanho da MTU deve ser 1500 para S-Band e até 3650 para X-Band (sua escolha)
  • Nenhuma inversão espectral é usada
  • Nenhum deslocamento de frequência é usado

Próximos passos

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