一群来自23区和24区的业余卫星爱好者

2行代码,预测卫星轨道

卫星参数 2017-05-02 652 0

* 前言

(最核心的代码确实只有两行)

业余卫星通讯中的一个关键问题,是计算卫星的方位角、仰角和相对于观察者的瞬时速度强两个参数用来确定天线的指向,后一个参数用来确定电台的发射和接收频率。很多软件都可以完成这样的计算,例如windows平台上的orbitron, iOS平台的ProSat, Android平台的HamSatDroid。这些软件使用方便功能强大,但是对于爱折腾,希望能自制软硬件,获得更多乐趣的火腿来说,是远远不够的。本文介绍python语言下的ephem库,使用这个库,可以用寥寥几行代码,方便地计算出需要的参数,并且可以传递给旋转器和电台等等设备。

* Python

Python语言的官方网站在 http://www.python.org 。官网有各种发行版下载,也有详细的文档和教程。

对windows来说,python需要安装,个人推荐Anaconda https://www.continuum.io 这个发行版,因为它已经集成了很多重要的库,例如用于科学计算的nu,py, scipy, 用于制作图形界面的 PyQt,而且也集成了库的安装工具 pip, 甚至图形化的IDE也被集成。 用起来非常方便。

而对于各种Linux来说,python一般都是默认安装的。只需要更新系统即可。在ubuntu下面用
sudo apt-get update
sudo apt-get upgrade来更新系统。
如果没有pip,使用命令
sudo apt-get install python-pip
即可安装。

最简单而实用的入门教程是 Dive into Python, 在 http://www.diveintopython.net 。Python 语言非常容易入门。

* 主角登场

PyEphem 在http://rhodesmill.org/pyephem/quick.html 有比较详细的介绍。这是一个天文计算库,功能强大。计算卫星的位置和相对速度等参数对它来说只是小菜一碟。库的安装相当轻松,运行
pip install pyephem
即可。这个命令在windows下面可以直接使用,linux也可以,如果在linux系统中遇到权限问题,可以用
sudo -i pip install pyephem
来安装, 这个命令不适用于windows。

如果程序需要和外被设备通信,串口是一个不错的选择。推荐使用 PySerial, 安装也只需要一条命令
pip install pyserial

当然如果打算使用树莓派,而可以使用GPIO与外设通信。安装 RPi.GPIO 库即可。

* 干货1:计算某时刻的参数

首先程序需要导入库
import ephem
#当然还需要导入其他必要的库,不一一赘述。
me_city = ephem.Observer()
#产生的对象用来保存观察者,或者天线所在的QTH。
me_city.lon, me_city.lat, me_city.elevation ='118.7917', '31.9375', 50.0
#这一行程序设置地理位置,Python程序可以用一行代码给多个变量赋值,注意经度和纬度都表示为字符串,高度表示为数值。
tle_1='FO-29 '
tle_2='1 24278U 96046B 17088.67318232 -.00000028 00000-0 71175-5 0 9991 '
tle_3='2 24278 098.5754 342.4712 0350331 183.2266 176.6612 13.53074862018129 '
#这三行文本就是卫星的TLE参数,来自星历文件,这是只是示例,实际用的时候,从网上自动更新比较合适,不宜手工制定。
sat = ephem.readtle(tle_1, tle_2, tle_3)
#这一行程序生成为一个卫星对象
me_city.date = ephem.now()
#设置计算的时刻,为了简单,使用现在的时间
sat.compute(me_city)
#无数复杂的运算都在这一行程序,由ephem代劳完成了,下面开始摘桃子
print(sat.az * 180.0 / 3.1416)#这就是卫星的方位角,输出前转化为角度表示,否则为弧度表示
print(sat.alt * 180.0 / 3.1416 )#这是卫星的仰角
print(sat.range_velocity)#这是卫星相对于观察者的运动速率,如果为负,表示卫星越来越近,如果为正,表示卫星正在远离观察者。这个值可以用来计算多普勒效应下的频率修正。

此时sat对象由很多属性中封装了有价值的数据,等待您去发掘。

* 干货2:预测

还有一个问题,就是如何预测卫星何时到来。
rise_time, azr, max_time, altt, set_time, azs = me_city.next_pass(sat)
执行之后, 以上被赋值的变量的含义分别就是:
卫星升起时间,升起的方位角,卫星最高仰角时刻,
卫星最高仰角,卫星最高仰角对应的方位角,
卫星落下地平线的时刻,卫星落下地平线的方位角。

* 下面还可以做什么

可以计算某颗卫星什么时候相对于两个火腿都有不错的角度。
可以控制电台频率,修正多普勒频率偏移,代替手工调整。
可以计算出什么时候,两个卫星同时处于可见范围。等等。

* 补充说明1

示例中的星历文件是过时的。为了避免主题分散,将会另文介绍如何自动更新星历,自动加载。

* 补充说明 2

ephem中使用的时间是UTC,需要本地时间的话请自行转换, 简单的方法是使用datetime类和timedelta类。ephem中使用的时间是浮点数,使用的角度都是弧度表示。ephem中还封装了一些现成的天体。

* 补充说明 3

这和树莓派由什么关系?
树莓派上运行简化过的linux,运行这些代码完全没有任何障碍。对于只能游击战的卫星火腿,树莓派可以用移动电源供电,可以使用web或者威信与手机交互,可以控制步进电机,可以获取传感器数据,是一个不错的选择。

* 补充说明4

手机上面可以这么玩吗?
目前有困难,安卓和苹果的手机上都有python的解释器,但是安装库有困难,有些库需要编译器的配合。但是使用python是可以开发出完整的安卓apk的,有一套使用kivy做图形界面的解决方案,请自行谷歌。

分享到您的社交平台:

发表评论: