世界の飛んでいる航空機情報を見るサービス、Flightradar24が人気です。
最近では岸田元首相がウクライナに電撃訪問した際に、そのチャーター機の情報がFlightradar24で見られると話題になりました。
このFlightradar24の情報は、ADS-Bという通信を受信し構築されています。ADS-Bは、航空機からの位置情報などを地上局に送信するための通信方式です。従来飛行機の位置情報は空港などにある地上のレーダー設備から位置特定していましたが、必ずしも地上から飛行機の位置を取得できるものではありません。そこで飛行機側からも位置情報を出すことでより完璧な位置情報を取得できるようにしたのがADS-Bです。
このADS-Bは平文で飛行機から出力されているため受信機さえあれば手軽に情報を取得できます。今回は自宅の屋内にアンテナを設置して周辺にいる飛行機の情報を取得してみます。
受信機選定
ADS-Bの受信機はAmazonやAliExpressなどで無数に販売されています。まずLinuxで動作しADS-Bを受信できると報告がある機器を探します。
NESDR Mini 2+ 0.5PPM TCXO RTL-SDRおよびADS-B USBレシーバーセット(アンテナ、吸引マウント、メスSMAアダプター付き)。 RTL2832UおよびR820T2チューナー。 低コストのソフトウェア無線
今回は上記機種が動作報告豊富だったため購入しました。
環境
今回はProxmox VM上にセットアップします。
OSはUbuntu 22.04 Serverをインストールしています。ストレージは60GB程度設定していますが恐らく16GBもあれば足ります。メモリは2GBにしましたがカツカツだったため4GBくらいあった方が良いかもしれません。
ADS-Bの受信環境はRaspberry piが一般的でamd64環境、ましてやProxmoxでの構築事例は少ないため少し苦労しました。
セットアップ
Ubuntuインストール
この段階ではまだ受信機を接続していません。
特筆すべき事はないので割愛します。プレーン状態でインストールした状態です。
Dockerインストール
Dockerをインストールしますが今回は特別なスクリプトでインストールします。
GitHub - sdr-enthusiasts/docker-install: Script to help install Docker on Raspberry Pi and similar Debian-based OSes
SDR Enthusiastsさんの各種リポジトリではDockerでADS-Bを扱うさまざまなリポジトリが提供されています。
後ほどADS-Bを受信する環境もDockerコンテナで構築するのですが、その前提となる各種設定やツールのインストールを自動化してくれるスクリプトが公開されています。
arm64でもamd64でも動作するため、Raspberry pi環境でも利用可能です。OSはdebian系が前提です。
bash <(wget -q -O - https://raw.githubusercontent.com/sdr-enthusiasts/docker-install/main/docker-install.sh)
上記コマンド実行します。
Do you want to prepare the system for use with any of the RTL-SDR / ADS-B containers?
Examples of these include the collection of containers maintained by SDR-Enthusiasts group:
Ultrafeeder, Tar1090, Readsb-ProtoBuf, Acarshub, PlaneFence, PiAware, RadarVirtuel, FR24, other feeders, etc.
It's safe to say YES to this question and continue unless you are using a DVB-T stick to watch digital television.
途中上記質問が出るのでY
を選択します。
スクリプト実行後は再起動して’docker’コマンドが打てるか確認します。
問題無くDockerコマンドが打てたらVMをシャットダウンします。
Proxmox側の設定
先ほどのDokcerインストールスクリプトの中にカーネルモジュールへの設定が含まれています。
受信機のデバイスがカーネルから読み込まれないようにする処理です。念のためProxmoxホスト側でも同じ設定を通しておきます。
sudo tee /etc/modprobe.d/blacklist-rtlsdr.conf <<TEXT1
# Blacklist host from loading modules for RTL-SDRs to ensure they
# are left available for the Docker guest.
blacklist dvb_core
blacklist dvb_usb_rtl2832u
blacklist dvb_usb_rtl28xxu
blacklist dvb_usb_v2
blacklist r820t
blacklist rtl2830
blacklist rtl2832
blacklist rtl2832_sdr
blacklist rtl2838
blacklist rtl8192cu
blacklist rtl8xxxu
# This alone will not prevent a module being loaded if it is a
# required or an optional dependency of another module. Some kernel
# modules will attempt to load optional modules on demand, which we
# mitigate here by causing /bin/false to be run instead of the module.
#
# The next time the loading of the module is attempted, the /bin/false
# will be executed instead. This will prevent the module from being
# loaded on-demand. Source: https://access.redhat.com/solutions/41278
install dvb_core /bin/false
install dvb_usb_rtl2832u /bin/false
install dvb_usb_rtl28xxu /bin/false
install dvb_usb_v2 /bin/false
install r820t /bin/false
install rtl2830 /bin/false
install rtl2832 /bin/false
install rtl2832_sdr /bin/false
install rtl2838 /bin/false
install rtl8192cu /bin/false
install rtl8xxxu /bin/false
TEXT1
sudo modprobe -r rtl2832_sdr
sudo modprobe -r dvb_usb_rtl2832u
sudo modprobe -r dvb_usb_rtl28xxu
sudo modprobe -r dvb_usb_v2
sudo modprobe -r r820t
sudo modprobe -r rtl2830
sudo modprobe -r rtl2832
sudo modprobe -r rtl2838
sudo modprobe -r rtl8192cu
sudo modprobe -r rtl8xxxu
sudo modprobe -r dvb_core
sudo update-initramfs -u
ここまで作業が終わったら受信機をUSBポートに接続します。接続後はVMのHardware設定からUSBデバイスを追加します。
現在のProxmoxホストはMINISFORUMのミニPCなのですが、背面の刺すとVMへ接続後にデバイスを触った瞬間ゾンビになる問題がありました。もしかすると電力不足なのかもしれません。
今回はフロント側に接続することで動作しました。
docker-readsb-protobuf
VM側に戻ってADS-Bを受信するためのコンテナを設定します。
GitHub - sdr-enthusiasts/docker-readsb-protobuf: Multi-architecture readsb-protobuf container with support for RTLSDR, bladeRF and plutoSDR (x86_64, arm32v7, arm64v8)
先ほどのDockerインストールスクリプトと同じチームが出しているdocker-readsb-protobuf
を利用します。
volumes:
readsbpb_rrd:
readsbpb_autogain:
services:
readsb:
image: ghcr.io/sdr-enthusiasts/docker-readsb-protobuf:latest
tty: true
container_name: readsb
hostname: readsb
restart: always
devices:
- /dev/bus/usb:/dev/bus/usb
ports:
- 8080:8080
- 30005:30005
environment:
- TZ=Asia/Tokyo
- READSB_DCFILTER=true
- READSB_DEVICE_TYPE=rtlsdr
- READSB_FIX=true
- READSB_GAIN=autogain
- READSB_LAT={緯度}
- READSB_LON={経度}
- READSB_MODEAC=true
- READSB_RX_LOCATION_ACCURACY=2
- READSB_STATS_RANGE=true
- READSB_NET_ENABLE=true
volumes:
- readsbpb_rrd:/run/collectd
- readsbpb_autogain:/run/autogain
- /proc/diskstats:/proc/diskstats:ro
tmpfs:
- /run/readsb:size=64M
- /var/log:size=32M
緯度経度はアンテナ設置場所の緯度経度を小数5桁くらいで入力します。Google Mapsで緯度経度を見たい地点を右クリックすると表示されるのでオススメです。
docker-compose up -d
でコンテナを起動します。
起動したらdocker exec -it readsb viewadsb
で受信状況が確認できます。
航空機は取得でいているが緯度経度を取得できてない場合は受信感度が悪いかもしれません。アンテナの調整等が必要になります。(単純に飛行機の位置が受信限界ギリギリの可能性もあるのである程度見守って判断するのが良いかと)
注意:夜中にテストするとそもそも飛行機が飛んでいないので受信できません。Flightradar24で家の近くに飛行機が飛んでいるか確認してください。
http://<IPアドレス>:8080/
にアクセスすると受信した飛行機の情報が地図上で確認できます。
受信感度
屋内に素朴に付属アンテナを建ててみました。
これでも半径60km程度のADS-Bを受信できました。屋根などにしっかりとしたアンテナを設置すれば400km程度の範囲を受信できるそうです。
ADS-Bは1090Mhz帯を利用していますが、上空から送出すると案外遠くまで受信できるものなんだと関心しました。
以上で受信機さえあればお手軽に自宅周辺の飛行機情報を取得できました。ただこれだとデータを眺めて終わりになってしまうので次回はこれをFlightradar24へ送信してみようと思います。