AffineTransformation2D

AffineTransformation2D

我有一个固定的全天空相机,想适应WCS的解决方案(地图像素x,y到alt,az)。如果我确定一些恒星,我就能得到一个初始解

import numpy as np
from astropy.modeling import models, fitting
from astropy.modeling.projections import Sky2Pix_ZEA, AffineTransformation2D
from scipy.optimize import minimize

# Stars of known x,y on chip and alt,az in sky.
star_obs = np.array([('Achernar', 3441.0, 2918.0, 49.947050461141515, 215.1280625253878),
                    ('Achernar', 3576.0, 3018.0, 43.715460044327585, 217.98734214492922),
                    ('Betelgeuse', 2123.0, 971.0, 43.319872170968644, 40.984431336638984),
                    ('Betelgeuse', 2330.0, 956.0, 47.122656796538564, 32.091831385823845),
                    ('Betelgeuse', 2677.0, 949.0, 51.30177229534061, 14.886238412655885),
                    ('Canopus', 2221.0, 2671.0, 55.59320568854928, 141.12216403321605)],
                    dtype=[('star_name', 'S10'), ('x', '<f8'), ('y', '<f8'),
                    ('alt', '<f8'), ('az', '<f8')])

class sky2pix(object):
    def __init__(self, x, y, alt, az):
        projection = Sky2Pix_ZEA()
        self.affine = AffineTransformation2D()
        self.x = x
        self.y = y
        self.projx, self.projy = projection(az, alt)

    def __call__(self, x0):
        self.affine.translation.value = x0[0:2]
        self.affine.matrix.value = x0[2:]
        newx, newy = self.affine(self.projx, self.projy)
        residuals = np.sum((newx - self.x)**2 + (newy-self.y)**2)
        return residuals

fun = sky2pix(star_obs['x'], star_obs['y'], star_obs['alt'], star_obs['az'])
x0 = np.array([np.median(star_obs['x']), np.median(star_obs['y']), 1., 0., 0., 1.])
fit_result = minimize(fun, x0)

我想利用astropy制作复合模型的能力,只需说proj_aff = Sky2Pix_ZEA + AffineTransformation2D然后将其输入到astropy.modeling.fitting例程中,但我不知道如何处理返回2个输出的AffineTransformation2D

最佳答案

目前,astropy.modeling中的装配工都不能处理多个输出(我也遇到过这个限制),但文档中对此并不清楚。此外,由于某些原因,模型Sky2Pix_ZEAAffineTransformation2D当前具有属性fittable=False
我现在已经打开了一个issue来支持多个输出,同时也打开了一个documented the limitation来支持多个输出,但我不确定有人能在多快的时间内完成这项工作(几乎肯定不能赶上即将发布的v2.0)。
请注意,如果您感兴趣的话,您可以通过对Fitter(如here所述)进行分类来编写自己的装配工。一个同事已经写了几十个专门的只有几十行,虽然有几个层与统计函数和优化器接口,以了解(从现有的代码)。

关于python - 使用已识别的恒星将WCS坐标解决方案拟合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43548183/

10-10 18:21