Smart Laser Alignment algorithm

The SLA functions mainly from the two python modules lat_improved_image_process.py and lat_lm1_algo.py. These are both instantiated by the launch controller, which contains the necessary functions to execute the SLA.

LAT-LM1 reconstruction matrix calibration procedure

From the argos_sx_terminal or argos_dx_terminal:
argos.lan.controller.calibrateLatLm1AlignmentAlgo()

The calibration procedure is visualized in the following image:

calibarrow.png

The lasers start at a home position (a) then move into four positions (b,c,d) corresponding to different calibration offsets (k) applied to the phi and theta movements of the LM1 mirrors.

Nominal laser target calibration procedure

The goal of the SLA is to align the endpoints of each laser triplet (red circle in image below) to a nominal target (yellow circle). When the endpoints overlap this target (green circle), the LGSs aligns with the WFS:

redcircl.pnggreencircl.png

If current target is false, a new target will need to be set into the system. First manually align the lasers. Then run the following sequence in argos_sx_terminal or argos_dx_terminal:
targetTag= "TIMESTAMP"
from argos.lan.device.lat_base import LatTargetPosition
laserPosition= argos.lan.controller.getLatLaserPositionCircle[0:2]
newTarget= np.array(laserPosition)
targetToStore= LatTargetPosition(np.array(newTarget)
argos.lan.calibrationManager.storeLatTargetPosition(targetTag, targetToStore)

or for manual new target input of [targetX,targetY]:
targetTag= "TIMESTAMP"
targetX,targetY= [,]
from argos.lan.device.lat_base import LatTargetPosition
newTarget= np.array([targetX,targetY])
targetToStore= LatTargetPosition(np.array(newTarget))
argos.lan.calibrationManager.storeLatTargetPosition(targetTag, targetToStore)

Then change the corresponding target to the TIMESTAMP in Ranger. Also set LAN.CALIB.TAG.LAT_TARGET_POS:String in argos_sx_lan.cfg or argos_dx_lan.cfg to TIMESTAMP.

Reference Laser Slope

The SLA uses a reference slope for each SX and DX side that the lines formed by the lasers projected onto the LAT CCD follow. These slopes should remain the same for both sides unless the camera is rotated. If such an event occurs and the SLA can no longer detect lasers, new reference slopes must be set for LAN.CALIB.TAG.LAT_TARGET_POS in Ranger and the argos_sx_lan.cfg and argos_dx_lan.cfg files.

The current procedure for finding the new slopes is rather primitive, but it is possible to write an automatic slope finder script that works while only SX or only DX lasers are propogating. The manual slope finding procedure is:
  • Take LAT image
  • Open fits image in DS9
  • Select Region > Shape > Line
  • Draw on the laser image along one of the lasers
  • Double click the drawn line
  • Slope = tangent(Angle)
  • Repeat for other laser side

Laser Alignment procedure (GUI)

target= argos.lan.controller.getLatNominalTargetPosition()

#Take an image with LAT and fit a circle to the laser endpoints. Extract the [x,y] position of the circle position= argos.lan.controller.getLatLaserPositionCircle()[0:2]

#Calculate difference in pixels between laser target and position offsetInPixels= target - position

#Use reconstruction matrix stored in system to convert pixel offset to relative movement coordinates to apply to LM1 offsetInLM1Arcsecs= argos.lan.controller.convertOffsetLatPixelsToLm1Arcsecs(offsetInPixels)

#Apply relative movement coordinates to LM1 argos.lan.controller.startLM1RelativeMovement(offsetInLM1Arcsecs)

Parameter references

SLA direct use hack

Sometimes the constituents of the SLA (functions and classes) must be called directly for testing purposes. The following can be pasted into the argos terminals to use the LatImageProcess and LatLm1AlignmentAlgo directly:
import logging
logging.basicConfig(level= logging.DEBUG)
from argos.util.logger import Logger, PythonLoggerFactory
Logger.setLoggerFactory(PythonLoggerFactory())


from argos.lan.device.lat_improved_image_process import LatImageProcess
from argos.lan.lgs_alignment.lat_lm1_algo import LatLm1AlignmentAlgo

# Connecting to LAN controller property tree
argos.lan.controller.getState()
propertyTree= argos.lan.controller._propertyTree

# HACK(mk) Initialize access to telescope elevation in LAN property tree
argos.lan.controller._propertyTree.setTelescopeElevationInDegree(42)
import time; time.sleep(2)


lip= LatImageProcess(argos.lan.calibrationManager)
algo= LatLm1AlignmentAlgo(argos.lan.devicePool, lip ,argos.lan.calibrationManager)

class LatAlignmentConfigure(object):

    def __init__(self, lip, algo, propertyTree):
        self._latImageProcess= lip
        self._latLm1AlignmentAlgo= algo
        self._propertyTree= propertyTree

        self._latImageProcess.setLaserSlope(
            self._propertyTree.getLatLaserSlope())

        self._latImageProcess.setMinimumLaserFlux(
           self._propertyTree.getMinimumLaserFlux())
           
        self._latImageProcess.setDarkFrameTag(
            self._propertyTree.getLatDarkFrameTag())
        self._latImageProcess.setFlatFieldTag(
            self._propertyTree.getLatFlatFieldTag())
        self._latLm1AlignmentAlgo.setTargetPositionTag(
            self._propertyTree.getLatTargetPositionTag())
        self._latLm1AlignmentAlgo.setReconstructionMatrixTag(
            self._propertyTree.getLatLm1ReconstructionMatrixTag())
        self._latImageProcess.setElevation(argos.lan.controller._propertyTree.getTelescopeElevationInDegree())
        
LatAlignmentConfigure(lip, algo, propertyTree)

Proposed Improvements

Moncular vs Binocular targets

It has become apparent that the laser nominal position targets for both sides shift between monocular and binocular mode. Four targets total should be stored, two for SX and two for DX, to account for these two modes.

Current targets:
Side Mode x y Tag
SX Monocular 840 1090 MONO_20160521_232000
  Binocular 915 1070 BINO_20160519_205000
DX Monocular 1050 1050 MONO_20160519_183000
  Binocular 975 1045 BINO_20160519_183000

Clouds in laser path

The presence of clouds causes the lasers to fall short of their usual endpoints. This leads the lower parts of the lasers to align with the nominal targets, which means the usual endpoints are extending beyond the nominal targets. Two solutions are proposed:

Flux restoration

Use the LIDAR equation to fit to the integrated laser flux profiles not affected by clouds, effectively giving the original laser endpoints.

Reference slope scan

Use reference slope stored for each SX and DX to move down the path of the lasers from the target. This should eventually find the point where the WFS is aligned with the LGS
Topic revision: r3 - 07 Aug 2018, AndrewColson
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback