Audela
Audela

Qu'est-ce qu'un script ?

Qu'est-ce qu'un script ?

1. Définition d'un script

Un script Tcl est un fichier texte contenant des lignes de commandes à exécuter. Par exemple, on peut effectuer un enchaînement de plusieurs fonctions sans intervenir manuellement:

for {set k 1} {$k<=10} {incr k} {
 acq 20 2
 saveima "image-$k"
}

Pour devenir un script Tcl, ce texte doit être écrit dans un fichier (édité avec Notepad, Wordpad, kwrite, etc.). Audela, et l'interface Audace en particulier, permettent de lire ce fichier et exécutent les commandes. L'exemple ci-dessus, exécuté par l'interface Audace, permet de réaliser l'acquisition de 10 images de 20 secondes de pose en binning 2x2. A la fin de chaque pose, l'image est sauvée sur le disque avec un numéro qui s'incrémente à chaque pose. La syntaxe exacte de ce script peut vous paraître obscure pour le moment. C'est normal. Cette page est destinée à éclaircir la situation. De toute façon, la plupart des scripts utiles pour observer, avec l'interface Audace, n'utilisent qu'un petit nombre de fonctions dont nous donnons ici une liste utile pour l'acquisition et le traitement des images :

Noter que la plupart des fonctions de traitement d'images (sub, opt, etc.) peuvent être appliquées sur un lot d'images si on termine la fonction par le chiffre 2 (ex: sub2, opt2, etc.).

Revenons à nos scripts. Ils servent donc à simplifier les tâches d'observation, aussi bien pour l'acquisition des images que pour leur traitement. L'utilisation de scripts ne nécessite aucune connaissance en programmation. On peut donc utiliser des scripts très compliqués, écrits par d'autres, et avoir une méthode d'observation très performante sans être soit même programmeur. Néanmoins, si vous souhaitez personnaliser un script ou bien en écrire un nouveau, il faut savoir programmer. Si vous ne savez pas programmer, il est temps de commencer avec les scripts Audela. En effet, au cours de ces pages, nous allons vous guider pour comprendre la syntaxe des scripts utilisés par Audela.

Audela utilise des scripts écrits en langage Tcl. De cette façon, les scripts de Audela bénéficient des multiples champs d'action du langage Tcl. A noter que la syntaxe Tcl ne dépend pas du type de système d'exploitation présent sur l'ordinateur. Un script écrit par un utilisateur Linux est compatible Windows et vice versa.

On trouvera la syntaxe complète du langage Tcl/Tk dans la page débuter en langage Tcl.

2. Démarrer un script

L'interface Audace permet de lancer les scripts à partir d'un menu :

Cette façon de procéder est spécifique à l'interface Audace. Dans un cadre plus général, n'importe qu'elle interface du logiciel Audela permet de lancer un script à condition d'être équipée d'une ligne commande. C'est le cas aussi de l'interface Audace par l'intermédiaire de sa console. Dans ce cas, si le fichier de script Tcl s'appelle test1.tcl (placé dans le dossier audela), il suffit de valider la ligne de suivante dans la ligne de commande :

source test1.tcl

3. Quelques scripts pour débuter

Nous allons nous attacher à décrire les grandes familles de scripts utiles pour observer. On distingue habituellement les familles suivantes:

Ces trois familles sont présentées dans l'ordre de difficulté croissante. Nous allons passer rapidement en revue ces familles en donnant quelques exemples. Bien entendu, il est possible de mélanger ces trois familles. Pour le moment, nous allons les étudier séparément pour comprendre le rôle de chacune d'elle.

3.1. Enchaîner automatiquement l'exécution des commandes

Il s'agit des scripts les plus communs. Ils servent généralement à résoudre un problème donné. Par exemple, on a un lot d'images brutes dans les fichiers b1.fit, b2.fit, ..., b10.fit et veut soustraire l'image dark.fit à chacune de ces dix images. Faire cela manuellement pour chaque image est très vite fastidieux, avec un risque d'erreur non négligeable. On préférera donc écrire un petit script qui va réaliser une boucle sur les 10 images :

# remarque : fichier subdark.tcl
for {set k 1} {$k<=10} {incr k} {
 loadima b$k
 sub dark.fit 0
 saveima b$k
}

La syntaxe peut s'expliquer ainsi :

3.2. Définition de nouvelles fonctions

Ce genre de script a pour vocation d'ajouter de nouvelles fonctions à l'interpréteur de commandes. Celui-ci ne les exécutera que si on les appelle utltérieurement. On peut donc créer ainsi des "macros", c'est à dire des suites de fonctions que l'on appelle souvent. Par exemple, l'interface Audace utilise de tels scripts pour créer des macros qui simplifient l'écriture. La fonction loadima est ainsi faite (cf. sa définition dans le fichier aud1.tcl).

Si l'on trouve qu'il est trop long d'écrire "sub dark.fit 0" (par exemple, on considère que l'extension du fichier est toujours .fit et que la constante est toujours zéro) et qu'on voudrait remplacer cela par la syntaxe "sb dark", nous devons écrire le script suivant :

# remarque : fichier newproc.tcl
proc sb { nom_fichier } {
 sub ${nom_fichier}.fit 0
}

Dans ce script, nous avons créé une nouvelle fonction dont le nom est "sb".

Ainsi, le script de suite de fonctions correspondant à la soustraction du dark aux 10 images peut se simplifier :

# remarque : fichier subdark.tcl
source newproc.tcl
for {set k 1} {$k<=10} {incr k} {
 loadima b$k
 sb dark
 saveima b$k
}

Dans ce script, on commence à exécuter le script qui définit la nouvelle fonction sb (dans le fichier newproc.tcl). On voit bien ici que le script newproc.tcl ne fait rien à proprement parler. Il enrichit simplement les fonctions disponibles.

Il est intéressant de se confectionner une série de petites fonctions utilitaires : réalisation d'un dark médian, d'un bias médian, extraction d'un flat, etc.

3.3. Intéraction avec l'interface utilisateur

Cette famille de scripts présente de plus ou moins grandes complexités. En tout état de cause, cette interaction est un point fort du logiciel Audela et permet de constituer une véritable interface personnalisée. Voici un exemple très simple en trois lignes :

# remarque : fichier startdark.tcl
toplevel .mywin
button .mywin.but1 -text "soustraire le dark" -command { source subdark.tcl
  }
pack .mywin.but1

Les trois fonctions utilisées (toplevel, button et pack) proviennent de la librairie Tk, le complément graphique de Tcl. Voici quelques explications :

L'interface Audace est entièrement créée sous la forme de scripts qui construisent l'interface utilisateur. Ainsi, il est possible de modifier l'interface Audace à volonté.

4. Quelques exemples simples

Quelques exemples suivants permettent de comprendre comment fonctionnent les scripts dans des applications concrètes. Tous les exemples suivants doivent être exécutés dans l'interface Audace.

4.1. Images de noirs et réalisation du noir médian

Le prétraitement des images brutes impose la réalisation d'une image de calibration appelée "noir" (dark en anglais). Cette image doit être réalisée dans des conditions très voisines des images brutes : même binning, même temps de pose mais avec l'obturateur fermé. Enfin, on peut montrer que l'on peut éviter de perdre de la qualité dans l'image prétraitée si l'image de noir résulte d'une pile médiane de plusieurs images noires.

Nous allons donc supposer que vous ayez déclaré votre caméra dans l'interface Audace (menu Réglages->Caméra) et qu'elle possède un obturateur. Voici un script qui permet de prendre 5 poses de noirs (temps de pose 60 secondes, binning 2x2) puis d'en extraire l'image du noir médian :

# - début du script
cam1 shutter closed
acq 60 2
saveima noir-1
acq 60 2
saveima noir-2
acq 60 2
saveima noir-3
acq 60 2
saveima noir-4
acq 60 2
saveima noir-5
cam1 shutter synchro
smedian noir- noirmedian 5
# - fin du script

Analysons le contenu du script ligne par ligne :

Si l'on souhaite réaliser 10 images de noir au lieu de 5, il faut ajouter des lignes au script. Il devient vite pénible d'ajouter des lignes, d'autant qu'elles se ressemblent toutes à cela prêt que l'indice varie. Le langage script Tcl permet d'écrire des boucles. Ces boucles permettent de répéter un ensemble de fonctions autant de fois que l'on souhaite. Dans notre cas, il suffit de changer le nombre de boucles à effectuer pour prendre 5 ou 10 ou un tout autre nombre d'images. La boucle contient donc une variable appelée compteur et qui va être incrémentée à chaque tour. Lorsque le compteur dépasse la consigne du nombre de poses, le script arrête de boucler et continue avec l'instruction suivante du script. Le script suivant fait donc la même chose que le précédent mais avec une telle boucle :

# - début du script
cam1 shutter closed
for {set k 1} {$k<=5} {incr k} {
 acq 60 2
 saveima noir-$k
}
cam1 shutter synchro
smedian noir- noirmedian 5
# - fin du script

Nous venons ainsi de modifier le script en le réduisant de volume et en augmentant ses capacités puisque l'on peut changer le nombre d'images noires en changeant simplement 5 par une autre valeur. Cependant, remarquons qu'il faut changer le chiffre 5 deux fois dans le script. Ceci est source d'erreur si l'on oublie de changer l'une des deux valeurs. Pour éviter l'erreur, on peut initialiser le nombre total de boucles à effectuer au début du script et assigner cette variable pour la synthèse de la médiane. Cela donne le script suivant :

# - début du script
set n 5
cam1 shutter closed
for {set k 1} {$k<=$n} {incr k} {
 acq 60 2
 saveima noir-$k
}
cam1 shutter synchro
smedian noir- noirmedian $n
# - fin du script

La ligne set n 5, assigne la valeur 5 à la variable n. Ensuite, nous avons simplement remplacé les deux chiffres 5 par le mot $n. Le symbole $, placé devant la variable, signifie que l'on remplace $n par la valeur de la variable n. Il suffit de changer 5 par 10 dans la ligne "set n 5" pour qu'on réalise 10 images. Nous venons donc de voir qu'une même opération peut être générée par des scripts différents. Heureusement, la réalisation de "beaux" scripts n'est pas nécessaire pour parvenir à réaliser le but fixé. Néanmoins, à force d'écrire des scripts, on apprend à les améliorer.

4.2. Tri automatique d'images avec une WebCam

La technique classique d'acquisition d'images WebCam consiste à enregistrer une scène d'environ 100 images que l'on cherche ensuite à trier pour extraire les meilleures images. Nous allons écrire un petit script qui réalise un tri automatique des images par un critère de contraste. L'idée est de diviser l'acquisition en deux phases : la première consiste à prendre 20 images et à en déduire le critère de contraste qui permettra la sélection. La seconde phase consiste à prendre les images et à ne garder que celles qui sont meilleures que le critère de contraste de la sélection. Le critère de contraste est calculé en effectuant la somme, sur tous les pixels, de l'opposée de la valeur absolue de la différente de deux pixels adjacents. Il est tout à fait possible de changer facilement ce critère par autre dans le script proposé ici.

# - début du script
# === fonction d'acquisition couleur pour WebCam
proc acq_couleur {} {
 cam1 snap_rgb
 rgb_split 1 -rgb bgr
}
# == cherche le critere de contraste
set n 20
set meilleur_contraste 0
for {set k 1} {$k<=$n} {incr k} {
 acq_couleur
 set resultat [buf1001 stat]
 set contraste [lindex $resultat 8]
 if {$constraste<$meilleur_contraste} {
 set meilleur_contraste $constraste
 }
}
# == acquisition et enregistre uniquement les meilleurs images
set ntot 3000 ; # on fait 3000 images dans le pire des cas
set nselec 100 ; # on enregistre les 100 premières meilleurs
    images
set km 0
for {set k 1} {$k<=$ntot} {incr k} {
 acq_couleur
 set resultat [buf1001 stat]
 set contraste [lindex $resultat 8]
 if {$constraste<=$meilleur_contraste} {
 incr km
 rgb_save jupiter-$km
 }
 if {$km>=$nselec} {
 break
 }
}
# - fin du script

Ce script est beaucoup plus complexe que les précédents. Il se divise en trois parties:

Analysons en détail ce script :

Ce script de moins de quarante lignes montre les puissantes possiblités qu'offrent les scripts de Audela. De nombreuses tâches répétitives peuvent ainsi être automatisées et permettent d'observer plus vite et plus confortablement.

5. Compatibilité d'écriture des scripts

L'interface Audace utilise la fonction proc pour ajouter de nombreuses fonctions supplémentaires à Audela. Il est possible de créer une nouvelle interface qui fonctionnera en dehors du contexte Audace, mais alors de nombreuses fonctions décrites ci dessus ne sont plus accessibles. La liste complète des fonctions spécifiques à l'interface Audace sont repérées par le sigle [AC] dans la page consacrée à l'inventaire de toutes les fonctions disponibles.

Une documentation complète sur la compatibilité d'écriture des scripts peut être consultée. Dans le cas spécifique de l'interface aud'ACE, il est important de consulter la page dédiée aux règles à respecter pour que le script soit compaticle avec les variables d'environnements définies pdans Audace.

| English Version | Mailing List Audela | ©2004 Audela | Design TechnoSpeak