2026年3月17日

ADS-B 數位觀察:分析桃園空域航線、高度與信號傳播特性

 時隔兩週,其實我的這項用RTL-SDR V4收飛機訊號的計畫還在持續進行,甚至我還把收到的訊號轉送去Flightradar24flightaware,當然也獲得了一些很棒的會員權益,基本上就是可以取用資料庫。對這有興趣的話,兩者的官網都有資訊,但前提是你用的是linux的機器才好操作。(像我就是在樹莓派上運行)

從飛機收來的訊號不單是只有位置訊號,而是有這麼多不同的資料,但並不是每一台飛機都的資料內容都有這些,總之我是都即時用我房間的小天線,能抓都抓了。

參數 (Parameter)英文全稱 (English Full Name)中文說明 (Chinese Description)
$tTimestamp時間戳記 (接收訊號的時間)
.hexICAO Hex IDICAO 24位元位址碼 (飛機唯一識別碼)
.flightFlight Number / Callsign航班編號 / 呼號
.latLatitude緯度
.lonLongitude經度
.alt_baroBarometric Altitude氣壓高度
.alt_geomGeometric Altitude幾何高度 (GPS 高度)
.gsGround Speed地速
.iasIndicated Airspeed指示空速
.tasTrue Airspeed真空速
.machMach Number馬赫數
.trackTrack Angle航跡角
.track_rateTrack Rate航跡變化率 (轉彎率)
.rollRoll Angle滾轉角 (飛機坡度)
.mag_headingMagnetic Heading磁航向
.true_headingTrue Heading真航向
.baro_rateBarometric Vertical Rate氣壓爬升/下降率
.geom_rateGeometric Vertical Rate幾何爬升/下降率
.tempStatic Air Temperature靜溫 (外界環境溫度)
.wdWind Direction風向
.wsWind Speed風速
.nav_qnhQNH Setting氣壓高度表修正值 (海平面氣壓)
.nav_altitude_mcpMCP Selected Altitude自動駕駛設定高度 (MCP/FCU)
.selected_headingSelected Heading設定航向
.squawkSquawk Code應答機代碼 (四位數識別碼)
.rssiReceived Signal Strength Indication接收訊號強度指標
.messagesMessage Count訊息總數
.rcRadius of Containment容納半徑 (位置完整性)
.nic_baroNavigation Integrity Category (Baro)氣壓高度完整性類別
.nac_pNavigation Accuracy Category (Position)位置精確度類別
.nac_vNavigation Accuracy Category (Velocity)速度精確度類別
.silSource Integrity Level源完整性等級
.gvaGeometric Vertical Accuracy幾何垂直精確度
.sdaSystem Design Assurance系統設計保證
.categoryAircraft Category飛機類別 (重量或類型)
.nav_modesNavigation Modes導航模式狀態
.versionADS-B VersionADS-B 版本

我用one-liner列出目前收到的每日航班量,命令是

 printf "%-15s | %-10s\n" "Date (File)" "Flight Count" && \
printf "%-15s-|-%-10s\n" "---------------" "----------" && \
for f in adsb_*.csv; do 
    count=$(cut -d',' -f3 "$f" | grep -v "N/A" | sort -u | wc -l);
    printf "%-15s | %-10s\n" "$f" "$count"; 
done

Date (File)     | Flight Count
----------------|-----------
adsb_2026-02-17.csv | 693       
adsb_2026-02-18.csv | 1140      
adsb_2026-02-19.csv | 1114      
adsb_2026-02-20.csv | 1019      
adsb_2026-02-21.csv | 992       
adsb_2026-02-22.csv | 1030      
adsb_2026-02-23.csv | 963       
adsb_2026-02-24.csv | 971       
adsb_2026-02-25.csv | 921       
adsb_2026-02-26.csv | 892       
adsb_2026-02-27.csv | 1016      
adsb_2026-02-28.csv | 937       
adsb_2026-03-01.csv | 531       
adsb_2026-03-15.csv | 29      

中間有幾天電腦重啟,忘記繼續開紀錄的sh,就沒紀錄了,但是可以看到每天都能收到數百筆航班資料。

既然有大量資料,當然就是做我最愛的資訊視覺化,以下都用R來畫某一天的圖。
這用的是飛機的類型來繪圖,有小飛機、大飛機...。



每日收到的訊號點的圖



依照航向和高度來區分,黃線就是小於2000ft的,大部分都是起飛和降落的,可以觀察桃園機場一帶在這段時間是如何進場的。因為看到這張圖,我還因此跑去永安北岸觀海亭,想要實際看從北方來的飛機轉進桃園機場的即時現況。藍綠色線的是往北的高空飛機,紫色則是往南的。


看到這些線,就一定要去看看「交通部民用航空局電子式飛航指南」去找TAIPEI FIR EN ROUTE CHART來對照,才會更好玩。下圖的進入路徑是這樣

  1. 你要先到飛航指南 https://ais.caa.gov.tw/aimportalapp/ 去底下按eAIP 看最新的資料
  2. 到- Part 2 - 航路 (ENR) 找   ENR 6 航路圖,裡面有很多圖,看到TAIPEI FIR EN ROUTE CHART 點下去就是了

左右對照看到什麼,是不是就看最明顯三條是A1/W4、B1、M750,另外還有淺淺的B591、W8。看著看著想起以前我拍攝天空的縮時攝影時,就透過飛機雲的樣子推測過我家附近至少會看到三條航線,現在透過ADS-B的資料來對照,果然沒錯。




如果根據每分鐘改變的高度,來分類是爬升還是下降,紅色是下降,綠色是上升,當然在國際航線上,就是一直維持高度不變的灰色,而綠色的就對應了桃園機場和松山機場起飛的飛機囉。




再來我們看看信號的強弱和空間的關係。某些地區幾乎沒有訊號,大多是因為飛機本來就不會飛到那。



如果再把訊號與接收端的距離和高度做強度的比較,這樣就能看到經典的自由空間路徑損耗(Free Space Path Loss, FSPL)特性。近距離 (0-25km): 訊號強度(RSSI)從 -20 dBFS 快速掉落到 -30 dBFS。這是因為在距離很近時,距離增加一倍對訊號的百分比影響很大。遠距離 (50km 以上): 曲線開始趨於平緩,衰減的速度隨著距離增加而放慢。

高度 (Altitude) 的分層效應,觀察顏色的分佈:紫色點(低高度): 集中在左側(近距離)。因為飛機在低高度時,受限於地球曲率和地形遮蔽(障礙物),只能收得到近處的訊號。黃綠色點(高度 30000+ ft): 這些點可以延伸到 100km 甚至更遠。這是因為高空飛機與接收器之間通常沒有建築物或山脈阻擋,訊號路徑更接近純粹的物理模型。


除了這些raw data畫出的數據,其實透過這些數據的組合還有更多有趣的事,等下篇再來分享。

2026年2月17日

使用RTL-SDR V4收飛機的 ADS-B畫出畫出航跡地圖

10年前寫過一篇文章《從飛機雲估測我和誰看同一片天空》,那段時間,我的興趣全在天邊那些稍縱即逝的飛機雲。那時候用望遠鏡和 FlightRadar24 的 App,看著高空的飛機雲,手動對照飛航紀錄,確認自己在新竹的窗前,視覺極限大約能觸及 80 公里外的北海岸上空。

十年過去了,現在可以直接在電腦前,直接收集那些從萬米高空來的無線電訊號。這一次用的工具是 RTL-SDR v4-一根像USB隨身碟的小東西,是一個廣域的無線電接收器。

它內部是 RTL2832U 這顆由台灣瑞昱(Realtek)設計的晶片。最初它是為了讓電腦看 DVB-T 數位電視而生,但因為它能將類比訊號直接轉為數位數據(SDR,軟體定義無線電),且價格極其低廉,意外被開發者開啟了「上帝視角」。

我購買的這款 RTL-SDR Blog V4,比起一般的電視棒做了更多專業改進。它內建了 R828D 調諧器,並加上了三路濾波器,可以應對常見的 FM 電台、手機基地台或 Wi-Fi 干擾。價格也不貴,我在前幾周從官網以 $49.95 USD 的價格入手。

最近用它玩了好幾個專案,先來介紹這個收飛機訊號的專案吧。

飛機在飛行時,會透過 ADS-B (Automatic Dependent Surveillance-Broadcast) 系統,不斷地向四周廣播自己的經緯度、高度、速度與編號。要收這個訊號,只要把偶極天線架起來,再安裝 readsb 和 tar1090 這些開源軟體( windows上也有軟體),就可以直接接收。

飛機廣播 ADS-B 訊號的頻率固定在 1090 MHz。在這個頻率下,訊號像光線一樣是「直視傳輸,只要中間有山頭或建築物擋住,你就收不到它。剛好我的窗戶面東北有廣闊的天空,所以當然可以收到不少訊號。

再來是天線,RTL-SDR Blog V4的套件有兩組偶極天線,有一組長一組短。要收1090MHz就用兩組短的,單根長度6.5cm左右,兩根擺成垂直地面,貼在窗戶上就可以了。

天線長度需從無線電波的波長來計算。偶極天線設計為「半波偶極天線」(Half-wave Dipole),也就是天線的總長度約為半個波長。
  1. 光速約 300,000,000 m/s,1090MHz的無線電波在空氣中的全波長是300 / 1090  = 0.275  m
  2. 半波長就是27.5 / 2 =  13.75 cm
  3. 考量無線電波在金屬導體中傳輸的速度比在真空慢,實際天線長度需要乘以一個修正係數(通常取 0.95):理論總長度:13.75 cm x  0.95 = 13.1 cm
  4. 偶極天線的兩臂長度偶極天線由兩根對稱的金屬棒組成,中央連接同軸電纜,因此單臂長度 13.1 cm/ 2 = 6.55 cm

我使用的軟體 readsb 負責在底層解碼這些 1090 MHz 的原始脈衝,而 tar1090 則提供了類似 FlightRadar24 的視覺介面,讓我能即時在地圖上看到飛機的動向。(其實就和flightradar24界面相似,但看到的就是自己收的飛機訊號)


為了讓數據更有趣,我寫了一段 Python 腳本,將接收到的 Hex 碼轉換為視覺化的地圖,就可以看看自己的「新竹收訊圖」。

透過熱點圖和航線圖就能看到一些有趣現象:

這張圖定義了我的「數位視野」。因為我的窗戶面東北,加上東南方有山脈屏障,熱點圖展示的是地形對無線電的物理限制。紅色點代表是三萬英呎的飛機,過台灣不停的那種,而藍色點就是要進出桃園機場的飛機。

與 10 年前手動比對不同,現在我可以自動抓取訊號在地圖上標示出來那些飛機的航路,整體範圍大約是我觀測地的北方到東北方半徑80公里的範圍,這和十年前我用望遠鏡看到的範圍一致。

這次的觀察最令我著迷的不再只是看飛機在哪裡,因為我看到透過 SDR 接收到的進階數據(EHS),還有更多有趣的資料可以應用來分析,這就等下篇再來說。

2025年12月26日

內灣線一線九驛路線求解程式

新竹縣政府幾年前打造了一個「一線九驛」的活動,將台鐵內灣線沿線的九個車站用許多文創的元素串在一起。這些車站包括竹中、上員、榮華、竹東、橫山、九讚頭、合興、富貴、內灣等。

在搭乘這條路線時,我想到怎樣的規劃路線才可以每站都去走走呢?於是我就下載了時刻表,寫了一個程式來規劃行程。

你可以輸入起站和終站(例如設定成同一站,就是回到原來的地方),再設定幾點開始幾點結束,以及每站至少停留多少分鐘,程式的目的是在此要求下搜尋能到達最多站點的路線規劃。

還可以設定一定要去哪些站,或是不需要去哪些站。在使用上時要注意,有些班次週末和週間會有差異,停開或增開,但我程式並未處理這部分。

有興趣可以點選 一線九驛求解器




以程式的預設值來規劃,至少可以到達六站


如果想要達到一線九驛都下車的話,結束時間就要稍微晚一點,例如像這樣






2025年12月23日

神經系統單元的互動程式2025

 現在用AI寫程式或是做輔助教學實在太容易了,幾乎是想到什麼就可以做出來。所以好一陣子都在用AI做東西,倒是比較少在blogger紀錄了。

目前來整理一些今年在神經系統做的一些教學輔助程式,有些是用來上課,有些則是用來遊戲的。其他在神經單元但沒有介紹到的,都是以前做出來的。

所有的程式都可以在這裡連到,但我還是個別介紹一下。

音調產生器

可以用在說明聽覺的時候,不同頻率產感覺的音量不同,也可以發現每一個人所能聽到的頻率不相同。

https://chihhsiangchien.github.io/tone-generator/index.html



絕對音感

https://chihhsiangchien.github.io/absolute-pitch-game/index.html

顧名思義就是聽聲音,然後指出是哪個琴鍵產生的聲音


瞬間記憶數字

https://chihhsiangchien.github.io/instant-memory-game/index.html

幾年前做過scratch版本的,現在直接用js來實作


記憶數字長度的遊戲

https://chihhsiangchien.github.io/magic-number-game/index.html

畫面左邊會出現一串數字,等到消失之後,在右邊鍵盤重新打一次數字


色彩排序遊戲

https://chihhsiangchien.github.io/color-sorting-game/index.html

顏色會改變色相或彩度,玩家要排成正確的順序

https://chihhsiangchien.github.io/color-sorting-game/index.html


專注力遊戲

https://chihhsiangchien.github.io/concentration-grid/index.html

按照順序點選數字


史托普效應遊戲

先看出題目是用什麼顏色的字(不要被字義干擾),然後在底下選項選出正確的字義(不要被選項的顏色干擾)

數感挑戰

搭配斑龜的數感研究影片來使用。在方塊消失後,選擇數字較大的那部分。在數字小的情況(如4個和5個比),甚至只要0.01秒就能辨識出來,根本來不及數,但你就是能看出,那就是數感。

神經傳導路徑排序

就是點選動作後,把正確的路徑排出來



2025年11月11日

養分、酵素、光合作用、小魚等實驗的小技巧

 紀錄一下今年進行養分與酵素的實驗的一些技巧

測定食物養分的實驗

因為實驗室剛好衝堂,所以我就安排在教室進行。準備一個塑膠盆,再切一片珍珠板。盆子裝熱水用來提供本氏液的反應,帶洞的珍珠板設計的尺寸比盆底大一點,讓板子可以卡在盆子裡,然後固定一段距離用原子筆戳洞。

實驗的容器就用微量離心管,測試的食物、本氏液都只裝一兩滴,裝好就塞進珍珠板的洞裡,因為微量,所以反應很快,一到兩分鐘就會有反應了。但要注意離心管不需要蓋蓋子,不然可能會泡著泡著就爆開,如果會常常需要這樣使用,也可以乾脆把蓋子剪斷。



酵素實驗

上述的離心管,可以繼續用在額外的酵素實驗,例如雙氧水加上一些金針菇,然後就可以做成不定時炸彈,但是會噴出雙氧水,要小心就是。

課內實驗的部分,今年收集唾液的方式改成使用紗布,因為剛好有一批。本來都是叫學生把整片紗布放嘴裡咬,不過好幾個學生咬得嘔聲連連,後來就改成「手拿著一端,另外一端放入嘴裡咬20-30下」,然後大家把自己咬過的紗布放入小紙杯中,再加一點水進去杯子裡讓紗布浸潤,最後把水倒出到試管就可以用了。

光合作用

要做這個實驗的時候,北部連日陰雨,根本沒辦法使用室外植物,還好幾年前實驗室有買生長箱,反正加水就放進去養就對了。如果沒有生長箱的,其實準備多個檯燈加上定時器,效果也是一樣。

芹菜實驗

每年都會泡到有些芹菜爛爛的,其實泡爛的芹菜很棒,可以從裏頭撈出一堆絲狀物,裏頭也有一些漂浮物。

絲狀物就是芹菜的維管束,就是一些分離的導管,細節可以看這篇多年前的文章,至於一些霧霧的漂浮物多是薄壁細胞。

小魚尾鰭觀察

多年前改成把小魚放進封口袋來觀察了,效果原比幫小魚蓋棉花被子好很多,我以為大家都已經這樣做了,結果最近才知道朋友還是用棉花蓋住來觀察。只用棉花蓋住的最大缺點是魚在活動時,會把水噴到物鏡上,然後物鏡就會發霉損壞。

問了他為什麼還是用棉花,他說他覺得把魚放進封口袋還要手拿魚做這件事,有點阿雜。ㄟ,其實完全不需要沾手啊,就是準備一個L夾,底下剪開一個口,差不多魚大小,這個就是漏斗,底下請一個學生協助套上小封口袋,你把魚撈起後放進這個塑膠漏斗就好囉。


2025年10月14日

人體血液循環的視覺化互動程式

講全身血液循環時,我需要一個互動的介面可以讓我用來解說,要能呈現全身血液流動的過程。先講結論,我做出來了。底下是截圖


這是操作過程的影片,預設有幾百個血球在血管內流動,擺著不動一陣子會看到經過組織微血管(上下三區)的血球會變成暗紅色,並且釋放出代表氧氣的藍色圓形。而這些暗紅色的血球經過左右兩邊的肺部微血管時,會從外而內進入獲得氧氣,使暗紅色的血球變成鮮紅色。

你可以按下[血球淡化]的開關,使所有血球都變淡,然後點畫面很多血球的位置,例如心房心室,每次點擊都會在點擊處附近隨機標註一顆血球,你就可以追蹤它的流動。

此外,也可以將心房心室的動畫關閉或打開。
目前實作是做了全身血液循環,未來有時間會完成肺部和組織細胞之間的交換


接下來要說的是如何完成這樣的程式,血球需要循著特定的路徑往前移動,不能逆向,在交叉口又必須隨機。`所以我需要一個有很多節點的「有向圖」,節點之間有方向性的「邊」相連,每一個節點有id,有xyt座標,而每一個邊的資料包括起點和終點的節點。因此對有些節點來說,可能是多個邊的起點,也可能是多個邊的終點。

我先在draw.io上放一張底圖,然後用circle當節點,Directional Connector當作邊,把完整的循環路徑畫出來。最後的結果export 出xml。檔案連結



有了xml之後,再用js parse這些資料,就可以做出一個有向圖。建立資料時,可以指定某些connector的寬度,這可以用來畫出血管的寬度,而circle內的文字可以標註目前所在的位置,例如肺靜脈、肺動脈等。

對於血球的行為,其實就是不斷地從一個節點移動到另一個節點,而下一個節點的決定就看這個節點有幾個出口,隨機選一個就是了。經過特殊節點如肺動脈時,就讓血球進入一個可接受氧氣的狀態,有一定的機率可以得到氧氣。而到了肺靜脈時,可接受氧氣的狀態就被關閉了。而進入組織微血管或離開,也是一樣的方法,所以這就是一個狀態機的變化。

此外,動靜脈的流速不同,是利用節點的數量來控制,在一個動畫週期中的固定長度內,如果有越多節點,那麼血球就會越慢,如微血管內的行為,而如果節點越少,就會產生移動速度很快的視覺效果。

雖然節點和節點之間是直線相連,但血球在血管內的移動則是會以邊寬度為基礎,做左右偏移累積的移動,所以就可以產生彷彿在血管內移動的視覺效果。

2025年9月25日

酵素作用的互動教學工具

最近做了「酵素模擬器」的網頁工具,可以互動操,產生即時圖表與自動化實驗。

https://chihhsiangchien.github.io/enzyme-tutorial/



主要功能

1. 拖曳與新增分子、酵素

使用者可以用拖曳或點擊的方式,將不同種類的酵素與分子加入主畫面。每種分子和酵素都以圖示呈現,並可一次新增多個或快速移除。

2. 模擬布朗運動

所有分子在畫面上會隨機移動,模擬布朗運動,進而觸發酵素反應。

3. 酵素-受質結合與產物生成

當受質分子靠近酵素的活化位時,若符合反應規則,會自動吸附並進行反應,產生對應的產物。反應過程中,分子會有動畫效果。

4. 溫度調整與酵素變性

可透過滑桿調整環境溫度。溫度會影響分子的運動速度與酵素的活性,並可模擬高溫導致酵素變性的情境,每種酵素有不同的變性溫度。

5. 即時濃度變化圖表

畫面右側提供即時的分子與酵素數量變化圖表。每秒自動更新,方便觀察反應進行過程中各物種的濃度變化。

6. 實驗模式與自動化實驗

除了自由操作外還有「實驗模式」可進行實驗。可選擇酵素種類、設定溫度與觀察時間,並自動重複多組實驗,繪製「溫度-反應速率」關係圖,協助分析酵素活性與環境的關聯。