Computer & RF Technology

Raspberry-PiでADS-Bを受信しFlightradar24にフィードする

ADS-Bのアンテナも屋外設置して、それなりに受信ができるようになりました。ここまできたら常時運用してみたいところです。ところがPCで常時運用を行うとそれなりの電力を消費してしまいますし、なにかと邪魔です。そこでお決まりの小型省電力なRaspberry Piを使うことにしました。これなら消費電力は2W程度で済ませられます。

実は既に各種データ収集のためにRaspberry Piを常時稼働させておりましたので、これにADS-B受信も便乗させることにしました。

使用したRaspberry Piは、最初の販売バージョン256MBのモデルです。これまで、I2Cの大気圧センサ、自作USB温度センサ、Bluetooth経由で電力量の収集を行って、それぞれインターネットにアップロードを継続して行っています。ここにRTLドングルを追加することにしました。ただ、屋外から引っ張ってきたUSBケーブルで場所の都合がありますので、設置場所を変更しました。

ネットにはいくつかRaspberry PiによるADS-Bの運用事例が公開されていますが、改めて手順を紹介します。OSにはRaspbian、ソフトウェアはMac OSと同じようにdump1090を使用します。librtlsdrをビルドするためにcmakeを追加でインストールします。またライブラリとしてlibusbの開発版を入れておきます。

$ sudo apt-get install cmake screen
$ sudo apt-get install libusb-1.0-0-dev

準備ができたら、ソースをgitで引っ張ってきてビルドします。configureでもビルドできるようですが、今回はcmakeでやってみます。

$ git clone git://git.osmocom.org/rtl-sdr
$ cd rtl-sdr
$ mkdir build
$ cmake ..
$ make

ビルドが成功したら、インストールします。追加されたライブラリのパスを認識させるためにldconfigを一度だけ実行しておく必要があります。そうしないとdump1090のビルド時にリンクに失敗してしまいます。またUSBデバイスをユーザ権限で利用できるようにするために、udevルールをコピーしておきます。

$ sudo make install
$ sudo ldconfig
$ sudo cp rtl-sdr.rules /etc/udev/rules.d/

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

RTLドングルを接続して、rtl_testを実行してみます。

$ rtl_test
Found 1 device(s):
0: ezcap USB 2.0 DVB-T/DAB/FM dongle
  Using device 0: ezcap USB 2.0 DVB-T/DAB/FM dongle
Found Rafael Micro R820T tuner

もし、うまく動作しない場合は、RTLドングル用のLinuxのドライバがロードされている可能性があります。その場合は下記を試してみてください。

$ sudo rmmod dvb_usb_rtl28xxu

これでうまくいくようになるなら、ドライバがロードされないように/etc/modprobe.d/にno-rtl.confというファイルを下記の内容で作成しておきます。

$ sudo vi /etc/modprobe.d/no-rtl.conf
blacklist dvb_usb_rtl28xxu
blacklist rtl2832
blacklist rtl2830

続いてdump1090をビルドします。githubからソースを引っ張ってきてビルドします。MalcolmRobbさんのバージョンを使用します。

$ git clone https://github.com/MalcolmRobb/dump1090.git
$ cd dump1090
$ make

インストールのスクリプトは用意されていませんが、今回はそのまま動かしてみます。

$ ./dump1090

うまく行っていれば、受信したメッセージが表示されるはずです。

さて、常時稼働を簡便に済ませるため、GNU Screenを使用します。screenを使うと、プロセスを動作させたまま接続を切断したり、複数のセッションを起動することが可能です。

$ sudo apt-get install screen
$ screen

screenを起動すると、グリーティングが表示されますので焦らずEnterします。

screenの中で新たにシェルが起動します。稼働させておきたいプロセスはここで起動するようにします。さっそくdump1090を起動します。

$ ./dump1090 --net --aggressive --interactive

正常に起動したことを確認したら、ここでscreenのセッションを切り離します。Ctrl-Aを押し、続けてCtrl-Dを押します。これはデタッチDetach操作の意味です。そうするとscreenを起動する前の画面に戻りますが、プロセスはそのまま動作しています。

先ほどのscreenセッションに再接続(retach)するためには、screen -rを使用します。

$ screen -r

そうすると先ほどの画面が復活するはずです。Ctrl-A+Ctrl-Dと、screen -rを使用すると自在に行き来することが可能です。ログアウトしても動作しています。
複数のセッションを動作させることも可能です。オプション無しでscreenコマンドを実行すると新しいセッションが作成されます。同様にデタッチすることができます。この状態で再接続しようと-rオプション付きでscreenすると、候補が表示されます。

$ screen -r
There are several suitable screens on:
1255.pts-0.raspberrypi (08/22/14 07:25:26) (Detached)
12561.pts-0.raspberrypi (08/14/14 13:17:48) (Detached)
11701.pts-0.raspberrypi (08/14/14 11:27:58) (Detached)
2432.pts-0.raspberrypi (08/13/14 14:31:12) (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

-rオプションに表示されたセッション名を指定すると、そのセッションに再接続されます。

$ screen -r 1255.pts-0.raspberrypi

セッションが不要になったら、そのセッション内でexitまたはCtrl-Dします。Ctrl-A+Ctrl-Kでセッションを終了させることも可能です。Ctrl-A+?と入力するとヘルプが表示されます。

screen内でdump1090を動作させておけるようになったら、ブラウザで接続してみます。Raspberry PiのIPアドレスを調べて、他のPCからブラウザで https://{raspi ip address}:8080 を開くとgoogle mapが表示され、航空機の位置が表示されるはずです。

しばらくこの状態で、安定稼働するかどうかを試します。私の環境では時間後にOSがが反応しなくなるという現象が出ました。Raspberry PiはUSBの電源廻りが弱いという欠点があり、RTLドングルの電力消費に耐えられなかったようです。新しいRaspberry Piでは改善が図られているようですが、今回は旧版のRaspberry Piをそのまま使いたかったので、USBにセルフパワーハブを使用して、USBをRasPi本体から直接取らないようにすることで改善することができました。ついでにRaspberry Piの電源も同じセルフパワーハブから取るようにしました。RasPiが親になっているUSBハブのポートからRasPiの電源を取るのは変な感じですが、特に問題なく動作しています。電源制御されるハブの場合には問題があるかもしれません。

あとネットワークですが、安定接続のために有線のEthernetで接続しています。最初は無線で試したのですが、設置場所のせいで接続が安定せず、結局有線に変更しました。以後は危なげなく安定して動作しています。

さて、dump1090が稼働するようになったら、今度はflightradar24にフィードします。フィードするためのソフトウェアがwindows/linux/raspbery pi用のバイナリファイルが用意されていますので、ダウンロードして展開して内容を確認し、動作するかどうか試してみます。raspberry pi用は2種類ありますが、スタティックリンク版を使用するほうがトラブルが少ないと思います。

$ wget https://dl.dropbox.com/u/66906/fr24feed_arm-le_242s.tgz
$ tar xfz fr24feed_arm-le_242s.tgz
$ ls
fr24feed_arm-le_242s fr24feed_arm-le_242s.tgz
$ file fr24feed_arm-le_242s
fr24feed_arm-le_242s: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.18, BuildID[sha1]=0x5983f9ffa0cdc6866076241d103c5b6cb6a29faa, not stripped
$ ./fr24feed_arm-le_242s
[i]FR24Feed v242 - built on Apr 23 2014/09:49:17
Regular usage:
./fr24feed_arm-le_242s --fr24key=YOUR_SHARING_KEY
./fr24feed_arm-le_242s --fr24key=YOUR_SHARING_KEY [ --bs-ip=xxx.xxx.xxx.xxx --bs-port=NNNNN
If you don't have a sharing key please use the following command:
./fr24feed_arm-le_242s --signup

うまく動いたら、さっそくサインアップを行います。以前はWindows版のソフトウェアが必要だったようですが、現在はRaspberry Piから直接サインアップすることができました。いくつか質問がされますので、適宜入力していきます。受信地点の概略の緯度、経度が必要ですが、小数点以下一桁くらいで良いようです。それとメールアドレス。あとdump1090が動作しているホストとポート番号ですが、同じホストで動作させるならEnterだけでOKです。以上入力すると内容チェックの後、dump1090と接続して受信テストが行われて、うまく動いていることが確認されたら、レーダー番号と共有鍵が発行されます。

$ ./fr24feed_arm-le_242s --signup
[i]FR24Feed v242 - built on Apr 23 2014/09:49:17
Welcome to the FR24 Feeder sign up wizard!

Before you continue please make sure that:

1 - You have a working receiver/decoder providing Basestation compatible stream
2 - You know the network address of the data feed (localhost:30003 by default)
3 - You know your receivers location up to 1 decimal point
4 - You have a working email address that will be used to contact you

To terminate - press Ctrl+C at any point

Step 1/5 - Enter Latitude (DD.DDDD)
$:xx.xxx
Step 2/5 - Enter Longitude (DD.DDDD)
$:xxx.xxx
Step 3/5 - Enter your email address (username@domain.tld)
$:xxx@xxxx.xxx
Step 4/5 - Enter your the hostname of the data feed (leave empty for localhost)
$:
Step 5/5 - Enter your the port number of the data feed (leave empty for 30003)
$:

Validating form data...OK

The closest airport found is ICAO:RJCO IATA:OKD near Sapporo.

Latitude: 
Longitude: 
Country: Japan

Flightradar24 may, if needed, use your email address to contact you regarding your data feed.

Would you like to continue using these settings?

(yes/no)$:yes

Taking data sample, minimum 3 AC required including at least 2 ADS-B:

[b]connecting to localhost:30003
[b]connected
[i]00:00 - Connected to the data feed
[b]working
[i]Data feed time difference OK abs(13:15:21.875 - 13:15:21.853)=0
[b]00:05 - 5 AC in range
[b]00:10 - 5 AC in range
[b]00:15 - 5 AC in range
[b]00:20 - 5 AC in range
[b]00:25 - 6 AC in range
[b]00:30 - 6 AC in range
[b]00:35 - 6 AC in range
[i]Removed 0 of 6 AC
[b]disconnected

Sending data sample to the server, completing registration...OK

Account registered successfully!
Your sharing key is: xxxxxxxxxxxxxxx
Your radar code is: T-RJCO6

Soon you should also receive an email containing this information.

To start sending data please start the feeder providing your key:
./fr24feed_arm-le_242s --fr24key=xxxxxxxxxxxxxxx

レーダー番号は、入力された緯度経度から得た最寄りの空港コードに、番号を付けたものが発行されます。ちょっとそれっぽい気分になるギミックです。

フィーダを動作させるときには発行された共有鍵を使用します。フィーダも常時稼働させますので、新たにscreenセッションを開始してこの中でフィーダを動作させます。

$ screen
$ ./fr24feed_arm-le_242s --fr24key=xxxxxxxxxxxxxxx
[i]FR24Feed v242 - built on Apr 23 2014/09:49:17
[i]Downloading configuration...OK
[i]Parsing configuration...OK
[c]Interval: 5s
...

エラー無しにフィードがうまく動いているようなら、Ctrl-A+Ctrl-Dでデタッチしてしまってかまいません。

注意点ですが、dump1090とfr24_feedの常時稼働にscreenを使っていますが、自動でプロセスを起動することはできません。マシンを再起動する度に、screenでセッション作成とプロセス起動を行う必要があります。起動スクリプトでデーモンにしてしまうとログの記録と管理が面倒なので、しばらくはscreenで運用する予定です。

Flightradar24のWebにアクセスして、フィードのサインアップに使用したメールアドレスで、アカウントを作っておきます。アカウントの作成はフィードのサインアップとは別に行う必要があります。同じメールアドレスを使う必要があります。

Flightradar24にログインすると、自分のフィードの情報を確認することができます。数時間動作させた後であれば、受信した航空機やメッセージ数、距離や方向などの統計情報を確認することができます。これで受信状況の確認ができるようです。

Flightradarの画面に自分がフィードした情報が出るとちょっと嬉しいです。レーダー番号で識別することができます。

dump1090の画面と並べるとこんな感じです。

気になるRaspberry Piの負荷ですが、dump1090が30~40%消費するようですが、まだ余裕があります。メモリの消費も少なく、256MBのモデルでも全く問題なく動作しています。

Flightradar24ですが、フィードが動作しているならプレミアムサービスが無料で利用可能です。表示時間の制限が無くなり、その他全画面表示や、レーダービューなどを見ることができます。iPhone用のソフトウェアもプレミアム版も利用可能です。

ここ数日運用を続けていますが、調子良く動作しています。方位や距離のチャートも出るので、設定を変えて比較することもできると思います。もう少しいろいろ試してみようと思います。

リファレンス

Load more