Hatena::ブログ(Diary)

Okiraku Programming RSSフィード Twitter

2014-04-02 Raspberry Piで航空機からの位置情報信号ADS-Bを受信

Raspberry Piで航空機からの位置情報信号ADS-Bを受信してみた

f:id:NeoCat:20140401005358p:image:w480

最近ニュース航空機の捜索が話題になっていましたが、その中でADS-Bという単語が出てきました。

ADS-B(Automatic Dependent Surveillance-Broadcast)は、航空機から1090MHzの周波数で発信されている、識別子、GPSによる現在位置、高度、対気速度などを含む信号で、この情報を地上や航空機間で利用することでより安全航空機運用できるようにするもので、近年これに対応したトランスポンダを搭載する航空機が増えてきているそうです。1030MHzで各航空機に問い合わせを送り、各航空機が1090MHzで応答するというプロトコルになっています。

参考: 空中衝突防止装置 - Wikipedia


Flightradar24というサイトを見ると、航空機位置情報リアルタイムで見ることができますが、これはユーザの受信機が拾ったADB-Sの情報収集して配信することで、世界中航空機位置情報カバーする仕組みになっています(ADB-Sに対応しない航空機もあるため、FAAの情報(5分遅れ)なども利用して補完しています)。


さて、このADS-Bですが、ソフトウェアラジオ(SDR: Software Defined Radio)用のUSBスティックを使うと非常に安価に受信することができます。

R820Tというチップを使ったUSBドングルが特に簡単に利用できるようです。何とたったの999円で手に入るとか。Amazonでも2000円くらいから売られていました。


これをRaspberry Piに接続して、ADS-Bの受信(ついでにFMラジオ再生も)にトライしてみました。

f:id:NeoCat:20140401222347j:image:w360

今回使用したのは米国Amazon.comで購入したNoElecのR820T USBドングルです。

Raspberry PiでのADS-B受信は、下記のガイドが参考になります。

ADS-B Sniffing with the Raspberry Pi and the NooElec 820T Dongle | the electric stranger

なお、利用方法はR820Tを使用したドングルであればほぼ変わらないはずです。

WindowsMacで利用する方法も検索するといろいろと出てきます。


Raspberry Pi上のソフトウェアセットアップ手順は下記の通り。

rtl-sdrセットアップ

まず、SDR用のrtl-sdrというパッケージをセットアップします。

参考: Rtl_fm Guide: Updates for rtl_fm overhaul, Raspberry PiとRTL2832Uドングルを受信サーバとして使ってみる - Computer Radio RF Tech

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ソースの取得

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

4. rtl-sdrテスト

USBスティックの機種によって、rtl2830やrtl2832、dvb_usb_rtl28xxuといったカーネルドライバロードされている場合、rmmodする必要があります。

sudo rmmod rtl2830
sudo rmmod rtl2832
sudo rmmod dvb_usb_rtl28xxu

そして、

sudo rtl_test

してみて、「Found 1 device(s): デバイス名 」と表示されればOK。


次に、試しにFMラジオ再生してみます。例えば106.7MHzにチューニングする場合、

sudo src/rtl_fm -M fm -f 106.7M -s 170k -A fast -r 44100 -l 0 -E deemp | sudo aplay -t raw -r 44100 -c 1 -f S16_LE

とします。これで、ステレオミニジャックからラジオの音声が出力されます。

音量の調整は、sudo alsamixerコマンドで行います。あまりに低くなっていると音が出ないので注意。


Raspberry Pi上で rtl_tcp -a 0.0.0.0 を動かしておき、LinuxもしくはMacからgprxというソフトウェアで"rtl_tcp=<raspiのIPアドレス>:1234"に接続*1すると、リモートでラジオを聞いたりFFT波形を見たりできます。

詳しくはこちらが参考になります。MacでSDRするならgqrxがとても簡単 - Computer Radio RF Tech


gprxの接続設定の例。

f:id:NeoCat:20140401024751p:image:w360


gprxで1090MHz周辺を見てみたところ。真ん中のピークはフィルタによるノイズですが、右寄りに1090MHz (0.03MHz程の誤差がありますが…)のピークが見えますね。

f:id:NeoCat:20140401024752p:image:w600

ADS-Bの受信

様々なソフトがあるようですが、今回はLinuxでの実行がお手軽なdump1090を使います。

ADS-B dump1090

http://www.satsignal.eu/raspberry-pi/dump1090.html

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

実行するには、

./dump1090 --interactive --net

とします。コンソール上に下記のように受信されたADB-Sの情報が表示されます。

Hex     Mode  Sqwk  Flight   Alt    Spd  Hdg    Lat      Long   Sig  Msgs   Ti\
-------------------------------------------------------------------------------
a283fa  S                     2750                               24     8    1
a62f85  S                     6175             42.091  -71.138   20     6   53
aa435b  S                    22325                               21   160   31
a301f3  S     3417           25900                               19   517   11
86d668  S           JAL8      2200  153  019   42.248  -71.062   23   186   59
......

また、WebブラウザRaspberry piIPアドレスの8080番ポートに接続すると、下記のように地図上に取得した情報プロットしてくれます。

f:id:NeoCat:20140401215758p:image:w640

なお、下記フィード用等でサーバとして常駐させる場合は ./dump1090 --quiet --net とすれば画面表示を抑制して少し負荷が下げられるかと思います。


Flightradar24.comにデータフィードする

また、専用のfeederソフトを使って取得したデータをFlightradar24.comに送信して共有することもできます。一定の条件を満たせば、無料プレミアムアカウント機能を利用することができます。

Linux単体でも送信自体は可能ですが、最初のアカウントセットアップは現状Windows版のソフトからしかできないようです。手順は下記。

  1. Flightradar24.comのプレミアムアカウントにSign up(このとき料金を払う必要はありません)
  2. Flightradar24.com - Live flight tracker! からWindows用のfeederダウンロードして実行
  3. Sign upボタンをクリックし、アカウントメールアドレス、受信地の緯度経度(Google Map等で調べられます)、およびdump1090の30003ポートに接続できるようIPアドレスを設定
  4. しばらく待つと、2機以上の位置情報を受信して照合し、正しければkey(16桁の16進数)が付与される。
  5. Linux feeder software for Flightradar24 (Old software) からARM LE, statically linkedバージョンのfeederRaspberry Piダウンロード(動的リンク版は途中でSEGVして動きませんでした)
  6. tar xf *.tgz でアーカイブ解凍し、渡されたkey指定してfeederを起動*2
% ./fr24feed_arm-le_241s --fr24key=0123456789abcdef --bs-ip=127.0.0.1 --bs-port=30003
[i]FR24Feed v241 - built on Feb 20 2014/09:54:09
[i]Downloading configuration...OK
[i]Parsing configuration...OK
...
[n]connected
[n]switching to UDP
[n]working
[i]Data feed time difference OK abs(12:49:20.430 - 12:49:20.396)=0
[n]pinging the server
[i]sent 5 planes in 1 packets
...

プレミアムアカウント有効にして航空機クリックすると、データを取得した人のコード(ID)を見ることができます。自分コードが出てるのを見るとちょっと嬉しいですね。また、自分が送信したポイント数や、距離・方角の分布などもグラフィカルに見ることができます。

f:id:NeoCat:20140404000440p:image:w640

やはり付属のデジタルTVアンテナ、かつ室内なので、方角も南側に偏ってるし距離も最大100nm(185.2km)程度といまいちですね…。

追記→ 1090MHz用のグランドプレーンアンテナを作ってみたところ、最大170nm程度に改善しました。

その他の参考サイト

他の環境用のソフトウェア情報や、専用アンテナの作り方なども。

RTL-SDR Tutorial: Cheap ADS-B Aircraft RADAR - rtl-sdr.com

ADS-Bに夢中 安価で高性能のソフトウェアラジオを使用した航空無線・バーチャルレーダー受信機を紹介

ADS-B受信にチャレンジ - (。・ω・。)ノ・☆':*;':*

*1:サンプル数は増やすとチューニングが楽になりますがCPU負荷が上がりネットワーク帯域を多く消費します。デフォルトの1.5Mサンプルでは、3MB/s程度の転送と30%のCPUを程度消費します。250kサンプルだと500KB/s・2%程度になり、それでもFilterを適切な幅に設定すれば十分再生できます

*2:どうもこのfeederは10分に1度の割合ゾンビプロセスbash <defunct>)を発生させるようです。https://gist.github.com/NeoCat/9982700 にあるプログラムをかませて ignchld ./fr24feed_arm-le_241s ... と実行すればゾンビプロセスの発生を防げます(SIGCHLDを無視させている)。ただ、相変わらずpipeをopenしっぱなし(lsof -p <pid>で見ると分かります)なので、数日に1度くらい定期的にプロセスを殺して再起動するようにした方が良さそうです。

mabosmabos 2014/07/02 19:27 初めまして。
ADS-B Requestは(たぶん)このような受信方法では発信していないのでは無いかと思います。
航空機用のADS-B受信機(USBやWifi接続の簡易受信機があります)でも自分の乗っている機体が
ADS-B OUTに対応していないと(リクエストを送る人が誰もいないので)受信に制限がある、との表記
があります。

http://www.foreflight.com/stratus
"Note: ADS-B traffic is limited unless your aircraft has ADS-B Out installed in the panel."

地上で受信できるのはどうも付近に2機以上のADS-B OUTに対応している航空機がいる場合の相互通信を漏れ聞いているからのようです。

それにしても飛行中はやはりあると大変便利なので手放せません。XM Radioの天気は月額高いで
すし・・・
P-Townの空港などはNon-ToweredなのでADS-B OUTがある機体で行くと着陸の行列に並びや
すくてGoodです。(もっとも最終的には有視界で目視確認が必須ですが。)

akimatsu3233akimatsu3233 2016/01/30 23:22 はじめまして。

私はRaspberry pi2を用いてADS-Bを受信しようと考えているのですが、上記のように行ったところ、最後の実行の部分である
./dump1090 --interactive --net
でエラーが発生し、受信が出来ませんでした。
PC上での受信は問題は無いので、理由が良く分かりません。

もしご存じでしたら、教えていただきたいと考えております。
よろしくお願い致します。

NeoCatNeoCat 2016/01/31 12:29 lsusb等でUSBデバイスが認識されているか確認ください。
また、USB接続時にドライバが自動でロードされてしまうかもしれないので、
4.のドライバが入っていないかlsmodで確認、あるようならrmmodしてみてください。
他に、RasPi2の電源によっては電力不足ということもありえます。RasPi2とUSBデバイスの間にバスパワードのUSBハブをかましてみると改善する可能性もあります。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。