lin_guider软件使用详解
lin_guider是Linux平台最著名的导星软件,具有高效的算法和非常稳定的导星效果。在俄国,lin_guider的作者使用其导2米长焦距的RC望远镜。Ekos软件中集成的导星就是lin_guider。
本文通过先理论后实践,详细叙述lin_guider的高级使用技巧。
首先讲述lin_guider导星原理(本篇比较烧脑子,不想动脑的可以直接看楼下)
基本星点侦测:
lin_guider使用矩形框选择HFD(Half Flux Diameter)星点范围,然后对矩形框进行矩阵运算进而求得“质心”。因为跟我们的使用关系不大,所以就不详细叙述了,具体算法在gmath.cpp,矩阵算法重载定义在matr.h和vect.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实现算法:
for( int i = 0;i < MAX_ACCUM_CNT;i++ )
drift_integral[k] += drift[k][i];
out_params.delta[k] = t_delta / (double)cnt;
drift_integral[k] /= (double)MAX_ACCUM_CNT;
//if( k == RA )
// log_i( "PROP = %f INT = %f", out_params.delta[k], drift_integral[k] );
out_params.pulse_length[k] = fabs(out_params.delta[k]*in_params.proportional_gain[k] + drift_integral[k]*in_params.integral_gain[k]);
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的一个设置参数,这个我们在楼下阐述