欢迎使用OpenATS自动追踪系统(Open Auto Tracking System)
07/21/2019
先介绍下OpenATS整个系统的架构,简单的组成图可以让使用者更好的理解整个系统。
新的OpenATS整个系统中涉及单片机端、客户端、服务器端、web端几个组成部分。其中除WEB端外全部采用C语言编写,为了有更好的兼容性和计算效率。整个系统全部搭建在Linux环境中,使用者可以把客户端运行在树莓派上等小型Linux计算机,跟单片机组合形成天线控制器。
单片机端的主要任务为接收来自客户端发送的方位角、仰角数据,然后计算转换成相应的脉冲发送给电机驱动器,电机可以使用步进电机或者伺服电机。单片机这部分由原来的OpenATS改造升级而来,更高的处理速度和兼容性。由原来的Arduino换成了STM32 F407,当然这仅仅是我测试的方案,你也可以移植到更快的单片机上,代码开源简单,移植非常容易。
客户端是作为一个非常重要的控制部分,主要任务为接收天线GPS的经纬度、高度、时间等数据,读取最新的TLE卫星星历数据,使用SGP4、SGP4算法计算出卫星当前的位置(笛卡尔坐标系),再计算卫星相较于天线的方位角和仰角,传送给单片机。客户端还具有websocket接口以及socket接口,将计算出来的数据发送给web前端显示和汇报给网络上的服务器端做远程监测(图片中经纬度是360总部大楼)。
服务端拥有客户端的所有包括卫星追踪、目标追踪等、手动控制等功能外,另一个主要功能就是接收来的所有天线客户端数据,并发送给web控制中心,客户端的通信数据格式
数据格式分别为:天线ID,天线纬度,天线经度,天线高度,天线方位角,天线仰角,天线状态。其中天线状态如果为0,则为目标追踪模式,如果为数字,则为追踪卫星状态,数字为NORAD卫星编号。
服务端并可以给每个地面站下达追踪某颗卫星指令。服务器端有数据库接口,可以将客户端的数据做记录,方便调取天线历史状态。有感兴趣的组织或者公司也可以在web界面中添加网络摄像头的API,实时监控天线的状态。服务端同时预留了json函数,如果需要修改web传送数据的可以直接调用json函数接口即可。
Web端接收来自服务端软件的websocket打包的JSON数据,数据示例:{ "antennaid": "BEIJING","lat":39.98138427734375,"lng":116.48518371582031,"alt":149.36970520019531,"az":261.34140014648438,"el":-44.218364715576172,"status":28654,"ip": "127.0.0.1" }分别对应为:天线编号,天线纬度,天线经度,天线高度,天线的方位角,天线的仰角,天线状态,客户端ip地址。经过解析、处理,分别展示在web界面中,让用户可以实时观看所有测控站的情况。服务端预留了接口也可以给每个测控站下达追踪指令进行远程控制,需要的组织或者个人可以自己在Web界面做个接口就OK。Web端暂时的样子如下,随便堆了一个界面,我知道很丑,没把精力放在这上面,别嫌弃后期会改进哈哈。
OpenATS的安装、使用方法
1、单片机端安装
单片机端是基于原来旧版本的OpenATS升级改造而来,使用者可以直接将源码按照之前文章步骤上传到Arduino中或者STM32中,只需要把相应的步进电机库拷贝到库目录即可。可以根据自己的硬件条件修改代码中脉冲的接口针脚编号、脉冲比例系数等参数。
2、客户端安装
安装客户端首先安装依赖环境,本系统依赖GPSD、libgps-dev(3.20)、nscurses、libwebsockets-dev、gcc、make、wget,需要安装这些依赖环境后直接make就好。建议安装NTPD,将NTPD的授时源设置为本地GPS源,可以校准本地系统的时间还可以做时间服务器对外提供服务。具体设置方法请自行谷歌参考关键词GPS搭建本地NTP服务器,由于我们常用的系统为非实时操作系统,精度可能不会太高,但对于我们来讲足够,至少比NTP网络授时精准几个数量级。
3、服务端安装
服务端安装跟客户端类似,需要以上的依赖环境之外,需要安装mysql数据库或者mariadb数据库,还需要libsqlclient-dev客户端库,当然如果你不需要数据库的支持可以不安装数据库,but 客户端库还是要安装的,要不然编译不过去。
4、web端部署
Web部署相对简单,安装相应的web环境,Apache即可,将web端文件夹下的文件直接拷贝到web目录中即可,修改html主页的服务器地址,这样可以通过websocket获取服务端的信息。
5、配置文件
客户端和服务端都有软件的配置文件,文件名为options.ini,为了方便不太熟悉英文的朋友,含有中文注释,配置文件可以修改接收站默认的经纬度高度等信息,在没有GPS模块的情况下采用配置文件中的经纬度信息。以及默认目标位置信息,天线最大仰角限制参数、是否使用GPSD服务、是否使用GPS时间、GPS以及天线的串口配置信息、目标追踪接收数据接口、网络接口、前端接口、GPS读取/追踪/天线控制速度(单位ms)、TLE卫星星历数据更新地址以及备份地址等等。使用者根据自己需求和系统设计适当修改。
6,OpenATS的命令参数如下:
-s 追踪卫星命令,后面跟卫星名字,例如:openats -s NOAA 18
-n 追踪卫星命令,后面跟卫星的NORAD编号,例如:openats -n 28654
-t 追踪目标命令,后面无需跟参数。
-u 更新、下载TLE数据,无需参数,直接下载SpaceTrack的全部星历数据
-i 显示卫星轨道信息功能,后面跟卫星NORAD编号。
-g 为GPS调试功能,无需参数,将会显示GPS信息用来调试。
-r 为远程控制模式,之后的OpenATS客户端将有服务端下达指令用来统一管理。
注意:即便是普通追踪模式下,OpenATS客户端也会将天线的经纬度以及角度数据发送给服务器端。如果不需要的可以在代码中注释掉相应的线程即可。
OpenATS的一些常见问题和注意点
默认编译时带有-g参数,如果出现错误会产生调试文件,如果linux系统未生成错误文件请输入命令:ulimit -c unlimited将系统设置一下,产生错误后请用gdb调试定位错误位置,可以发邮件告知我。 默认配置下OpenATS通过共享内存获取GPSD的经纬度、高度、时间等信息用于计算卫星角度,此为推荐配置,使用者可以通过修改配置文件修改成直接使用GPS串口信息,也可以自己更换GPS解析库,但本人不建议使用,使用GPSD有以下好处:1、GPSD对GPS模块的信息处理技术更加成熟,处理速度约为10ms,精度高稳定性好,如果使用GPS模块原始数据的话会因为数据的漂移导致追踪受到影响。2、GPSD可以同时支持别的软件例如NTPD进行授时服务,可以校准计算机本地的时间让追踪系统达到更精准时间,GPS授时精确度可以达到20~30ns(1ns为十亿分之一秒),经过串口通信、处理,仍然可以保证在百毫秒左右的精度,可以大大减少计算误差。3、GPSD支持$GPHDT测向语句,可以对天线系统的方位角进行初步修正,为今后静中通、动中通做铺垫。今后OpenATS会支持静中通、动中通,通过传感器在单片机上做PID算法实时修正。 由于系统采用高精度追踪,代码中全部采用双精度类型(虽然float够用),获取系统时间为毫秒级(用的ftime()函数),所以对时间要求很高,如果采用GPSD和NTPD协助对系统授时的话,那么时间可以高精度计算卫星位置,但如果采用GPS模块的话,受模块的串口数据频率的影响,计算实时性受到限制,可以使用指令将GPS模块设置串口通信频率大一些如10Hz。这也是不建议直接使用GPS模块采集数据的原因,建议使用GPSD服务。 OpenATS使用的追踪核心技术为卫星TLE星历追踪,通过TLE轨道数据计算出卫星当前的位置,这种追踪优势明显,但缺点也有许多,TLE轨道星历数据由于其根数比较特殊,必须配合SGP4、SDP4算法导致预报精度有限,当然针对我们来讲足够精确了。TLE精度随着时间的变化误差漂移变大,所以需要经常更新TLE数据保持其精度。TLE分发由北美航空司令部(NORAD)分发,一些军事卫星等敏感卫星不在分发之列。OpenATS运行后会在4小时自动检查我服务器上的数据并更新本地数据,本人的服务器后台每4小时自动从SpaceTrack网站更新数据(NORAD每天更新两次),由于美国政府的规定:TLE数据个人或者组织分发受到限制,还请各位低调使用或者更换别的服务器地址(美国有几个组织提供TLE数据下载)。在此还要感谢“孤独小白”简总赠送的个人网站服务器。 OpenATS的目标追踪功能是一个新亮点,可以用作例如无人机、气球、飞机、火箭等目标物体的追踪,OpenATS启动目标追踪后,会在本地开启TCP监听端口,使用者仅需要将目标物体的GPS数据发送过来即可。GPS数据格式为:LAT:XX.XXXXX LNG:XXX.XXXXX ALT:XXX.XXXXX,注意的是数据格式遵循:“xx.xxxxxxx度”,而非“度分秒”格式,需要注意。玩法例如玩家可以修改一下dump1090等ADS-B软件,可以将飞机的经纬度传送给OpenATS,OpenATS会控制天线一直跟踪飞机。还有一些无人机爱好者也可以利用无人机发送回来的位置数据发送给OpenATS,自动追踪无人机获取更大的航行距离,更多的玩法还请自己想象。例如把天线换成激光炮,再做个多普勒雷达把角度计算出来,就是一个自动防御武器了,仅供参考哈,别来真的。
手动追踪模式时,输入两个角度数据控制天线指向,格式为:方位角 仰角,例如:265.35 46.35则天线指向方位角265.35仰角46.35,非常简单,输入q等命令会退出,天线自动归零。输入"X 修正角度值"修正方位角0点位置,输入"Y 修正角度值"修正仰角0点位置,用于校准天线0点位置。
非常感谢荷兰射电天文研究所ASTRON项目的天文学家Cees Bassa针对卫星轨道坐标转换的指导,计算卫星卫星角度的核心代码都是采用他的开源作品。最后要说明的是由于本人时间较忙,请使用者需要具有一定的计算机基础,包括一些安装依赖环境、单片机等基本问题,还请自行查找资料解决,暂时不提供技术支持谢谢谅解。同时欢迎关注本人个人公众号以及网站,有最新的信息或者好玩的东西会及时更新上去。
MCU搭建: 需要的硬件: 电脑一台,用来运行WXtrack卫星跟踪软件。 Arduino,山寨或者正版都可以,正版可以购买Genuino,分Nano和Mega等版本,建议Mega,拥有更多的接口和内存,并且以后扩展好。国内正版版本大概140元左右。Nano大概80左右,山寨30-50左右。山寨也正常,我的实验平台就是在山寨上运行的 步进电机2个,最好用57步进电机,扭距选择大一些的,2.0Nm以上最好,当然还可以通过减速机来增大扭矩。还可以使用闭环步进,确保角度准确,不丢步。 步进电机驱动器2个,分别控制步进电机的。1套驱动器配1个步进电机,57步进套装在200-300左右,当然可以淘二手的。 24V开关电源一个,工业上用的即可,淘宝很多,具体功率要根据你两个步进电机的功率之和来决定。如果选57大功率的步进电机的话,就要选择最少10A以上的电源。 XY轴可以旋转的支架,这个不好购买,可以自己制作,成本不太好估计。
搭建过程:
所有程序和代码,已经分享到我的百度网盘,链接:https://pan.baidu.com/s/1sliIPJJ 密码:pdx2 备用链接:https://pan.baidu.com/s/1nvtFfTJ 解压密码:1024 【注意,网盘中的OpenATS代码为旧版本,请使用Github上新代码烧写】
1,把Arduino驱动程序arduino-1.6.8-windows.exe和虚拟串口软件驱动CH341SER.EXE下载安装,把AccelStepper库下载解压缩,解压缩后的整个AccelStepper文件夹拷贝到安装后Arduino程序的libraries文件夹下 将追踪天线代码上传到Arduino板子中。
2,搭建硬件,具体硬件接线图,可以看图片。简单就是用Arduino的PWM接口,来发送脉冲。AZ方位角的控制接口是5,dir方向控制是6,EL仰角的控制接口是9,dir方向控制是10。采用共阴接法或者共阳接法都可以。
AZ方位角的CLK+(有的驱动器上也叫PUL+)接到Arduino的数字接口5,CW+(有的也叫DIR+)接到数字口6,EL仰角的CLK+接到9,CW+接到10上 AZ方位角驱动器上的CLK-,CW-接到一起,再接到arduino的一个GND接口。EL仰角驱动器的CLK-,CW-接到一起,再接到Arduino的另一个GND接口。 剩余的EN+(有的也叫ENA+)还有EN-我们都不接。
3,步进电机与驱动器的接线,步进电机比如常见的2相四线电机,分A+,A-,B+,B-接线,在驱动器上都有标识,自行按照自己步进电机的线颜色定义接上即可。驱动器上的电源接开关电源的输出即可,开关电源给两个驱动器供电24V电压。 注意正负极。
使用说明:
(一)自动追踪
自动追踪,电脑下载运行WXtrack软件,更新星历,星历更新会提示联不上网或者更新失败,我们手动去下载星历文件放到程序的文件夹下面即可。 电脑运行WXtrack软件,找到顶部菜单,Tracker--Options..然后打开设置天线追踪器界面,然后我们点击选中EasyComm I COM port, 下面的窗口,pass start可以设置1,意思是1分钟之前就唤醒天线。Pass end就是追踪完成后发送什么指令,我们输入我们天线的复位指令:“S”, Parking意思是停止天线,我们选中Park antenna,其余不用改。再切换到Port setup菜单,选中你的arduino对应的COM口,比如COM4,速率选中程序中设置的9600 然后是进入Tracker-specific options菜单,将EasyComm precision(精确度控制)设置为2,这样程序输出的串口数据会保留小数点2位,否则是整数,整个系统精确度很低。 电脑软件我们就设置完成了。调试好角度后,就可以自动追踪啦!
(二)手动控制
如果手动控制,请打开Arduino的IDE自带的串口监视器或者用别的可以发送串口数据的软件(各种串口调试工具都可以),用来做手动控制
设置你的Arduino对应的串口编号,然后设置波特率9600。 在发送角度命令时,按照如下格式:方位角 仰角(AZ EL),中间为空格,数据为浮点数或者整数,比如发送:20 40,则天线方位角转到20度,仰角到40度。 等同于:20.0 40.0 可以输入小数点儿,细分大的话,程序的识别能力可以精确到0.1度。 如果仅仅输入一位数字,则只调动方位角,仰角便为0.比如:20则天线默认将方位角转到20度,仰角为0度。输入R或者0都可以将天线复位,即方位角仰角都为0度。
校准功能 在长时间运转后,天线可能会由于电机的丢步,造成的精度不准,这时候可以输入命令来进行校准。为了简单明了来调整天线,AZ跟EL分开调整。 调整方位角的命令为:X 23 就是大写字母A后面紧跟一个数字,可以是浮点数也可以是整数。就是把天线当前的角度调整为23度。 调整仰角的命令便为:Y 56 原理同上。
V2.0更新
新的OpenATS改的地方很多,添加了W(wake up)唤醒,S(sleep)睡眠,L(lock)锁定功能,新的系统中,发送L命令后,天线保持当前角度,直接将步进电机的电源切断,而LNA的电源继续开启。这样在操作者想接收静止卫星的时候,关闭步进电机来达到省电的目的。发送W命令,天线解除锁定。如果发送S命后,天线将归零,延时一些时间后,继电器关闭,继电器可以接到天线的24V电源上。也就是说,输入S后,天线在一定时间内(几十秒)后,将会自动切断步进电机的电源,从而达到省电的目的。由于步进电机在静止时,也会有较大的电能损耗,这方面在设计OpenATS之初是没有想到的,静止的步进电机依然保持着静止扭矩。而这个耗电量虽然不如运转时耗电多 ,但由于静止时间太长,所以耗电量比运行天线都多出好几倍。所以添加了一个双路继电器模块,Arduino接收到睡眠命令时,控制继电器关闭,切断天线电机和LNA(如果你愿意)的电源,这样整个天线系统中,待机电流只有Arduino这一微小的设备了(也可能天线有自己的计算机有耗电),这样设计才能长久运行监控卫星。当发送唤醒命令时,Arduino会控制继电器模块打开天线供电电源,再进行卫星的追踪。程序中含有部分没有使用的ProtoThreads代码,为以后的OpenATS研发更多的功能来预留的。 改进的地方还有追踪角度的切换,之前的OpenATS代码中存在漏洞,在一定条件下,卫星经过0度线(正北方向),天线会反转,新的版本修正了此问题。 还改变了步进电机控制阵脚,将5、6;9、10阵脚用来控制步进电机(因为Arduino数字接口的3、5、6、9、10、11支持原生pwn),而mega的外部中断接口有2、3...所以将3接口预留了出来,为以后天线改进预留了外部中断接口。 如果手动控制,控制反馈界面也改变了很多,变得更实用。发送角度后,新的角度会显示出来,好让你看到上次发送的历史记录。如果S命令切断电源,软件会告诉你天线电源切断,并且不再接受新的控制命令,一直到你发送W命令唤醒后再继续。
还有一个更大的改变,控制软件的改变。这部分需要详细说明一下,如果不感兴趣的可以跳过此部分。 新的OpenATS分了两个版本,一个版本为原来的使用WXtrack软件的Easycomm协议来追踪,成熟稳定,但缺点是由于WXtrack作者对软件输出做出了时间限制,最快也是1秒发送一次角度数据,这就造成了天线自动追踪时的缺点,运行并不流畅,当角度变化大的时候,信号会减弱。而WXtrack的作者David tylor 设计了一款简单的应用,名字叫做FastWXtrack,这款软件的作用是读取注册表中的WXtrack的参数,包括你的坐标以及卫星的轨道和频率参数,来进行快速的计算卫星的下行频率,设计了DDE的服务端,这样著名的SDRsharp软件的DDE追踪插件,便可以连接上此软件来进行更快的频率追踪,保持频率居中。而我发现此程序输出的角度值,却是整数,没有输出小数。在联系了作者,跟作者说了很多,作者将软件更新了新的版本。新的版本为9月29日更新的1.1.2.15,更新说明是:为了JL30LW更新了更高精度的DDE参数,而我就是假冒JL30LW跟他谈判的人,因为谈判的前提是购买了WXtrack的许可,而我谷歌查到此日本一科学家购买过,所以假冒了他。这也是David tylor愿意为我更新软件的原因。虽然行为不太光荣,但我还是做到了,让FastWXtrack输出更快的角度信息,来用到我的OpenATS系统中,作为新的OpenATS控制软件。然后用了一个DDE转串口输出软件来将FastWXtrack角度信息传送给OpenATS。传送速度是每秒20次,非常快,Arduino经常由于通信较快偶尔出现串口无法通信的掉包现象,但不影响使用。我实在没脸让作者再修改修改了...然后我做的是将原来16细分的设置,改为了8细分,这样pwm输出频率降低一些,追踪速度也会快一些,但跟使用WXtrack作为控制软件的方案没法比速度,目前追踪如果超过一秒一度的速度卫星,会造成天线追踪跟不上卫星的情况,但此情况少见,多见于国际空间站那种飞行速度较快的卫星,或者是天线以高仰角经过上空,这样方位角变化角度飞快,但虽然追踪不上卫星,由于高仰角的方位角重要性会减弱,所以影响不大。可能很多人看不懂,以后自己在研究的时候会明白的。 无论哪个版本,都有自己的优点和缺点。 WXtrack的Easycomm协议作为控制软件的话,那么请将Arduino上传WXtrack版本的OpenATS。优点:软件成熟,可以实现完全自动化,设置卫星优先级等高级设置。缺点:追踪频率1秒一次,比较低。由于HRPT需要采用DDE协议,所以只能一个计算机控制天线,一个计算机用来控制解码器。 如果使用WXtrack+FastWXtrack+DDE client作为控制软件的话,请上传FastWXtrack版本的程序。优点:省掉一个计算机,可以采用树莓派、香蕉派(千兆网络推荐)等小计算机来进行网络IQ数据传输,HRPT解码器和控制天线都采用一个软件。追踪频率快,天线运行流畅。缺点:由于串口数据频率过快导致发送脉冲频率过快,天线运行慢。追踪快速卫星会悲剧。并且无法自动追踪多颗卫星。 如果要求不高,请选择WXtrack版本,无论哪个控制软件,OpenATS都很好的支持协议,并且都带有自动断电功能。
更新内容: 1、解决了之前版本的角度校正功能 校正功能使用方法: 输入:X 10 则设置方位角的10度为方位角的0度。 输入:Y 8.5 则设置仰角8.5度为仰角的0度。 后面数值可以为浮点数 仰角、方位角需要单独设置,不能一起设置,比如下面是错误的:X10 Y8.5
2、添加了追踪结束自动断电、发送S命令自动断电,W命令开启电源等实用功能,需要添加外部继电器模块。
3、步进电机针脚由原来AZ:3(PUL+)/5(DIR+) ;EL:6(PUL+)/9(DIR+) 改为现在的:AZ:5(PUL+)/6(DIR+) EL:9(PUL+)/10(DIR+) Arduino的支持pwm接口为:3,5,6,9,11
支持外部中断的接口为:
型号 int.0 int.1 int.2 int.3 int.4 int.5 UNO\Ethernet 2 3 Mega2560 2 3 21 20 19 18 Leonardo 3 2 0 1
Due 所有IO口均可
将2、3接口预留出来用于将来升级功能使用。
4、添加外部继电器模块,接口为4(天线步进电机电源控制继电器)、8(LNA电源控制继电器)。注意:继电器触发为高电平触发。
5、改进串口终端显示,手动控制发送角度后会显示到串口终端,方便观察上次发送角度。更直观的分隔符。
73