爆肝17天 600行程式碼拍到400公里外的國際空間站

如何在400公里開外,拍攝這樣一張空間站照片?

爆肝17天 600行程式碼拍到400公里外的國際空間站

作為太空中最大人造物體,國際空間站一直是無數天文愛好者心中夢寐以求的拍攝對象。

而大多數人採用的方法,是根據自己所在的經緯度,算好空間站過境的時間(幾秒到幾分鐘不等),然後配合手機或微單進行拍攝,然後啪——得到這樣一張小光點:

爆肝17天 600行程式碼拍到400公里外的國際空間站

稍微進階一點的,則會採用「凌日凌月」拍攝法,即在空間站飛過太陽或者月亮之前,以這兩個天體為背景源,確定一個範圍更小的區域。

然後等在中心線上,把持著幾公斤到幾十公斤重的大口徑、長焦距望遠鏡進行長時間的穩定跟蹤,直到空間站過月或過日的1秒之內,按下快門拍攝。

爆肝17天 600行程式碼拍到400公里外的國際空間站

這種拍攝效果會更加清晰,但致命的問題仍然存在:

空間站平均每90分鐘就能繞地球一圈。用知名的星空觀測模擬工具Stellarium對比一下,相比空間站,金星和火星簡直如同「靜物」(實時模擬,沒有加速):

爆肝17天 600行程式碼拍到400公里外的國際空間站

簡言之,就是空間站跑得太快了。

因此,不僅1秒內拍攝的幀數有限(無法用多幀疊加克服大氣抖動)、只能拍到輪廓剪影,甚至很可能因為計算錯誤而錯過拍攝的機會。

要是還想拍出更高精度的照片,不僅得有非比尋常的耐心,還要有深厚老練的手動操控技術。

爆肝17天 600行程式碼拍到400公里外的國際空間站

例如一旦遇到大風,拍出來的效果就容易「糊成一團」:

爆肝17天 600行程式碼拍到400公里外的國際空間站
△圖源王卓驍,已授權

於是這時,有人就靈光一動:

沒有麒麟臂,用程式碼讓望遠鏡自己動起來不就好了?

說干就干,這位「業餘程式設計師」當即爆肝17天,搞出了一套自動跟蹤系統。

在這套自動跟蹤系統的加持下,望遠鏡不再是只能在特定幾秒鐘拍攝幾張靜態影像,而是持續不斷地跟了空間站2分鐘。

最終,多張影像疊加和後期處理,便合成了一張高精度的立體GIF影像:

(也就是我們開頭的那張圖)

爆肝17天 600行程式碼拍到400公里外的國際空間站

就是這麼一張影像,讓網友發出了「直接開啟人造天體跟蹤攝影的時代」的感嘆。

爆肝17天 600行程式碼拍到400公里外的國際空間站

於是,我們找到這位開發者本人,北大天文校友、天體物理博士劉博洋聊了聊。

拍攝高精度空間站,到底難在哪?

首先,需要簡單了解一下拍攝空間站的「時機」。

雖然空間站移動速度極快,平均每90分鐘就能繞地球一圈,而且高度平均距離地球也就400公里左右,屬於肉眼可見的範圍,但我們並不能隨時觀測到它。

主要有兩個限制條件:視野範圍和觀測時間。

視野範圍指空間站飛到我們視野可見的範圍內,也就是恰好「過境」這段時間;

觀測時間指我們能觀測到空間站的時機。空間站自身不會發光,只有在每天日落後兩小時、或日出前兩小時以內,空間站反射的太陽光最亮,才最適合拍攝。

只有這兩個條件同時滿足,我們才有機會在地面觀測並拍攝到空間站,但效果也還受天氣等因素影響(如圖中就是遇到了多雲天氣):

爆肝17天 600行程式碼拍到400公里外的國際空間站
△圖源朱一靜&徐成城,已授權

然而,目前已有的幾種常見天體拍攝方法,對於拍攝更高精度的空間站照片,其實都不適合。

第一種方法,是直接通過「手搖」望遠鏡拍攝,也就是推著望遠鏡跟蹤天體。

這種方法有一個缺陷,沒辦法拍攝非常高清的空間站。由於拍攝時必須靠人工跟蹤,因此不能用長焦鏡頭直接找,否則就像是用顯微鏡去捕捉一隻高速移動的螞蟻,空間站一不留神就消失在鏡頭外了。

爆肝17天 600行程式碼拍到400公里外的國際空間站

第二種方法,是像「守株待兔」一樣,架好各種高清晰度的鏡頭和設備,在原地等待空間站「路過」。

這種方法不需要移動鏡頭,而是反過來等空間站自己「經過」。但它又面臨一些新的問題,例如空間站「路過」的時間很短,有時候往往只有幾秒鐘的時間,很可能抓拍不到;即使抓拍到的鏡頭,由於無法調整角度等原因,效果也無法保證。

所以,為什麼不用望遠鏡自帶的追蹤功能拍攝?

這個功能通常只適用於用於追蹤日月、行星、恆星等天體由於地球自轉而產生的東升西落,畢竟它們移動的速度不快,基本與地球自轉同步。但對於像空間站這種高速移動的天體,望遠鏡自己就追不上了。

因此,最終還是得靠程式輔助,來實現高精度空間站的跟蹤拍攝。

第三種方法,是利用軌道根數(即軌道參數)跟蹤,也就是利用在各種天文網站上(如Heavens-Above等)找到的天體資訊,來調整望遠鏡的跟蹤路徑,並進行手動修正:

爆肝17天 600行程式碼拍到400公里外的國際空間站

目前,大部分天文愛好者都是通過這種方法實現跟蹤+微調,網上也已經有一些相對成熟的程式,例如這是用電動經緯儀根據軌道參數跟蹤空間站的效果:

爆肝17天 600行程式碼拍到400公里外的國際空間站
△圖源王卓驍,已授權

BUT,你永遠不知道這些天文網站更新到底及不及時。有時候空間站臨時調整了軌道、但網站沒有更新的話,你的程式也就失效了。

利用光學識別,誤差控制在4像素以內

上述的所有問題,作為老天文迷的劉博洋不可能不懂。

他一開始的想法,是通過現有的一些軟體尋找鏡頭中的「光點」,基於光學識別方法對目標實施識別和跟蹤。

然而他在查找合適的程式時卻發現,這些程式不是沒維護(連Windows版都太古早沒法用)、就是更新不及時且系統複雜,或者乾脆就是閉源收費。

所以,劉博洋最終決定自己上手,寫一個光學識別的自動跟蹤腳本,手動找到空間站後基於PID控制跟蹤。

他的計劃一共分為兩步:

第一步,編寫程式實現望遠鏡自動識別並跟蹤空間站,耗時5天完成。

值得一提的是,光學識別並不是劉博洋的「第一手選擇」。

他確實想過用參數+手動微調的方式進行跟蹤,包括用搖桿無級控制赤道儀轉速,以及用軌道根數進行粗跟、結合遊戲手把無級微調等,但試拍效果並不理想(微調時手不夠穩)。

於是,他基於PID控制原理,編寫了一種光學跟蹤的方法。這是一種非常經典的控制演算法,PID分別指比例、積分和微分單元,像讓2輪機器小車保持平衡,用的就是這種演算法。

劉博洋之前並沒有學過這一知識,但是為了建立一個穩定的自動控制系統,他自然地引入了比例單元(P)和積分單元(I),以使系統的誤差減少。

爆肝17天 600行程式碼拍到400公里外的國際空間站

劉博洋的望遠鏡分為視野較大的尋星鏡和視野較小的主鏡兩部分。這套演算法的基本目標,就是根據當前空間站在尋星鏡中的位置,計算出它偏離主鏡視場的幅度,從而調整望遠鏡跟蹤速度,以改正存在的偏離,使空間站落到主鏡視場中。

利用這個程式,就能讓尋星鏡快速跟隨移動的空間站「光源」,使得空間站總是保持在視野中央。劉博洋試著用雷射筆在自己家牆上造了一個勻速移動的亮點,模擬空間站的運動,效果還不錯:

爆肝17天 600行程式碼拍到400公里外的國際空間站

程式本身,基於一個叫做ASCOM的平台開發。

它能將天文設備的所有配置,比如控制望遠鏡的對焦器、濾光片的轉動、相機的開合都集成在一個單獨的軟體上,是在天文領域運用非常廣泛的軟體介面標準:

爆肝17天 600行程式碼拍到400公里外的國際空間站

硬體準備上,除了筆記型電腦電腦之外,還包括:

11英寸口徑,焦比f/10,折反射式的星特朗EdgeHD望遠鏡,配套有CGEM赤道儀

Canon EOS R5相機

QHY5III462c相機,作為導星相機

圖馬思特T16000M遊戲手把

其中,望遠鏡大約4萬元,Canon EOS R5相機租借了兩周花費2200元(市價2.5萬元),462c相機不到1000元,手把則是和朋友以物換物拿到的(市價500多元)。

整個成本算下來不到4.5萬元,據劉博洋表示,對精度要求沒那麼高的話,整套不到1萬元就能搞定。

接下來進入第二步,現場實拍並成功用設備拍攝到高精度的空間站照片。

但沒想到的是,實際拍攝反而要比想像中更難,期間劉博洋「一直在反覆試錯修bug」。

他一開始的目標,是捕捉中國空間站,然而接連兩次出bug,導致錯過了兩次觀測的最佳時機。

3月23日,由於未能及時對焦,自動光學跟蹤沒能起到作用;3月27日,由於尋星鏡視場只有3°左右,過小的視野導致初步捕獲失敗,再次沒能進入自動跟蹤流程。

爆肝17天 600行程式碼拍到400公里外的國際空間站

此時距離中國空間站下次可見過境還有很久。因此,在修復操作問題後(將尋星鏡視場增大到15°),劉博洋決定,先用即將迎來幾次絕佳過境的國際空間站「練練手」。

於是,在將自動跟蹤程式中的「抓捕」改為手動觸發後,劉博洋成功在4月2日驗證了程式功能。

雖然還是有不完美的地方,例如軟體崩潰導致尋星鏡和主鏡的位置校準數據丟失,針對這個問題劉博洋又增加了校準數據記錄功能。

這個時候,程式碼已經從最初的400多行變成了600行。

終於,4月3日晚上,在緊急修復bug後,劉博洋成功抓拍到了國際空間站。

具體來說,望遠鏡對空間站的抓捕分為x和y兩個軸,在按下catch後,y軸很快就穩穩跟上了目標,x軸則略慢了10秒。

在30秒左右時,兩個軸都保持在了一個穩定的誤差範圍內(四個像素左右),這種高精度跟蹤持續了一共120秒,完整記錄了國際空間站從接近到遠離的全流程:

爆肝17天 600行程式碼拍到400公里外的國際空間站

最初得到的原始畫面大約是100多像素,最終,在經過多幀疊加的超取樣處理後,圖片的像素提高到了200多像素。

最後經過處理,成功輸出了一系列300 x 300像素的影像(合成GIF圖):

爆肝17天 600行程式碼拍到400公里外的國際空間站

而這,是劉博洋開始做這一項目的第17天。

之後還要發射小火箭

在談到整個項目中最難的一個階段時,劉博洋印象最深刻的,就是如何讓望遠鏡被Python程式碼調用:

對於我這樣一個編程很差的人,開發最初完全就是一個黑箱。

劉博洋本科、博士分別就讀於北京大學、西澳大學,都是天體物理學專業。

爆肝17天 600行程式碼拍到400公里外的國際空間站

這個專業要求掌握基本的編程技能,但是劉博洋大學時的相關課程,比如電腦概論、數據結構都是低分飄過或者緩考的。

到了博士階段,多了大量需要用腳本完成的數據處理工作,他才開始深入地學習程式語言。

這次之所以選擇自編程式碼操控望遠鏡,除了沒有找到現成可用的軟體之外,也是想要繼續鍛煉自己的編程能力。

那麼這套程式碼會開源嗎?

在我們這樣問時,劉博洋表示:

至少要在自己能調試的範圍,將程式碼優化到一個自己滿意的程度,才會考慮下一步。

他目前最近期的一個目標,是兩周後的中國空間站的再一次過境。

在成功拿國際空間站」練了手「後,劉博洋充滿了信心,還在考慮是否要在接下來的捕捉中適當縮小視場,進而提高拍攝的精度。

中國空間站的拍攝如果順利,將在4月21號之前結束,之後,他就要立刻趕往青海,開展新項目:發射一枚裝著自己相機的小火箭。

再遠一些,劉博洋還提到了今年下半年可能會有的神舟系列的火箭、以及實驗艙的發射,他到時候會拿著自己的這套跟蹤空間站的程式,再去跟拍大火箭。

如此硬核的「備戰」計劃,妥妥一位狂熱的航天愛好者無疑了。

劉博洋最後這樣說:

天文的興趣從小就有,也因此本碩博都讀的天體物理學。

不過隨著為中國的航天任務越來越多,我能接觸到相關活動的機會也就越來越多,於是航天方面的興趣也就逐漸發展了起來,到現在已經發展成主要的業餘愛好了。

參考鏈接:

[1]//weibo.com/1144755982/LmV8Cp72V

[2]//zhuanlan.zhihu.com/p/493080686

[3]//www.heavens-above.com/orbit.aspx?satid=25544

[4]//mp.weixin.qq.com/s/gNueq8lDQz_86Ifuw8n6Pg#rd