자습서: GNU Radio를 사용한 Aqua의 복조를 통해 vRF(가상 RF) 이해
자습서: 공공 위성에서 데이터 다운링크에서 NASA Aqua 위성의 데이터는 관리되는 모뎀 을 사용하여 다운링크됩니다. 즉, 지상국이 Aqua 위성에서 수신한 원시 RF 신호는 Azure Orbital에서 관리하는 모뎀을 통해 패스됩니다. 그러면 바이트 형식으로 나타나는 이 모뎀의 출력은 사용자의 VM으로 스트리밍됩니다. 공공 위성 다운링크 임무를 위한 접점 프로필 구성 단계의 일부로 복조 구성이 Aqua Direct Broadcast로 설정되었습니다. 이는 Aqua에서 수신한 RF 신호를 복조/디코딩하도록 관리되는 모뎀을 사용하도록 설정하고 구성한 것입니다. vRF 개념을 사용하면 관리되는 모뎀이 사용되지 않으며 대신 처리를 위해 원시 RF 신호가 사용자의 VM으로 전송됩니다. 이 개념은 다운링크와 업링크에 둘 다 적용할 수 있지만 이 자습서에서는 다운링크 프로세스를 검토합니다. 원시 RF 신호를 처리하고 모뎀 역할을 하는 GNU Radio를 기반으로 vRF를 만듭니다.
이 가이드에서는 다음 작업 방법을 배웁니다.
- vRF 사용의 제한 사항 및 단점 파악
- 관리되는 모뎀 대신 vRF를 통해 연락처 프로필을 구성합니다.
- 오프라인/개발 설정과 실시간 설정을 모두 사용하고 GNU Radio를 모뎀으로 사용하여 Aqua에서 (원시 RF 형태로) 다운링크된 데이터를 처리합니다.
필수 조건
- 전체 자습서: NASA의 아쿠아 공공 위성에서 데이터를 다운 링크, 이 자습서는 이미 우주선과 VM을 구성 가정으로.
vRF 사용의 제한 사항 및 장단점 이해
자습서를 살펴보기 전에 vRF의 작동 방식을 이해하고 관리되는 모뎀을 사용하는 방식과 이 방식을 어떻게 비교할 수 있는지 이해하는 것이 중요합니다. 관리되는 모뎀을 사용하면 전체 물리적(PHY) 계층이 Azure Orbital 내에서 발생합니다. 즉, RF 신호는 Azure Orbital의 리소스 내에서 즉시 처리되고 사용자는 모뎀에서 생성한 정보 바이트만 수신합니다. vRF를 선택하면 관리되는 모뎀이 없으며 원시 RF 신호가 지면 스테이션 디지타이저에서 사용자에게 스트리밍됩니다. 이 방법을 사용하면 사용자가 자체 모뎀을 실행하거나 나중에 처리하기 위해 RF 신호를 캡처할 수 있습니다.
vRF의 장점은 Azure Orbital이 지원하지 않거나 액세스 권한이 없는 모뎀을 사용하는 기능을 포함합니다. 또한 vRF를 사용하면 성능을 최적화하기 위해 다른 매개 변수를 시도하는 동안 모뎀을 통해 동일한 RF 신호를 실행할 수 있습니다. 이 방법을 사용하여 테스트하는 동안 필요한 위성 패스 수를 줄이고 개발 속도를 높일 수 있습니다. 원시 RF 신호의 특성으로 인해 일반적으로 패킷/파일 크기는 해당 RF 신호에 포함된 바이트보다 큽니다. 보통 2~10배 더 큽니다. 데이터가 많을수록 VM과 Azure Orbital 간의 네트워크 처리량이 잠재적으로 vRF의 제한 요소가 될 수 있습니다.
이 자습서에서는 vRF 작동 방식을 직접 알아봅니다. 이 자습서의 끝부분에는 vRF 사용자에게 관심 있는 몇 가지 RF 및 디지타이저 관련 세부 정보가 포함되어 있습니다.
vRF 내에서 DIFI의 역할
Azure Orbital의 지상국은 DIFI를 활용하여 디지털화된 RF 송/수신하는 디지타이저로 구성됩니다. 기술적으로 "IEEE-ISTO Std 4900-2021: Digital IF 상호 운용성 표준"이라고 하는 DIFI 패킷 프로토콜은 표준 IP 네트워크를 통해 디지털화된 IF 데이터(예: IQ 샘플)와 해당 메타데이터를 송/수신하기 위한 데이터 평면 인터페이스를 정의합니다. DIFI가 "IF" 표준임에도 불구하고 Baseband의 IQ 샘플은 Azure Orbital과 마찬가지로 DIFI로 스트리밍할 수도 있습니다. DIFI 패킷의 주요 사용 사례는 위성 지상국 디지타이저(트랜시버)와 소프트웨어 모뎀 간의 인터페이스를 만들어 상호 운용성을 가능하게 하고 위성 산업을 괴롭히는 공급업체 잠금을 퇴치하는 것입니다.
DIFI 패킷 프로토콜에는 데이터 패킷과 컨텍스트 패킷이라는 두 가지 기본 메시지 유형이 포함되어 있습니다. 레거시 하드웨어 때문에 두 가지 버전의 컨텍스트 패킷이 있습니다. Azure Orbital의 지상국은 X 밴드 신호에는 최신(DIFI v1.1) 컨텍스트 패킷을, S 밴드 신호에는 기존 형식을 사용합니다. gr-difi GNU 라디오 패키지를 사용하는 경우 X-Band의 경우 108바이트 형식과 S-band의 72바이트 형식을 선택해야 합니다. GNU가 아닌 VRF의 경우 컨텍스트 패킷에 올바른 버전의 DIFI가 사용되는지 확인해야 합니다. 여기서 v1.1을 찾을 수 있으며 이 코드 섹션에서 레거시 버전을 유추할 수 있습니다. 이 자습서의 끝부분에 나오는 AOGS 참조 내의 vRF에는 더 많은 고려 사항이 포함되어 있습니다.
1단계: AOGS를 사용하여 접점 예약 및 Aqua 데이터 수집
먼저 관리되는 모뎀을 제거하고 원시 RF 데이터를 pcap 파일로 캡처합니다. 자습서: NASA의 Aqua 공공 위성에서 데이터 다운링크에 나열된 단계를 실행합니다. 그러나 NASA의 Aqua 공공 위성 에서 데이터를 다운링크하지만 Aqua 다운링크 임무에 대한 접점 프로필 구성 단계를 진행하는 중에는 복조 구성은 비워 두고 프로토콜 로 UDP를 선택합니다. 마지막으로 (TCP 패킷을 캡처하는) socat
명령 대신 끝으로 sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap
를 실행하여 pcap 파일에 대한 UDP 패킷을 캡처합니다.
참고 항목
자습서: NASA Aqua 공공 위성에서 데이터 다운링크에는 다음 세 가지 수정 사항이 필요합니다.
- 복조 구성: 비워 둡니다.
- 프로토콜: UDP를 선택합니다.
- 8단계 및 9단계: 대신
sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap
명령을 사용합니다.
위성 패스 후에는 최대 권한 상승에 따라 크기가 10~20GB인 /tmp/aqua.pcap
파일이 있어야 합니다. 이 파일에는 지상국에서 수신한 원시 RF 신호를 IQ 샘플의 형태로 포함하는 DIFI 패킷이 들어 있습니다.
2단계: DIFI 패킷에서 IQ 샘플 추출
다음으로 IQ 샘플을 추출하여 보다 일반적인 형태인 이진 IQ 파일로 저장합니다. 다음 단계는 앞서 만든 aqua.pcap 파일의 복사본이 있는 모든 VM/컴퓨터에서 수행할 수 있습니다. 이러한 단계에는 DIFI 컨소시엄에서 유지 관리하는 간단한 Python 스크립트를 사용하여 UDP DIFI 패킷에서 IQ 파일로 IQ 샘플을 추출하는 작업이 포함됩니다.
- 다음 코드를 다운로드하거나 새 Python 스크립트에 복사합니다.
- pcap(
/tmp/aqua.pcap
)을 저장한 위치와 일치하도록 편집filename
합니다. - Python 스크립트를 사용하여
python3 difi_to_binary_iq.py
실행합니다. 그러면 확장명과 함께 pcap과.cs8
동일한 디렉터리에 새 파일을 만들어야 합니다. 이 파일은 8비트 정수로 디지털화된 RF 샘플을 포함하는 이진 IQ 파일입니다. 스크립트를 실행하는 데 시간이 걸리고 실행되면 파일이 커집니다. 스크립트가 완료되면 파일의 크기는 pcap 파일과 거의 같습니다. 완료하기 전에(control-C를 사용하여) 스크립트를 중지하고 자습서를 계속할 수 있습니다. 대화 상대의 전체 기간은 자습서의 나머지 부분에 필요하지 않습니다. - (선택 사항) 신호를 시각화하려면 새 파일의 경로를 사용하여 https://github.com/miek/inspectrum/wiki/Build#building-on-debian-based-distros Inspectrum을 실행하여 Inspectrum
inspectrum /tmp/aqua.pcap.cs8
을 설치합니다.cs8
. Inspectrum GUI에서 신호의 전체 동적 범위를 조정Power Max
하고Power Min
볼 수 있습니다.
int8 대신 float32 형식으로 IQ 샘플을 사용하려는 경우(일부 소프트웨어에서는 float32 형식만 로드할 수 있음) 다음 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')
GNU 라디오 흐름 그래프를 간소화하므로 다음 단계에서 float32 버전을 사용합니다.
3단계: GNU Radio에서 Aqua 신호 복조
다음으로, Aqua 신호를 복조하는 데 사용되는 GNU Radio를 기반으로 실제 vRF 모뎀을 만듭니다.
GNU Radio는 신호 처리 블록과 많은 예제 DSP(디지털 신호 처리) 애플리케이션을 제공하는 무료 오픈 소스 소프트웨어 개발 도구 키트입니다. 쉽게 사용 가능한 저렴한 RF 하드웨어와 함께 사용하여 소프트웨어 정의 라디오를 만들거나 시뮬레이션과 같은 환경에서 하드웨어 없이 사용할 수 있습니다. GNU 라디오는 무선 통신 연구와 실제 무선 시스템을 모두 지원하기 위해 연구, 산업, 학계, 정부 및 취미 환경에서 널리 사용됩니다. 이 자습서에서는 GNU Radio를 사용하여 Aqua를 복조합니다(즉, GNU Radio가 모뎀으로 작동함).
GNU Radio는 헤드리스 모드에서 사용할 수 있지만 이 자습서에서는 GNU Radio의 GUI(즉, 데스크톱 인터페이스)를 사용합니다. 따라서 /tmp/aqua.pcap.cf32
를 X11 이상이 설치된 VM 또는 Ubuntu 20/22 데스크톱이 설치된 컴퓨터로 복사해야 합니다. 명령 scp
를 사용하면 Azure의 VM에서 로컬 개발 머신으로 파일을 복사할 수 있습니다.
GNU Radio 설치
Ubuntu 22를 사용하는 경우 sudo apt-get install gnuradio
를 실행합니다. 대신 Ubuntu 20에서 사용 중인 경우 다음 명령을 사용하여 GNU Radio를 설치합니다.
sudo add-apt-repository ppa:gnuradio/gnuradio-releases
sudo apt-get update
sudo apt-get install gnuradio python3-packaging
GNU Radio가 제대로 설치되어 있고 그래픽이 gnuradio-companion
을 사용하여 작동 중인지 확인합니다. 다음과 같은 창이 나타나야 합니다.
오른쪽에 블록 트리가 표시되지 않으면 오른쪽 위에 있는 돋보기 아이콘을 사용하여 표시할 수 있습니다.
Aqua 흐름 그래프 실행
GNU 라디오 애플리케이션을 "흐름 그래프"라고 하며 일반적으로 RF 신호를 처리하거나 생성합니다. 사용할 시작 흐름 그래프는 여기에서 다운로드할 수 있습니다. GNU Radio 내에서 이 .grc
파일을 열면 다음 흐름 그래프가 표시되어야 합니다.
참고 항목
흐름 그래프/모뎀의 작동 방식에 대한 세부 정보에 관심이 없는 경우에는 다음 단락을 건너뛸 수 있습니다.
흐름 그래프는 IQ 파일을 읽어 인터리빙된 8비트 정수에서 GNU Radio의 복합 데이터 형식으로 변환한 다음, 원래 18.75MHz에서 15MHz로 이동하는 신호를 다시 샘플링합니다. 이는 기호당 샘플 수를 나타내는 정수입니다. 접점 프로필에서 15MHz의 대역폭을 지정했기 때문에 이 다시 샘플링은 약간 혼란스러울 수 있습니다. 이 자습서의 끝부분에 설명하는 대로 X 밴드 신호의 경우 디지타이저는 지정된 대역폭의 1.25배인 샘플 속도를 사용합니다. 이 흐름 그래프에서는 15MHz의 샘플 속도를 원합니다. 따라서 기호당 정확히 두 개의 샘플이 있기 때문에 18.75MHz에서 15MHz로 다시 샘플링해야 합니다. 다음으로, 신호 출력 수준을 정규화하기 위한 AGC(Automatic Gain Control) 블록이 있습니다. RRC(Root Raised Cosine) 필터는 정합 필터 역할을 합니다. Costas 루프는 주파수 동기화를 수행하여 오실레이터 오차 또는 불완전한 Doppler 수정으로 인한 사소한 주파수 오프셋을 제거합니다. Aqua는 일반 QPSK 대신 OQPSK(오프셋 QPSK)를 사용하기 때문에 다음 세 가지 블록이 사용됩니다. 그런 다음 OQPSK 기호가 피크에서 샘플링되도록 기호 동기화가 수행됩니다. Constellation 싱크 블록을 사용하여 QPSK의 이 샘플링을 시각화할 수 있습니다(예제 출력이 표시됨). 흐름 그래프의 나머지 부분은 실제 부분과 가상 부분을 인터리빙하고 소프트 기호를 나타내는 int8(문자 수/바이트 수)로 저장합니다. 이러한 소프트 기호를 1과 0으로 변환할 수 있지만 나중에 처리하면 전체 기호 값을 갖게 되는 이점이 있습니다.
흐름 그래프를 실행하기 전에 파일 원본 블록을 두 번 클릭하고 저장 /tmp/aqua.pcap.cf32
한 위치와 일치하도록 경로를 업데이트합니다. 위쪽의 재생 단추를 클릭하여 흐름 그래프를 실행합니다. 이전 단계에 성공했고 Aqua 접점에 성공한 경우 다음과 같은 PSD(전력 스펙트럼 밀도) 및 IQ 플롯이 표시됩니다.
신호가 수신된 강도에 따라 달라질 수 있습니다. GUI가 표시되지 않으면 왼쪽 아래에 있는 GNU Radio의 출력에서 오류가 있는지 확인합니다. GUI가 표시되지만 (튀어나온 부분 없이) 수평 노이즈 라인과 유사하면 접점이 실제로 Aqua의 신호를 수신하지 못했음을 의미합니다. 이 경우 접점 프로필에서 자동 추적이 사용하도록 설정되어 있고 중심 주파수가 올바르게 입력되었는지 다시 한 번 확인합니다.
GNU 라디오를 완료하는 데 걸리는 시간은 컴퓨터/VM CPU 전원과 결합된 pcap_to_iq 스크립트를 실행할 수 있는 시간을 기반으로 합니다. 흐름 그래프가 실행되면 저장된 /tmp/aqua.pcap.cf32
RF 신호를 강등하고 모뎀의 출력을 포함하는 파일을 /tmp/aqua_out.bin
만듭니다. 이 .bin 파일을 VM에서 자유롭게 복사할 수 있습니다.
이 자습서는 여기서 종료합니다. 바이트를 이미지로 디코딩하는 데 관심이 있는 경우 NASA의 도구를 사용하거나altillimity/X-Band-Decoders 등과 같은 오픈 소스 도구를 사용할 수 있습니다.
(선택 사항) 4단계: GNU Radio 흐름 그래프 라이브 실행
이 시점까지의 이 자습서는 vRF를 만드는 디자인/테스트 부분을 나타냅니다. 실제 vRF 모뎀과 유사한 VM에서 라이브로 실행될 수 있도록 GNU Radio 흐름 그래프를 변환합니다.
입력 처리
이전에는 DIFI 패킷 pcap을 이진 IQ 파일로 수동으로 변환한 다음 Fink 원본 블록을 사용하여 이진 IQ 파일을 GNU Radio로 로드했습니다. GNU Radio로 DIFI 패킷을 수신하도록 설계된 gr-difi(Microsoft에서 유지 관리함) 내의 블록을 사용하여 흐름 그래프를 간소화할 수 있습니다. 추가된 이 블록을 사용하려면 GNU Radio용 플러그인과 같은 GNU Radio OOT(Out-Of-Tree) 모듈을 설치해야 합니다.
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
이러한 단계가 끝나면 GNU Radio를 다시 열고 블록 트리에 나열된 새 블록(DIFI 원본 및 DIFI 싱크)을 볼 수 있어야 합니다. 이전 섹션에서 사용한 흐름 그래프에서 다음 단계를 수행합니다.
- 파일 원본 블록을 DIFI 원본 블록으로 바꿉니다.
- DIFI 원본 블록을 두 번 클릭하여 해당 매개 변수를 편집합니다.
- 원본 IP 주소는 VM의 eth0 인터페이스 IP여야 합니다.
- tcpdump 단계에서 사용한 것처럼 포트는 56001이어야 합니다.
- DIFI 스트림 번호를 0으로 설정합니다. 다른 모든 매개 변수는 기본값으로 남겨둘 수 있습니다.
개발 머신에서 이 흐름 그래프를 테스트하려는 경우 기록한 pcap을 재생하기 위한 도구(예: udpreplay)가 필요합니다. 그러지 않으면 Azure Orbital에 연결된 VM에서 흐름 그래프가 라이브로 사용될 때까지 이 부분을 테스트하도록 기다릴 수 있습니다. 이 제한 사항은 vRF 개발 및 테스트 단계 중에 신호를 기록하는 데 도움이 되는 이유 중 하나입니다.
출력 처리
마지막에 파일 싱크를 두고 각 패스에 기록된 파일을 검색하도록 선택할 수 있지만 많은 애플리케이션에서 모뎀에서 바이트를 스트리밍해야 합니다. 한 가지 옵션은 파일 싱크 대신 TCP 싱크 블록을 사용하는 것입니다. TCP 싱크 블록은 초기 연결을 만들어야 하는 쪽에 따라 서버 또는 클라이언트 모드에서 구성할 수 있습니다. 입력 형식을 바이트로 설정하고 TCP 싱크는 원시 TCP 페이로드를 통해 바이트를 스트리밍합니다.
ZMQ PUB 싱크는 또 다른 옵션으로, PUB/SUB와 같은 보다 복잡한 동작을 위해 TCP 또는 IPC(프로세스 간 통신) 위에 있는 메시징 라이브러리입니다.
파일 싱크로 두는 경우 생성된 파일을 새 위치에 복사하는 흐름 그래프 끝에 몇 줄의 Python을 추가하는 것이 좋습니다.
헤드리스 모드에서 흐름 그래프 실행
Azure Orbital 스트림을 수신하는 VM이 데스크톱 환경을 지원하지 않아 GNU Radio가 충돌할 가능성이 있습니다. GUI를 사용하지 않도록 이 흐름 그래프를 구성해야 합니다.
- 왼쪽 위에 있는 옵션 블록을 편집합니다.
- 생성 옵션에서 GUI 없음을 선택합니다.
- 실행 옵션에서 완료될 때까지 실행을 선택합니다.
- [확인]을 누릅니다.
이러한 단계를 통해 흐름 그래프를 GUI 없이 Python 스크립트로 실행하고 들어오는 소켓이 닫히면 흐름 그래프가 자동으로 종료되어야 합니다.
흐름 그래프 라이브 실행
흐름 그래프가 DIFI 원본 및 헤드리스 모드로 구성되면 VM에서 흐름 그래프를 라이브로 실행할 수 있습니다. GRC(GNU Radio Companion)에서는 재생 단추를 누를 때마다 동일한 디렉터리에 .py 파일이 생성됩니다. 이 Python 스크립트를 VM에 복사해야 합니다. GNU Radio 및 gr-difi가 제대로 설치된 경우 python yourflowgraph.py
를 사용하여 Python 스크립트를 실행할 수 있어야 하며 Azure Orbital에서 DIFI 스트림이 시작될 때까지 기다립니다. 패스할 때마다 결과 파일을 새 위치에 복사 등과 같은 Python 코드를 이 Python 스크립트에 자유롭게 추가할 수 있습니다. 참고: GRC 내에서 Python 스크립트를 다시 생성하는 경우 이 새 Python 코드를 수동으로 다시 추가해야 합니다.
위의 단계가 작동하는 경우 GNU Radio를 기반으로 다운링크 vRF를 성공적으로 만들고 배포했습니다.
AOGS 참조 내의 vRF
이 섹션에서는 vRF 사용자 또는 디자이너에 관심 있는 몇 가지 RF/디지타이저 관련 세부 정보를 제공합니다.
다운링크 측에서 vRF는 Azure Orbital로부터 신호를 수신합니다. DIFI 스트림은 위성 접촉 중에 Azure Orbital에 의해 사용자의 VM으로 전송됩니다. 사용자는 스트림을 기록하거나 라이브로 처리하여 실시간으로 스트림을 캡처해야 합니다. 예를 들어 tcpdump, socat을 사용하거나 모뎀으로 직접 수집합니다. 다음은 Azure Orbital의 지상국이 신호를 수신하고 처리하는 방법과 관련된 몇 가지 사양입니다.
- 중심 주파수는 접점 프로필에서 지정됩니다.
- BW(신호 대역폭)는 접점 프로필에 설정되며 샘플 속도는 X 밴드의 경우
1.25*BW
, S 밴드 접점의 경우1.125*BW
입니다. - DIFI 스트림은 8비트 깊이(IQ 샘플당 2바이트)를 사용합니다.
- 디지타이저의 게인 모드는 출력 목표가 -10 dBFS인 AGC(Automatic Gain Control)를 사용하도록 설정됩니다.
- 스펙트럼 반전이 사용되지 않습니다.
- 주파수 오프셋이 사용되지 않습니다.
- 사용자 VM MTU 크기는 X 밴드의 경우 3650, S 밴드의 경우 1500으로 설정해야 하는데, 이 값은 Azure Orbital에서 들어오는 최대 패킷 크기입니다.
업링크 측에서 사용자는 Azure Orbital이 전송할 수 있도록 패스 전체에서 Azure Orbital에 DIFI 스트림을 제공해야 합니다. 다음 참고는 업링크 vRF 디자이너에 관심이 있을 수 있습니다.
- 중심 주파수는 접점 프로필에서 지정됩니다.
- 신호 샘플 속도는 DIFI 스트림을 통해 설정됩니다(대역폭이 접점 프로필의 일부로 제공되더라도 전적으로 내부 네트워크 구성을 위한 것임).
- 비트 깊이는 DIFI 스트림을 통해 설정되지만 Azure Orbital에는 8비트를 기대합니다.
- DIFI 스트림 ID는 0으로 설정해야 합니다.
- 다운링크와 마찬가지로 MTU 크기는 S 밴드의 경우 1500, X 밴드의 경우(선택한 경우) 최대 3650이어야 합니다.
- 스펙트럼 반전이 사용되지 않습니다.
- 주파수 오프셋이 사용되지 않습니다.
다음 단계
Azure Orbital Ground Station을 사용하여 위성 탑재 지구 관측 데이터를 수신하고 처리하는 데 필요한 다운스트림 구성 요소를 쉽게 배포하려면 다음을 참조하세요.