...

エンジニアリング観測のためのプログラムのテスト駆動開発

by user

on
Category: Documents
16

views

Report

Comments

Transcript

エンジニアリング観測のためのプログラムのテスト駆動開発
エンジニアリング観測のためのプログラムのテスト駆動開発
友野大悟
国立天文台ハワイ観測所
tomono at subaru.naoj.org
ABSTRACT
すばる望遠鏡では新規の補償光学系 (AO188) の導入が進んでいる。AO188 を用いる場合に
は標準のカメラが利用できないため、既存のプログラムではポインティング・アナリシスを実
施することができない。このたび、スケジューリングの都合により、 1 週間の作業期間でポイ
ンティング・アナリシスを準備する必要が生じた。テスト駆動開発によって時間内に準備する
ことに成功した。
Subject headings: Test-driven development, Software, Telescope control system, Unit test
1.
イントロダクション
2009 年 6 月に、すばる望遠鏡のポインティン
グ・アナリシス (PA) をするためのプログラムを早
急に作成する必要が生じた。 PA のためには、星
表のデータベースや望遠鏡の制御系とのインター
フェースの確立が必要である。通常の PA は、望
遠鏡のオートガイダと呼ばれるカメラを用いて実
施されるが、新規の補償光学系 (AO188) を用いた
観測の際には、オートガイダが利用できない。今
回は、AO188 にとりつけられた観測装置をオート
ガイダの代わりに使えるよう、PA を実施するプ
ログラムを作成した。プログラムを作成する際に
は、 限られた時間で、それまでに確立したイン
ターフェースを壊さず完成させるため、テスト駆
動開発 (Test-driven development) と呼ばれる開発
手法を用いた。
1.1.
テスト駆動開発
テスト駆動開発は、プログラムの開発手法のひ
とつで、「動作するきれいなコード」 (Beck 2003)
を目指す。 Figure 1 のように、コードを、動かな
いものに対して動くもの、また、きたないものに
対してきれいなもの、という 2 つの次元で分類し、
下記のサイクルを繰り返してコードを書いていく。
Red 新機能に期待する動作をテストとして書き、
実行して、そのテストが失敗することを確
認する。新しく追加したテストが実行され
ていることが確かめられる
Fig. 1.— テスト駆動開発のサイクル
Green 新機能を実装し、テストを実行して、すべ
てのテストが成功することを確認する
Refactor 新機能を含めてコードを見なおし、重
複する部分や不明瞭な部分を修正して、す
べてのテストが成功するのを確認しながら、
きたなかったコードをきれいにして、設計
を良くする。
このサイクルをひとまわりすることによって、ま
ず、保守の容易なきれいなコードとして、プログ
ラムにひとつ機能が追加されたこと、さらに、こ
れまでに実装された機能が壊れていないことが確
認できる。
テストの記述と実行には、一般的に xUnit1 と呼
ばれるフレームワークを用いる。このようなフレー
ムワークを用いることで、テストの実行を自動化
することができ、テスト駆動開発のそれぞれのス
テップで容易にテストを実行することができる。
1.2.
すばる望遠鏡の PA
ポインティング・アナリシス (PA) は、望遠鏡の
指向方向を、星を使って較正する作業である。天
球上での位置のわかっている星に望遠鏡を向け、
得られた星の像が望遠鏡の視野の中心からどれだ
けずれているか測定し、全天に散らばったいくつ
かの星についてずれが最小となるように、指向方
向のずれを補正するパラメータ (PA 係数) を求め
なおす。
望遠鏡のオペレータは、TWS1 と呼ばれる計算
機、あるいは、TWS2 と呼ばれる計算機を操作し
て、PA を始める。指示を受けた TWS1 あるいは
TWS2 は、以下のような動作を繰り返して PA を
進める。
1. TWS3 と呼ばれる計算機のデータベースに
問い合わせ、指向したい高度方位角に近い
星をヒッパルコス星表から検索する。
2. TSC と呼ばれる計算機に指示を出すことで、
得られた星に望遠鏡を向ける。
3. オートガイダと呼ばれるカメラを使い、星
の像の望遠鏡の視野の中心からのずれを測
定する。
1.3.
AO188 での観測
AO188 は望遠鏡のナスミス赤外焦点に搭載さ
れる補償光学系である。AO188 で観測をおこなう
場合には、オートガイダは星像を得ることができ
ない。ナスミス焦点では、イメージロテータを挿
入した観測と退避した観測がおこなえる。どちら
の場合でも焦点面が変化しないよう、イメージロ
テータの状態によって副鏡の位置が調整される。
AO188 で観測をおこなう場合には、副鏡はイメー
ジロテータを挿入した位置に移動させるいっぽう、
イメージロテータを退避させる。この場合、焦点
面は移動して、星からの光はオートガイダに像を
結ばない。
PA では、通常はオートガイダによって望遠鏡
の指向方向のずれを測定する。今回は、星像を得
1
それぞれのプログラミング言語に提供されているユニットテ
ストのためのフレームワークの総称
られる観測装置によって、望遠鏡の指向方向のず
れを測定する必要がある。
プログラムの作成
2.
AO188 を用いた PA の準備は、5 営業日で終え
る必要があった。ハワイ時間 2009 年 6 月 29 日 (月)
に、AO188 を用いた PA が、7 月 9 日 (金) と 10 日
(土) の夜におこなわれることになった。準備作業
ができる日数は、7 月 2 日 (金) の独立記念日の振
替休日と、同時に確定した他のエンジニアリング
項目のための夜勤に必要な 2 日とを除いて、 5 日
だった。
外部とのインターフェースを確立しながら短時
間で PA を進行するプログラムを準備するため、
テスト駆動開発をおこなった。 § 1 に述べたよう
に、AO188 を用いた焦点では、通常の PA のため
に必要なオートガイダを使うことができない。ま
た、TWS1 や TWS2 は通常の科学観測にも用いる
計算機であり、プログラムを改変することはでき
ない。このため、TWS1 や TWS2 と同様に TSC や
TWS3 と通信をすることができ、自由にプログラ
ムを作成することができる TWS4 と呼ばれる計算
機で動くプログラムを作成して、星像を得られる
観測装置を用いた PA を行うこととした。
TWS1 や TWS2 の動作を観察した結果、AO188
を用いた PA を進行するためには、下記の機能を
実装する必要があることがわかった。
1. 向きたい高度方位角を選択する
2. 向きたい高度方位角を、赤経赤緯に変換する
3. 得られた赤経赤緯に近い星を、 TWS3 の星
表から検索する
4. 得られた星に望遠鏡を向ける
5. 観測装置で測定した望遠鏡の向きのずれを
記録する
2.1.
星に望遠鏡を向ける
本稿では、前項に述べた機能のうち、星に望遠
鏡を向ける機能を例として、テスト駆動開発の例
を示す。
TSC に送付するコマンドの確認 まず、イン
ターフェースの確認をした。TSC で得られる
ログより、例えば、ある固有運動を持った赤経
14h 21m 11.s 7327、赤緯 −51◦ 21′ 43.′′ 17 に位置する星
class HipStar:
に望遠鏡を向けるためには、TSC に「102005 ABS
def to_tsc(self):
+142117327 -51214317 20000000 -000987 -000946
return ’ ’.join([’102005 ABS’, self.ra
OFF +0170 TSC」という文字列を送ればよいこと
Fig. 4.— 星の位置をコマンド文字列に変換する
がわかった。
コード片
Red 前項で得られたインターフェース条件を、
テストとして記述した。今回は Python を用いた。
Figure 22 にその一部を示す。このテストが、Figure
3 のように失敗することを確認した。
$ python tws3.py
.
-----------------------------------------Ran 1 test in 0.002s
OK
if __name__ == ’__main__’:
import unittest
Fig. 5.— テストの成功
class TestHipStar(unittest.TestCase):
def setUp(self):
self.h = HipStar()
self.h.from_tws3({u’E_ITEM’: u’0’, u
ないことを確かめる。テスト駆動開発には重要な
ステップであるが、本稿では割愛する。
def testto_tsc(self):
self.assertEqual(
"102005 ABS +142117327 -51214317 2
self.h.to_tsc())
星に望遠鏡を向ける以外の機能についても、上
記のようにテスト駆動開発のサイクルに則り、コー
ドの作成を進めた。
少なくともテスト駆動開発のサイクルをひとま
わりするたびに、コードの変更点をバージョン管
理システム3 に登録した。これにより、テストが失
敗するようになった場合に、変更点を容易に確認
できる。また、コードの作成を複数の計算機でや
る方が効率的な場合に、さらに、複数の人が同じ
コードを作成・修正する場合にも、変更点の同期
が容易である。
unittest.main()
Fig. 2.— テストケース
$ python tws3.py
E
==========================================
ERROR: testto_tsc (__main__.TestHipStar)
-----------------------------------------Traceback (most recent call last):
File "tws3.py", line 202, in testto_tsc
self.assertEqual("102005 ABS +14211732
AttributeError: HipStar instance has no at
3.
AO188 を用いた PA は、ナイトログによれば、
7 月 9 日 (金) の 19:40 から翌 04:50 に赤外副鏡を
用いて、また、10 日 (土) の 19:40 から 23:46 に可
視ナスミス副鏡を用いて、おこなわれた。
バージョン管理システムの記録によれば、PA 開
始前の最後の変更点の登録は、ハワイ時間 7 月 9 日
(金) の 19:39 だった。その直後に PA が始まったこ
とになり、今回は、かろうじて納期に間に合った。
今回作成したプログラムは期待通り動いたが、
エンジニアリング観測全体としては下記のような
問題があった。
-----------------------------------------Ran 1 test in 0.003s
FAILED (errors=1)
Fig. 3.— テストの失敗
Green 前項で得られたインターフェース条件を
満たすように、機能を実装した。ここでは、星の
位置を TSC に送付するべき文字列に変換するメ
ソッドを、Figure 4 のように実装した。この後テ
ストを実行すると、 Figure 5 のように成功するこ
とが確認できた。
Refactor コードと設計を良くする。コードを編
集したらすぐにテストを実行し、その編集によっ
てこれまでに動いていた機能が動かなくなってい
2
リストの右側は紙面の外に出てしまっていて見えないが、テ
スト駆動開発の要点を示す上では重要ではない
結果
3
ファイ ル の 変 更 点 を 記 録 す る プ ロ グ ラ ム 。今 回
は Subversion を 用 い た 。こ の 他 、古 典 的 な も の で
は CVS、最 近 の も の で は Git、Mercurial な ど が あ
る 。AO188 を 用 い た PA で 用 い た コ ー ド の 全 体 は 、
http://teldiv.subaru.nao.ac.jp/viewcvs.cgi/
misc/trunk/pa-on-ao/ で閲覧できる。
3.1.
観測装置によって測定した望遠鏡の向きの
ずれの伝達
観測装置によって測定した望遠鏡の指向方向は
口頭で伝える必要があった。これにより、若干余
計に時間がかかった。
また、符号の扱いに一貫性が無かった。望遠鏡
の指向方向を変換結果に従ってずらすことで、得
られた望遠鏡の向きのずれが正しいことを確認し
ようとしたが、星像が期待通りに移動しない場合
があった。一方、これによって、測定ごとに符号
の扱いを正すことができた。
3.2.
PA 係数の更新についての理解も必要である。
REFERENCES
Beck, K. 2003, Test-Driven Development: By Example, The Addison-Wesley Signature Series
(Addison-Wesley)
指向方向のオフセットの取り扱い
望遠鏡には、全天での指向方向を補正する PA
の他、副鏡などのトップユニットの望遠鏡への取
付誤差を補正する、 1 点 PA と呼ばれる機能があ
る。これは、天球のある 1 点で望遠鏡の指向方向
のずれを測定し、PA 係数のうちトップユニットの
望遠鏡への取付誤差が影響するものだけを更新す
るものである。
AO188 を用いた観測の際には、 PA 係数はイ
メージロテータを用いない場合のものと共有され
ることが知られていたが、1 点 PA による PA 係数
の更新がどう反映されるかは未知だった。今回の
PA の前には、観測装置の視野に星を導入するた
めに 1 点 PA をおこなったのだが、PA 後に得られ
た PA 係数に、この 1 点 PA の結果がどう影響して
いるか、直感的な理解を得られなった。
PA 係数の更新についても直感的な理解とは異
なる振舞が見られたこともあり、PA 係数の更新と
確認のために、望遠鏡時間を 9 日の夜に 5 時間半
程度、10 日の夜に 1 時間半程度、費すこととなっ
てしまった。
4.
まとめ
AO188 を用いた観測の際には望遠鏡の標準の
カメラが使えないため、観測装置を使って望遠鏡
のポインティング・アナリシス (PA) をするため
のプログラムが必要になった。テスト駆動開発に
よって、2 台の計算機との間でインターフェース
を確立し、内部で座標変換をするプログラムを短
期間で作成することができた。
今回の開発では最低限の機能を実現することが
必要だったため、プログラムを操作する人に対す
るユーザーインターフェースは最適化されていな
い。今後、このプログラムが使われる場合には、
ユーザーインターフェースの改良が必要である。
This 2-column preprint was prepared with the AAS LATEX
macros v5.2.
Fly UP