かなり以前、ドングルを使ったADS-Bの受信にトライしていたのですが、なぜか受信がうまくいっていませんでした。その時は、アンテナが悪いのかと冬の雪の屋外で長い竿にアンテナを立てたりして、さんざん苦労したのですが成果は上がらず、結局その後放置していました。
先日スペクトラム表示のデモを作ったとき、1090MHzにチューンしてみると時折パルスが出ているのが観察できました。アンテナは室内に置いたRTLドングル付属のものです。もしかするとこれは、と思い改めて最新の環境でADS-Bのデコードを試してみたところ、なんの苦労もなくあっさりと受信に成功しました。Webに掲載されている皆さんのレポートを見るとadsbSCOPEなどWindowsのソフトウェアを使用している方が多いようですが、OSXでもADS-Bを受信することができましたので、その方法をまとめておきます。
ソフトウェアは、dump1090を使用します。コマンドラインツールですが、なんとWebインターフェースを持っていて、ブラウザで画面表示が可能です。これは是非試さねばなりません。
準備としてツールとライブラリを用意します。XcodeのCommand Line Toolsとbrewをセットアップしておきます。ターミナルから下記のコマンドでセットアップできるはずです。
$ xcode-select --install
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
$ brew doctor
つづいてライブラリですが、手作業でのインストール方法を示します。最後にbrew一発でのインストール法も示します。お好みで選択してください。dump1090はRTLドングルの制御にlibusbとlibrtlsdrを使用していますので、まずlibusbだけはbrewでインストールしておきます。
$ brew update
$ brew install libusb
次にlibrtlsdrをソースからインストールします。
$ git clone git://git.osmocom.org/rtl-sdr.git
$ cd rtl-sdr
$ ./configure
$ make
$ sudo make install
これらの準備ができたら、ようやく本体のdump1090をビルドします。ソースをgithubから引っ張ってきますが、githubにはいくつか派生バージョンが存在しているようです。antirezさんのものがオリジナルだと思われますが、今回はMalcolmRobbさんの拡張されたバージョンを使用します。ビルドは、configureが無いのでmakeするだけです。
$ git clone https://github.com/MalcolmRobb/dump1090.git
$ cd dump1090
$ make
エラーが出なければこれだけで完了です。インストールは、Makefileにルールが記載されていないので、手作業でコピーする必要がありますが、とりあえずこのまま、このディレクトリで実行してみます。
RTLドングルを接続し、コマンドラインから下記を入力します。ドングルを認識していれば下記のようにメッセージが表示されます。
$ ./dump1090
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001 (currently selected)
Found Rafael Micro R820T tuner
Max available gain is: 49.60
Setting gain to: 49.60
Exact sample rate is: 2000000.052982 Hz
Gain reported by device: 49.60
ADS-Bのメッセージを受信&デコードに成功している場合は、それらもこんな感じに表示されます。
\*02e1923cfe0617;
CRC: 851230 (ok)
DF 0: Short Air-Air Surveillance.
VS : Airborne
CC : 1
SL : 7
Altitude : 28500 feet
ICAO Address : 851230
\*8d86318858a753c0f66387940575;
CRC: 000080 (wrong)
No. of bit errors fixed: 1
DF 17: ADS-B message.
Capability : 5 (Level 2+3+4 (DF0,4,5,11,20,21,24,code7 - is airborne))
ICAO Address : 863188
Extended Squitter Type: 11
Extended Squitter Sub : 0
Extended Squitter Name: Airborne Position (Baro Altitude)
F flag : even
T flag : non-UTC
Altitude : 32325 feet
Latitude : 41.630630
Longitude: 140.681367
dump1090はコマンドラインツールですが、内部にはWebサーバを持っており、--netオプションを付けると8080番ポートでWebサーバが動作します。Webブラウザからアクセスする地図上にプロットして表示することができます。–aggressiveオプションを付けると、エラー訂正のレベルを上げて、より多くのメッセージを受信するようです。また、ドングルの周波数ずれを補正するパラメータを–ppmで指定します。これらは無くても受信できていましたが、とりあえず指定しておきます。
$ ./dump1090 --aggressive --ppm 50 --net
これを動作させたまま、ブラウザでhttps://localhost:8080/を開きます。そうすると下記のように、Google Mapsと各種情報が表示された画面になります。
受信に成功した航空機がプロットされています。クリックすると受信中に航空機が動いた分が軌跡として表示されます。
アンテナはドングルに付属していたホイップアンテナです。皆さんがレポートされているように、このアンテナでもそれなりに十分受信することができるようです。屋外の屋根にアンテナを出してみたところ、120km程離れた函館近くの恵山沖あたりから受信できています。
上は夜にちょっと試した結果ですが、もう少し真面目に時間をかけて昼間に試してみました。アンテナはやはり屋根の上です。
羽田方面の真南の航空路だと恵山沖あたりまでしか受信できないのに対して、関西やアジア方面の南南西方向だともうすこし距離が伸びることがわかりました。津軽海峡あたりまで受信できます。
方向によって結果が違うのは、受信地点からみて200mほど先の南側に目の高さに森があり、これに遮られていると予想しています。ちょっと西側にずれるとオープンですのでこちらの方向の結果が良いのだろうと予想しています。アンテナ高さをもう少し上げると良い結果が出るかもしれません。
dump1090の起動時に–interactiveオプションを付けると、コンソールに表形式で表示します。受信したメッセージ数等が表示されています。更新レートが早いため、目で見て数値が変化しますので、受信状況が掴みやすいです。
$ ./dump1090 --aggressive --ppm 50 --net --interactive
最後にbrewでlibrtlsdrとdump1090をインストールする方法です。brew用のレシピを用意しましたので、これを使ってインストールすることが可能なはずです。brew tapコマンドを使ってgithubからレシピをダウンロードしてインストールを行います。–HEADオプションを忘れないようにしてください。
$ brew tap ttrftech/gnuradio
$ brew install libusb
$ brew install dump1090 --HEAD
依存関係は自動的に解決しますのでlibrtlsdrは自動で入るはずです。また、brewの流儀に従って/usr/localに必要なファイルがインストールされますので、任意のディレクトリから実行可能です。もしインストールがうまくいかない場合はログを添付(--vdオプションを付けてbrew installを実行)してお知らせください。
dump1090は、antirezさんのオリジナルからたくさんの派生バージョンが作られています。オリジナルのユーザインターフェースがちょっとシンプル過ぎなのと、実装がみなさんお馴染みのHTML+JavaScriptで作られていますので、拡張が容易なためです。自分もちょっと試してみましたが、下のキャプチャは50kmと100kmの距離円を描くよう拡張した例です。
githubのForksやNetworkという欄を見ると、派生バージョンを辿ることができますので、いろいろ比較してみると面白いかもしれません。
さて、無事にADS-Bの受信環境が構築できましたので、続いてこれの改善を考えていきたいと思います。アンテナ、フィルタ付きプリアンプ等を検討中です。今回はdump1090をMac OSXで試しましたが、Linux系でも同じように使えるはずです。常時稼働や、ゆくゆくはflightradar24へのフィードもやってみたいと思います。
昨夜作ったADS-B用の1090MHz SAWフィルタ&プリアンプ。特性もいい感じになった pic.twitter.com/AhH1r7yw1b
— TT@北海道 (@edy555)
リファレンス
- 今回使用したMalcolmRobbさんのdump1090 https://github.com/MalcolmRobb/dump1090
- antirezさんのオリジナル https://github.com/antirez/dump1090
- これが無くては始まらないrtl-sdrの本家 https://sdr.osmocom.org/trac/wiki/rtl-sdr
- Okiraku Programming NeoCatさんのADS-Bの記事 https://d.hatena.ne.jp/NeoCat/20140402/1396406442
- ゆうパパさんのADS-B関連記事 https://blog.livedoor.jp/bh5ea20tb/tag/ADS-B
- Today’s sky: ja8175さんのブログ https://blog.ja8175.com/
- flightradar24 https://www.flightradar24.com/