教學課程:透過使用 GNU 無線電示範水族來了解虛擬 RF (vRF)
在 教學課程:從公用衛星下行鏈接數據時,來自美國宇航局水衛星的數據會使用 受控數據機向下連結,這表示地面站從水衛星接收的原始 RF 信號會通過 Azure Orbital 管理的數據機傳遞。 此數據機的輸出,其格式為位元組,然後串流至使用者的 VM。 在設定公用衛星下行鏈接任務聯繫人配置檔的步驟中,Demodulation Configuration 已設定為 Aqua Direct Broadcast,這是啟用並設定受控調製解調器以降級/譯碼從 Aqua 接收的 RF 訊號。 使用 vRF 概念時,不會使用受控數據機,而是將原始 RF 訊號傳送至使用者的 VM 進行處理。 此概念可以同時套用至下行連結和上行連結,但在本教學課程中,我們會檢查下行鏈接程式。 我們會根據 GNU Radio 建立 vRF,以處理原始 RF 訊號並作為數據機。
在本指南中,您將了解如何:
- 瞭解使用 vRF 的限制和取捨。
- 透過 vRF 設定連絡人設定檔,而不是受控數據機。
- 使用 GNU Radio 作為數據機處理來自 Aqua 的下行連結資料(以原始 RF 的形式),使用離線/開發設定和即時設定。
必要條件
- 完成 教學課程:美國宇航局水體公用衛星的下行鏈接數據,因為本教學課程假設您已設定航太器和 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 訊號。 DIFI 封包通訊協議在技術上稱為「IEEE-ISTO Std 4900-2021:Digital IF 互操作性標準」,定義用於透過標準 IP 網路傳輸和接收數位 IF 數據的數據平面介面(例如 IQ 樣本)和對應的元數據。 即使 DIFI 是「IF」標準,基底帶的 IQ 樣本也可以與 DIFI 串流,如同 Azure Orbital 一樣。 DIFI 封包的主要使用案例是建立衛星地面站數位板(電報)與軟體數據機之間的介面,使互操作性和對抗困擾衛星產業的廠商鎖定。
DIFI 封包通訊協定包含兩個主要訊息類型:數據封包和內容封包。 由於舊版硬體原因,內容封包有兩個不同的版本。 Azure Orbital 的地面站會針對 X 波段訊號使用最新的 (DIFI v1.1) 內容封包,以及 S-Band 訊號的舊版格式。 如果您使用 gr-difi GNU Radio 套件,請務必選取 X-Band 的 108 位元組格式,以及 S 波段的 72 位元組格式。 針對非 GNU Radio vRFs,您必須確保正確版本的 DIFI 用於內容封包,您可以在這裡找到 v1.1,而且可以從這一節的程式代碼推斷舊版。 在本教學課程結束時,AOGS 參考中的 vRF 包含更多考慮。
步驟 1:使用 AOGS 排程聯繫人並收集青色數據
首先,我們會移除受控數據擷取到pcap檔案。 執行教學課程:來自 NASA 水體公用衛星的下行鏈接數據中的步驟,但在設定水底下連結任務的聯繫人配置檔期間,將降級設定保留空白,然後選擇 [通訊協定] 的 UDP。 最後,在結尾,而不是 socat
命令(擷取 TCP 封包),執行 sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap
以將 UDP 封包擷取到 pcap 檔案。
注意
教學課程需要 下列三項修改:美國宇航局水公用衛星的下行鏈接數據:
- 降級設定:保留空白
- 通訊協議:選擇 UDP
- 步驟 8 和 9:請改用 命令
sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap
在衛星傳遞之後,您應該會有大小為 10-20 GB 的檔案 /tmp/aqua.pcap
(視高度上限而定)。 此檔案包含 DIFI 封包,其中包含地面站所接收的原始 RF 訊號,格式為 IQ 樣本。
步驟 2:從 DIFI 封包擷取 IQ 範例
接下來,我們會擷取 IQ 樣本,並以更傳統的形式儲存它們;二 進位 IQ 檔案。 下列步驟可以在您建立的 aqua.pcap 檔案複本的任何 VM/計算機上執行。 這些步驟牽涉到使用 DIFI 聯盟維護的簡短 Python 腳本,將 IQ 範例從 UDP DIFI 封包擷取到 IQ 檔案。
- 將下列程式 代碼 下載或複製到新的 Python 腳本中。
- 編輯
filename
以符合您儲存pcap (/tmp/aqua.pcap
) 的位置。 - 使用
python3 difi_to_binary_iq.py
執行 Python 腳本,而且它應該在與 pcap 相同的目錄中建立新的檔案,擴展名.cs8
為 。 此檔案是二進位 IQ 檔案,其中包含數位 RF 樣本做為 8 位整數,而沒有其他任何整數。 腳本需要一些時間才能執行,而且執行檔案時會變大。 當腳本完成時,檔案的大小大致與pcap檔案相同。 您可以在完成之前停止腳本(使用 control-C),然後繼續進行教學課程:本教學課程其餘部分不需要連絡的整個持續時間。 - (選擇性)如果您想要將訊號可視化,請使用 https://github.com/miek/inspectrum/wiki/Build#building-on-debian-based-distros 安裝 Inspectrum,然後使用 執行 Inspectrum
inspectrum /tmp/aqua.pcap.cs8
(使用新.cs8
檔案的路徑)。 在檢查 GUI 中之後,您可以調整Power Max
並Power Min
查看訊號的完整動態範圍。
如果您也想要使用 float32 格式的 IQ 範例,而不是 int8(某些軟體只可讓您載入 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')
我們將在下一個步驟中使用 float32 版本,因為它簡化了 GNU Radio flowgraph。
步驟 3:示範 GNU 電台中的水色訊號
接下來,我們會根據 GNU 無線電建立實際的 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
;視窗應該會快顯如下:
如果未顯示右邊的區塊樹,您可以使用右上方的放大鏡圖示來顯示它。
執行水流圖
GNU Radio 應用程式稱為「流程圖」,而且通常會處理或產生 RF 訊號。 您可以 在這裡下載要使用的入門流程圖。 在 GNU Radio 中開啟此 .grc
檔案,您應該會看到下列流程圖:
注意
對於那些對流程圖/數據機運作方式的詳細數據不感興趣,您可以略過下列段落
流程圖從在 IQ 檔案中讀取開始,將它從交錯的 8 位整數轉換成 GNU Radio 的複雜數據類型,然後重新取樣訊號,從原始的 18.75 MHz 轉換為 15 MHz,這是每個符號的整數樣本數目。 此重新取樣可能會有點令人困惑,因為在聯繫人配置檔中,我們指定了 15 MHz 的頻寬。 如本教學課程結尾所討論的更多內容,對於 X 頻訊號,數位板會使用指定頻寬 1.25 倍的取樣率。 事實證明,在此流程圖中,我們想要 15 MHz 取樣率,因此每個符號只有兩個樣本:因此,我們必須從 18.75 MHz 重新取樣到 15 MHz。 接下來,我們有一個自動增益控制(AGC)區塊,以標準化信號功率等級。 根引發餘弦值 (RRC) 篩選條件會做為相符的篩選條件。 科斯塔斯迴圈會執行頻率同步處理,以移除因誤差或不完美多普勒修正所造成的任何小頻率位移。 接下來會使用三個區塊,因為 Aqua 會使用位移 QPSK (OQPSK),而不是一般 QPSK。 接著會執行符號同步處理,讓 OQPSK 符號在尖峰時取樣。 我們可以使用星座接收區塊將QPSK的取樣可視化(顯示範例輸出)。 流程圖的其餘部分交錯了實際和虛構的部分,並將它們儲存為 int8 的 (chars/bytes),代表軟符號。 雖然它可以將這些軟符號轉換成 1 和 0,但稍後處理的優點是擁有完整的符號值。
在執行流程圖之前,請按兩下 [檔案來源] 區塊,並更新路徑以符合您儲存 /tmp/aqua.pcap.cf32
的位置。 按兩下頂端播放按鈕以執行流程圖。 如果先前的步驟成功,且您的 Aqua 連絡人成功,您應該會看到下列電源光譜密度 (PSD) 和 IQ 繪圖顯示:
根據收到訊號的強度,您的情況可能會有所不同。 如果未顯示任何 GUI,請檢查左下角的 GNU Radio 輸出是否有錯誤。 如果 GUI 出現,但類似於水準嘈雜線(沒有駝峰),這表示聯繫人實際上沒有收到青色訊號。 在此情況下,請仔細檢查聯繫人配置檔中已啟用自動追蹤,並正確輸入中心頻率。
GNU Radio 完成所花費的時間取決於您讓pcap_to_iq腳本執行的時間,再加上計算機/VM CPU 電源。 當流程圖執行時,它會將儲存在 中的 /tmp/aqua.pcap.cf32
RF 訊號降級,並建立檔案 /tmp/aqua_out.bin
,其中包含數據機的輸出。 請隨意從 VM 複製此.bin檔案。
我們在此結束本教學課程。 如果您有興趣將位元組譯碼成影像,您可以使用 NASA 的工具或 開放原始碼 工具,例如 altillimity/X-Band-Decoders。
(選擇性)步驟 4:實時執行 GNU 無線電流程圖
本教學課程最多代表建立 vRF 的設計/測試部分。 我們轉換此 GNU 無線電流程圖,使其可在 VM 上實時執行,其與真正的 vRF 數據機相同。
處理輸入
先前,我們手動將 DIFI 封包 pcap 轉換成二進位 IQ 檔案,然後使用 Fink Source 區塊將該二進位 IQ 檔案載入 GNU Radio。 我們可以使用 gr-difi 內的區塊 來簡化流程圖(由 Microsoft 維護),其設計目的是將 DIFI 封包接收到 GNU Radio! 這個新增的區塊確實需要我們安裝 GNU Radio out-of-tree (OOT) 模組,這就像 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
在這些步驟之後,您應該能夠重新開啟 GNU Radio,並查看區塊樹狀結構中列出的新區塊(DIFI 來源和 DIFI 接收)。 在您在上一節中使用的流程圖中,執行下列步驟:
- 將 [檔案來源] 區塊取代為 DIFI 來源 區塊
- 按兩下 DIFI 來源區塊以編輯其參數
- 來源IP位址應該是VM eth0介面的IP
- 埠 應該是 56001,就像我們在 tcpdump 步驟中使用的一樣
- 將 DIFI 數據流編號設定為 0。 所有其他參數都可以保留預設值
如果您想要在開發計算機上測試此流程圖,您需要 udpreplay 之類的工具來播放我們錄製的 pcap。 否則,您可以等候測試此部分,直到連線至 Azure Orbital 的 VM 上即時使用流程圖為止。 這項限制是協助在 vRF 開發和測試階段期間錄製訊號的其中一個原因。
處理輸出
您可以選擇將檔案接收留在結尾,並擷取每個傳遞的記錄檔,但許多應用程式需要將位元組串流出數據機。 其中一個選項是使用 TCP 接收區塊 來取代檔案接收。 TCP 接收區塊可以在伺服器或用戶端模式中設定,視應進行初始連線的端而定。 將輸入類型設定為 Byte,而 TCP 接收會透過原始 TCP 承載串流位元組。
ZMQ PUB 接收 是另一個選項,這是位於 TCP 或進程間通訊 (IPC) 之上的傳訊連結庫,用於更複雜的行為,例如 PUB/SUB。
如果您將其保留為檔案接收,建議您在流程圖結尾新增幾行 Python,以將建立的檔案複製到新位置。
在無外設模式中執行流程圖
接收 Azure Orbital 數據流的 VM 很可能不支援桌面環境,這會導致 GNU Radio 當機。 我們必須設定此流程圖,以避免使用 GUIS。
- 編輯左上角的 [選項] 區塊
- 在 [產生選項] 下選擇 [無 GUI]
- 在 [執行選項] 下,選擇 [執行至完成]
- 按 [確定]
這些步驟可讓我們以沒有 GUI 的 Python 腳本的形式執行流程圖,當連入套接字關閉流程圖時,流程圖應該會自動結束。
實時執行流程圖
一旦使用 DIFI 來源和無外設模式設定流程圖之後,我們可以在 VM 上即時執行流程圖。 在 GNU Radio Companion (GRC)中,每次按下播放按鈕時,都會在同一個目錄中建立.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 的訊號。 在衛星聯繫人期間,Azure Orbital 會將 DIFI 串流傳送至使用者的 VM。 用戶應該即時擷取數據流,方法是錄製或實時處理串流。 範例包括使用 tcpdump、socat 或直接內嵌至數據機。 接下來是一些與 Azure Orbital 地面站如何接收和處理訊號相關的規格:
- 中心頻率是在聯繫人配置檔中指定
- 訊號頻寬 (BW) 是在聯繫人配置檔中設定,取樣速率是
1.25*BW
X 頻和1.125*BW
S 波段聯繫人 - DIFI 資料流使用 8 位深度(每個 IQ 樣本 2 個字節)
- 數位板的增益模式設定為使用自動增益控制 (AGC), 電源目標為 -10 dBFS
- 未使用光譜反轉
- 未使用頻率位移
- 使用者 VM MTU 大小應針對 X-Band 設定為 3650,而 S-Band 應設定為 1500,這是來自 Azure Orbital 的最大封包大小
在上行連結端,用戶必須提供 DIFI 串流給 Azure Orbital,Azure Orbital 才能傳輸。 上行連結 vRF 設計工具可能會有下列注意事項:
- 中心頻率是在聯繫人配置檔中指定
- 訊號取樣率是透過 DIFI 串流設定的(即使頻寬是作為聯繫人設定檔的一部分提供,但純粹用於網路設定下)
- 位深度是透過 DIFI 數據流設定,但 Azure Orbital 預期有 8 位
- DIFI 數據流標識碼應設定為 0
- 類似於下行連結,S-Band 的 MTU 大小應為 1500,X-Band 最多 為 3650 (您選擇的)
- 未使用光譜反轉
- 未使用頻率位移
下一步
若要使用 Azure Orbital 地面站輕鬆部署接收和處理太空地球觀測數據所需的下游元件,請參閱: