牧夫天文论坛(中国最早的天文论坛,致力于天文和望远镜的科普交流平台)

 找回密码
 加入牧夫(注明天文爱好者)

QQ登录

只需一步,快速开始

蔡司光学大连望远镜
西湾光电振旺光电牧夫纪录片
2017年爱牧夫星特朗天文年历来了!牧夫文化衫
查看: 2293|回复: 10

[天文软件] 从理论到实践——lin_guider软件使用详解

[复制链接]
发表于 2015-6-16 01:00 | 显示全部楼层 |阅读模式
本帖最后由 ecloud 于 2015-6-16 11:50 编辑

lin_guider是Linux平台最著名的导星软件,具有高效的算法和非常稳定的导星效果。在俄国,lin_guider的作者使用其导2米长焦距的RC望远镜
本文通过先理论后实践,详细叙述lin_guider的高级使用技巧
注:lin_guider3.1已经被整合到iAstroHub二代中,将于近期正式发布,目前测试进行中

首先讲述lin_guider导星原理(本篇比较烧脑子,不想动脑的可以直接看楼下)
基本星点侦测:
lin_guider使用矩形框选择HFD(Half Flux Diameter)星点范围,然后对矩形框进行矩阵运算进而求得“质心”。因为跟我们的使用关系不大,所以就不详细叙述了,具体算法在gmath.cpp,矩阵算法重载定义在matr.hvect.h

PID控制方法:
lin_guider并不是直接把已经测得的误差应用于赤道仪矫正。在lin_guider最初设计中打算采用PID控制法,但是目前实际上只实现了PI。
PID控制法——proportional-integral-derivative,即比例—积分—微分算法。PID是工业控制中非常常用的控制算法
能翻墙的详见:https://zh.wikipedia.org/wiki/PID控制器
不能翻墙的:http://www.elecfans.com/dianzichangshi/20120909287851.html


为什么不直接输出修正值?因为直接测得的误差值可能含有噪声干扰,另外修正指令的发出是具有延迟的,当修正指令发出时,其瞬时误差可能会有变化。因此在20世纪初,人们发明了PID控制法,最初用于美国海军的舰艇自动驾驶仪,效果很好。
lin_guider的PI实现算法:
  1. for( int i = 0;i < MAX_ACCUM_CNT;i++ )
  2.                          drift_integral[k] += drift[k][i];
  3.                
  4.                 out_params.delta[k] = t_delta / (double)cnt;
  5.                 drift_integral[k] /= (double)MAX_ACCUM_CNT;
  6.          
  7.                 //if( k == RA )
  8.                 //        log_i( "PROP = %f INT = %f", out_params.delta[k], drift_integral[k] );

  9.                 out_params.pulse_length[k] = fabs(out_params.delta[k]*in_params.proportional_gain[k] + drift_integral[k]*in_params.integral_gain[k]);
  10.                  out_params.pulse_length[k] = out_params.pulse_length[k] <= in_params.max_pulse_length[k] ? out_params.pulse_length[k] : in_params.max_pulse_length[k];
复制代码

可见这里积分因子的计算是求一段时间(MAX_ACCUM_CNT)内的算术平均数。
局限:在目前的lin_guider中,MAX_ACCUM_CNT被设为固定的50。也就是说,积分因子的统计,和RMS的计算,都只算到“这次之前的共50次”为止。这个值并不够大,我正在跟开发人员讨论是否可以在之后的版本把这个值增加到100。这里主要考虑的问题可能是100次累加对性能的影响。


在lin_guider设置中,需要给出比例系数Kp和积分系数Ki。如果系数为0,则程序不会对赤道仪发出修正指令。
至于两个系数如何设置,是一门高深的方法论,可以采用尼古拉斯-齐格勒法,不过此法需要大量实践以获得那个“使得修正值产生明显波动的比例因子”
根据我的日常使用经验,在lin_guider中,比例参数Kp可以设置为0.7-0.85左右,这样可以尽量减少“噪声干扰”,比如阵风,薄云,有人走过等。
对于RA轴来说,因为RA轴修正值的“累计误差”会比较接近于0,所以对于RA轴来说,积分因子的作用效果不大,因此建议把RA轴的Ki设置成0或者小于等于0.1的值。
对于DEC轴来说,积分因子体现了极轴误差的长期影响,因此具有一定的意义,因此可以把DEC轴的Ki设置稍大,比如0.3
总体思路是,以P为主要修正参考,I作为辅助参考。越接近天赤道的RA变化比较明显,因此Kp可以略大,越接近天极的DEC变化比较明显,因此Kp可以略大。一般不建议把Kp设为大于等于1的值,Ki不建议超过0.3
但是因为个人的设备不同,所以最终参数设置还是要自己实践得出最优。最懒的方法是,Kp统统设为0.85,Ki统统为零!
举例:
程序测得实际的误差值为:1.2"
Kp=0.85, Ki=0.1, 50次内误差的平均值为0.4"
那么程序实际发送给赤道仪的修正指令为:
0.85*1.2"+0.1*0.4"=1.06"

导星速率:
很多,很多的人,很久以来在问这个问题
我们可以看到,lin_guider源码中对输出指令的变量命名为out_params.pulse_length,显然这是一个时长,而不是角度或者距离。
ST4协议发送给赤道仪的指令实际是时间长度,即多少毫秒,而不是角度什么的。因为时间最容易被赤道仪理解和实现,不需要进行任何转换。
那么这个时间是如何参考的?这就是“导星速率”的由来。
以sidereal速率(15"/s)作为基础,乘以一个比例,这个比例就是”导星速率“。如果导星速率为0.1,那就意味着ST4指令的速率为1.5"/s。此时如果软件给赤道仪发出100ms的修正指令,意味着需要移动0.15"
导星速率在赤道仪手柄中可以设置,通常来说,其值的大小没有什么影响,唯独会影响到lin_guider的一个设置参数,这个我们在楼下阐述

 楼主| 发表于 2015-6-16 01:00 | 显示全部楼层
本帖最后由 ecloud 于 2015-6-16 12:44 编辑

本楼阐述lin_guider的具体设置方法

屏幕快照 2015-06-14 下午9.43.55.png

相机设置界面,这里有以下几点注意
分辨率一定要设置为最大,除非你觉得导星灵敏度太高了,即便如此,也建议通过Kp和Ki参数来控制灵敏度而不是改变图像分辨率
对焦时候把gain拉高以后,完了别忘了拉回去
从3.1版本开始,曝光时间不再是fps各式,而是直接以时间格式存在,请注意
”Dark subtract”是扣暗场,这个选择需要在下面界面拍过暗场以后才能点


屏幕快照 2015-06-14 下午9.44.33.png

导星设备设置界面,这里没有什么可说的,不要动他除非你自己DIY的赤道仪线序不一样


屏幕快照 2015-06-14 下午9.44.48.png

基本设置界面,这里注意以下几点
"drift data"要确保开启,否则你看不到任何曲线
抖动范围,一般5个像素足够了,记住这里指的是导星相机上5个像素,一般反映到主镜上通常会加倍
抖动超时我想不出来有什么理由去改她
的最下面的HFD功能,目前只能用来看视宁,开启以后HFD会显示在最下面的状态栏里,没什么大用处


屏幕快照 2015-06-14 下午9.43.10.png

校准界面,这里就是拍摄暗场的地方
选择暗场帧数,然后按最右下角的Start按钮就开始拍暗场,别忘了盖镜头盖
在这里拍摄完暗场以后,才能在相机设置界面里勾选”Dark subtract”
暗场数据程序退出以后作废,所以每次都要重新拍。建议外温20度以上就要拍暗场了,温差大了以后要重拍


屏幕快照 2015-06-14 下午9.46.00.png

导星界面,重头戏来了,这里就是设置各种参数的地方
左边那些参数不需要修改,图像品质不需要开启,既耗费资源又没什么鸟用
导星速率,设置成跟你赤道仪手柄一样
单轴,单方向导星可以在这里选择实现
"Accumulate frames",取多张拍摄结果的平均数作为测量误差。也就是说,如果这里你选择2,快门设为1s,那么程序实际上每2秒发出一个修正指令
已知BUG:比例系数Proportional gain的单位不正确,在下个版本修正之前,设置的方法是:
先看导星速率右边那个P:266.67
这个值就是100%Proportional gian的大小,所以如果你要设置Kp为1,那么需要在下面的输入框里输入266.67
这个BUG会在下个版本被修正,到时候你就可以输入正常的0-1之间的值了
Integral gain没有此BUG,因此输入范围是0-1
Derivative gain没有实现,不用管它
最后两个值是最大和最小修正时间范围,也就是说,如果程序算出的修正指令小于150ms,就不会向赤道仪发出,如果大于5000ms,也不会向赤道仪发出。这个最大值一般不需要动,最小值根据你的主相机分辨率来决定,在一个像素以内的偏移量就不需要发出修正指令了

注意,所有参数设置必须在程序菜单选择Exit以后才能永久保存。断电或者直接杀死程序,参数将不会保存!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-16 01:03 | 显示全部楼层
本帖最后由 ecloud 于 2015-6-16 13:07 编辑

lin_guider的进阶用法
由于在图表上显示的是实测误差,而当Kp和Ki都为0的时候,程序不会发出任何修正指令
我们可以利用这个特性实现PAM

首先要完成导星的校准
然后将主镜指向RA为0的上中天目标,将DEC轴的Proportional gain和Intergral gain都设为0,开始导星
此时图表中将出现一条有明显斜率的DEC曲线,这条曲线就能揭示极轴的水平误差
同理,如果将主镜指向地平线附近的RA为0目标,如法炮制,那么此时的DEC曲线就能揭示极轴的高度误差


说到Kp和Ki的设置方法,每个人的情况各不相同,所以我所说的仅仅是个引子。具体的需要个人自己实践得到

齐格勒-尼科尔斯方法英语Ziegler–Nichols method)是一种整定PID控制器、探索其控制参数的方法。它是由1940年代早期两位泰勒仪器公司的工程师提出的,这个方法也因此以二人的名字命名。[1]其调试方式为,首先将积分和微分增益设置为0,然后比例增益从零开始逐渐增加,直到到达极限增益KU,此时控制器输出值以恒定值振荡。KU和振荡周期TU根据不同的类型,按下表中的方式来设置比例、积分和微分增益。

Ziegler–Nichols方法[2]
控制类型
比例
-
-
比例-积分
-
经典比例-积分-微分(PID)[3]
Pessen Integral Rule[3]
some overshoot[3]


对于iAstroHub感兴趣的,可进群讨论:367368763
回复 支持 反对

使用道具 举报

发表于 2015-6-16 07:16 | 显示全部楼层
深夜发帖,辛苦了
回复 支持 反对

使用道具 举报

发表于 2015-6-16 08:13 | 显示全部楼层
学习下
回复 支持 反对

使用道具 举报

发表于 2015-6-16 08:36 | 显示全部楼层
留名
回复 支持 反对

使用道具 举报

发表于 2015-6-16 09:08 | 显示全部楼层
本帖最后由 nwwolf 于 2015-6-16 09:09 编辑

我承认脑子已经沸腾啦

等你的919啊
回复 支持 反对

使用道具 举报

发表于 2015-6-16 10:55 | 显示全部楼层
不错,学习了!
回复 支持 反对

使用道具 举报

发表于 2015-6-16 18:04 来自手机 | 显示全部楼层
我会说我能够看懂题目吗?
回复 支持 反对

使用道具 举报

发表于 2017-9-14 11:57 | 显示全部楼层
讲得很棒,学习了
回复 支持 反对

使用道具 举报

本版积分规则

QQ|论坛广告版面招租|简版|手机版|爱牧夫天文淘宝店|牧夫天文论坛 ( 京ICP备06060556号 本站官方联系电话:+86-411-8424-1208,186-零零贰贰七七九九,联系QQ:224-27993 )

GMT+8, 2017-9-21 00:34 , Processed in 0.042656 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表