ASCOM dla programistów aplikacji użytkowych

Wprowadzenie do wykorzystania API platformy ASCOM w aplikacjach użytkowych

ASCOM to bardzo poręczna platforma zapewniająca ustandaryzowaną obsługę sprzętu astronomicznego. Producenci sprzętu dostarczają sterowniki, a aplikacje końcowe jak PHD, czy Nebulosity mogą od razu je obsługiwać. Dla programistów chcących pisać sterowniki albo wykorzystywać API w aplikacjach końcowych czeka sporo grzebania w surowej dokumentacji. Dodatkowo nieco pomocna może okazać się lista dyskusyjna. Daleko ASCOMowi do np. dokumentacji Django, ale mimo to - da się tego używać.

Na dzień dobry oprócz samej platformy instalujemy dodatkowe komponenty dla programistów dostarczające potrzebne biblioteki jak i dokumentację. ASCOM wykorzystuje platformę .NET, ale można tworzyć aplikacje końcowe w wielu innych językach wykorzystując technologię COM.

Dokumentację znajdziemy w Program Files/ASCOM/Platform 6 Developer Components/Developer Documentation (lub "Program Files (x86)" w 64-bitowych Windowsach). Najbardziej interesujący jest manual PlatformDeveloperHelp.chm - zawiera on kilka przykładów oraz całą przestrzeń nazw biblioteka ASCOMa.

API dla aplikacji końcowych

Aplikacje końcowe (użytkowe) - czyli te, co chcą kontrolować sprzęt astronomiczny poprzez ASCOM - np. kamerę, czy montaż. W takich przypadkach wykorzystujemy ASCOM.DriverAccess oferujące API do obsługi kopuł, kamer, kół filtrowych. focuserów, rotatorów, czy montaży. W PlatformDeveloperHelp.chm znajdziemy całą przestrzeń nazw ładnie "opisaną".

Python i COM

Dla języków spoza rodziny .NET udostępniono API poprzez COM. Oto przykładowy skrypt Pythona, który nakazuje montażowi skierować teleskop na podane koordynaty:

import win32com.client      #needed to load COM objects

#Identyfikator sterownika
#ASCOM.Simulator.Telescope
tel = win32com.client.Dispatch("Celestron.Telescope")
if tel.Connected:
    print "	->Telescope was already connected"
else:
    tel.Connected = True
    if tel.Connected:
        print "	Connected to telescope now"
    else:
        print "	Unable to connect to telescope, expect exception"

tel.Tracking = True
tel.SlewToCoordinates(12.34, 86.7)     # !!!pick coords currently in sky!
tel.Connected = False

Za pomocą win32com.client.Dispatch ładujemy bibliotekę, lub jak w tym przypadku sterownik-urządzenie. Jako "Celestron.Telescope" przedstawia się sterownik Celestrona do montaży (swoich i SkyWatchera). Sterownik ten ma API dokładnie takie jak ASCOM.DriverAccess.Telescope. Na początku trzeba "połączyć" się z urządzeniem ustawiając właściwość "Connected" na True. Własność Tracking włącza śledzenie (domyślnie Sideral). Metoda "SlewToCoordinates" ustawi montaż tak by teleskop celował w podane koordynaty (RightAscension, Declination).

Żeby obsługiwać sprzęt, który użytkownik chce trzeba dać mu opcję wyboru. W powyższym przykładzie użyłem "Celestron.Telescope". Identyfikator sprzętu, który użytkownik wybrał zwraca ASCOM.Utilities.Chooser.

import win32com.client      #needed to load COM objects
x = win32com.client.Dispatch("ASCOM.Utilities.Chooser")

x.DeviceType = 'Telescope'
print x.Choose(None)

Chooser potrafi wybierać każdy typ sprzętu obsługiwany przez ASCOM. Metoda Choose wyświetli okno dialogowe i po jego zamknięciu zwróci identyfikator sterownika-sprzętu. Ustawienia zmienione w oknie dialogowym zostaną zapisane w tle.

ascom_chooser
ascom_chooser2

IronPython

IronPython to implementacja Pythona na platformie .NET. Implementacja ta może wykorzystywać biblioteki .NET

#-*- coding: utf-8 -*-

import clr

# załadowanie DLL
clr.AddReference("ASCOM.DriverAccess.dll")

from ASCOM.DriverAccess import *

#a = Telescope('ASCOM.Simulator.Telescope')
a = Telescope('Celestron.Telescope')
a.Connected = True

a.SlewToCoordinates(11.11, 11.11)

a.TrackingRate = 0
a.Tracking = True
a.Connected = False

API jest to samo, tylko inaczej się importuje. W katalogu ze skryptem umieściłem także bibliotekę ASCOM.DriverAccess.dll z Program Files/ASCOM/Platform 6 Developer Components/Components/Platform6. Skrypt wykonujemy interpreterem IronPythona - ipy.exe.

W przypadku np. kamer wygląda to podobnie:
#-*- coding: utf-8 -*-

import clr

clr.AddReference("ASCOM.DriverAccess.dll")

from ASCOM.DriverAccess import *

a = Camera('ASCOM.Simulator.Camera')
a.Connected = True
a.StartExposure(1, True)

wait = True
while wait:
    if a.ImageReady:
        wait = False


print list(a.ImageArray)

"Zdjęcie" otrzymujemy w postaci tablicy, którą następnie należy zapisać. Na chwilę obecną nie mam gotowego rozwiązania. W przypadku .NET może to być biblioteka CSharpFITS, a w przypadku Pythona pyFITS. W przypadku CSharpFITS potrzebna będzie także biblioteka nunit - trzeba będzie dołączyć nunit.framework.dll by CSharpFITS mógł się poprawnie załadować.

clr.AddReference("nunit.framework.dll")
clr.AddReference("CSharpFITS.dll")

from nom.tam.fits import *
blog comments powered by Disqus

Kategorie

Strony