文字| 历史 安利官方
编辑|历史安利官员
引导星算法实现完成后,必须进行测试,以初步调试算法实现并测试引导星算法的有效性。
但考虑到实际的导星实验在进行导星之前需要一个长期、多步骤的设备调整过程,而且天文观测受天气等因素影响较大,因此测试极其繁琐,无法随时进行和任何地方。
因此,在算法调试阶段,我们采用了自行搭建仿真测试平台,进行仿真测试的方案。
天文观测图像星追踪
为了模拟真实的导星环境,将导星算法嵌入其中,让它实际运行,并连接反馈环路,以下功能是必不可少的:
1、模拟天文相机,模拟恒星观测图像。
2、模拟赤道仪,模拟赤道仪的基本功能。
3、模拟赤道仪的自转,同步赤道仪的指向和恒星观测图像的内容。
4、导星算法使用天文相机和赤道仪的通用接口来访问和控制模拟天文相机和赤道仪。
据此,利用模拟星图软件Stellarium实现了星观测图像的模拟,并利用ASCOM的模拟赤道仪来模拟赤道仪的功能。 最后借助socket通信和Windows截图实现,实现了天文相机和导航系统。 成功进行了星反馈环的仿真过程和导星算法的仿真测试。
首先通过拆分,对仿真测试平台的各个功能模块进行详细说明。
然后描述了测试平台运行的原理和具体流程; 最后对实验结果进行展示、分析和总结。
天文测试平台三大模块
测试平台主要分为三个模块,模拟天文相机和望远镜的模拟星图模块、模拟赤道仪的模拟赤道仪模块、导星算法模块。
为了尽可能模拟实际的导星过程,测试平台需要将这三个模块合理连接,形成导星循环。
引导星周期的形成需要三个模块之间的沟通与配合。
模拟星图模块向引导星算法模块提供当前的恒星观测图像,引导星算法根据图像计算出应补偿的量并发送给模拟赤道仪模块。
模拟赤道仪模块模拟旋转过程,并将当前赤道仪坐标发送至模拟星图模块,以模拟视场的实际旋转。
可见,这三个模块之间的连接构成了一个循环,即模拟导星循环。
模拟星图主要功能
模拟星图的主要作用是为导星算法提供当前赤道仪所指向恒星的观测图像。
完成该任务需要两个子功能的配合,即生成指定坐标的星图以及图像与赤道仪当前指向坐标的同步。
对于指定坐标的星图生成功能,测试平台选择了一款开源的模拟星图软件——虚拟天文馆(Stellarium)作为基础。
该软件内置超过60万颗星星的星表,使用OpenGL绘图API极其逼真地渲染3D夜空,并支持调整视场以还原望远镜等设备的视场。
而且,还可以为恒星位置和大气效果的还原提供更加真实的导星环境。
其内置的时间控制功能不仅可以模拟当前的星图,还可以绘制过去、未来等任意指定时间的星图。
此外,虚拟天文馆还具有高度可扩展性。 简单的动画和交互可以使用脚本来实现,而复杂的功能集成,特别是那些需要与第三方软件或硬件通信的功能集成,可以利用虚拟天文馆。 预留开发接口,用于编写插件。
模拟星图的旋转模拟是通过编写自定义插件来实现的。
以上特点使其非常适合作为模拟星图的提供商。
然而,虚拟天文馆有自己的用户界面(GUI)虚拟天文馆软件,其模拟图像呈现在自己的窗口中。
虽然也有内置的截图功能,可以保存当前显示图像,但只能保存到硬盘,不能直接写入内存。
如果让虚拟天象仪先将图像保存到硬盘,然后让导星算法模块将图像文件读取到内存中,就会减慢整个模拟过程,达不到模拟效果。
其内部开发接口并不直接打开图像数据,因此要想获得虚拟天文馆当前的模拟图像。
模拟星图模块通过外部截图的方式实现,即直接使用Windows图形API捕获虚拟天文馆的窗口图像。
在Windows系统中虚拟天文馆软件,GDI可以用来截取窗口的屏幕截图。
首先使用Windows API找到想要截图的窗口的窗口句柄,然后可以通过窗口句柄进一步获取窗口的设备上下文(DeviceContext)。
该设备上下文包含特定绘图的所有细节。 使用此设备上下文,您可以复制窗口的内容。
然而,复制的数据是内存中的BMP图像。 只有解析之后才能真正获得窗口图像在内存中的副本。
具体实施步骤如下:
1、使用FindWindowEx函数根据窗口标题和窗口类名查找需要截图的窗口。
2. 获取窗口的设备上下文(DC)并复制。
3、使用复制的DC在内存中创建位图,即图像复制的缓冲区。
4、将窗口内容从原始DC复制到复制的DC中,即获取上一个缓冲区中窗口内容的位图。
5、解析缓存区中的BMP格式图像,获取像素值数据。
6. 释放或销毁DC。
通过事先使用spy++程序查看Stellarium程序的窗口结构,并找出第一步所需的绘图窗口的窗口标题和窗口类名,就可以完成虚拟天文馆截图的实现了任何时候。
由于导星算法使用硬件接口,为了保持一致性,测试平台构建了Camera Simulator的子类来封装截图虚拟天文馆的实现。
这样就解决了星图生成以及与导星算法配合的问题。
不过为了与模拟赤道仪当前坐标同步,插件API中除了设置虚拟天文馆打开的观测坐标的功能外。
还需要在虚拟天象仪和模拟赤道仪之间建立通信通道,以便虚拟天象仪知道赤道仪当前的指向坐标。
为了模拟实际的因果关系,即赤道仪的自转与观测坐标的变化之间的关系。
该测试系统使用模拟赤道仪将当前指向坐标发送到虚拟天文馆程序。 虚拟天文馆响应该消息并改变生成的观测图像的模式。
换句话说,虚拟天文馆是消息接收者,模拟赤道仪是消息发送者。
并且由于在实现上,模拟赤道仪和虚拟天文馆运行在不同的进程中,因此需要跨进程的通信方式。
因此,本测试平台选择了socket5)作为两者交互的桥梁。
为了让虚拟天象仪在运行过程中不断接收坐标信息并相应改变屏幕显示,本测试平台为虚拟天象仪编写了自定义插件来实现上述功能。
虚拟天文馆的类结构设计为插件的编写提供了很多便利,也规定了插件的编写规则。
每次生成图像时都会调用激活的插件,使插件有机会更改生成的图像并完成其任务。
虚拟天文馆插件的实现是Stel Module的子类。
为了让子类可以自定义各种步骤和功能,StelModule作为所有插件的基类,定义了如下虚函数: init函数用于初始化插件。
update函数用于更新插件状态。
绘制函数在每次绘制过程中都会被调用,是插件主函数的实现。
getCallOrder 函数返回插件的调用顺序。
在本测试平台实现的插件中,最重要的是init函数和draw函数。
由于菜单和光标等交互工具显示在虚拟天文馆的默认窗口中,这些都会干扰生成的星图。
因此您需要更改其设置以隐藏这些交互式显示元素。
而且,为了使用socket接收模拟赤道仪发送的坐标,进程需要初始化Widnowssocket库。
这些一次性任务是在 init 函数中完成的。
绘制函数负责接收坐标并改变虚拟天文馆当前的观测坐标,使模拟星图与模拟赤道仪同步。
综上所述,虚拟天文馆本身负责固定坐标星图的模拟,而Camera Simulator中的截图实现则负责导出模拟图片。
最后,虚拟天象仪的自定义插件负责虚拟天象仪内部观测坐标和模拟赤道仪内部指向坐标之间的同步。
虚拟天象仪和相机模拟器加上上述插件共同构成了测试平台中的模拟星图模块。
模拟赤道仪
模拟赤道仪主要有两个功能:
首先,模拟真实赤道仪支持的功能。
其次,它模拟真实赤道仪的旋转过程(指向坐标的连续变化)。
使用 ASCOM 平台附带的赤道仪模拟程序可以轻松实现第一个目标。
ASCOM赤道仪模拟程序可以完整模拟ASCOM标准中规定的赤道仪接口规范。
而且,模拟程序带有一个简单的GUI,方便用户设置细节和显示状态(指向坐标等)。
由于本仿真程序完美支持ASCOM标准中的赤道仪接口,因此可以使用ASCOMMount类对象来实现测试平台的相应部分。
然而,为了完成第二个目标,需要时刻查询赤道仪当前的指向目标,并且根据设计,获得坐标后,需要发送到模拟星图模块。
因此,需要在ASCOMMount原有的功能上增加查询和发送功能。
一种方法是创建一个名为 MountSimulator 的 ASCOMMount 子类,并将此功能添加到该子类中。
另一种方法是将该函数添加到集成了Camera和Mount函数的Scope类中。 Scope类是为了组织接口、方便硬件设备灵活更换而引入的抽象层,因此可以创建Scope的子类ScopeSimulator来集成它。 CameraSimulator并实例化模拟赤道仪的AsCOMMount对象。
为了不破坏赤道仪的继承体系,本测试平台采用第二种方法来实现模拟赤道仪的坐标传输。
根据设计,导星算法将使用ScopeSimulator继承自Scope的通用接口来操作模拟赤道仪并向其发送旋转命令。
ScopeSimulator 对象可以直接与代表模拟赤道程序的 ASCOMMount 对象交互。 然而,在模拟赤道仪模拟自转的同时,ScopeSimulator对象还必须不断读取因模拟自转而变化的赤道仪指向坐标,并将其发送到模拟恒星。 图形模块。
也就是说,测试平台向模拟赤道仪发送命令后,需要立即进入读取坐标和发送坐标的循环过程,直到模拟旋转完成。
但由于导星算法和与模拟赤道仪交互的ScopeSimulator在同一个进程中,读取和发送坐标的循环过程会导致导星算法的其他部分在模拟旋转过程中停止并等待流程结束。
要让引导星算法在模拟旋转的同时继续运行,就需要多线程的帮助。
测试平台的实现将读取坐标和发送坐标的循环过程放到一个与主线程(引导星算法所在线程)不同的工作线程中,并利用Windows系统的Event对象来帮助同步工作线程。
当Scope Simulator接收到来自导星算法的旋转命令时,它将命令转发给模拟赤道仪并启动工作线程来同步坐标。
工作线程根据Mount定义的赤道仪通用接口获取坐标,并查询模拟赤道仪当前的导星状态。 它不断发送模拟的赤道仪坐标,直到旋转状态结束,并自动阻塞,等待示波器模拟器的下一次激活。
综上所述,模拟赤道仪利用ASCOM平台自带的赤道仪模拟程序来模拟真实的赤道仪,然后通过多线程和socket通信相结合的方式来模拟连续旋转过程。
该测试平台通过与模拟星图配合,可以实现模拟星冬季与模拟赤道仪之间的坐标同步,还原赤道仪自转的中间过程,为引导星提供更加真实、统一的界面测试环境算法。
参考