Audela |
![]() |
L'une des applications de base des scripts en observation astronomique est d'enchaîner des images d'objets du ciel profond (galaxies, amas, nébuleuses). Par exemple, on peut programmer un marathon Messier. La méthode couramment employée consiste à écrire un fichier texte qui contient la liste des objets à observer, ainsi que les caractéristiques de la pose CCD à effectuer. On peut ainsi faire une petite balade dans le ciel profond.
Ce script fonctionne sous Audace sans interface graphique propre et constitue un exemple typique d'une application facile à programmer.
Admettons que l'on veuille observer les objets Messier 2, 15 et 31. Le fichier texte peut ressembler à cela :
M2 21 33 30 -00 49 60 2 5
M15 21 30 0 +12 10 30 1 7
M31 0 42 42 +41 16 60 1 5
Appelons objs.txt ce fichier à placer dans le dossier audela. Pour chaque ligne, les champs sont les suivants :
Le script suivant montre l'enchaînement des fonctions pour observer automatiquement ces trois objets. Le fichier texte obj.txt doit être placé dans le dossier courant (utiliser la fonction pwd pour le connaître). Avant d'exécuter ce script, assurez vous bien qu'un télescope et une caméra sont connectés :
# === fichier tour.tcl ===
#
# --- recupere la liste des objets dans le fichier texte
set input [open "obj.txt" r]
set contents [split [read $input] \n]
close $input
# --- fait une boucle d'acquisition
foreach obj $contents {
# --- extrait les infos de l'objet
set name [lindex $obj 0]
set rah [lindex $obj 1]
set ram [lindex $obj 2]
set ras [lindex $obj 3]
set decd [lindex $obj 4]
set decm [lindex $obj 5]
set expose [lindex $obj 6]
set binning [lindex $obj 7]
set nbposes [lindex $obj 8]
# --- coordonnees de l'objet
set ra "${rah}h${ram}m${ras}s"
set dec "${decd}d${decm}m$"
# --- pointe le telescope
tel1 goto [list $ra $dec]
# --- boucle sur le nombre de poses
for {set k 1} {$k<=$nbposes} {incr k} {
# --- lance l'acquisition ---
acq $expose $binning
# --- sauve l'image
saveima "$name-$k"
}
}
Il suffit de lancer le script tour.tcl par la ligne de commande de la console de Audace :
source tour.tcl
ou bien par le menu Script->Exécuter de l'interface Audace.
La façon la plus simple de charger le fichier texte en mémoire est de charger tout le texte d'un seul coup dans une liste Tcl. Pour cela, il convient d'abord d'ouvrir le fichier texte :
set input [open "obj.txt" r]
La variable input contient l'identificateur Tcl du fichier ouvert. L'argument r signifie que le fichier est ouvert en lecture seule. Le contenu du fichier est lu par la fonction read :
set contents [split [read $input] \n]
De cette façon, l'ensemble du contenu du fichier est lu (si on avait voulu lire qu'une partie du fichier on aurait ajouté un nombre de caractères après le mot $input et la fin du fichier aurait été détectée en utilisant la fonction eof de Tcl). Après la lecture, la fonction split va "découper" le texte en une liste dans laquelle chaque élément représente une ligne du fichier (\n est le symbole du passage à la ligne). La variable contents est donc une liste de trois éléments. A noter que chacun de ces éléments est lui même constitué d'une liste de neuf éléments. Si on demande la valeur de la variable contents (set contents) on aurait :
{M2 21 33 30 -00 49 60 2 5} {M15 21 30 0 +12 10 30 1 7} {M31 0 42 42 +41 16 60 1 5}
Le fichier est fermé par la fonction close.
close $input
N'oubliez pas de fermer les fichiers.
Il faut analyser les éléments de la liste des observations pour extraire les paramètres de pointage et de pose pour chaque objet. La boucle foreach permet d'analyser les éléments de la liste un par un :
foreach obj $contents {
La variable obj contient la liste des paramètres d'un objet donné. Il convient maintenant de décoder ces paramètres. Pour cela il faut isoler chaque élément de la liste et le reporter dans une variable :
# --- extrait les infos de l'objet
set name [lindex $obj 0]
set rah [lindex $obj 1]
set ram [lindex $obj 2]
set ras [lindex $obj 3]
set decd [lindex $obj 4]
set decm [lindex $obj 5]
set expose [lindex $obj 6]
set binning [lindex $obj 7]
set nbposes [lindex $obj 8]
On remarquera que le premier élément (le nom dans notre cas) porte d'indice zéro. C'est une convention des listes Tcl. Le neuvième élément a l'indice 8.
On met en forme les deux variables de coordonnées (RA = Ascension Droite ; DEC = Déclinaison). La fonction tel1 goto est suivie d'une liste des deux éléments RA DEC :
# --- coordonnees de l'objet
set ra "${rah}h${ram}m${ras}s"
set dec "${decd}d${decm}m$"
# --- pointe le telescope
tel1 goto [list $ra $dec]
Normalement, le script ne continue que si le télescope a fini de pointer. Attention de penser à créer un télescope avant de lancer le script (fonction tel1 create dans Audela ou menu Réglage->Télescope dans l'interface Audace).
Une fois le télescope pointé, il devient possible de lancer les poses. Nous allons faire une boucle sur le nombre de poses à effectuer. La fonction for comporte quatre arguments : le premier concerne l'initialisation des variables de boucle, le deuxième concerne la condition de sortie de la boucle, le troisième indique l'incrément à donner à la variable de boucle (incr k augmente la valeur de k de une unité) et le quatrième argument contient ce qu'il faut exécuter dans la boucle.
# --- boucle sur le nombre de poses
for {set k 1} {$k<=$nbposes} {incr k} {
Il est donc maintenant possible de lancer la pose dans cette boucle :
# --- lance l'acquisition ---
acq $expose $binning
La fonction acq est définie dans l'interface Audace pour effectuer un pose puis affiche l'image dans la zone image du logiciel. Si l'on désire utiliser le script dans un contexte extérieur à l'interface Audace, il faudrait remplacer cette ligne par :
# --- lance l'acquisition ---
cam1 exptime $expose
cam1 bin [list $binning $binning]
cam1 acq
# --- attend la fin de l'acquisition
vwait status_cam1
La fonction vwait suspend l'exécution du script durant la pose : la fonction attend que la variable d'état de la caméra (status_cam1) change de valeur. Ce changement est réalisé automatiquement par Audela en fin de pose.
Il reste à enregistrer l'image sur le disque :
# --- sauve l'image
saveima "${name}-$k"
}
}
L'avant dernière accolade ferme la boucle des poses, la dernière ferme la boucle foreach sur les objets.
Ce script constitue une base à partir de laquelle on peut apporter de nombreux raffinements :