Deep Sky Memories

横浜の空で撮影した星たちの思い出

シリウスBチャレンジしてみたがシリウスAの場所がわからない。もう一度撮影しろと言われてももう遅い (2022/3/12)

3月12日は月面モザイク撮影の後、そのままμ-180Cの直焦点でシリウスBを撮影しました。阿南市科学センターが昨年末から「シリウスBチャレンジ」という観測キャンペーンをやっていて触発されたからです。

今年に入ってから公式 Twitter アカウント(@siriusb_wd)もできて、僕はそれで知りました。

シリウスBは2年前に撮っているのですが、今回はセンサーサイズの大きなカメラがあるので周囲の星も写るような写真も撮って、位置や離角を測定してみようと思いました。

機材は月面モザイク撮影の時の状態そのままで、μ-180C 直焦点に ASI294MM Pro (Bin 1)、フィルターなし、という構成です。

まず、周囲の星の位置を記録するために4秒露出で撮ったものがこれです。

シリウス (2022/3/12 20:05)
シリウス (2022/3/12 20:05)
高橋 ミューロン180C (D180mm f2160mm F12 反射) / Vixen SX2 / ZWO ASI294MM Pro (Bin 1, Gain 150, 10℃), SharpCap 4.0.8667.0, 露出 4秒 x 16コマ / DeepSkyStacker 4.2.6, Photoshop 2022, Lightroom Classic で画像処理。

縦の高さが 8K 相当(4320 pixel)になるように少しクロップしています。シリウスの光条がなかなかかっこいいです。インスタでもちょっとウケました。まあ、6本の細い光条は副鏡スパイダー由来の回折像だし、8本の太めの光条は方向からしておそらくCMOSセンサー由来のパターンなのでシリウスそのものとは何の関係もない模様ですが…

これを4倍に拡大(クロップ)します。

シリウス (2022/3/12 20:05) (4倍)
シリウス (2022/3/12 20:05) (4倍)

同じサイズでシリウスBが写るように1/15秒露出で撮って画像処理したものがこれです。

シリウス A + B (2022/3/12 19:52) (4倍)
シリウス A + B (2022/3/12 19:52) (4倍)
高橋 ミューロン180C (D180mm f2160mm F12 反射) / Vixen SX2 / ZWO ASI294MM Pro (Bin 1, Gain 150, 10℃), SharpCap 4.0.8667.0, 露出 1/15秒 x 250/500コマ / AutoStakkert!3 3.0.14, RegiStax 6.1.0.8, Photoshop 2022, Lightroom Classic で画像処理。

シリウスBに光条が半分かぶさっていますね。2020年に撮った写真ではもう少し離れていたのですが… μ-180C は鏡筒にアリガタが固定されているため、同じ架台に載せれば光条の方向は同じになります。シリウスBは地球から見て時計回りに周っているので来年あたりは光条と重なってしまいそうです。

さて、シリウスBの位置を測定しましょう、ということで、GW中から色々やっていたのですが…

まずは最初の写真を2倍に拡大(クロップ)したものを*1 astrometry.net でプレートソルブをしてみたのですが… ダメです。シリウスの位置のアノテーションが大きくズレてしまいます。

シリウス (2022/3/12 20:05) (astrometry.net でプレートソルブ)
シリウス (2022/3/12 20:05) (astrometry.net でプレートソルブ)

ローカルにインストールした astrometry.net でも試したのですが同様でした。クソ眩しいシリウスが邪魔しているのでしょうか?原因は後で判明するのですが…

これではダメだということで、astropy でなんとか計算する方法を考えます。最初に astrometry.net を使ったのは WCS (天球座標と画像上の座標との変換器)を作るためでした。WCS は astrometry.net がプレートソルブ時に生成する wcs.fits というファイルからロードできます。

調べてみると astropy には基準になる赤経/赤緯がわかっている星の画像上の位置を何点か指定して WCS を生成する方法があるようです。ならばと Stellarium で周囲の星の赤経/赤緯を調べようとしたのですが、シリウスの周りはほとんど星が描かれていません…

シリウスが明るすぎてデータがないのでしょうか?やや離れた位置にいくつか同定できる星があったのでそれを指定して WCS を生成してシリウスAとBのXY座標を天球座標に変換してみたのですが、シリウスAの位置が Wikipedia に書かれた座標とだいぶ違う位置になってしまいました。

まず考えたのは歪曲収差の影響です。でも Dall-Kirkham に歪曲収差ってあるのかな?ちょっと情報がみつけられなかったのですが、コマ収差で星像の重心位置もズレそうなので画面の端の方の星を指定するのは避けたいところ。

それなら真ん中のシリウスAの座標を指定したらよいのでは?ということで、やってみたのですが、シリウスAとBの離角がかなりズレてしまいました。そんなものなのかなー、と思いつつ、赤経/赤緯のグリッド線を描画してみるとなんと赤経線と赤緯線が直交してません。

https://rna.sakura.ne.jp/share/sirius-b-mesurement-fail-01.png

なにこれ?と思って指定した基準星の座標の入力ミス等がないかチェックしたり、基準星の同定ミスがないかチェックしたりしてみたのですが、問題は見つからず。とにかく基準星を中心近くにみつけようと、Aladin Lite で探しました。

デフォルトの DSS2 等ではシリウスの周りは白飛びしてしまって星が同定できないのですが、2MASS に切り替えると比較的近くまで星が見えるので、これで SIMBAD に載っている星を選んで指定してみたところ、赤経線と赤緯線が直交するようになり、縦横1分角のクロスヘアを描画して縦横比を確認しても問題なさそうでしたが、シリウスAの位置が30秒角近くズレてしまい振り出しに戻りました…

シリウスは地球から近い(8.6光年)ので年周視差の影響?と思ったのですが年周視差は400ミリ秒角以下なので30秒角近いズレは説明がつきませんし、方向的にも合いません。

わけがわからなくてふて寝してたのですが、まさか固有運動?と思って調べたところ年間1.3秒角ぐらい動くようです。SIMBAD に載ってる座標って何時の時点の座標なんでしょう?観測時の座標だとしたらソースが2007年発表の論文なのでそれより前。それともepochがJ2000なので2000年時点の座標なんでしょうか?2000年以後の観測だと観測時点の座標から固有運動の分巻き戻した値?

よくわからないけど、Stellarium は固有運動考慮して位置を表示してるって言うから Stellarium の表示が正しい?と思ったら、固有運動の大きい恒星の座標が間違っているというバグがあるみたいですね…

なんか、1分角以内の誤差ならほとんどのユーザーは気にしないんだから自分で直せとか言われてて "low importance" ラベル貼られて放置されてます…

とりあえずシリウスの固有運動のせいならシリウスAとBの間の位置関係の測定には支障がないはず、と思うことにして、図を描いてみました。

シリウスA+B (2022/3/12 19:52) 位置測定結果(拡大)
シリウスA+B (2022/3/12 19:52) 位置測定結果(拡大)

「Sirius A (2007)」が現在 SIMBAD に載っているシリウスA座標で、ソースは VAN LEEUWEN F. Validation of the new Hipparcos reduction. (Astronomy and Astrophysics, volume 474, 653-664 (2007/11-1)) です。

最初に astrometry.net が出した画像を重ねるとアノテーションシリウスAの位置はこの「Sirius A (2007)」に一致しました。どうやらアノテーションのズレは、astrometry.net が固有運動を考慮していないせいだったようです。

「Sirius A (Stellarium 0.22.1 (2022/3/12))」は Stellarium 0.22.1 で撮影日時の空を表示した時に表示された座標です。「Sirius A (2007)」よりは写真上のシリウスAに近いですが、それでもだいぶズレています。

「Sirius A (observed (2022/3/12))」は写真上のシリウスAの座標です。写真上の位置としては6本の光条の交点を使っています。正確には1点に交わらなかったので、中心部に出来た三角形の中心点を使っています。

「Sirius B (observed (2022/3/12))」は写真上のシリウスBの座標です。光条と少し重なって星像の中心点がわかりづらかったので、反対側に伸びた光条を反転したものを減算して光条のカブリをキャンセルした像を見て中心点を決めました。

シリウスAとBの離角を計算すると約11.6秒角(東に約10.3秒角、北に約5.5秒角)と出ました。シリウスBチャレンジのサイトに載っている値とほぼ一致しました。

https://rna.sakura.ne.jp/share/sirius-b-fig4.jpg
観察しよう | シリウスBチャレンジ より。

シリウスBは2021年~2024年頃において、地球から見たとき主星(シリウスA)から最も離れて見える時期を迎えます。このとき離角は11.3秒角に達します。今期を逃せば、次回はまた約50年後となります。なおシリウスBの発見以来、同じような見頃となる時期は過去1870年代、1920年代、1970年代にありました。
観察しよう | シリウスBチャレンジ より。

シリウスAの位置の件は本当に気になりますが、とりあえずそれっぽい値がでてきたのでよしとします。また撮ってみたいのですが、上でも書いたように μ-180C ではスパイダーの光条の関係で2025年頃まで観測は難しそうです。その間シリウスAは固有運動で5秒角くらい動く計算。そのあたりも含めて測定できたら面白いかな…

ちなみにタイトルは「追放系」ラノベタイトルのパロディです。実は「追放系」は一度も読んだことないんですけど… すみません。「なろう」はダンジョン脱出を目指すパーティが全員方向音痴だったという謎な小説しか読んだことがありません。*2

データとスクリプト

最後にこの計算に使ったデータとスクリプトを貼っておきます。ある程度汎用的に作ってありますが動作結果は無保証です。

データ

references.json

座標系の決定に使う基準星のデータです。

[
  {
    "name": "BD-16 1589",
    "x": 3826,
    "y": 3398,
    "ra": "06h44m58.68333s",
    "dec": "-16d47m50.6410s"
  },
  {
    "name": "BD-16 1586",
    "x": 5149,
    "y": 2276,
    "ra": "06h44m39.08151s",
    "dec": "-16d43m43.7368s"
  },
  {
    "name": "Gaia DR2 2947057475918406784",
    "x": 2457,
    "y": 888,
    "ra": "06h45m19.97874s",
    "dec": "-16d38m53.3484s"
  }
]
taegets.json

位置計算の対象となる星のデータです。"ra", "dec" (天球座標)が書いてある星は "x", "y" (写真上の位置)の計算対象、"x", "y" が書いてある星は "ra", "dec" の計算対象です。

座標系が正しく決定されているか確認するために天球座標のわかっているいくつかの星のデータを追加してあります。

[
  {
    "name": "Sirius A (2007)",
    "ra" : "06h45m08.91728s",
    "dec" : "-16d42m58.0171s"
  },
  {
    "name": "Sirius A (Stellarium 0.22.1 (2022/3/12))",
    "ra" : "06h45m08.45s",
    "dec" : "-16d43m39.2s"
  },
  {
    "name": "Sirius A (observed (2022/3/12))",
    "x": 3240,
    "y": 2161
  },
  {
    "name": "Sirius B (observed (2022/3/12))",
    "x": 3193,
    "y": 2135
  },
  {
    "name": "TYC 5949-2705-1",
    "ra" : "06h45m39.85092s",
    "dec" : "-16d37m27.3042s"
  },
  {
    "name": "TYC 5949-2765-1",
    "ra": "06h45m47.85991s",
    "dec": "-16d41m08.7441s"
  },
  {
    "name": "CSS 254",
    "ra": "06h44m28.87639s",
    "dec": "-16d42m58.3959s"
  },
  {
    "name": "TYC 5949-2747-1",
    "ra": "06h44m29.28203s",
    "dec": "-16d37m20.2212s"
  },
  {
    "name": "TYC 5949-2643-1",
    "ra": "06h44m32.59814s",
    "dec": "-16d35m32.3589s"
  }
]

astro-image-masurement.py

references.json と targets.json と元画像を与えると計算結果(results.json)と星のマーカーとグリッドを記入したSVG画像を出力するスクリプトです。

#!/usr/bin/env python
import json
import math
import numpy as np
from astropy import units as u
from astropy.coordinates import Angle
from astropy.coordinates import SkyCoord
from astropy.wcs import WCS
from astropy.wcs.utils import fit_wcs_from_points
import svgwrite
from PIL import Image
import base64
from argparse import ArgumentParser

argparser = ArgumentParser(description='get RA/DEC of target position.')
argparser.add_argument('ref_json', metavar='reference_stars.json',
                       help="reference stars data file.")
argparser.add_argument('target_json', metavar='target_stars.json',
                       help="target stars data file.")
# argparser.add_argument('image_width', help="width of image (pixels).")
# argparser.add_argument('image_height', help="height of image (pixels).")
argparser.add_argument('in_image', help="input jpg/png file.")
argparser.add_argument('out_svg', help="output svg file.")
args = argparser.parse_args()
ref_stars = None
target_stars = None

with open(args.ref_json, 'r', encoding='utf-8') as f:
    ref_stars = json.load(f)

with open(args.target_json, 'r', encoding='utf-8') as f:
    target_stars = json.load(f)

def ra_dec_to_angle(str_or_deg):
    if (type(str_or_deg) is str):
        return Angle(str_or_deg)
    else:
        return Angle(str_or_deg, u.deg)
    
ref_ra = []
ref_dec = []
ref_x = []
ref_y = []
proj_point = 'center'
for star in ref_stars:
    ra = ra_dec_to_angle(star['ra'])
    dec = ra_dec_to_angle(star['dec'])
    ref_ra.append(ra.deg)
    ref_dec.append(dec.deg)
    ref_x.append(star['x'])
    ref_y.append(star['y'])
    if ('proj_point' in star) and star['proj_point']:
        proj_point = SkyCoord(ra=ra.deg, dec=dec.deg, frame="icrs", unit=u.deg)

target_xy = []
xy_index = []
target_radec = []
radec_index = []
for i, star in enumerate(target_stars):
    if 'x' in star:
        xy_index.append(i)
        target_xy.append([star['x'], star['y']])
    elif 'ra' in star:
        radec_index.append(i)
        target_radec.append((ra_dec_to_angle(star['ra']).deg,
                             ra_dec_to_angle(star['dec']).deg))

stars = SkyCoord(ra=ref_ra, dec=ref_dec, frame="icrs", unit=u.deg)
pixels_x = np.array(ref_x)
pixels_y = np.array(ref_y)
wcs = fit_wcs_from_points(xy=[pixels_x, pixels_y],
                          world_coords=stars,
                          proj_point=proj_point)

radec_result = wcs.wcs_pix2world(target_xy, 0)
# for xy in target_xy:
#    print(wcs.pixel_to_world(xy[0], xy[1]))

for i, star_index in enumerate(xy_index):
    star = target_stars[star_index]
    star['ra'] = Angle(radec_result[i][0], u.deg).to_string(unit=u.hour)
    star['dec'] = Angle(radec_result[i][1], u.deg).to_string(unit=u.degree)

xy_result = wcs.wcs_world2pix(target_radec, 0)
for i, star_index in enumerate(radec_index):
    star = target_stars[star_index]
    star['x'] = xy_result[i][0]
    star['y'] = xy_result[i][1]

output = json.dumps(target_stars, indent=2, ensure_ascii=False)
print(output)

image = Image.open(args.in_image)
w = image.width
h = image.height
corner_points = wcs.wcs_pix2world([[0, 0], [w, 0], [0, h], [w, h]], 0)

ra_min = Angle(min(list(map(lambda p: p[0], corner_points))), u.deg)
ra_max = Angle(max(list(map(lambda p: p[0], corner_points))), u.deg)
dec_min = Angle(min(list(map(lambda p: p[1], corner_points))), u.deg)
dec_max = Angle(max(list(map(lambda p: p[1], corner_points))), u.deg)

# print("RA: " + ra_min.to_string(unit=u.hour)
#       + " - " + ra_max.to_string(unit=u.hour))
# print("DEC: " + dec_min.to_string(unit=u.deg)
#       + " - " + dec_max.to_string(unit=u.deg))

ra1 = ra_min.hms
ra2 = ra_max.hms
dec1 = dec_min.dms
dec2 = dec_max.dms

ra_h_start = int(ra1.h)
ra_h_last = int(ra2.h)
ra_m_start = int(ra1.m)
ra_m_last = int(ra2.m)
ra_s_start = int(ra1.s)
ra_s_last = int(ra2.s)
ra_scale = []
ra_scale_deg = []
for ra_h in range(ra_h_start, ra_h_last + 1):
    if ra_h == ra_h_last:
        ra_m_stop = ra_m_last + 1
    else:
        ra_m_stop = 60
    for ra_m in range(ra_m_start, ra_m_stop):
        if (ra_h == ra_h_last) and (ra_m == ra_m_last):
            ra_s_stop = ra_s_last + 1
        else:
            ra_s_stop = 60
        for ra_s in range(ra_s_start, ra_s_stop):
            ra = (ra_h, ra_m, ra_s)
            ra_scale.append(ra)
            ra_scale_deg.append(Angle(ra, unit="hourangle").deg)
        ra_s_start = 0
    ra_m_start = 0

dec_d_start = int(dec1.d)
dec_d_last = int(dec2.d)
dec_m_start = int(dec1.m)
dec_m_last = int(dec2.m)
dec_s_start = int(dec1.s)
dec_s_last = int(dec2.s)
dec_scale = []
dec_scale_deg = []
for dec_d in range(dec_d_start, dec_d_last + 1):
    if dec_d == dec_d_last:
        dec_m_stop = dec_m_last + 1
    else:
        dec_m_stop = 60 if (dec_d >= 0) else 1
    for dec_m in range(dec_m_start, dec_m_stop):
        if (dec_d == dec_d_last) and (dec_m == dec_m_last):
            dec_s_stop = dec_s_last + 1
        else:
            dec_s_stop = 60 if (dec_d >= 0) else 1
        for dec_s in list(range(dec_s_start, dec_s_stop)):
            dec = (dec_d, dec_m, dec_s)
            dec_scale.append(dec)
            dec_scale_deg.append(Angle(dec, unit=u.deg).deg)
        dec_s_start = 0 if (dec_d >= 0) else -59
    dec_m_start = 0 if (dec_d >= 0) else -59

# draw output svg
drw = svgwrite.Drawing(args.out_svg, size=(w, h))

# draw image
with open(args.in_image, 'rb') as f:
    mime = ''
    if args.in_image.upper().endswith('.JPG'):
        mime = 'image/jpeg'
    elif args.in_image.upper().endswith('.PNG'):
        mime = 'image/png'
    image_data = 'data:' + mime + ';base64,'
    image_data += base64.standard_b64encode(f.read()).decode()
    drw.add(drw.image(image_data))

# draw grid
ra_lines_h = []
ra_lines_m = []
ra_lines_s = []
for i,ra in enumerate(ra_scale):
    coords = []
    for dec_deg in dec_scale_deg:
        coords.append((ra_scale_deg[i], dec_deg))
    line = wcs.world_to_pixel(SkyCoord(coords, frame="icrs", unit=u.deg))
    ra_h, ra_m, ra_s = ra
    # print((ra_h, ra_m, ra_s))
    if (ra_m == 0) and (ra_s == 0):
        ra_lines_h.append(line)
    elif ra_s == 0:
        ra_lines_m.append(line)
    else:
        ra_lines_s.append(line)

dec_lines_d = []
dec_lines_m = []
dec_lines_s = []

for i,dec in enumerate(dec_scale):
    coords = []
    for ra_deg in ra_scale_deg:
        coords.append((ra_deg, dec_scale_deg[i]))
    line = wcs.world_to_pixel(SkyCoord(coords, frame="icrs", unit=u.deg))
    dec_d, dec_m, dec_s = dec
    # print((dec_d, dec_m, dec_s))
    if (dec_m == 0) and (dec_s == 0):
        dec_lines_d.append(line)
    elif dec_s == 0:
        dec_lines_m.append(line)
    else:
        dec_lines_s.append(line)

def draw_lines(drw, lines, style):
    g = drw.g()
    for line in lines:
        points = []
        for i, x in enumerate(line[0]):
            points.append((x, line[1][i]))
        svg_line = drw.polyline(points)
        svg_line.update({ 'style' : style })
        g.add(svg_line)
    return g

grid_g = drw.g()
ra_g = drw.g()
ra_g.add(draw_lines(drw, ra_lines_h, "stroke: #fcc; stroke-width: 2;"))
ra_g.add(draw_lines(drw, ra_lines_m, "stroke: #ffc; stroke-width: 2;"))
ra_g.add(draw_lines(drw, ra_lines_s, "stroke: #ccc; stroke-width: 1;"))
grid_g.add(ra_g)
dec_g = drw.g()
dec_g.add(draw_lines(drw, dec_lines_d, "stroke: #fcc; stroke-width: 2;"))
dec_g.add(draw_lines(drw, dec_lines_m, "stroke: #ffc; stroke-width: 2;"))
dec_g.add(draw_lines(drw, dec_lines_s, "stroke: #ccc; stroke-width: 1;"))
grid_g.add(dec_g)
drw.add(grid_g)

# draw center mark
# center = SkyCoord.from_pixel(w/2, h/2, wcs)
# min = Angle((0, 1, 0), unit=u.deg)
# c0 = center.directional_offset_by(Angle(0, unit=u.deg), min).to_pixel(wcs)
# c90 = center.directional_offset_by(Angle(90, unit=u.deg), min).to_pixel(wcs)
# c180 = center.directional_offset_by(Angle(180, unit=u.deg), min).to_pixel(wcs)
# c270 = center.directional_offset_by(Angle(270, unit=u.deg), min).to_pixel(wcs)

def to_xy(pixel):
    x = (pixel[0]).item()
    y = (pixel[1]).item()
    return (x, y)

# l1 = drw.line(start=to_xy(c0), end=to_xy(c180), stroke='red', stroke_width='1')
# l2 = drw.line(start=to_xy(c90), end=to_xy(c270), stroke='red', stroke_width='1')
# drw.add(l1)
# drw.add(l2)

def draw_markers(stars, color, font_size):
    for star in stars:
        x = star['x']
        y = star['y']
        l1 = drw.line(start=(x - 4, y), end=(x + 4, y),
                      stroke=color, stroke_width='1')
        l2 = drw.line(start=(x, y - 4), end=(x, y + 4),
                      stroke=color, stroke_width='1')
        drw.add(l1)
        drw.add(l2)    
        t1 = drw.text(star['name'], x=[x+24], y=[y-(font_size * 2)],
                      fill=color, font_size=font_size)
        t2 = drw.text(star['ra'], x=[x+24], y=[y-font_size],
                      fill=color, font_size=font_size)
        t3 = drw.text(star['dec'], x=[x+24], y=[y],
                      fill=color, font_size=font_size)
        g = drw.g()
        g.add(t1)
        g.add(t2)
        g.add(t3)
        drw.add(g)

draw_markers(ref_stars, "#8f8", 48)
draw_markers(target_stars, "#ff8", 24)

drw.save(pretty=True)

results.json

出力結果です。

[
  {
    "name": "Sirius A (2007)",
    "ra": "06h45m08.91728s",
    "dec": "-16d42m58.0171s",
    "x": 3171.2872323943716,
    "y": 2032.3461331144615
  },
  {
    "name": "Sirius A (Stellarium 0.22.1 (2022/3/12))",
    "ra": "06h45m08.45s",
    "dec": "-16d43m39.2s",
    "x": 3198.84000411331,
    "y": 2223.511470771049
  },
  {
    "name": "Sirius A (observed (2022/3/12))",
    "x": 3240,
    "y": 2161,
    "ra": "6h45m07.84766535s",
    "dec": "-16d43m25.56154398s"
  },
  {
    "name": "Sirius B (observed (2022/3/12))",
    "x": 3193,
    "y": 2135,
    "ra": "6h45m08.56224723s",
    "dec": "-16d43m20.10826886s"
  },
  {
    "name": "TYC 5949-2705-1",
    "ra": "06h45m39.85092s",
    "dec": "-16d37m27.3042s",
    "x": 1143.6019365086354,
    "y": 469.298876585322
  },
  {
    "name": "TYC 5949-2765-1",
    "ra": "06h45m47.85991s",
    "dec": "-16d41m08.7441s",
    "x": 593.4770269367737,
    "y": 1486.5362595217844
  },
  {
    "name": "CSS 254",
    "ra": "06h44m28.87639s",
    "dec": "-16d42m58.3959s",
    "x": 5830.79180786849,
    "y": 2077.298236424214
  },
  {
    "name": "TYC 5949-2747-1",
    "ra": "06h44m29.28203s",
    "dec": "-16d37m20.2212s",
    "x": 5833.743239682289,
    "y": 511.1390967611835
  },
  {
    "name": "TYC 5949-2643-1",
    "ra": "06h44m32.59814s",
    "dec": "-16d35m32.3589s",
    "x": 5622.878222448987,
    "y": 8.085561764319664
  }
]

出力画像の方はこんな感じです。ただし、マーカーのテキストが重なる部分や、緑と黄色以外のマーカーの色は手動で(InkScapeで)修正してあります。

シリウスA+B (2022/3/12 19:52) 位置測定結果(緑の大きな文字のマーカーが基準点、その他の小さな文字のマーカーがピクセル位置からの計算結果)
シリウスA+B (2022/3/12 19:52) 位置測定結果(緑の大きな文字のマーカーが基準点、その他の小さな文字のマーカーがピクセル位置からの計算結果)

入力画像は4秒露出画像の上に1/15秒露出画像を重ねたものです。1/15秒露出画像に微かに写った周囲の星を使って手動で位置合わせしています。

separation.py

計算結果(results.json)と、二つの星の "name" を指定して離角を計算するスクリプトです。

#!/usr/bin/env python
import sys
import json
from astropy import units as u
from astropy.coordinates import Angle
from astropy.coordinates import SkyCoord
from argparse import ArgumentParser

argparser = ArgumentParser(description='get RA/DEC of target position.')
argparser.add_argument('stars_json', metavar='stars.json',
                       help="stars data file.")
argparser.add_argument('star_name_a', help="name of star A.")
argparser.add_argument('star_name_b', help="name of star B.")
args = argparser.parse_args()

stars = None
with open(args.stars_json, 'r', encoding='utf-8') as f:
    stars = json.load(f)

star_a = None
star_b = None
for star in stars:
    if star['name'] == args.star_name_a:
        star_a = star
    elif star['name'] == args.star_name_b:
        star_b = star

coord_a = SkyCoord(Angle(star_a['ra']).deg, Angle(star_a['dec']).deg, unit=u.deg)
coord_b = SkyCoord(Angle(star_b['ra']).deg, Angle(star_b['dec']).deg, unit=u.deg)
for_ra = SkyCoord(Angle(star_b['ra']).deg, Angle(star_a['dec']).deg, unit=u.deg)
for_dec = SkyCoord(Angle(star_a['ra']).deg, Angle(star_b['dec']).deg, unit=u.deg)

print(star_a['name'] + ": " + star_a['ra'] + " / " + star_a['dec'])
print(star_b['name'] + ": " + star_b['ra'] + " / " + star_b['dec'])
print("separation: " + coord_b.separation(coord_a).to_string(unit=u.deg) +
      " (" + coord_a.separation(for_ra).to_string(unit=u.deg) + " / " +
      coord_a.separation(for_dec).to_string(unit=u.deg) + ")")

results.json、"Sirius A (observed (2022/3/12))"、"Sirius B (observed (2022/3/12))" を指定し以下の出力を得ました。

Sirius A (observed (2022/3/12)): 6h45m07.84766535s / -16d43m25.56154398s
Sirius B (observed (2022/3/12)): 6h45m08.56224723s / -16d43m20.10826886s
separation: 0d00m11.62396968s (0d00m10.26536042s / 0d00m05.45327512s)

*1:元の写真のままではさすがにデカすぎると思ったので。

*2:自分も方向音痴なのでネットで話題になった時に読みました。文体は馴染めませんでしたがお話は面白かったです。

2021年の天文活動をふりかえる (その1)




昨年は年内の活動をブログエントリにまとめるのが遅れて1月の半ばあたりまで去年の分のエントリをアップしていたところ、仕事が急激に忙しくなりブログどころか天文活動もほぼ不可能になってしまい、4月末あたりまでそんな状況が続きました。

1月中には2021年の振り返りエントリを、と思っていたのですが全然書ける状況ではなく、GWになってやっと時間がとれるようになったので、そろそろ書こうと思いつつ、5月になってそんなエントリ上げても、という気持ちも…

とりあえず、準備しかけて放置していた「統計編」をベースに色々とふりかえっていきます。「統計編」は今回始めての試みで、1年間何を撮ってきたか、機材をちゃんと活用できているか、等を集計して来年の(もう今年ですが…)活動の指針にしようというものです。

チャートは Char.js を使って JavaScript で動的に描画しています。今時のブラウザなら動くと思います(IE11はダメです)。チャートは色分けになっていますが、チャートの上にマウスを持っていくと項目名と数値が表示されます。

撮影対象別集計

まずは撮影回数を撮影対象の種類別に集計したチャートを。

2021年の撮影対象は惑星と月と銀河で過半を占めていました。夏から秋にかけてのベランダ閉鎖がなければ木星土星をもっと撮っていたのですが…

とはいえ過去最高の木星をタイムラプス撮影できたのでそれで十分おなかいっぱい感はありました。

銀河は春の銀河祭り(赤外/ノーフィルター)の分ですね。これをきっかけにアノテーションツール Galaxy Annotator を自作して撮った後の楽しみ方が広がりました。



今年は忙しくて銀河祭りは中止になってしまい、Galaxy Annotator の開発も止まったままですが… アイデアは色々あるのでなんとか再始動したいところです。

彗星はあまり積極的に撮らないのですが2021年は5位にランクイン。レナード彗星とチュリュモフ・ゲラシメンコ彗星のおかげですね。


流星は全く撮らない年も多いのですが、昨年はふたご座流星群を動画で撮りました。動画をチェックするのはダルいのですが、今年に入ってからアストロアーツのつのださんが公開したツールを改造して動画から流星検出とダイジェスト動画の生成ができるようになったので今年はもっと撮るかも?


でも動画だとどうしても 1/30s 以上の露出時間で撮れないので F0.95 のレンズでも絵的に映えないんですよねぇ。でも静止画だと流れてる!って感動に乏しくて。

DSO は銀河と散光星雲に偏っています。星団、あんまり撮りませんね。特に球状星団。冷却CMOSとHαフィルターを買ったので輝線星雲優先になってたのもあったし、実際光害地でもHαは面白いようによく写るので…

球状星団と言えば M13 を未だに撮ってないのはどうかと思うので、今年あたりはなんとかしたいのですが、ベランダからは撮れない位置で外に機材を持ち出さないといけません。スカイメモSでは8cm屈折と冷却CMOSは文字通り重荷過ぎるし、もう少ししっかりして持ち運びもできる赤道儀を買うか、それとも SX2 をどうにか持ち出すか…

「衛星」も木星土星の衛星を撮ってるので実質「惑星」カテゴリでしょうか。月・惑星関係が20回、DSO 関係が19回(ただし写野内に複数の種類があるものはそれぞれカウントしています)で、概ねバランスよく撮影している感じです。

流星が少ないのと昨年は太陽を撮りませんでしたが、まあ、オールラウンダーと言ってよいのではないでしょうか。まあ、オールラウンダーということはより先に進む際に機材投資が対象のタイプ毎に分散してしまうので必ずしもよいことではないのですが…

使用鏡筒/レンズ別集計

次は、機材関連。まず、使用鏡筒/レンズ別の集計です。

8cm 屈折の BLANCA-80EDT が過半数を占めました。18cm 反射の M-180C (μ-180C)ではまだ DSO は撮っていないのと、月の全景も BLANCA-80EDT を使っているのでこうなりました。

一時期 RedCat が宝の持ち状態になりかけていましたが、2021年はそこそこ活用できた感じです。彗星の撮影に使った他、当初の目的でもあった大きめの DSO の撮影にも使いました。



接眼部がしっかりしているので冷却CMOSとの組み合わせでも安心ですし、スカイメモS でもギリギリ運用可能で、野外での撮影でも重宝しました。写りも良いし、F値が明るくてピントがシビアな割にピントリングが渋くて往生する以外は本当にいい鏡筒です。

μ-180C は相変わらず光軸も出荷時のまま無調整で使っていますが、問題なく使えてます。遠征で車に乗せたりしたら調整が必要なのかもしれませんが、ベランダで使う分にはメンテナンスフリーに使える感じで助かります。

μ-180C については今年は純正フラットナーレデューサーとの組み合わせで懸案の DSO 撮影(オフアクシスガイダー使用)にチャレンジしてみようと思います。というか、実は先日チャレンジしました。まだ課題は多いですが、まるで無理というわけでもなさそう。後日エントリを上げる予定です。

使用カメラ別集計

続いて使用カメラ別の集計です。

2021年は月惑星に加えて銀河の撮影にも惑星用CMOSカメラを使っていたので ASI290MM/MC で半数近くを占めました。惑星撮影には両方使ってて二重カウントになってるせいもありますが…

2021年はやはり新規に投入した冷却CMOSカメラ ASI294MM Pro が早速活躍してくれました。失敗分もカウントしていますが、既にメインカメラのポジションです。




いきなりモノクロカメラは無謀かとも思ったのですが、なんとか実用になっています。撮影も画像処理も大変ですが、個人的には苦労する甲斐はあるかな、という印象。一晩に多くの対象を撮りたい人には向きませんが。

Hαフィルターによるナローバンド撮影も始めたので、馬頭星雲みたいなHαの赤い星雲を撮るのが楽しくてしかたがないです。というかモノクロカメラで良かったことの半分以上はこれですね。

ASI294MM Pro は Binning 1 で使用すると ASI290MM より高解像度なので、太陽面や月面の撮影にも使えます。もう OM-DE-M1 Mark II の出番がないのでは?とも思いますが、フォーサーズマイクロフォーサーズの電子式ピントリングを動かす手段が今のところないので、これらのレンズを使う場合はまだ必要です。

また、動きの速い天体をカラーで撮るのはモノクロCMOSでは厳しいのですが、レナード彗星の撮影もなんとかなったので(むちゃくちゃ忙しい撮影になりましたが)画質を考えるとなるべく冷却CMOSで撮りたい気持ちです。でもここは ASI294MC Pro が欲しいかなぁ…

使用架台別集計

機材系の最後は使用架台別の集計ですが、SX2 とスカイメモSしか持ってないので…

ベランダではSX2、野外(含むマンションの廊下)ではスカイメモS、という使い分けです。スカイメモSは重い冷却CMOSカメラでの撮影では制約が大きいですし、SX2 は長焦点のオフアキガイドで十分な精度が出ない気がするので、どちらもアップデートしたい気持ちはありますが、先立つものが…

SX2 を野外に持ち出す算段もいまだに付かず。小さめのハーモニックドライブ赤道儀で全部まかなうか?とも思っていたのですが、こないだビクセンワイヤレスユニット買ったばかりなんですよね。ビクセンさん、RST-135クラスのハーモニックドライブ赤道儀出しませんか?って、出てもすごい値段になっちゃうんだろうなー…

撮影場所別集計

次は撮影場所別の集計。

まあ、ひきこもり天文家なので圧倒的に自宅ベランダですね、これは。マンションの廊下もひきこもりのうちと見るなら一回だけ徒歩圏内の公園で M31 を撮ったっきりですね。導入むっちゃ苦労したし、自動導入可能でポータブルな赤道儀が欲しい、などと堕落したことを言ってしまいますが、もういいトシなので許して…

撮影月所別集計

続いて撮影日時にまつわる集計。まず、撮影月別の集計。

2021年は8月から9月末までベランダが封鎖されていたため8月はナシ、9月も1回だけでした。それ以外は一年中撮ってる感じですが、10月以降は冷却CMOSカメラ導入に伴うテスト的な撮影もあり、年末にレナード彗星が接近したこともあって、過半数がこの時期に集中しました。

ともあれ、一年中楽しめる趣味として天文活動を続けていられるのは良いことです。今後も続けていきたいです。

撮影時刻別集計

最後に撮影時刻別の集計。基本的に撮影開始の時刻です(木星等は de-rotation 時の基準時刻)。

まあ、2021年は太陽撮らなかったので金星食以外は全部夜ですね…

夜の撮影はだいたい日没後ベランダに機材を出してドリフトアライメントしてってやってると、最初の撮影対象は21時台に撮影開始になることが多くて、2つ目の対象を撮る場合は0時頃になる感じでしょうか。

この集計、特に得るものはなかったですね…

2021年ベストショット

ここで2021年のベストショットを選んでおきます。サムネにいい感じの写真を載せたいので…

木星 (2021/7/17 2:16)
木星 (2021/7/17 2:16)
高橋 ミューロン180C (D180mm f2160mm F12 反射), AstroStreet GSO 2インチ2X EDレンズマルチバロー (合成F41.4), ZWO IR/UVカットフィルター 1.25", ZWO ADC 1.25" / Vixen SX2 / L: ZWO ASI290MM (Gain 276), RGB: ZWO ASI290MC (Gain 360) / 露出 1/60s x 1500/3000コマをスタック処理 x6 (L:3, RGB:3) をLRGB合成 / AutoStakkert!3 3.0.14, WinJUPOS 12.0.7, RegiStax 6.1.0.8, Photoshop 2021, Lightroom Classic で画像処理

色々ありましたが、個人的にはやはりこれ。2018年に μ-180C で木星を撮るようになってから数えても木星はこれがベストショットです。拡大光学系もカメラも機材はずっと同じなのでほぼシーイングがベストだったということですね。

正直、これなら C9.25 (23.5cm シュミカセ)で撮った写真にも勝ってるのでは?C11 (28cm シュミカセ)ともいい勝負かも?下剋上じゃあ!とか思ってたんですが、2021年の夏は全国的に?好シーイングに恵まれたようで、その後、ネットには凄い写真が続々とアップされたのでした…

やはり惑星撮影はシーイングが命。とはいえ、絶好のシーイングに遭遇するためにも、遭遇した際にバッチリ撮れるようにするためにも、シーイングの乱れに心を乱すことなく日々精進を続けなくてはなりませんね。

その他いろいろ

その他、2021年の心に残った出来事を。

まず、『月刊 星ナビ』の「ネットよ今夜もありがとう」という天文系ブログやサイトの紹介記事にこのブログが載ったこと。

載った人が次に載せる人を決めるリレー形式の連載で、僕のところにはだいこもんさん(id:snct-astro)からバトンがまわってきました。あらためましてどうもありがとうございます!そして僕が受け取ったバトンは「もりのせいかつ」の k さんに渡したのでした。

このリレーは、HIROPONさん(id:hp2) → だいこもんさん(id:snct-astro) → 僕(id:rna) という形ではてなの天文ブログが続いたので、この機会にはてな内でバトンを回していくかとも思ったのですが、それもちょっと… と思って春の銀河祭りの際に銀河の撮影の件でお世話になった k さんに渡しました。

と思ったら、後日 k さんのブログははてなブログにお引越し(「もりのせいかつ 別館」)。やはりはてな村の陰謀…?ではなくてココログの容量がいっぱいになったのだとか。というわけで k さん(id:mayururii)、今後ともよろしくお願いします。

コミュニティ関連といえば、昨年は天リフのライブ配信イベントをちょいちょい見るようになりました。スパチャとか初めてやりましたね。

世は動画配信時代で、長時間露出と画像処理が必要な天文趣味はなかなか配信では映えない趣味でしたが、電子観望技術の進歩でライブ配信で楽しく天体を見ることができるようになり、天リフさんもそのへん力を入れています。たぶんこのへんが今後の天文の普及のカギになるところだと思うので、是非頑張っていただきたいです。

さて、天文趣味のバックグラウンドには天文学という膨大な知識が蓄えられた学問があり、科学的な知識を深めることで楽しみも深まります。2021年は「光年」について少し真面目に勉強しました。最初は「○○億光年先の銀河が写った!」とか自慢したかっただけだったんですが…

宇宙における「距離」というのは奥が深くて、光が1年かけて進む距離=1光年という単位もなにかとミスリーディングで最近では一般向けには使わなくなっているとのこと。宇宙モデルとか宇宙論パラメータとか未だにさっぱりなんですが、自分の手が届かないところにも大事な知識がたくさん積み上がっているのを実感した一件でした。

「その2」では…

これで2021年のまとめはおしまい、と思ったのですが、ベストショットをまとめて見られるエントリがあった方がいいですし、ここ数年やってるスライドショーも作っておきたいので近日中に「その2」をアップしたいと思います。

M60, NGC4647 と超新星SN 2022hrs (2022/4/22)

4月22日は昼の太陽の撮影の後、ベランダに出した機材をそのままにしておいて、夜から M60 と NGC4647 の銀河のペアを撮りました。

というか、狙いはもちろん4月16日に板垣公一さんが発見した超新星 SN 2022hrs 狙いです。

発見当時は15等ということで透明度次第ではどこまで写るか?という心配はありましたが、とにかく撮らなきゃわからんということで。機材は BLANCA-80EDT と ASI294MM Pro です。実は μ-180C でオフアキやるための機材は既に届いていたのですが、超新星がいつまで撮れるかわからないので、ここはまず確実に撮っておきたいと思って。

結果はこうなりました。

M60, NGC4647, SN 2022hrs (2022/4/22 21:35)
M60, NGC4647, SN 2022hrs (2022/4/22 21:35)
笠井 BLANCA-80EDT (D80mm f480mm F6 屈折) + ED屈折用フィールドフラットナーII (合成F6) / Vixen SX2, D30mm f130mm ガイド鏡 + ZWO ASI290MM + PHD2 2.6.10 による自動ガイド / ZWO ASI294MM Pro(Binning 1, Gain 150, -10℃), SharpCap 3.2.6482.2, 露出 R:2分 x 22コマ, G:2分 x 22コマ, B:2分 x 21コマ / DeepSkyStacker 4.2.6, Photoshop 2022, FlatAid Pro 1.2.3, Lightroom Classic で画像処理

SN 2022hrs 撮れました!超新星を撮ったのは初めてです。超新星出現前の M60 と NGC4647 の写真は昨年2月に撮ったものがあったのでスケールを合わせて重ねた比較動画を作りました。動画の最後にアノテーションを入れてあります。

M60+NGC4647+SN2022hrs
M60+NGC4647+SN2022hrs

NGC4647 の南東方向に去年はなかった星があるのがわかります。明るさは周りの恒星と比較すると13等台前半ぐらいでしょうか?発見時の15等から随分増光しているようです。

よく見ると他にも前後で明るさが異なる星があるのですが、これは昨年の写真は赤外(IRパスフィルター)で、今年の写真はRGBフィルターで撮ったため、写っている波長が異なるためだと思われます。

昨年の写真の撮影データ等はこちらを参照してください。

なお銀河のアノテーションには昨年作った Galaxy Annotator を使っています。

超新星アノテーションはこのツールの出力の SVG を手動で編集して(Inkscapeで編集したものをテキストエディタで手直し)追加しました。

上の写真は中心部をクロップしたもので、全体はこんな感じです。

M60とその周辺 (2021/4/22 21:35)
M60とその周辺 (2021/4/22 21:35)
撮影データは上に同じ。

西側に M59 も写っています。背景のカブリの色むらがかなり出て暗い銀河をあまり炙り出せなかったのですが、15.5等までの銀河のアノテーションを加えたものを以下に。

M60とその周辺 (アノテーション付き(15.5等まで)) (2021/4/22 21:35)
M60とその周辺 (アノテーション付き(15.5等まで)) (2021/4/22 21:35)

写真をクリックすると flickr に飛ぶので拡大して見てみてください。ギリギリの写りですが15億光年先の銀河も写っているのがわかります。

さて、撮影データを見て気付いた方もいらっしゃるかと思いますが、今回は LRGB 合成ではなく RGB 合成になっています。実は途中まで L も撮っていたのですが、L だけ星像が流れる現象が発生して RGB のみにしました。

L,R,G,Bの星像の違い
L,R,G,Bの星像の違い
L:1分 x 12コマ, R:2分 x 22コマ, G:2分 x 22コマ, B:2分 x 21コマ をコンポジット。

LRGBの各画像を露出を揃えてレベル調整したものをアルバム形式にしました。矢印ボタンでL,R,G,Bの順に切り替わります。

明らかにLの星像が流れたように伸びています。RとBもわずかに伸びていますがGはほぼ真円です。たまたまLだけガイドが悪かったわけではありません。

Lは4コマずつ、R,G,Bはそれぞれ2コマずつ、順にフィルターを切り替えて撮っているので、ガイドのせいならLに切り替えた3回のタイミングでだけガイドが悪かったことになり、不自然すぎます。そもそも15秒露出のプレビューでも星像が伸びていたのでガイドのせいとは考えにくいです。

ということは光学系の問題と考えられます。Lフィルターが傾いてる?あるいは露出中に揺れているとか?しかし撮影前のフィルター清掃の時には異常はなかったですし、今チェックしても問題は見当たりませんでした。

となると、ひょっとして以前からあった BLANCA-80EDT の色ズレ問題のせい?購入時からそうなのですが、この鏡筒、RGBの像がわずかにズレる問題があって、惑星撮影では ADC を利用して色ズレを補正したり、DSO のカラー撮影ではスタックの際に RGB Align を ON にしたりという工夫でしのいでいました。

色ズレがあるということは、L で撮れば星像は色ズレの方向に伸びるはずです。ZWO の RGB フィルターのデータを見ると透過帯域が G は狭く B と R は広めなので、B と R の星像が僅かに伸びるという結果とも整合的です。

太陽の撮影で L だけ像がブレたようになったのも同じ原因?

しかし昨年の春の銀河祭りで ASI290MM でフィルターレス撮影していた時にはここまで星像は伸びてなかったんですよね。ピクセルサイズは2割しか違わないし不可解。色ズレの原因は3枚玉の対物レンズの玉ズレと思われるのですが、この一年の間にズレが大きくなった?

このあたりはいずれ検証してみたいところですが、接眼部がいまいちヤワなところも含めて冷却CMOSで使うには辛い部分が多いので、新しい鏡筒が欲しいなとも思ったり…

というわけで、一応超新星撮れました。間に合えば μ-180C でも撮ってみたいところだけど、果たしてオフアキは機能するのかどうか…

久しぶりの黒点 (2022/4/22)

仕事の方は一段落ついたので、金曜日は休みを取って昼から太陽を撮影しました。17日に現れた黒点群(2993, 2994)がかなりデカくて活動的なので撮りたかったのですが天候に恵まれず、22日は貴重な晴れ間になりそうだったので。

今回は ASI294MM Pro での撮影です。正直迷ったのですが… 万が一センサーを焼いてしまったら損失がデカいしフィルターも太陽光に晒して大丈夫なのか?とも思って。でも太陽全体を高解像度で撮ってみたくて2インチバローとの組み合わせで撮影しました。

2993-2996黒点群 (2022/4/22 12:45)
2993-2996黒点群 (2022/4/22 12:45)
笠井 BLANCA-80EDT (D80mm f480mm F6 屈折), GSO 2インチ2X EDレンズマルチバロー (合成f992mm), Kenko PRO ND-100000 77mm, ZWO LRGB Filter (G) / Vixen SX2 / ZWO ASI294MM Pro (Binning 1, Gain 80, 20℃), SharpCap 3.2.6482.2, 露出 1/1000s x 250/2000コマをスタック処理 / AutoStakkert!3 3.0.14, RegiStax 6.1.0.8, Photoshop 2022, Lightroom Classic で画像処理

右端の大中小の三つが繋がった形の黒点が2993黒点群、その左下に少し離れて並んだ二つの黒点が2994黒点群、そこから左に離れたところにある黒点が2995黒点群、その左上の小さな黒点が2996黒点群です。

この日の太陽の地心距離は 1.00501 AU = 150347356 km (iステラ調べ)、WinJUPOSの測定では 0.4815"/ピクセル なので画像上の1ピクセルは約350km(横浜から京都までの距離くらい)です。*1 2993黒点群の一番大きな真っ黒い部分の直径が約36ピクセルなので大きさは約12600km。地球の直径(赤道面)が12756kmなので、ほぼ地球一つ分の大きさということになります。

太陽 (2022/4/22 12:57)
笠井 BLANCA-80EDT (D80mm f480mm F6 屈折), GSO 2インチ2X EDレンズマルチバロー (合成f992mm), Kenko PRO ND-100000 77mm, ZWO LRGB Filter (L) / Vixen SX2 / ZWO ASI294MM Pro (Binning 1, Gain 80, 20℃), SharpCap 3.2.6482.2, 露出 1/2000s x 250/2000コマをスタック処理 / AutoStakkert!3 3.0.14, RegiStax 6.1.0.8, Photoshop 2022, Lightroom Classic で画像処理

こちらは太陽全体です。画像の向きは、宇宙天気ニュースの画像とにらめっこして、なるべく太陽の北が上になるように調整しています。太陽全体が写っているので WinJUPOS の Image measurements を使って合成焦点距離を算出しました。

拡大光学系はこんなふうに組みました。

2インチバロー使用時の接続状況
2インチバロー使用時の接続状況

48mmネジにバローレンズのレンズ部分をねじ込み
48mmネジにバローレンズのレンズ部分をねじ込み

カメラ側から、

  • ASI294MM Pro
  • EWFmini
  • ZWO 11mm 延長筒 (ASI294MM Pro 付属)
  • 笠井 T2延長リング(20m + 15mm)
  • ZWO M42M-M48F-16.5mm (ASI294MM Pro 付属)
  • GSO 2インチ2X EDレンズマルチバロー (レンズ部分のみ)
  • ビクセン 42T→50.8AD
  • 笠井 CNC2インチHP直焦点アダプター

という構成。2インチバローのレンズ部分は48mmネジ(オス)になっているので、M42M-M48F-16.5mm の48mmネジ(メス)にねじ込んでいます。これでバローレンズの拡大率は約2.07倍です。もっとシンプルにいきたいところでしたが、笠井 CNC2インチLP直焦点アダプターの先に2インチバローを付ける方式だと光路長が足りず合焦できませんでした。

ビクセン 42T→50.8AD の細いネジ2本留めで重い冷却CMOS + EFW を保持できるか心配だったのですがなんとかなりました。*2


撮影はいろいろとゴタゴタがありました。まずフィルターの問題。最初の拡大像*3は粒状班のつぶつぶもよく解像していていい感じなのですが、2枚目の全体像は等倍表示するとあまり改造していません。違いはフィルターだけです。解像している方は G フィルター、していないほうは L フィルターを使っています。

実は LRGB 合成をやろうとして拡大像では L,R,G,B 全部撮っていたのですが、L だけ wavelet 処理すると斜めにブレたような像になってしまったのです。

2993黒点群、2994黒点群 (G) (2022/4/22 12:45)
2993黒点群、2994黒点群 (G) (2022/4/22 12:45)
(1枚目の写真の等倍クロップ)

2993黒点群、2994黒点群 (L) (2022/4/22 12:40)
2993黒点群、2994黒点群 (L) (2022/4/22 12:40)
ZWO LRGB Filter (L) / 露出 1/2000s x 250/2000コマをスタック処理 (他は1枚目の写真と同じ)

最初はシーイングが悪かったのかな?と思っていたのですが、3回やって3回ともそうなるし、カラーフィルターを使用したものは R,G,B,Ha どれも大丈夫です。L,R,G,B,Ha,L,L の順で撮って3つのLがどれもダメ。

フィルター以外はシャッタースピードが違い、G は1/1000秒、L は1/2000秒です。L の方がローリングシャッター歪みが強く出てスタック時に何か悪影響が?と思って AS!3 のパラメータをいじってみたのですが改善せず。

この時に Quality Estimator を Local (AP) から Global (Frame) に切り替えたものが、解像感が落ちるかわりに流れる感じが軽減していたので、2枚目の全体像の写真ではそのパラメータで処理しました。

一体何なんでしょう?それはこの日の夜に撮った M60 + NGC4647 の撮影の際に明らかになった、かも?(まだ確信なし)

この撮影ではもう一つトラブルがありました。上の写真では撮影に SharpCap 3 を使っていますが、最初は SharpCap 4 で撮っていました。が、撮影時間が妙に長くて、よく見るとフレームドロップが大量に発生していて Bin1 のクロップ無しだと 1.6 fps とかになってしまってました。

プレビュー中はフレームドロップが発生していないので、保存先のSDD(PCIe 3.0 NVMe)に何かトラブルが?と思ってディスクの最適化を実行したのですが、改善せず。SharpCap の設定に保存先ディスクのスピードテスト機能があるのを見つけて実行してみたのですが、1GB/s 以上の速度が出ています。

SharpCap 3 ではこんなことなかったよな?と思って 3 に切り替えたところフレームドロップゼロ、フレームレートも Bin1 のクロップ無しで 4 fps 弱で撮影できました。うーん、一体何なんでしょう?こちらはまだ謎なまま。

というわけで色々ありましたが久しぶりのデカい黒点で興奮しました!

*1:tan(0.4815") = y / 150347356[km] から y = 0.000002334 * 150347356[km] = 350.9[km]. 地球と太陽の半径を考慮しても349kmでほぼ変わりません。

*2:というか、よく考えたら最初に ASI294MM Pro で満月撮った時(https://rna.hatenablog.com/entry/20211021/1634822016)も似たような構成でした。https://www.flickr.com/photos/rnanba/51614396304/in/dateposted/ https://www.flickr.com/photos/rnanba/51614396424/in/photostream/

*3:ROIを設定してクロップしただけで光学的な拡大率は同じです。

月面モザイク撮影 (2022/3/12)

仕事は終わってないのですが徹夜で仕上げた中間納品の後の土日はさすがにお休みしました。土曜日は夕方から夜中まで快晴、深夜から曇りの予報。

何か撮ってみたいとは思ったものの晴れている間は月齢9.7の月がずっと出ているので DSO は無理、むしろその月を撮る?久々に μ-180 で月面モザイク撮影にチャレンジとか?などと思ったものの、この日の月は南中高度が80度以上で、薄明終了後に撮影開始では撮影途中でベランダの天井に月が隠れてしまう可能性大。

それならば「シリウスBチャレンジ」でも、と思って夕方まだ明るいうちからベランダに機材を設置。ファインダー越しでもさすがにまだシリウスは見えないので月面でピント合わせなどしているうちに、シーイングも悪くないしやっぱり月面写真も撮りたいなと思って、まだ薄明の残っている18:30頃から撮影開始。仮処理の結果も悪くなく、ついついそのまま月面全体をモザイク撮影してしまいました…

今回は ASI294MM Pro の Bin 1 (SharpCap 4.0 では「46 Megapixel mode」)で撮りました。いつもの ASI290MM と比べるとセンサーサイズが約3.6倍(対角長23.2mm)でピクセルサイズは約20%小さく(2.315μm)、モザイク撮影しやすい上に高解像度。

しかし転送速度はかなり落ちます。Bin 1 だと 3.5fps くらいまでしか出ません。この速度では月惑星を撮るには厳しいですし、そもそも μ-180C の周辺像はコマ収差が大きくフォーサーズイメージサークルでも周辺は甘くなります。スターベース東京さんのテストによると実用的に良像範囲は直径8mm程度、ピクセルサイズによってはそれ以下とのこと。

ということで ROI を設定して 4232 x 4232 の範囲でキャプチャーすることにしました。対角長13.9mmなのでこれでも大きすぎるのですが、多少像が甘い部分が出ても3年前にやらかしたみたいに糊代が足りなくてモザイクが欠ける悲劇が発生するよりはマシなので…

fps はこれでも 6.5fps くらいしか出ません。1000フレーム撮ると2分半くらい。惑星撮影には遅すぎる感じですが月面ならフレーム数もそこまで必要ないのでなんとかなるはずと、これでいきました。

シーイングは中盤から乱れ気味で、ピントも少しズレてきた?と思ってピントを再調整したのですが、シーイングが乱れた中でのピント合わせには厳しいものがあり、後半はピントに不安を抱えたまま撮影を続けていました。

1セット1000フレームを18セットで1時間以上かかりました。懸案のベランダの天井問題ですが、月明かりでベランダの床に落ちた影を見て天井によるケラレがあるかどうか確認していたのですが、撮影後半に見た時点では天井の影と鏡筒の影は分離していて、撮影後10分後ぐらいに見た時は重なっていたので、最後の方で少しケラれていたかも。

各セットで撮った動画を画像処理して 3200 x 3200 くらい(対角長約10.5mm)にクロップしたものを、最近公開終了になってると話題になっていた*1 Microsoft ICE (Image Composite Editor)でモザイク合成。 速度も仕上がりの安定感も Photoshop よりこっちですね。大事に使っていこうと思います。

最後に月の南北の向きを合わせるために WinJUPOS の image measurement で向きを調整して1枚だけで de-rotation (画像回転だけになります)したのですが、画像がデカすぎてやたら時間がかかりました。

というわけで結果はこうなりました。元画像は 7840 x 9800 (約7680万画素)です。

月 (2022/3/12 18:26-19:33)
月 (2022/3/12 18:26-19:33)
高橋 ミューロン180C (D180mm f2160mm F12 反射) / Vixen SX2 / ZWO ASI294MM Pro (Bin 1, Gain 150, 10℃), SharpCap 4.0.8667.0, 露出 1/250s x 500/1000コマをスタック処理 x 18枚をモザイク合成 / AutoStakkert!3 3.0.14, RegiStax 6.1.0.8, Lightroom Classic, Microsoft ICE 2.0.3.0, WinJUPOS 12.0.7 で画像処理。

どうでしょう?これは成功と言ってよいのでは?

写真クリックすると Flickr に飛ぶので、そこで写真をクリックすると拡大、さらにクリックするとさらに拡大表示になります。その状態でマウスを動かすと月面がグリグリ動くのであちこち眺めてみてください。

等倍で見るとやや甘いところもあるのですが、高解像度すぎて Flickr の拡大表示で最大にしても等倍表示にはならないので、まあ、よしとします。北から順に撮ったので前半のシーイングが良いタイミングで撮ったアルプス谷のキレとかアペニン山脈のゴツゴツした感じとかがなかなかよく写っていて、それだけでも満足です。

Registax のパラメータは全部同じにしてありますが、シーイングがやや悪かった後半部分は Lightroom の「テクスチャ」を少し強めにかけて解像感を気持ち揃える感じに仕上げています。

縮小画像だけだともったいないので、欠け際を中心に 2048 x 2048 で切り出したものを以下に。

プラトー、アルプス山脈周辺 (2022/3/12)
プラトーアルプス山脈周辺 (2022/3/12)

コペルニクス、エラトステネス周辺 (2022/3/12)
コペルニクス、エラトステネス周辺 (2022/3/12)

ヒギヌス谷、中央の入江周辺 (2022/3/12)
ヒギヌス谷、中央の入江周辺 (2022/3/12)

プトレメウス、アルバテグニウス周辺 (2022/3/12)
プトレメウス、アルバテグニウス周辺 (2022/3/12)

雲の海周辺 (2022/3/12)
雲の海周辺 (2022/3/12)

ティコ、デランドル周辺 (2022/3/12)
ティコ、デランドル周辺 (2022/3/12)

グラビウス、マギヌス周辺 (2022/3/12)
グラビウス、マギヌス周辺 (2022/3/12)

うーん、いいですね。ずっと見ていられますね。時間ができたらクレーターの名前とかを記入したバージョンも作ってみたいと思います。

というわけで、ずっと天体写真が撮れなかったストレスも解消したし、3年前のリベンジも果たせたし、実にいい撮影でした。

なお、シリウスBチャレンジの成果についてはまた後日アップします。

近況

このところ仕事が無茶苦茶忙しくて星を見る余裕もブログを書く余裕もない状況です。体力温存のため、腱鞘炎と肩こりを悪化させないため、オフの時間に頭と体に負担をかけない生活を強いられています。

おかげで2021年のふりかえりエントリが未だにアップできず、まあ、それを楽しみにしている人というのもあまりいないとは思うのですが、自分の中でも区切りがつかないモヤモヤとしたものを抱えたままで、早くなんとかしたいとは思うのですが…

この状況は少なくとも3月半ばくらいまでは続きそうです。あー、もう春までずっと雨降ってたらいいのに(ひどい)。

写真/動画から流星を検出するツールを公開しました

先日紹介した動画から流星を検出するツールですが、

あの後、色々と手を加えて先程 github にコードを公開しました。

ふたご座流星群2014 流星検出サンプル (2014/12/14 23:46:52)
detector_tuner.py の出力サンプル。

流星検出の detect_meteor.py の他に補助ツールとして、動画フレームの比較明合成を行う lighten_only_composite.py, 流星検出用のパラメータをテストする detector_tuner.py, 検出結果を元にダイジェスト動画を生成する make_digest_movie.py を同梱しています。

ダイジェスト動画はこんな感じになります(pipe モードを使って ffmpeg で画質調整してエンコードしたものです)。*1

Voigtlander Nokton 17.5mm F0.95 (F0.95) / Kenko-Tokina スカイメモS / OLYMPUS OM-D E-M1 Mark II (ISO6400, FHD, Super Fine, 30p), 露出: 1/30秒, Simple Meteor Detector v0.1.0, ffmpeg で画像処理

detect_meteor.py に元々あった写真からの検出機能は残してあります(一応テストしました)。また、前回エントリで無効化したと書いたエリア検出除外機能も復活しておきました(ただし --area-threshold のデフォルト値は 0 (無効)にしてあります)。

使用方法など詳細は README.md を参照してください。質問等はこの記事のコメント欄か、github に慣れた方でしたら github の方で issue として投稿してください。

ライセンスは3条項BSDライセンスです。元になったOpenCVの直線検知で流星群画像を仕分けの detect_meteor.py と同じライセンスですので、同ライセンスの条件を守れば自由に改変・再配布可能です。

あらためまして、detect_meteor.py を公開してくださったアストロアーツのつのださんに感謝します。

追記: 2022/1/19

ライセンスにある通り、動作結果については無保証です。入力ファイルはあらかじめバックアップを取っておくことをおすすめします。出力ファイルは基本的に無条件に上書きする仕様になっているので、必要に応じてオプションで出力先ディレクトリを指定する等、工夫してご利用ください。

*1:なぜか flickr にアップロードできないので YouTube にアップロードしました。