天文吧 关注:469,230贴子:2,917,394

自制谐波赤道仪及导星算法结题

只看楼主收藏回复

经过了一年时间的设计及算法编写,以及这个寒假做的算法代码测试与改进,我认为这个赤道仪的性能已经达到我能做到的极限了。
在赤道仪机械部分,在赤经轴使用了来自中国聚隆的型号为HF20-2的谐波减速器,在赤纬轴使用了一个在咸鱼买的日本新宝70型谐波减速器,两个轴均使用同步带+42步进电机驱动;在下方极轴电调机构部分,在极轴俯仰角调节处使用了蜗轮蜗杆传动结构,在极轴东西向调节处使用了行星减速器+外齿轮传动,由于减速比足够,每个轴的电机分辨率都小于了0.1″(0.1/3600度)。
在赤道仪控制部分,并没有使用大家熟知的onstep模块,而是利用STM32自己编写了赤道仪的控制程序,通过单片机定时器输出PWM波形控制步进电机运行,利用串口中断方式,和上位机(我的拯救者2021R7000p)使用USB连接,自己定义了通信协议(既单片机接收的信号和上位机的约定),可以将精确到1/60″(1/60/3600度)的角度信号、8种运动模式信号(盲跟,赤经轴停止,赤经纬轴自动寻星调整,赤经炜轴导星调整,极轴调整)发送给单片机进行处理。


IP属地:上海来自Android客户端1楼2023-01-17 14:46回复
    在上位机底层算法部分,主要完成了如下工作:
    1.星点提取,从导星相机拍摄的图像中将星点提取出来,这里每个星点用C++语言描述为了一个星点类(class)其中的成员包括星点中心坐标位置、星点大小、平均灰度等,该函数输入OPENCV的Mat类,输出我自己定义的星点数组类。
    2.星点定心,这一小步主要工作是将只包含一个星点的小图像中的星点中心确定下来,当然方法很多,这里主要利用了质心法和高斯拟合法。
    3.星点跟踪,这一步的工作是确定两张图像中的对应星点,进而算出两张图像的像素单位的偏移,这里的算法主要是基于几何特征,因此一次可以计算很多星点,这样该算法就不同于phd只寻找一个星点,当然具体好不好我就不管了吧
    4.一些数学算法类,我利用C++封装了一些类从而便于书写程序,其中包括了:离散傅里叶变换器(用于分析导星误差以及给出周期误差预测)、随机抽样一致性算法圆拟合类(用于对极轴)、模糊pid控制器(用于导星控制)


    IP属地:上海来自Android客户端2楼2023-01-17 14:46
    回复
      上位机实际执行的函数主要是以下这些:
      1.极轴校准,由于自制的赤道仪没有给极轴镜留位置,因此这里我利用导星镜对极轴,极轴校准的步骤是,第一步,将导星镜调整到与赤道仪极轴同轴,这一步就需要赤经轴转起来,观测北极星在导星镜图像里面划过的轨迹,利用算法拟合这个轨迹得到一个圆,这个圆的中心就是赤道仪极轴在导星镜图像中的位置,第二步,将北极星移到这个圆心的位置,这样就将赤道仪极轴指向了北极星,第三部,利用当地恒星时得到北极星的位置,极轴下面两个调整电机运行规定的角度将极轴放置于北天极
      2.自动寻星,自动寻星算法也是自己写的,即首先将所有星星坐标输入程序,计算赤道仪该运行多少度,将度数发到赤道仪,当然说起来简单,但是也得考虑很多问题,第一,赤道仪不能打到脚架,这就要求赤纬大半圆的位置要根据星点位置而变化,要使得赤道仪赤纬大半圆不能经过中天(因为赤纬轴坐标覆盖率180度而赤道仪的赤纬轴可以转360度),第二,需要进行校准,得到赤道仪的角度误差曲线,这里使用的是最小二乘法拟合,可以进行大于等于3的任意星校准。
      3.导星,上述很多数学class都是为了导星服务的,导星算法大致分为这几步,第一步,测量赤经轴、赤纬轴的运行方向向量,因为我的导星相机位置每次都是现安装的,每次的位置都不一样,因此每次两个轴运行在图像上造成的星点偏移方向都不一样,第二步,测量角度传递系数,这个名字是我起的,意义是将图像中星点偏移的像素值换算为赤道仪运行的角度值需要乘以的常数,第三步,进入导星死循环,在进循环之前首先录入一个初始图像并提取星点,在循环中持续读导星镜的实时图像,利用跟踪函数计算这一时刻和初始图像的偏移,转换为赤道仪运行的角度,发送给赤道仪。
      在导星中有很多小tips如下:
      第一,这个导星算法其实是一个pid控制算法,我写了程序段记录导星误差的离散积分以及变化率,因此给到赤道仪的角度并非是1:1的图像偏移
      第二,导星中使用了傅里叶变换,在前500次时持续给傅里叶变换器输入数据,在500次之后傅里叶变换提取导星误差里的周期分量,在之后的时间里加入傅里叶周期预测,减少了一些误差
      第三,导星并非一直使用同一个初始图像,当偏移超过阈值的次数超过规定次数时就将这一实时的星点作为初始位置
      第四,导星是运行在两个线程的,因为运行在一个线程会导致图像很卡看着不爽,因此我建立了第二个线程专门从导星相机读数据并提取星点


      IP属地:上海来自Android客户端3楼2023-01-17 14:47
      回复
        一些结果:
        1.导星误差,在没有加入傅里叶变换时导星误差最大4角秒,均值0.25角秒,加入傅里叶变换预测后最大误差降低到2角秒,均值几乎不变(注意这里的角秒是赤道仪运行的角度即2/3600度,不知道和爱好者口中的误差是不是一个东西,但是单位是一样的)
        2.造价,因为走了很多弯路,因此造价来到了8500元
        3.耗时,赤道仪的机械设计花了五个月,期间还被有个淘宝老板鸽了,算法程序设计用了七个月,使用的是C和C++语言,写了15000行代码,利用了OPENCV进行图像识别,该程序没有GUI,因此运行的时候主界面是个DOS的黑框框,其他窗口是来自OPENCV的窗口,看着粗制滥造。
        4.收获,感觉还行,现在要努力愁保研的事了,等我大四有空了继续优化吧!
        还是那句话,学机械的还是有点糙


        IP属地:上海来自Android客户端4楼2023-01-17 14:48
        回复










          IP属地:上海来自Android客户端5楼2023-01-17 14:52
          回复


            IP属地:新疆来自Android客户端6楼2023-01-17 15:19
            回复


              IP属地:辽宁来自Android客户端7楼2023-01-17 15:27
              回复
                大佬NB


                IP属地:浙江来自Android客户端8楼2023-01-17 15:48
                回复
                  牛逼


                  IP属地:江苏来自iPhone客户端9楼2023-01-17 15:48
                  回复
                    这是清华还是哪个985的大佬?这么NB!当毕业设计满分!


                    IP属地:安徽来自Android客户端11楼2023-01-17 16:10
                    收起回复


                      IP属地:河南来自Android客户端12楼2023-01-17 18:46
                      回复
                        请收下我的膝盖


                        IP属地:云南来自Android客户端13楼2023-01-17 19:00
                        回复
                          无敌


                          IP属地:北京来自Android客户端14楼2023-01-17 19:13
                          回复
                            这个不是毕业设计,就是个小爱好吧


                            IP属地:上海来自Android客户端15楼2023-01-17 19:24
                            回复
                              大佬🐮


                              IP属地:重庆来自iPhone客户端16楼2023-01-17 22:18
                              回复