eddy_em: (Default)
[personal profile] eddy_em
Чтобы наиболее качественно построить модель СКН для любого телескопа, желательно пройтись по большому количеству звездных полей, распределенных на полусфере неба равномерно. В случае с БТА я руководствовался медлительностью телескопа, поэтому точки были неравномерно распределены: по 4 точки (Z=10,30,50 и 70 градусов) на четырех основных азимутах (A=0,90,180 и 270 градусов) и по две точки (Z=40 и 60) на промежуточных азимутах.
Но для сравнительно быстрого полуметрового экваториала можно увеличить количество точек и распределить их равномерно. Естественно, алгоритм равномерного распределения точек по сфере существует давным-давно. Мне первым попался этот ответ на SO. Мерзопакостную пхытонятину заменил на octave. Получилось вот что:
num_pts = 200;
indices=[0:num_pts/2-1]+0.5;
phi = acos(1 - 2*indices/num_pts);
theta = pi * (1 + sqrt(5)) * indices;
x=cos(theta) .* sin(phi);
y=sin(theta) .* sin(phi);
z=cos(phi);
scatter3(x,y,z)
lowest=10*pi/180;
idx=find(phi<lowest);
phi(idx)=[];
theta(idx)=[];

f=fopen("out", "w")
for i = 1:98; fprintf(f, "%.3f\t%.3f\n", mod(theta(i), 2*pi)*180/pi, phi(i)*180/pi); endfor
fclose(f)

В получившемся файле имеем распределение точек по полусфере, начиная с высоты в 10° и заканчивая почти зенитом. Отсортированы они по высоте, поэтому в баше выполняем sort out -n и получаем список, отсортированый по азимуту (так будет удобней: меньше перекладок телескопу делать).
Вот так выглядит этот набор точек на полусфере:

А так — в проекциях азимут-высота:


Надеюсь, 98 точек хватит, чтобы монтировка могла построить нормальную модель СКН.
Вот еще, правда, нужно будет выяснить, что за косяк у 10micron с вычислением рефракции. Похоже, они берут значение в килопаскалях, потому что если ввести 780, то отклонение получается очень значительным.

Получившийся файл — еще не совсем то, что нужно для того, чтобы погонять экваториальную монтировку. Поэтому доделываем. Сначала заведем файл ang.m:
function s=ang(a)
% convert angle (in degr) into a string DD:MM:SS
    sgn = "";
    if(a < 0) sgn = "-"; a = -a; endif
    d = floor(a);
    a = (a-d)*60.;
    m = floor(a);
    a = (a-m)*60.;
    s = sprintf("%s%d:%d:%.1f", sgn, d, m, a);
endfunction

А теперь после получения phi/theta делаем вот что:
A=[]; H=[]; for i = 1:98; A=[A 180-mod(theta(i), 2*pi)*180/pi]; H=[H phi(i)*180/pi]; endfor
[~,idx]=sort(A)
As=A(idx); Hs=H(idx);

f=fopen("out", "w")
for i = 1:98; fprintf(f, "%s\t%s\n", ang(As(i)), ang(Hs(i))); endfor
fclose(f)

Сортировку делаем уже средствами Octave.
Ну, а сформировав файл, наводимся при помощи баш-скрипта:
#!/bin/bash

function sendcmd(){
    echo $1 | nc 192.168.70.33 10001 -q10
}

while read A H; do
    sendcmd ":Sz${A}#"
    sendcmd ":Sa${H}#"
    sendcmd ":MS#"
    while true; do
        ANS=$(sendcmd ":Gstat#")
        echo $ANS
        [ $ANS == "0#" ] && break
        sleep 2
    done
    fli_control -x15000 field
done

Как-то так: ./sendcmd < out (вчера я допилил stellariumdaemon, чтобы можно было на порт 10001 подсоединяться в отладочную консоль, не мешая основным процессам; правда, забыл на гитхаб push сделать).
Единственный косяк в этом подходе — альтазимутальный порядок точек, в результате чего вблизи полюса монтировка довольно долго мотается туда-сюда. По-хорошему, нужно бы преобразовать эти координаты в часовой угол/прямое восхождение и отсортировать по часовому углу. Но для этого придется ваять уже сишную "наводилку", т.к. придется подключать libsofa для преобразования координат между разными системами.

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 25th, 2025 08:53 pm
Powered by Dreamwidth Studios