RaspberryPi
VDL2とは
VHF Data Link - Mode 2(VDL2あるいはVDL-M2 )は次世代のACARSと位置づけられるもので、従来のACARSに比べ10倍の伝送速度で、航空機と地上の間のデータ伝送する方式です。
ACARSを用いて、高層気象データを収集していると、ボーイング787など新形式の航空機からの情報が無いことに気がつきました。在来、詳細な気象情報を提供してくれていたボーイング777などが退役していくと、いずれどういうことになるか、心配していました。
所属する、電子情報通信学会の通信ソサイエティマガジン2017年秋号に、「航空機用無線通信システム」の記事があり、そのなかでVDL2の紹介がありました。最新の技術を使っており、とくに輻輳するヨーロッパでは、ACARSからVDL2に移行が進行しているようです。早速当研究所でもソフトウェアラジオによりVDL2の受信機を作成することにしました。


 ACARSは、航空機のさまざまな運用情報を伝送していますが、VDL2の目的はまったくおなじで次のように変調方式・プロトコルが異なります。

  VDL2
VHF Data Link - Mode 2
ACARS 
Aircraft Communications Addressing and Reporting System
 用途 便名、出発・到着時刻、現在位置、高度、搭載燃料、航空機の状態などのほか最新の気象情報 を通報 左に同じ
使用周波数 VHFエアバンド 136.975 MHzの周波数が、共通チャンネル VHFエアバンド 131.250 MHz、131.450 MHzなど
チャンネル間隔 25 kHz 25 kHz 
変調方式 8相PSK 31.5 kbit/s 音声帯域MSKモデム 2.4 kbit/s
プロトコル ICAO(nternational Civil Aviation Organization )による標準化 かなり自由な形式

VDL2はACARSとおなじ、VHFエアバンドをもちいていますが、つぎのような新しい技術で構成されています。
1. 8相PSK変調方式により、従来方式の10倍以上の伝送速度
2. 136.975 MHzの周波数が、共通チャンネルで、ここが混雑しているときは、自動的に他のチャンネルに移行する
3. WiFi等で使われている CSMA(Carrier Sense Multiple Access)方式により、送信する前にチャンネルが空いているかを調べ、データの衝突を防止する
4. 伝送フレームフォーマットは、エラー訂正可能なHDLCとX25方式パケットを用いている。

現役時代に標準化にかかわった、HDLCとX25がここでも使われていることに、感動です。

VDL2の受信
 ソウトウェアラジオでVDL2の受信のため、このプロトコルをソフトで実現しなければなりません。自作するのは、なかなか手強いですが、ありがたいことに先駆者がdumpvdl2開発、公開しておられます。簡単にインストールできますが国内ではまだ紹介例が少ないので、ここに概要を述べることとします。ACARSの場合と同様、RTL2832U+R820TドングルとRaspberryPiを用います。ここではPi3モデルB、OSはjessieを前提にします。

 ADS-BあるいはACARSの場合と同様に、RaspberryPiでソフトウエアラジオを動かすために必要なソフトを準備します。

1. 必要なパッケージをインストール
$ sudo apt-get update
$ sudo apt-get install git
$ sudo apt-get install cmake
$ sudo apt-get install libusb-1.0-0.dev
$ sudo apt-get install build-essential
$ sudo apt-get install pkg-config


2.  rtl-sdrのソースの取得
つぎに最も重要なソウトウェアラジオ用パッケージであるrtl-sdrを本家からインストールします。
$ git clone git://git.osmocom.org/rtl-sdr.git

3. rtl-sdrをビルド
$ cd rtl-sdr
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig
$ sudo cp rtl-sdr.rules /etc/udev/rules.d/


4. /etc/modprobe.d/ディレクトリにrtlsdr.confというファイルを下記の内容で作成
$ sudo nano /etc/modprobe.d/rtlsdr.conf
blacklist dvb_usb_rtl28xxu
blacklist rtl2830
blacklist rtl2832
blacklist dvb_usb_v2
blacklist dvb_core

一度念のためリブートしておきます。

5. ドングルをRaspberryPiのUSBにさし、つぎの確認を行います。
$ lsusb
Bus 001 Device 004: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T

$ rtl_test

Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001
Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
・・・・

6. つぎにVDL2のソフトウェアのインストールです。 Tomasz Lemiech 氏が開発した、dumpvdl2がこちらにあります。
ダウンロードは
$ git clone https://github.com/szpajder/dumpvdl2.git

7. 次にコンパイル
$ cd dumpvdl2
$ make

dumpvdl2ディレクトリのなかに、プログラムができています。これでインストール完了です。

8. ためしにホームディレクトリから
$ dumpvdl2/dumpvdl2 --help
でコマンドの使い方が表示されます。

dumpVDL2 v1.1.0
Usage:

RTL-SDR receiver:
     dumpvdl2 [output_options] --rtlsdr <device_id> [rtlsdr_options] [<freq_1> [freq_2 [...]]]

I/Q input from file:
     dumpvdl2 [output_options] --iq-file <input_file> [file_options] [<freq_1> [freq_2 [...]]]

common options:
     <freq_1> [freq_2 [...]]         VDL2 channel frequences, in Hz (max 8 simultaneous channels supported).
                          If omitted, will use VDL2 Common Signalling Channel (136975000 Hz)

output_options:
     --output-file <output_file>     Output decoded frames to <output_file> (default: stdout)
     --hourly                 Rotate output file hourly
     --daily                  Rotate output file daily
     --utc                  Use UTC timestamps in output and file names
     --raw-frames             Output AVLC payload as raw bytes
     --msg-filter <filter_spec>      Message types to display (default: all) ("--msg-filter help" for details)
     --output-acars-pp <host:port>  Send ACARS messages to Planeplotter over UDP/IP

rtlsdr_options:
     --rtlsdr <device_id>          Use RTL device with specified ID or serial number (default: ID=0)
     --gain <gain>              Set gain (decibels)
     --correction <correction>      Set freq correction (ppm)
     --centerfreq <center_frequency>  Set center frequency in Hz (default: auto)

file_options:
     --iq-file <input_file>          Read I/Q samples from file
     --centerfreq <center_frequency>  Center frequency of the input data, in Hz (default: 0)
     --oversample <oversample_rate>  Oversampling rate for recorded data (default: 10)
                            (sampling rate will be set to 105000 * oversample_rate)
     --sample-format <sample_format> Input sample format. Supported formats:
                           U8 8-bit unsigned (eg. recorded with rtl_sdr) (default)
                           S16_LE 16-bit signed, little-endian (eg. recorded with miri_sdr)



ハードの構成
 全体の構成はACARSの場合と同様で、
アンテナ→RTL2832U+R820Tドングル→RaspberryPi→ホストPC
です。
rtlsdrドングルとしてあらたにソフトウェアラジオ用として開発された、RTL-SDR.COM V3購入しました。 たいへん優秀で、ソフトによる補正は不要、筐体にふれてもほのかな温度です。
RTL-SDR.COM V3
1 PPM の温度補正発信器(TCXO)
SMA コネクタにより50Ωのアンテナが接続可能
アルミニウム筐体による空冷


アンテナはACARSのためのAL-120F-MRと共用するため、第一電波工業のSS500で、2つのrtlsdrドングルに分岐します。
RaspberryPi3は4つのUSBが制御できますので、下の図のように構成します。
RaspberryPiとホストPCとはWiFi接続です。

軒下に設置した分配器とrtlsdrドングル。新しくRTL-SDR.COMを購入
SS500分配器とドングルはMP-SMAP変換コネクターで接続
左のグレーの同軸は、アンテナケーブル
シャシーのなかに、いままでのACARS用のrtlsdrドングルが入っている



dumpvdl2の起動

RaspberryPiにrtlsdrドングルをさし、アンテナをつなぎ、つぎのように起動します。
$ dumpvdl2/dumpvdl2 --rtlsdr 1 136975000 --gain 49.6 --output-file vdl2log/vdl2.log --msg-filter downlink,avlc_i,acars --output-acars-pp 192.168.xx.4:9742

起動メッセージはつぎのようです。

dumpVDL2 v1.1.0
Sampling rate set to 1050000 sps
Found 2 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001
1: Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Exact sample rate is: 1050000.026077 Hz
[R82XX] PLL not locked!
Center frequency set to 136975000 Hz
Device #1: gain set to 49.60 dB
Device 1 started

パラメータを説明します。
--rtlsdr 1 136975000  rtlsdrドングルの番号を指定 acarsdecとかち合わないように注意 共通チャンネル136.975MHzを指定(デフォルト)
--gain 49.6  ゲインを49.6dB
--output-file vdl2log/vdl2.log  RaspberryPiのホームディレクトリ下のvdl2logディレクトリのなかに、vdl2.logファイルを作ります。これを周期的に、ホスト側から読みに行き、気象データを抽出します。
--msg-filter downlink,avlc_i,acars  様々なデータのなかから必要なもの(acarsのダウンリンクのみ)だけを出力するよう、フィルタを指定。これをしていしないと、不要のデータがたくさん出る。
--output-acars-pp 192.168.xx.4:9742  ホストのPCで、PlanePlotterというソフトが動いていれば、それにデータを送り込み地図上に航空機の位置を表示することが出来ます。

このほかの指定方法は、こちら。またフィルタについてはこちらに詳しい。

同一のRaspberryPiで旧来のACARSを受信するためacarsdecも動かします。そのためにscreenをインストールしておきます。
$ sudo apt-get install screen
そして、screenごとに、acarsdecdumpvdl2を起動することとします。

気象データの抽出
dumpvdl2から出力される気象データを含むメッセージは次のようです(新型の航空機を例示)。旧来のACARSのacarsdecが出力するメッセージとほぼおなじです。

例1 日本航空 JA348J Boeing 737-846 羽田からの離陸直後

[2017-11-09 06:47:45 JST] [136.975] [-15.0/-38.9 dBFS] [23.9 dB]
851CCA (Aircraft, Airborne) -> F00648 (Ground station): Command
AVLC type: I sseq: 0 rseq: 1 poll: 0
ACARS:
Reg: .JA348J Flight: JL0501
Mode: 2 Label: H1 Blk id: 7 Ack: ! Msg no.: D02A
Message:
#DFBWDCAF9000D20A 6
08214018
100N35333E1394752140 16345 20
200N35334E1394752140 16339 21
300N35335E1394742140 16341 27
400N35335E1394742140 16342 26
500N35336E1394742140 16340 35
700N35336E13
高度100フィートから700フィートまで、位置と気象データを1つのメッセージで送っている。たとえば
高度: 100フィート
現在位置: 北緯35度33.3分 東経139度47.5分
外気温: 16℃
風向: 345°
風速: 20ノット
なぜ700フィートの気象データが欠落しているのか不明。


例2 全日空 JA818A Boeing 787-8 Dreamliner

[2017-11-09 06:50:07 JST] [136.975] [-11.1/-39.2 dBFS] [28.1 dB]
86D2EE (Aircraft, Airborne) -> F00648 (Ground station): Command
AVLC type: I sseq: 7 rseq: 4 poll: 0
ACARS:
Reg: .JA818A Flight: NH0985
Mode: 2 Label: H1 Blk id: 5 Ack: ! Msg no.: D13A
Message:
#DFBPO8JA818A985 RJTTRJOO081117215001
1513 7 210ACMF1017
WN35034E13845121500327978-33270117 21900
従来のACARSに現れなかった、787-8 Dreamlinerからのメッセージ例。
WN35034E13845121500327978-33270117 21900
から
現在位置: 北緯35度03.4分 東経138度45.1分
高度: 27978フィート
外気温: -33℃
風向: 270°
風速: 117ノット

 気象データの抽出手順は、次の通りです。10分に1回、全自動で行います。

(1) RaspberryPiではacarsdecdumpvdl2が動いており、acarsdec.logとvdl2.logの2本のログファイルが出来ています。周期的にPCからそれらを読み出します。

(2) ホストPC上で、それぞれのファイルから、 時刻、現在位置(緯度latitude, 経度longitude)、高度(altitude)、外気温(temperature)、風速(windspeed)、風向(winddirection)をとりだし、必要な単位変換を行います。acarsdec_weatherdata.csv とvdl2_weatherdata.cavの2つのCSVファイルが得られます。

(3) 2つのCSVファイルを1本に併合(マージ)します。

(4) そして、GNUPLOTによるグラフ描画し、FTPによりホームページに掲載します。


 
いくつかのコメント
比較的簡単に最新の航空機からのACARSを受信することができ、高層の気象情報を得る強い味方が増えました。
すでにかなりの数の航空機がVDL2を利用し、移行が進んでいるようです。従来のACARSのメッセージ量を1とすると、これに加えVDL2により0.5〜0.8、すなわち2倍近くの気象情報が得られます。航空機の世代交代によりこれがさらに進むと考えられます。

注意点としては
1.1台のRaspberryPiに2個のドングルを使用する場合、上に述べた/etc/modprobe.d/rtlsdr.conf がないと動きませんでした。また、rtlsdrドングルの番号はどちらが0番、1番になったか、dumpvdl2から見えません。1台ずつUSBに接続し、ソフトを追加起動するようにします。

2.2個のドングルで消費電力も増えるので、電源は2.5A のアダプタでないと不安定でした。

3.旧来のACARS受信のため、同居するacarsdecは、最新のVer3.4にする必要がありました。そのためこちらのACARSのページを更新してあります。

4.VDL2の周波数は136.975MHzのみを指定していますが、ヨーロッパの混雑エリアでは136.725, 136.775, 136.875MHzも使われているようです。日本では未確認です。dumpvdl2は8周波数までデコードできるそうです。

5.旧来のACARSに比べ、高度化しているため伝送距離が短いかと思っていましたが、ほぼ同じで、北は福島、西は静岡まで受信できてます。(気象情報の場合は、遠隔地のデータはむしろノイズですから、フィルタしていますが)

6.電波法59条「傍受してその存在若しくは内容を漏らし、又はこれを窃用してはならない」という、秘密の保護規定にふれる可能性があることには変りありません。