Raspberry Piで天体写真用オートガイダーを制御する

現在ここベイエリアは歴史的規模と言われる山火事の真っ最中で、実のところ天体写真どころではない。煙が常時空を覆っており、外に長時間出ていたら健康や機材に悪影響が出かねず、そんな危険を冒したところでいい写真が撮れる見込みは全くない。参考に、下記は https://fire.airnow.gov/ で見られる執筆時点のsmoke mapである。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/b9d672b5-498a-ab86-5a02-061fc66cde25.png" width="640">
というわけで、次に撮影できるときのためにインドアでできる準備をしてみよう。

## 動機とゴール

うちには[Orion StarShoot AutoGuider](https://www.telescope.com/Orion-StarShoot-AutoGuider/p/52064.uts)(以下SSAG)という天体写真撮影用のオートガイダーがある。撮影中に星をぴったり追尾するためのCCDカメラ＋マウントコントローラーだが、画像認識用にPCを接続する必要があり、普段使いのWindowsノートPCを野外であまり使いたくないので出番が少ない。代わりに粗雑に扱えるRaspberry Piを使えないだろうか？

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/88cb10bb-daa7-b688-d9d9-78f135a5744c.png" width="360"> (上記サイトの商品画像より)

そこで以下のような課題に取り組み、Raspberry Piをオートガイダーの制御に使えないか試してみることにする。

- オートガイディングソフトウェアを動かす: 定番はOSSの[PHD2](https://openphdguiding.org/)だが、Linux用は自分でビルドしないといけないらしい。
- SSAG用ドライバを見つける: Linuxで動くドライバはあるという噂だが、Orionから提供されているわけではないので自分で探し、場合によってはビルドしないといけない。
- 消費電力を抑える: バッテリーで駆動するので、消費電力はなるべく抑えたい。うちには空いているRPi 4とRPi Zeroがあるが、RPi Zeroで動かせないだろうか。
- 操作方法を選ぶ: 野外でRPiをどう操作するか。まずは雑にWiFi+VNCで試してみるが、よりよい方法があるかもしれない。

やってみた結論はと言うと、こんな感じである。

- PHD2をRPi 4で動かすのは、公開されている手順書通りでストレートに行ける。
- SSAGを使うには、PHD2にビルトインされているカメラ種別の "QHY Camera" というのを選べばOK。
    - SSAGの中身は[QHYCCD](https://www.qhyccd.com/)というコモディティ品らしい。
- RPi Zeroでも一応動くが、いろいろ怪しい。素直に大容量の電池を持ってRPi 4を使う方がリーズナブルな気がする。
    - カメラベンダーから提供されているQHYドライバがZeroだと動作しないので、これを除いてPHD2をビルドする必要がある。代用の "QHY 5" というドライバで一応動く。
    - マシンパワーかドライバのせいか、画像認識のクオリティがRPi 4より若干低いようである。
    - 単純に操作に対する反応が遅く、時間が無駄になるし、イライラするし、誤操作も増える。
- 自宅WiFiの下であればVNCで十分快適に操作できることが確認できた。これをベンチマークとし、自宅WiFiの外に出たときにどうするかは今後検討する。

テスト用セットアップ:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/5bd61eb0-198f-395f-7264-8869cd8fd3cb.jpeg" width="480">

画面キャプチャ:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/ae113b3e-d978-7a38-986e-61bd2e646f3e.png" width="640">

## 準備

普通にBusterをインストールしたRPiを用意する。まずはRPi 4で、それができたらRPi Zeroという順序で試す。

## INDIのインストール

INDI( https://indilib.org/ )とは、オートガイダーやモータードライブマウントなど、さまざまな天体観測用機器をPCに接続するためのドライバとサーバの一式である(と思っておけばよい)。自分の機器のドライバを組み込んだINDIサーバを立ち上げ、PHD2などのアプリケーションから接続することで、アプリケーション側で各機器に対応する処理を作り込まなくても多くの機器をサポートできるという仕掛けである。

結果的にはSSAGへの接続はPHD2本体がネイティブで対応しておりINDIは使わないようなのだが、PHD2の前提ライブラリとなっているので黙って入れておく。インストール手順はここを見ればOK。
https://indilib.org/get-indi/download-rpi/category/6-raspberry-pi.html

インストールしたら、念の為サーバを起動して動作確認してみる。ドライバにindi_qhy_ccdを指定するとSSAGに接続できる。もうひとつindi_starshootg_ccdというそれらしいドライバがあるのだが、これでは「カメラが接続されていない」状態になってしまった。機種が微妙に違うのだろう。

```
indiserver indi_qhy_ccd
```

カメラをRPiに接続して正しく検出されれば、こんな感じの初期化処理のログが出る。

```
2020-08-24T10:26:26: Driver indi_qhy_ccd: QHYCCD|QHYCCD.CPP|InitQHYCCDResource()|START
```

RPi Zeroの場合、Child process died的なメッセージが出て動作しない。調べてみるとQHYドライバ内でillegal instructionが発生していた。このドライバはカメラベンダー提供のバイナリなのでINDIのせいではなく、簡単に直すこともできないが、後述の通り回避策があるのでここでは無視してよい。

## PHD2のビルド

Linux用のビルド手順はここ。
https://github.com/OpenPHDGuiding/phd2/wiki/BuildingPHD2OnLinux

RPi 4では手順書通りで特に問題なし。待ち時間もそれほどかからない。

RPi Zeroでは先述のQHYドライバの問題でビルドが途中で止まる(おそらくライブラリがロードできずにリンクに失敗する)。これを回避するため、`-DOPENSOURCE_ONLY=1` オプション付きでcmakeを叩き、問題のドライバをビルドから除く必要がある。ビルドには相当時間がかかるので注意。

## PHD2の動作確認

WindowsのようにOrion公式ドライバがないので、どのドライバを使うのか、果たしてちゃんと動くのかが一番の心配。とりあえず `phd2` を叩いて起動してみる。

1. 接続ウィザードにカメラ種別を聞かれるので、"QHY Camera" を選ぶ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/e247d248-d6b9-b635-19bc-e8210233a246.png" width="640">

2. カメラを接続しろと言われるので、SSAGをRPiに接続し、Yesを押す。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/c70343a6-9f21-aafc-bf89-97b62fa709bd.png" width="480">

3. ピクセルサイズが自動的に読み取れれば成功。あとのステップはWindowsと同じ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/9688526f-912f-1f52-7f04-42b278284f29.png" width="640">

  もし問題があれば、まずはSSAGがRPiに認識されているか確認する。`lsusb`するとこんなふうに見えるはず:
  `Bus 001 Device 004: ID 16c0:296d Van Ooijen Technische Informatica`
  ちなみにINDIと一緒にインストールされたっぽいudevルールが /lib/udev/rules.d/85-qhyccd.rules に置かれている。

4. 「露出ループの開始」を押すと、ちゃんとカメラからの映像が出た！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/6b83e0b4-2304-5ff9-90cd-0aa36ffdc8c7.png" width="640">

その他、実際に星を使わずに次のような動作確認が可能である。

- カメラシミュレータ(カメラ種別でSimulatorを選択)を使ってオートガイディングがちゃんと動作するか
- モータードライブマウントに接続し、マニュアルガイド(Tools > Manual Guide)でマウントをちゃんと操作できるか

RPi Zeroの場合はQHY Cameraが選択肢に出ない(ビルド時に除外している)ので、代わりに "QHY 5" を選択する。この場合ピクセルサイズが自動的に取れないので手動で入力する。SSAGの場合は5.20μmである。

## 実際の星の追尾

ここまで来たら実機を使って実際に星の追尾をしてみたくなる。空気は煙っていても星は見えるので、マウントにオートガイダーだけ載せてちょっとテストしてみた。

結論としては、期待通りに動作する。RPi 4ではこんな感じに見える。ちなみにこれはスマフォ上で撮ったVNCのスクリーンショットで、視野の中心にあるのはこと座のベガである。
![Screenshot_20200827-224532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/2a991493-81eb-9db5-bb4c-7bf08daac0ca.png)

RPi Zeroでも動作するのだが、操作に対する反応が遅くて時間の無駄になるし、イライラするし、誤操作も多くなる。また右側のStar Profileを見るとわかるように、星像の解析結果がギザギザになる傾向がある。ドライバが違うからか演算能力が低いからだと思うが、原因はわからない。このせいで撮影中に星をロストするとしたらもったいない。
![Screenshot_20200827-222431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/8f7996e0-3a58-ef67-901b-b9b5d278d6ad.png)
総合的に見たら、電気をケチってRPi Zeroを無理して使うよりも、少々大き目のバッテリーを持っておおらかにRPi 4を使うというのが大人の楽しみ方ではないかと思う。消費電力とマシンパワーのバランス的にはRPi 3でちょうどいい気がするのだが、手元に浮いているものがないので試すことができない。

## 今後の展望

- 今回のテストは自宅WiFiが届く範囲内で行ったので容易にスマフォからVNCで操作できたが、外に出たら何らかの対応が必要である。
  RPiをWiFiアクセスポイントに切り替えるか、あるいはRPiをスタンドアロンで操作できるようにするか。
- RPiをスタンドアロンにするアプローチとして、タッチパネル付きディスプレイを付けてみた。
  結果的に実用性は高くなかったのだが、テンションは上がる。<br>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465152/06e9e828-d11a-3b05-6e50-1e2a9d141bb6.jpeg" width="480">