T-StudioさんからStellarsolverというのを教えてもらったので、試してみました。ものはこちら。


中身はastrometry.net + SExtractorです。従来はそれぞれの実行ファイルを別プロセスとして呼び出していたのを、ソースレベルでマージして直接ソフトウェアに組み込める形にしたもの。かつマルチスレッドなどに対応して高速化しているらしいです。

セットアップは上記のサイトに書いてある通りでRaspberry PIにインストールできます。ビルドされた実行ファイル名は、StellarSolverTesterです。
sudo apt -y install git cmake qtbase5-dev libcfitsio-dev libgsl-dev wcslib-dev
git clone https://github.com/rlancaste/stellarsolver.git
cd stellarsolver
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTER=ON ..
make -j4
sudo make install

では実行してみます。入力画像はいつものこの画像です。右上に三個縦に並んでいるのがオリオンの盾。左右反転しています。
54f3a48e


RPi4上でちょっとplate solveのパラメータなど調整して実行してみると、入力解像度が1280x960pixelと大きいにもかかわらず約0.9秒で座標の計算まで完了しています。たしかに速い。
Screenshot from 2022-02-20 11-33-55

このソフト、ファイル名が StellarSolverTester となっている通り、テスト用サンプルソース扱いです。計算の本体は libstellarsolver.so というライブラリになっていて、OSにRaspberry PI OS Bullseye 64bitで動かしている場合、デフォルトで、
/usr/lib/aarch64-linux-gnu
にインストールされます。
またヘッダ類は
/usr/include/libstellarsolver
にインストールされています。そのためStellarSolverのソースなどを見なくても、このライブラリをリンクするだけでPlate Solveを実装することが可能になります。確かにsolve-fieldを別プロセスで呼び出すよりずっとスマートです。ただしこのライブラリ、中はガッツリQtで書かれているので、これを使うアプリもQtが必要になります。

このライブラリのAPIの呼び出し方は、このStellarSolverTesterのソースを見ればわかります。stellarsolverのソースの tester フォルダの中がStellarSolverTesterのソースです。
mainwindows.cppの void MainWindow::solveImage() がplate solveを実行している関数です。後でじっくり読んでみましょう。

上記のソースのサイトによると、このStellarSolverを作ったモチベーションは、astrometry.netとかはいろんなライブラリを入れたりとか、Pythonを使ったりとか、Linuxで動かすにはいいけどWindowsとかに移植するのが大変。なので全部まとめて一つのプロジェクトにしたい、ということのようです。確かにあまり依存するライブラリは多くなく、自身も一つのライブラリとしてまとまっていて、アプリケーションへの実装も非常にやりやすくなっています。

ただこれが、特に商売として使おうとすると大きな問題となります。というのもこのStellarSolver、ライセンスがGPLv3になっています。そのためStellarSolverを組み込んだソースは公開する必要があります。例えばIndiはLGPLv2なので、Indi自体をいじらず単にリンクするだけであれば、自分のプロプライエタリなソースは公開する必要はありません。IndiのWebサイトでも
「Open Source: Available for all to contribute to and re-use under the commercial-friendly LGPL v2 license.
と商売で使いやすくなっていることを主張しています。
またastrometry.netはGPLv3ですが、すでに出来上がった実行ファイルを別プロセスとして呼び出しているだけなので、これも自分のソースは公開不要です。
しかしStellarSolverはライブラリとして組み込むため、自身のソースを公開する必要があります。スマートに作った弊害ですね。仕事に使うのは面倒そうです。結局astromatry.netと同じように、最低限の実装だけした実行ファイルを作ってそれを別プロセスで呼び出す、この最低限の実装部分だけソースを公開する、という使い方になるんじゃないかな、と思います。自分は趣味で遊んでいるだけなのでそんなことしないですが。