-- Views
September 11, 26
スライド概要
Flightradar24のような航空機追跡アプリは、実は特別なデータ提供元を持っているわけではありません。上空を飛ぶ旅客機は、自分の位置・高度・速度・便名を、暗号化なしの電波として放送し続けています。これは ADS-B と呼ばれる仕組みで、数千円のアンテナとUSBドングルで誰でも電波を受信できます。
本セッションでは、この「空から降ってくる電波」が、地図上で動く一機の飛行機になるまでの全工程を、一から実装して確かめた話をします。
この発表を聞き終えると、次のことが分かるようになります。
飛行機が放送するADS-Bの全体像と、設計の背景
アンテナが拾う生の電波(I/Q信号)が、信号処理(復調)を経てビット列になるまで
ビット列から機体アドレス・緯度経度・速度をどう読み解くか(バイナリプロトコルのデコード手順)
緯度経度を2枚のフレームに分けて送る CPR という独特な座標エンコードの発想
当日は受信済みデータのリプレイで、生のフレームが地図上の飛行機に変わる瞬間をお見せします。空から降る電波を一緒に読んでみましょう。
今日もどっこい生きているアプリエンジニア&バイオリン製作家&ピアニスト&ワイン醸造家。絶望的に道に迷うので、個人で方向音痴向けナビアプリ「Waaaaay!」を作っています。 生八橋、ピーナッツかりんとう、芋けんぴ、ちんすこう、通りもん、抹茶味の食べ物が好き。
空から降ってくるバイナリを読む 数千円のハードで作る、自分だけの飛行機トラッカー Day 0, Track A, 17:20Ryota AYAKI / @ayakix
海から空へ 2
Flightrader24 https://flightradar24.com/ 3
ノギス 本尺( 1 目盛 = 1.0 mm) ① 整数部の読み取り 副尺の0が指す本尺の位置を読みます。 2 と 3 の間 → 整数部 2 mm ② 小数部の読み取り 副尺( 1 目盛 = 0.9 mm) 本尺と副尺が一直線に揃う箇所を読みます。 4番目で一致 → 小数部 0.4 mm 4
電波は限りある資源 航空機位置 1090 MHz AM放送 NFC FM放送 地デジ WiFi 衛星放送 470~710 MHz ADS-Bで 使用される 周波数帯 ~1.6 MHz 13.56 MHz 76~95 MHz 2.4 / 5 GHz 12 GHz帯~ 1 MHz 10 MHz 100 MHz 500 MHz 1 GHz 5 GHz 10 GHz 5
航空機位置情報 (ADS-B) 航空機が自ら電波を発信し、リアルタイムにブロードキャスト 便名 Flight ID 航空機を識別するための 識別番号(コールサイン) 緯度・経度 高度 Position Altitude GPSなどで測定された、現 在の正確な地理的平面位 置 気圧高度計や GPSデータ から算出された現在の高 度情報 速度 Velocity 対地速度を基準とする 移動速度情報 6
ハードウェア構成 最小限の機材で始める手軽な受信システム 1 2 受信アンテナ 1090 MHzのADS-B電波を受信 2 RTL-SDR アンテナからの電波をデジタル信号に変換 1 3 Android/小型PC端末 受信データのデコード/表示 7
SDR(Software Defined Radio)とは? なるべく生のままデジタル化し、残りは全部ソフトウェア SDR 従来 ● FMラジオ、航空無線、Wi-Fiなど、目的の規格ごとに 専用の電子回路を物理的にハンダ付けして製造 ● FMラジオ専用機で航空無線の電波を受信・復調す ることは物理的に不可能。 低コスト化 ● アンテナで拾った高周波を、最小限の回路とADC(ア ナログ・デジタル変換器)で「生の数値データ」として 取り込む ● プログラムを書き換えるだけで、同じハードウェアの まま「FMラジオ」「航空機ADS-B」など、様々な通信 方式に対応 柔軟性と拡張性 信号処理の可視化 8
電波の中から ADS-B を見つける 合図(プリアンブル)を探し、直後の 5 bit を読む 直後の 5 bit を読む プリアンブル ● 送られてくるデータには区切りがない ● 2 サンプルで1bitを表現 ● 決まった形の合図 を先頭に付けて送る ● 前半が高ければ 1、後半が高ければ 0 ● 受信側は 1 サンプルずつずらしながら、こ の形を探し続ける ● 先頭 5 bit が 10001(= 17)なら ADS-B プリアンブル波形同期 (8.0 µs) P1 0.0µs P2 1.0µs P3 3.5µs P4 4.5µs 9
ADS-Bのビットフレーム構造 112 (bit) DF 5 bit CA 3 bit ICAO 24 bit ME (ペイロード ) 56 bit CRC-24 24 bit DF: 0–4 bit (5 bit) ME (ペイロード ): 32–87 bit (56 bit) Downlink Format。ADS-B = 17 本文56ビット。先頭5ビットが Type Code(TC) で中身の種 類(位置、速度、識別情報など)を決定する CA: 5–7 bit (3 bit) 通信能力 / 運用状態 CRC-24: 88–111 bit (24 bit) 24ビットの誤り検出パリティ。受信データの整合性を検証する ICAO: 8–31 bit (24 bit) 24ビットの機体固有アドレス。世界で1機に1つ、国ごとに 割当(例: 71C709 韓国機 / 86xxxx 日本機) 10
ME フィールド (56 bit / 7 byte) Type Code (TC) 5 bit 具体的なフライトデータ 51 bit TC 1 〜 4 | 機体識別 / コールサイン 便名(例: ANA111 , 8文字の英数字コード) TC 5 〜 8 | 地上位置 (Surface Position) 滑走路走行中の緯度・経度、対地移動速度、地上 進行方向 ★ TC 9 〜 18 | 空中位置 気圧高度、CPR 符号化された緯度・経度(偶数 /奇 数フレーム) TC 20 〜 22 | 空中位置( GNSS高度版) GPSの幾何学的高度を用いた位置情報 TC 19 | 空中速度 (Airborne Velocity) 対地速度(ノット)、進行方位( Heading)、上昇 / 降下率( ft/min) TC 28 | 機体ステータス 緊急通報コード(スコーク: 7700など)やTCAS警告 状態 11
TC 0-4 (5b) SS 5-6 (2b) S 7 (1b) 高度 (Altitude) 8-19 (12b) T F 20 21 (1b) (1b) CPR 緯度 (Latitude) 22-38 (17b) CPR 経度 (Longitude) 主要パラメータ定義 Fビット(フレーム識別)と CPR TC (Type Code): 9〜18(空中位置情報) ★ F (Format) ビット : SS (Surveillance Status): 監視ステータス (2 bit) S (Single-Antenna): 送信アンテナフラグ (1 bit) 高度 (Altitude): 12 bit の気圧高度データ T (Time): UTC同期状態 (1 bit) 39-55 (17b) CPRの奇数/偶数フレームを判別するための最重要フラグ 0 = 偶数 (even) フレーム 1 = 奇数 (odd) フレーム CPR 緯度/経度 (各17 bit): コンパクト位置レポート (CPR)形式。偶数と奇数の両フ レームを受信・合成することで、高精度な現在位置を 算出
圧縮/CPRの必要性 17bit送信における限界 5m高分解能化への課題 40,000km / 2^17 ≒ 305m 分解能 緯度データ22 bit 経度データ23 bit 地球1周(約40,000km)を17bitで等分した場 合、1つの単位(分解能)は約 305m ⚠ 航空機の安全な運航監視には粗すぎる精 度 合計要求帯域あわせて 45 bit 必要 💡限られた帯域で送るために圧縮が必要 =CPR(Compact Position Reporting) 13
ゾーン内の位置だけを送信 送信情報のルール データ計算の具体例 🌐 緯度経度をゾーンに等分割 📍 送信したい緯度:33.0° 🎯 ゾーン内の相対位置を高解像度で送信 33.0 ÷ 6 = 5.5 ❌ どのゾーンにいるか(整数部)は送らない 5 (整数部) = ゾーン番号 (送らない ) 0.5 (小数部) = ゾーン内位置 👉 0.5 × 2¹⁷ = 65,536 を 17 bit で送信 0° 6° 12° 18° 24° 30° 36° Zone 0 Zone 1 Zone 2 Zone 3 Zone 4 Zone 5 3.0° 9.0° 15.0° 21.0° 27.0° 33.0° ⚠ どの候補なのかは、 1通のデータ送信だけからは特定できない 14
ノギス 本尺( 1 目盛 = 1.0 mm) 副尺( 1 目盛 = 0.9 mm) 15
ものさしを 2 本用意する 別のものさしで交互に送信 受信側はズレからゾーン番号を特定 偶数フレーム:60分割(1ゾーンあたり6.0000°) 📐 1つ進むごとに境界が 0.1017°ずれる 奇数フレーム:59分割(1ゾーンあたり6.1017°) 💡 このズレの大きさからゾーン番号がわかる 偶数フレーム ゾーンが 1 つ進むごとに、境界が 0.1017° ずつずれていく 奇数フレーム 16
ズレからゾーン番号を出す(受信側) ゾーン番号の復元計算 ゾーン内位置を度に変換 この緯度を知りたい 📍 偶数フレーム: 60分割 偶数:0.5 × 6.0000° = 3.0° 奇数:0.408333 × 6.1017° = 2.49152° 2つの計算値の差を算出 💡 0.51° ずれ = 5 × 0.1017° (5ゾーン分 ) 差 : 0.50848° → 0.50848 ÷ 0.1017 ≒ 5.00 👉 ゾーン 5 奇数フレーム: 59分割 17
ゾーン位置から値の復元 (受信側) 復元計算の要素 値の復元計算 📐 6.0000° 1ゾーンの幅 lat = ゾーン幅 × (ゾーン番号 + 相対位置 ) 🔢5 前ステップで2つのフレームの差から 復元したゾーン番号 = 33.0° lat = 6.0000° × (5 + 0.5) 🎉 送信前の元の緯度が復元! 📍 0.5 ゾーン内の高精度な相対位置 0° 6° Zone 0 偶数フレーム: 60分割 12° Zone 1 18° Zone 2 24° Zone 3 5ゾーン + 0.5 30° Zone 4 36° Zone 5 18
実験してみた 19
羽田空港第 1ターミナル展望台 20
東京タワー展望室(メインデッキ) ADS-Bの信号を受信できず (Low-Eガラスの影響) 21
東京スカイツリータウン屋上 地デジが強すぎて受信機が飽和 2倍すると ADS-Bの帯域に 22
まとめ 信号のキャッチ 空からの電波を受信 飛行機が常にブロードキャ スト(送信)している ADS-B 信号をリアルタイムにキャッ チ 特別な送信要求をすること なく、上空から降り注ぐ信号 を受信可能 緯度経度取得までの流れ 実験結果と考察 1 アンテナ 街中に溢れる電波 2 SDR (ソフトウェアラジオ ) 実際に複数のロケーション で受信実験 3 A/D変換 4 ビットフレーム解析 5 デコード → 緯度経度特定 https://github.com/ayakix/PocketRadar 「街中は電波で溢れている」 目に見えない無数の電波信 号が、私たちの周囲を常に 飛び交っていることをデータ として実感 23
余談 24
太平洋上にある飛行機の位置がなぜわかる? 太平洋上空の飛行機 地上 ADS-B 詳細フライト情報 衛星ベース 25
FMラジオ受信 26
リポジトリ https://github.com/ayakix/PocketRadar 27
受信距離の上限は 400kmほど 28
RTL-SDRの出力 — I/Q サンプル 生の I/Q データストリーム ADS-B での振幅( Magnitude)変換 ・1サンプルの構成 ・振幅の計算式 I と Q の 2 つの数で構成。符号なし 8 bit、無信号時は 127 が 基準 magnitude = |I - 127| + |Q - 127| ・極限までシンプルな並び ※無信号時の基準値 127 からの絶対値誤差を足し合わせることで、高 速に振幅を近似計算します。 データは I, Q, I, Q, ... と順に並ぶのみ 29
PPM (Pulse Position Modulation) パルス位置変調 ADS-B では、1 ビットの時間を厳密に 1マイクロ秒 (1.0µs) と規定 前半と後半を 0.5µsずつ分割し、パルスを配置する位置(タイミング)によってビットを表現 「1」: 前半にパルス(山) 「0」: 後半にパルス(山) 前半 0.5 µs (オン) 前半 0.5 µs (オフ) 後半 0.5 µs (オフ) 合計時間 : 1.0 µs 後半 0.5 µs (オン) 合計時間 : 1.0 µs 30
プリアンブルの必要性 - 10001はノイズの中に 32 回に 1 回は出てくる - 2 サンプルずつの区切りが決定出来る - データには現れない形 31
Mode SとADS-B 項目 Mode S(基本機能) ADS-B(拡張機能) 正式名 称 Mode Select Automatic Dependent Surveillance-Broadcast 主な用 途 二次監視レーダー(管制)と機体の 1対1通信 自機の情報を周囲全体に届ける同報配信(ブロー ドキャスト) 送信の 契機 問い合わせ・応答型( Interrogation & Reply) 地 上レーダーから「誰ですか?高度は?」と聞かれ て答える 自律的・定期的( Squitter: 垂れ流し) 誰からも聞 かれなくても、毎秒数回自分から電波を出す 主な発 信内容 機体の識別(ICAO 24-bit)、高度、気象、管制コ マンド GPS位置(緯度経度)、高度、対地速度、進行方 向、便名 誰が受 信できる か 主に問い合わせたレーダー局(パリティにレー ダーIDが混ざる場合あり) 電波が届く範囲の全員(管制・他機・地上受信機・ 自作SDR) 年代 1970年代に前身となる DABS 2000年代 32
ADS-BとADS-C 項目 ADS-B (Broadcast) ADS-C (Contract) 送り方 誰に向けてでもなく放送(ブロードキャス ト) 管制機関と 1 対 1。事前に「何を・どの頻度で」の契 約を結んで報告 経路 1090 MHz の電波(地上直接波) 衛星通信(インマルサット / イリジウム)やデータリン ク経由 頻度 毎秒 約 2 回(高頻度・リアルタイム) 数分〜十数分に 1 回(低頻度・イベント駆動) 届く範囲 見通し内(地上局から約 400 km) 洋上・極域などレーダー圏外が主戦場(地球規模) 内容 位置・高度・速度・便名 位置・高度・速度に加え、この先の予定経路(飛行意 図) 受信できる 人 電波が届く全員(自作 SDR 等も可) 契約相手の管制機関だけ(暗号化・閉域網) 世代 2000 年代〜(次世代の標準監視) 1990 年代〜(FANS-1/A 構想) 33