Чтобы наиболее качественно построить модель СКН для любого телескопа, желательно пройтись по большому количеству звездных полей, распределенных на полусфере неба равномерно. В случае с БТА я руководствовался медлительностью телескопа, поэтому точки были неравномерно распределены: по 4 точки (Z=10,30,50 и 70 градусов) на четырех основных азимутах (A=0,90,180 и 270 градусов) и по две точки (Z=40 и 60) на промежуточных азимутах. Но для сравнительно быстрого полуметрового экваториала можно увеличить количество точек и распределить их равномерно. Естественно, алгоритм равномерного распределения точек по сфере существует давным-давно. Мне первым попался этот ответ на SO. Мерзопакостную пхытонятину заменил на octave. Получилось вот что:
В получившемся файле имеем распределение точек по полусфере, начиная с высоты в 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 для преобразования координат между разными системами.