卫守林,陈亚杰,梁 波,王 锋,邓 辉,戴 伟,曹子皇
(1.昆明理工大学云南省计算机技术应用重点实验室,云南 昆明 650500;2.中国科学院云南天文台,云南 昆明 650011)
RTS2中新CCD类型扩展方法
卫守林1,陈亚杰1,梁 波1,王 锋1,邓 辉1,戴 伟1,曹子皇2
(1.昆明理工大学云南省计算机技术应用重点实验室,云南 昆明 650500;2.中国科学院云南天文台,云南 昆明 650011)
CCD是天文望远镜中最常见的观测终端设备,也是望远镜自主控制系统中的重要组成部分。随着天文望远镜自主观测需求的不断出现以及技术的快速发展,开源的RTS2软件系统成为目前该领域研究中受到较多关注的系统之一。但RTS2支持的CCD设备较为有限,同时控制接口约定也相对固定。在针对部分特殊的CCD设备(如LAMOST中采用的32台CCD设备、选址用的部分CCD设备)时,仅实现原有类的方法是不够的。在深入分析RTS2源码的基础上,重点从参数、命令、协议扩展方面研究基于原有的Camera类,通过继承的方法构造新的CCD类型,实现对LAMOST项目的CCD控制,取得了较好的效果,对在RTS2中集成望远镜系统其他类型设备也有较好的参考价值。
远程控制;RTS2;CCD;扩展
CN53-1189/P ISSN1672-7673
远程望远镜系统第2版[1](Remote Telescope System 2nd version,RTS2)是一个开放源码的天文望远镜自主观测软件系统,采用面向对象的C++开发,具有良好的模块化设计,组件之间的通信基于传输控制协议(Transmission Control Protocol,TCP),在分布式组件部署情况下能够支持多CCD的集群控制[2]。
RTS2已经可以支持诸多的设备或模块,实现多种仪器设备如圆顶、望远镜、CCD的控制。在网址http://www.rts2.org/wiki/hw.start中可以查看RTS2目前支持的设备。从CCD设备来看,当前主要支持的CCD设备包含了SBIG、Andor、Apogee等十多种类型,显而易见,针对国内的天文望远镜诸如LAMOST、NVSTFAST等配置的大型望远镜的科学级CCD的控制需要,是RTS2当前无法支持的。由于控制的复杂性,RTS2中的CCD控制基类只提供了基础的控制实现,满足不了实际观测与CCD控制的要求。
本文正是在这样的背景下开展相应的研究工作,在分析RTS2中CCD构建的基础上,重点研究RTS2继承和扩展新设备的方法,并以LAMOST CCD开发为例,从参数扩展、自定义方法、协议扩展几方面探讨基于RTS2的CCD控制扩展技术。
RTS2体系中服务和设备是以组件的形式进行封装,对程序可扩展性进行了较完善的考虑。所有的组件和服务都可以通过配置文件中进行配置,可以在任何时候开始工作、重启或者停止,在这过程中不会影响系统其他模块的使用。RTS2需要运行在Linux环境下,可进行分布式的部署,至少需要部署一个中心控制程序(CentralD),也可以部署多个中心控制程序。在每个中心控制程序中维护着系统中所有的设备连接、客户端连接和服务连接,针对每一台天文观测设备都有一个后台管理进程。客户端程序或者RTS2本身提供的一些工具类,首先通过中心控制程序找到设备的地址,通过这个地址双方建立Socket连接进行通信、接收或发送相应的数据[3]。
在RTS2的代码体系结构中,所有的对象都继承于rts2core∷Object,在该基类中只是提供了postEvent事件提交的方法,所有的设备驱动都是继承于rts2core∷Device,并且作为守护程序运行,像rts2core∷Telescope是望远镜设备的基础类,rts2core∷Camera是CCD相机设备的基础类。在这些设备的基础类中只是提供了设备的基本操作的框架,而针对特定一款新设备的驱动就需要继承这些设备类并实现框架中的方法[4]。在RTS2的设计中,还特别考虑了所有可能的阻塞(Blocking)状态,以此确保系统内的设备可以协调完成观测任务。
RTS2中CCD的所有设备都继承自rts2core∷Camera(在camd.h和camd.cpp中定义),在Camera的实现中大量使用虚函数,不同的功能分别在不同层次的基类中实现,设计中较少采用多重继承的方法,所以源码结构相对清晰易读。实现新CCD类型的控制就需要继承rts2core∷Camera类,rts2core∷Camera类及其父类都在rts2core的命名空间下,图1是RTS2中Camera类的继承关系。
图1 RTS2中Camera类的继承关系Fig.1 The heritage relations of the Class Camera in the RTS2
基类App中主要定义作为应用所需要处理的命令行参数的解析、初始化和帮助提示的工作。基类Block负责维护网络连接、定时器等。基类Daemon主要负责初始化守护进程、创建网络监听、接收客户端的连接。基类Device作为所有设备的基类,主要进行设备层的初始化工作,对CCD曝光、望远镜移动、数据读出等阻塞状态进行设置。基类ScriptDevice是对设备当前运行的脚本进行处理。基类Camera是对CCD基本操作的封装,包含了曝光命令、温度设置等一系列操作。
在Camera类中,使用虚函数的方式定义了CCD相机的基本控制的方法。为了将新类型的CCD设备集成到RTS2体系中,需要对参数设置、初始化、命令行处理等多个部分的函数进行重写。下面对在新类型CCD扩展中需要重写的关键函数进行说明。
info():在收到info命令后触发该函数,收集设备的相关信息,并将信息发送到请求端。在新类型设备中可以设置需要发送给请求端的信息。在Camera和Daemon类中都有定义。
idle():在oneRunLoop函数中调用,在程序运行期间,oneRunLoop被无限次循环执行,idle函数主要完成定时器清除工作,将连接从预备队列移动到正式连接队列,依次执行连接上的idle函数。在Camera类中的idle函数检查CCD曝光状态和数据读出。在新类型的CCD设备中可以根据CCD的曝光机制和数据读出机制,重写idle函数。
processOption():程序执行时命令行参数解析处理函数,通过重写processOption函数,增加新设备的命令行参数。在基类App、Daemon、Camera和Device类中有定义。
init():初始化函数,完成设备在RTS2体系中网络注册、参数初始化操作,调用initHardware完成设备硬件的初始化工作。如自定义设备使用USB连接,可以重写该函数,完成对USB接口的初始化连接工作。
startExposure():开始曝光的函数,在Camera类中被定义为纯虚函数,在自定义的设备类中是必需重写的。在执行该函数前会调用camStartExposure进行曝光条件的检查,如设备是否正在曝光,对焦器是否正在移动,满足曝光条件才能执行该函数。
isExposing():重写该函数返回,返回-2表示已经曝光结束,返回其他大于0的值,表示距离曝光结束还有多少毫秒。
endExposure():当前曝光结束时调用该函数,开始读取数据,将图像数据存储在文件系统中。
stopExposure():停止曝光函数,将曝光队列清空。通知所有的连接曝光已停止,在endExposure ()函数中调用,或者收到stopexpo命令时触发。
readoutStart():准备开始读取数据,调用sendFirstLine函数设置图像头信息,在camReadout中被调用,在自定义CCD实现中,可以设置数据读取前的初始化工作。
doReadout():读取数据函数,在Camera中是以纯虚函数形式声明,所以自定义CCD中必需实现,通常是先调用markReadoutStart表示开始读取,读取数据,然后调用sendReadoutData函数将数据发送出去。doReadout在checkReadouts函数中被调用。
endReadout():结束数据读取,在checkReadouts函数中被调用,也是周期性地被调用,主要工作是对数据的清理,如果曝光队列中还有等待命令,则会调用camExpose继续曝光。自定义CCD中通常需要做一些资源释放的操作。
setValue():设置设备参数值,通过客户端或网络连接可以设置设备的参数值,如曝光时间、温度等,对于特定设备的参数,可以重写该函数完成参数的修改,通过网络协议“X”关键字可以修改参数。
在RTS2中,CCD组件的扩展主要是构建CCD的设备层的控制程序,包括了对CCD参数的扩展和对设备一系列操作的重写,如开始曝光、停止曝光、判断是否在曝光、开始读数据、结束读数据、读取数据等。接下来从LAMOST CCD参数扩展、自定义方法、协议扩展几方面探讨基于RTS2的CCD控制扩展。
2.1 CCD参数扩展
在Camera中已经定义了相机的基本参数,比如芯片类型、曝光时间、读出时间等参数。但针对特定的CCD,还需要定义该CCD专有的参数,在LAMOST CCD类中,需要定义该设备特有的参数如读出速率,读出方式,红、蓝相机同步等参数,参数的类型需要使用Value的继承类(在value.h和value.cpp中定义),包含了字符串、整型、时间日期、浮点型、布尔型、列表选择类型及天文中特有的方位角和高度值。如LAMOST项目中的CCD相机中增益的参数扩展可以增加如下变量:
在类的构造方法中完成参数值的默认设置,可以调用父类Daemon中的createValue函数完成。在每个设备中都维护着一个类型为CondValueVector的参数列表,createValue函数对参数进行初始值的设置并加入该列表中。每一个参数值可以包含以下几个或多个状态值:
RTS2_VALUE_FITS:是否将参数写到FITS文件中。
RTS2_VALUE_AUTOSAVE:是否自动保存。
RTS2_VALUE_NEED_SEND:是否被在infoAll函数中发送。
RTS2_VALUE_WRITABLE:设置参数值是否可以被修改。
2.2 函数重写与实现
RTS2中对CCD的关键操作包含了对CCD的参数设置、曝光命令的解析、数据读出等操作。其中曝光命令的执行最为关键,本节以曝光命令的解析为例说明新类型CCD对父类函数重写的方法。
在RTS2中对曝光命令的处理是在commandAuthorized()函数中。请求端发送的命令首先在Connection对象的processLine函数中进行解析,如果无法解析则会调用command函数,最后再调用commandAuthorized()函数进行解析,如系统中的命令无法满足新类型设备的需求,可以通过重写该函数完成自定义命令的实现。如下代码为LAMOST CCD控制中该函数处理曝光命令的部分代码。
在上段代码中,首先判断当前命令是否是曝光命令,如果是,判断参数的个数,紧接着判断CCD到UCAM的网络连接的状态,如果是连接的状态,则将命令转发到UCAM的命令控制器中。如果在该函数中没有满足条件的命令关键字的解析过程,则调用Camera父类中commandAuthorized函数进行命令解析。
2.3 协议扩展
RTS2中各个组件间的通信是使用基于文本的传输控制协议[5]。通信两端建立连接后,两端是对等的,同时处理来自对方的请求和发送请求到对方。CCD设备进程启动后建立动态监听端口,同时建立和中央监控程序CentralD(默认端口为617)的连接,同时向CentralD发送注册命令,注册成功后设备的连接信息将保存在CentralD对象中,并且所有设备的网络地址信息都在CentralD中进行注册维护。设备到CentralD的连接定义为DevConnectionMaster,CentralD到设备的连接类型为Rts2ConnCentralD,两者的通信过程如图2。
客户端(如rts2-mon)启动后首先和CentralD建立连接,发送登录命令到CentralD,CentralD会将注册过的设备信息发送到客户端,客户端再和设备建立连接,客户端到设备的网络协议解析过程如图3。
图2 CCD设备与CentralD通信过程Fig.2 A schematic diagram of the communication between the CCD and CentralD
图3 客户端到CCD设备的网络协议解析过程Fig.3 A schematic diagram of the parsing process of the protocol from the Client to a CCD
RTS2的网络协议规则由协议关键字和参数组成,协议关键字在block.h中定义,如PROTO_VALUE表示参数值更新,PROTO_STATUS表示状态信息。另外还包含了没有使用宏定义的协议关键字,如注册、登录协议使用Command封装,在Connection类、设备类中也包含一些关键字,给源码的分析带来一些困难。在CCD设备基类Camera支持的关键命令中,目前包含了曝光(expose)、停止曝光(stopexpo)、停止读出(stopread),如果需要增加新的命令,可以通过重写commandAuthorized()函数完成。
将LAMOST项目的CCD相机加入RTS2的控制体系中,首先需要在RTS2的源码中src/camd目录下增加lamost.cpp文件,创建类LamostCCD并继承于Camera类,如class LamostCCD:public Camera。目前LAMOST的CCD使用UCAM的方法进行控制[6-7],LamostCCD类不直接和底层的硬件进行通信,而是和UCAM通过网络连接发送命令实现对CCD的控制。由于UCAM控制CCD已相对成熟,通过这样的方式,一方面可以减少出错的可能性,另一方面,也可以减少底层控制代码编写的工作量。在LamostCCD类初始化时建立UCAM的通信连接,图4为将LAMOST的CCD接入RTS2体系中,并通过RTS2的自带工具rts2-mon进行控制。
图4 使用rts2-mon对LAMOST CCD进行曝光控制Fig.4 An rts2-mon interface to send an exposure command to a CCD on the LAMOST
RTS2系统因为其开源特性同时有一定的用户基础,已经成功应用于BOOTES、LSST等多个自主控制天文台中,是国内天文技术界目前较为受关注的系统之一。RTS2目前支持的主要CCD型号是天文爱好者所用的CCD设备,在对用户接口、多通道CCD支持及CCD集群的组合观测等方面还存在诸多不足,有较大的改善空间。本文在分析RTS2源码的基础上,研究如何扩展RTS2,将新类型的CCD设备加入RTS2的体系结构中,同时为其他类型的设备扩展提供了有价值的参考。
参考文献:
[1] Remote Telescope System-2nd vesion[EB/OL].[2013-11-10].http://rts2.org/.
[2] 赵永恒.天文望远镜的自动观测技术[J].科研信息化技术与应用,2012,3(4):11-16.
Zhao Yongheng.Technology of automatic observation of astronomical telescope[J].E-Science Technology&Application,2012,3(4):11-16.
[3] Kubánek P,Jelínek M,Frenchc J,et al.The RTS2 protocol[C]//Bridger A,Radziwill N M. Advanced Software and Control for Astronomy II:Proceedings of the SPIE.2008,7019:92-103.
[4] Kubánek P,Jelínek M,Vítek S,et al.RTS2:a powerful robotic observatory manager[C]// Lewis H,Bridge A.Advanced Software and Control for Astronomy:Proceedings of the SPIE. 2006,6274.
[5] 程祖桥,邓辉,王锋,等.云南1米红外太阳塔分布式CCD实时控制与图像采集系统软件研制[J].天文研究与技术——国家天文台台刊,2012,9(4):426-431.
Cheng Zuqiao,Deng Hui,Wang Feng,et al.Design of the distributed real-time control and image-acquisition software system for the YNAO 1m solar telescope[J].Astronomical Research&Technology——Publications of National Astronomical Observatories of China,2012,9(4): 426-431.
[6] 罗阿理,田园,宋静,等.LAMOST观测控制系统设计与实现[J].科研信息化技术与应用,2012,3(4):76-85.
Luo Ali,Tian Yuan,Song Jing,et al.Design and implementation of LAMOST observatory control system[J].E-Science Technology&Application,2012,3(4):76-85.
[7] 徐灵哲,徐欣圻.LAMOST网路控制系统结构[J].天文学进展,2006,24(3):200-209.
Xu Lingzhe,Xu Xinqi.The structure of network control system for LAMOST[J].Progress in Astronomy,2006,24(3):200-209.
Methods of Constructing New CCD Classes in the RTS2
Wei Shoulin1,Chen Yajie1,Liang Bo1,Wang Feng1,Deng Hui1,Dai Wei1,Cao Zihuang2
(1.Key Laboratory of Applications of Computer Technologies of the Yunnan Province,University of Science and Technology of Kunming,China,Email:wsl@cnlab.net;2.Yunnan Observatories,Chinese Academy of Sciences,Kunming 650011,China)
CCDs are among the most commonly used instruments on astronomical telescopes and are also important parts of autonomous control systems of astronomical telescopes.With emerging needs of automatic observations using astronomical telescopes and the rapid development of relevant technologies,the open-source RTS2 has become one of the software systems that are relatively more noticed in the field of automatic observations.However,the RTS2 supports rather limited types of CCDs,and its control-interface convention is rather fixed.The original settings of classes in the RTS2 are not sufficient to incorporate special CCD devices (such as the 32 CCDs of the LAMOST and some CCD devices for selecting observation sites).Based on our thorough analysis of the RTS2 source codes,we investigate methods of constructing new CCD classes from the original Camera class.The methods are mainly about extensions of parameters,commands,and protocols.The methods are applied to the control of the CCDs on the LAMOST telescope and achieve rather effective results. The work of this paper provides rather valuable references for incorporating other types of equipments on astronomical telescopes into the RTS2.
Remote Control;RTS2;CCD;Extension
TP311.1
A
1672-7673(2014)03-0281-06
2013-10-13;
2013-10-25
卫守林,男,讲师,硕士.研究方向:软件架构,网络安全,天文计算方法.Email:wsl@cnlab.net