我,爆肝17天用600行代码拍到400公里之外的国际空间站

让望远镜自己动起来

博雯 萧箫 发自 凹非寺
量子位 | 公众号 QbitAI

如何在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赤道仪

佳能EOS R5相机

QHY5III462c相机,作为导星相机

图马思特T16000M游戏手柄

其中,望远镜大约4万元,佳能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×300像素的图像(合成GIF图):

我,爆肝17天用600行代码拍到400公里之外的国际空间站

而这,是刘博洋开始做这一项目的第17天

之后还要发射小火箭

在谈到整个项目中最难的一个阶段时,刘博洋印象最深刻的,就是如何让望远镜被Python代码调用:

对于我这样一个编程很差的人,开发最初完全就是一个黑箱。

刘博洋本科、博士分别就读于北京大学、西澳大学,都是天体物理学专业。

我,爆肝17天用600行代码拍到400公里之外的国际空间站

这个专业要求掌握基本的编程技能,但是刘博洋大学时的相关课程,比如计算机概论、数据结构都是低分飘过或者缓考的。

到了博士阶段,多了大量需要用脚本完成的数据处理工作,他才开始深入地学习编程语言。

这次之所以选择自编代码操控望远镜,除了没有找到现成可用的软件之外,也是想要继续锻炼自己的编程能力。

那么这套代码会开源吗?

在我们这样问时,刘博洋表示:

至少要在自己能调试的范围,将代码优化到一个自己满意的程度,才会考虑下一步。

他目前最近期的一个目标,是两周后的中国空间站的再一次过境。

在成功拿国际空间站”练了手“后,刘博洋充满了信心,还在考虑是否要在接下来的捕捉中适当缩小视场,进而提高拍摄的精度。

中国空间站的拍摄如果顺利,将在4月21号之前结束,之后,他就要立刻赶往青海,开展新项目:发射一枚装着自己相机的小火箭

再远一些,刘博洋还提到了今年下半年可能会有的神舟系列的火箭、以及实验舱的发射,他到时候会拿着自己的这套跟踪空间站的程序,再去跟拍大火箭。

如此硬核的“备战”计划,妥妥一位狂热的航天爱好者无疑了。

刘博洋最后这样说:

天文的兴趣从小就有,也因此本硕博都读的天体物理学。

不过随着为国内的航天任务越来越多,我能接触到相关活动的机会也就越来越多,于是航天方面的兴趣也就逐渐发展了起来,到现在已经发展成主要的业余爱好了。

参考链接:
[1]https://weibo.com/1144755982/LmV8Cp72V
[2]https://zhuanlan.zhihu.com/p/493080686
[3]https://www.heavens-above.com/orbit.aspx?satid=25544
[4]https://mp.weixin.qq.com/s/gNueq8lDQz_86Ifuw8n6Pg#rd

版权所有,未经授权不得以任何形式转载及使用,违者必究。