Поиск

Равномерно распределенные по полусфере точки


Чтобы наиболее качественно построить модель СКН для любого телескопа, желательно пройтись по большому количеству звездных полей, распределенных на полусфере неба равномерно. В случае с БТА я руководствовался медлительностью телескопа, поэтому точки были неравномерно распределены: по 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 для преобразования координат между разными системами.
eddy_em.livejournal.com

Добавить комментарий