チュートリアル: GNU Radio を使用した Aqua の復調による仮想 RF (vRF) を理解する
「チュートリアル: 公共衛星からデータをダウンリンクする」では、マネージド モデムを使用して、NASA の Aqua 公共衛星からのデータをダウンリンクします。つまり、Aqua 衛星から受信された生の RF 信号は、Azure Orbital によって管理されるモデムを介して渡されます。 その後、このモデムの出力 (バイト形式) は、ユーザーの VM にストリーミングされます。 手順の公共衛星ダウンリンク ミッションのコンタクト プロファイルを構成することの一環として、[復調構成] を [Aqua Direct Broadcast] (Aqua ダイレクト ブロードキャスト) に設定しました。これは、マネージド モデムを有効にし、Aqua から受信した RF 信号を復調またはデコードするように構成したものです。 vRF の概念を使用すると、マネージド モデムは使用されず、代わりに生の RF 信号がユーザーの VM に送信され、処理されます。 この概念はダウンリンクとアップリンクの両方に適用できますが、このチュートリアルではダウンリンク プロセスについて説明します。 ここでは、GNU Radio に基づいて vRF を作成します。GNU Radio は生の RF 信号を処理し、モデムとして機能します。
このガイドでは、以下の方法について説明します。
- vRF を使用する場合の制限とトレードオフを理解する。
- マネージド モデムの代わりに vRF を通じてコンタクト プロファイルを構成する。
- オフラインまたは開発セットアップとリアルタイム セットアップの両方を使用して、モデムとして GNU Radio を使用して Aqua からダウンロードされたデータ (RF 形式) を処理する。
前提条件
- このチュートリアルでは、宇宙船と VM が既に構成されていることを前提としているため、「チュートリアル: NASA の Aqua 公共衛星からデータをダウンリンクする」を完了してください。
vRF を使用する場合の制限とトレードオフを理解する
チュートリアルに入る前に、vRF のしくみと、マネージド モデムを使用する場合との比較を理解することが重要です。 マネージド モデムでは、物理 (PHY) 層全体が Azure Orbital 内で発生します。つまり、RF 信号は Azure Orbital のリソース内で即座に処理され、ユーザーはモデムによって生成された情報バイトを受信するだけです。 vRF を選択すると、マネージド モデムはなく、生の RF 信号が地上局デジタイザーからユーザーにストリーミングされます。 この方法により、ユーザーは独自のモデムを実行したり、後で処理するために RF 信号をキャプチャしたりすることができます。
vRF の利点には、Azure Orbital ではサポートされていない、またはアクセスできないモデムを使用できる点があります。vRF では、パフォーマンスを最適化するために異なるパラメーターを試しながら、モデムを介して同じ RF 信号を実行することもできます。 この方法を使用すると、テスト中に必要な衛星パスの数を削減し、開発をスピードアップすることができます。 生の RF 信号の性質上、パケットおよびファイルのサイズは通常、その RF 信号に含まれるバイト数よりも大きくなります (通常、2 から 10 倍)。 データが増えるということは、vRF では、VM と Azure Orbital の間のネットワーク スループットが制限要因になる可能性があることを意味します。
このチュートリアルでは、まず、vRF のしくみについて説明します。 このチュートリアルの最後に、vRF ユーザーにとって興味深い RF およびデジタイザー固有の詳細情報をいくつかご紹介します。
vRF 内での DIFI の役割
Azure Orbital の地上局は、DIFI を利用して、デジタル化された RF 信号を送受信するデジタイザーで構成されます。 DIFI パケット プロトコルは、技術的には "IEEE-ISTO Std 4900-2021: Digital IF Interoperability Standard" と呼ばれ、デジタル化された IF データ (IQ サンプルなど) および対応するメタデータを標準 IP ネットワーク経由で送受信するためのデータ プレーン インターフェイスを定義します。 DIFI は「IF」標準ですが、Azure Orbital と同様に、ベースバンドの IQ サンプルを DIFI でストリーミングすることもできます。 DIFI パケットの主なユースケースは、衛星地上局デジタイザー (トランシーバー) とソフトウェア モデムの間のインターフェイスを作成して、相互運用性を実現し、衛星業界を悩ませているベンダー ロックインを食い止めることです。
DIFI パケット プロトコルには主に、データ パケットとコンテキスト パケットの 2 種類のメッセージが含まれます。 レガシ ハードウェアの理由により、コンテキスト パケットには 2 つの異なるバージョンがあります。 Azure Orbital の地上局では、X バンド信号には最新 (DIFI v1.1) のコンテキスト パケットが使用され、S バンド信号にはレガシ形式が使用されます。 GNU Radio パッケージ gr-difi を使用する場合、X バンドには 108 バイト形式を、S バンドには 72 バイト形式を選択してください。 非 GNU Radio vRF の場合は、コンテキスト パケットに正しいバージョンの DIFI が使用されていることを確認する必要があります。v1.1 はこちらに掲載されています。レガシ バージョンは こちらのコード セクションから推測できます。 その他の考慮事項については、このチュートリアルの最後にある 「AOGS 内の vRF に関するリファレンス」を参照してください。
ステップ 1: AOGS を使用して、連絡のスケジュールと、Aqua データの収集を行う
まず、マネージド モデムを削除し、生の RF データを pcap ファイルにキャプチャします。 「チュートリアル: NASA の Aqua 公共衛星からデータをダウンリンクする」に記載されている手順を実行します。ただし、手順 「Aqua ダウンリンク ミッションのコンタクト プロファイルを構成する」では、[復調構成] を空白のままにし、[プロトコル] として [UDP] を選択します。 最後に、socat
コマンド (TCP パケットをキャプチャする) の代わりに、sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap
を実行して UDP パケットを pcap ファイルにキャプチャします。
Note
「チュートリアル: NASA の Aqua 公共衛星からデータをダウンリンクする」での設定に対して、次の 3 つの変更が必要です。
- 復調構成: 空白のままにする
- パケット: [UDP] を選択する
- 手順 8 と 9: 代わりに、コマンド
sudo tcpdump -i eth0 port 56001 -vvv -p -w /tmp/aqua.pcap
を使用する
衛星パス後、(最大高度に応じて) サイズが 10 から 20 GB のファイル /tmp/aqua.pcap
が作成されます。 このファイルには、地上局によって受信された生の RF 信号を含む DIFI パケットが IQ サンプルの形式で含まれています。
手順 2: DIFI パケットから IQ サンプルを抽出する
次に、IQ サンプルを抽出し、より従来に近い形式 (バイナリ IQ ファイル) で保存します。 次の手順は、作成された aqua.pcap ファイルのコピーがある任意の VM またはコンピューターで実行できます。 これらの手順では、DIFI コンソーシアムによって管理される短い Python スクリプトを使用して、UDP DIFI パケットから IQ ファイルに IQ サンプルを抽出する必要があります。
- 新しい Python スクリプト ファイルに次のコードをダウンロードまたはコピーします。
- pcap (
/tmp/aqua.pcap
) を保存した場所に合わせてfilename
を編集します。 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 をインストールし、(新しい
.cs8
ファイルへのパスを使用して)inspectrum /tmp/aqua.pcap.cs8
を使用し、Inspectrum を実行します。 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')
次の手順では float32 バージョンを使用します。これは、float32 バージョンでは GNU Radio フローグラフが簡略化されるためです。
手順 3: Aqua の信号を GNU Radio で復調する
次に、Aqua の信号を復調するために使用される GNU Radio に基づいて、実際の vRF モデムを作成します。
GNU Radio は、信号処理ブロックと、多くのデジタル信号処理 (DSP) アプリケーションの例を提供する無料のオープンソース ソフトウェア開発ツールキットです。 これは、すぐに入手できる低コストの RF ハードウェアと併用してソフトウェア定義の無線を作成したり、ハードウェアを使用せずにシミュレーションのような環境で使用したりすることができます。 GNU Radio は、無線通信の研究と実世界の無線システムの両方をサポートするために、研究機関、産業界、学術界、政府機関、愛好家の環境で広く使用されています。 このチュートリアルでは、GNU Radio を使用して Aqua を復調します (つまり、GNU Radio はモデムとして機能します)。
GNU Radio はヘッドレス モードでも使用できますが、このチュートリアルでは GNU Radio の GUI (デスクトップ インターフェイス) を使用するため、X11 転送を備えた VM または Ubuntu 20/22 デスクトップを備えたコンピューターに /tmp/aqua.pcap.cf32
をコピーする必要があります。 コマンド 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 Radio アプリケーションは "フローグラフ" と呼ばれ、通常は RF 信号を処理または生成します。 使用するスターター フローグラフは、こちらからダウンロードできます。 GNU Radio でこの .grc
ファイルを開くと、次のフローグラフが表示されます。
Note
フローグラフおよびモデムのしくみの詳細に関心がなければ、次の説明をスキップすることができます
フローグラフは、IQ ファイルの読み込みから始まり、インターリーブされた 8 ビット整数から GNU Radio の複素数データ型に変換し、信号をリサンプリングして、元の 18.75 MHz から 15 MHz (シンボルごとのサンプルの整数) に変換します。 コンタクト プロファイルで 15 MHz の帯域幅を指定したため、このリサンプリングは多少理解しにくいかもしれません。 このチュートリアルの最後で詳しく説明しますが、X バンド信号の場合、デジタイザーでは、指定された帯域幅の 1.25 倍のサンプル レートが使用されます。 このフローグラフでは 15 MHz のサンプル レートが必要であるため、シンボルごとにちょうど 2 つのサンプルが必要であることがわかります。したがって、18.75 MHz から 15 MHz にリサンプリングする必要があります。 次に、信号電力レベルを正規化するための自動ゲイン制御 (AGC) ブロックがあります。 ルート レイズド コサイン (RRC) フィルターは、整合フィルターとして機能します。 Costas ループは、周波数同期を実行して、発振器エラーまたは不完全なドップラー修正によって発生した小さな周波数オフセットを除去します。 次の 3 つのブロックが使用されているのは、Aqua では通常の QPSK ではなくオフセット QPSK (OQPSK) が使用されるためです。 次に、シンボルの同期が実行され、ピーク時に OQPSK シンボルがサンプリングされます。 この QPSK のサンプリングは、Constellation Sink ブロックを使用して視覚化できます (出力例を示します)。 フローグラフの残りの部分は、実数部分と虚数部分をインターリーブし、それらをソフト シンボルを表す int8 (文字数/バイト数) として保存します。 これらのソフト シンボルを 1 と 0 に変換することもできますが、後で処理すると、完全なシンボル値を取得できるという利点があります。
フローグラフを実行する前に、ファイル ソース ブロックをダブルクリックし、/tmp/aqua.pcap.cf32
を保存した場所と一致するようにパスを更新します。 上部にある再生ボタンをクリックしてフローグラフを実行します。 前の手順が成功し、Aqua とのコンタクトが成功した場合は、次のパワー スペクトル密度 (PSD) と IQ プロットが表示されます。
実際に表示される画面は、受信された信号の強度によって異なる場合があります。 GUI が表示されない場合は、左下の GNU Radio の出力でエラーがないかどうかを確認してください。 GUI が表示されても、ノイズの多い水平線 (こぶがない) に近い場合は、実際にはコンタクトで Aqua 信号が受信されていないことを意味します。 この場合、コンタクト プロファイルで自動追跡が有効になっていること、および中心周波数が正しく入力されていることを再確認してください。
GNU Radio が終了するまでにかかる時間は、pcap_to_iq スクリプトの実行時間と、コンピューターまたは VM の CPU 能力に基づきます。 フローグラフが実行されると、/tmp/aqua.pcap.cf32
に格納されている RF 信号が復調され、モデムの出力を含むファイル /tmp/aqua_out.bin
が作成されます。 この .bin ファイルは VM から自由にコピーできます。
このチュートリアルはここで終了です。 バイトを画像にデコードすることに興味がある場合は、NASA のツールを使用するか、altillimity/X-Band-Decoders などのオープンソース ツールを使用できます。
(省略可能) 手順 4: GNU Radio フローグラフをライブで実行する
ここまでのチュートリアルでは、vRF を作成する際の設計およびテスト部分を説明しました。 この GNU Radio フローグラフを、真の vRF モデムと同様に VM 上でライブ実行できるように変換します。
入力を処理する
前の手順では、DIFI パケット pcap をバイナリ IQ ファイルに手動で変換し、そのバイナリ IQ ファイルを、Fink Source ブロックを使用して GNU Radio に読み込んでいました。 DIFI パケットを GNU Radio に受信するように設計された gr-difi (Microsoft が管理) 内のブロックを使用して、このフローグラフを簡素化できます。 この追加ブロックでは、GNU Radio のプラグインなどの GNU Radio Out-Of-Tree (OOT) モジュールをインストールする必要があります。
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 Source と DIFI Sink) が表示されます。 前のセクションで使用したフローグラフで、次の手順を実行します。
- File Source ブロックを DIFI Source ブロックに置き換えます
- DIFI Source ブロックをダブルクリックして、そのパラメーターを編集します
- Source IP Address は、VM の eth0 インターフェイスの IP である必要があります
- tcpdump の手順で使用したのと同様、Port は 56001 に設定する必要があります
- DIFI Stream Number を 0 に設定します。 他のパラメーターはすべて既定値のままにします
このフローグラフを開発用マシンでテストする場合は、記録した pcap を再生するための udpreplay などのツールが必要です。 それ以外の場合は、Azure Orbital に接続された VM 上でフローグラフがライブで使用されるまで、この部分のテストを待つことができます。 この制限は、それが、vRF の開発およびテストの段階で信号の記録を行うのに役立つ 1 つの理由です。
出力を処理する
File Sink を最後に残し、各パスで記録されたファイルを取得することもできますが、多くのアプリケーションではモデムからバイトをストリーミングする必要があります。 1 つ目の方法は、File Sink の代わりに TCP Sink ブロックを使用することです。 TCP Sink ブロックは、最初の接続をどちら側で行うかに応じて、サーバー モードまたはクライアント モードのいずれかで構成できます。 Input Type を Byte に設定すると、TCP Sink で生の TCP ペイロードを介してバイトがストリーミングされます。
もう 1 つのオプションは、ZMQ PUB Sink です。これは、PUB/SUB などのより複雑な動作を行うために、TCP またはプロセス間通信 (IPC) の上に配置されるメッセージング ライブラリです。
これを File Sink として残す場合は、フローグラフの最後 (終了後) に、作成されたファイルを新しい場所にコピーする数行の Python を追加することをお勧めします。
ヘッドレス モードでフローグラフを実行する
Azure Orbital ストリームを受信する VM ではデスクトップ環境がサポートされていない可能性が高く、そのために GNU Radio がクラッシュします。 GUI を使用しないようにこのフローグラフを構成する必要があります。
- 左上の Options ブロックを編集する
- [Generate Options] (Options の生成) で [No GUI] (GUI なし) を選択します
- [Run Options] (Options の実行) で [Run to Completion] (完了まで実行) を選択します
- [OK] をクリックします。
これらの手順により、GUI を使用せずにフローグラフを Python スクリプトとして実行できるようになり、受信ソケットが閉じるとフローグラフは自動的に終了します。
フローグラフをライブで実行する
DIFI Source を含み、ヘッドレス モードのフローグラフを構成したら、フローグラフを 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 からの信号を受信します。 DIFI ストリームは、衛星通信中に Azure Orbital によってユーザーの VM に送信されます。 ユーザーは、ストリームを記録するかライブで処理することで、ストリームをリアルタイムでキャプチャすることが想定されています。 たとえば、tcpdump または socat を使用するか、モデムに直接取り込みます。 Azure Orbital の地上局が信号を受信して処理する方法に関連するいくつかの仕様を次に示します。
- 中心周波数は、コンタクト プロファイルで指定します
- 信号帯域幅 (BW) は、コンタクト プロファイルで設定します。サンプル レートは、X バンドの場合は
1.25*BW
で、S バンド コンタクトの場合は1.125*BW
です - DIFI ストリームでは、8 ビット深度 (IQ サンプルあたり 2 バイト) が使用されます
- デジタイザーのゲイン モードは、パワー ターゲットが -10 dBFS の自動ゲイン制御 (AGC) を使用するように設定します
- スペクトル反転は使用しません
- 周波数オフセットは使用しません
- ユーザー 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 を使用して、宇宙船の地球観測データを受信して処理するために必要なダウンストリーム コンポーネントを簡単にデプロイするには、次を参照してください。