見出し画像

RealityCaptureの処理完了通知をスマホ(Slack)へ送る方法

重要

このnoteで紹介する方法やコードを実行はすべて自己責任で判断してください。この方法、コードを実行したことによる、いかなるトラブル、損害への責任は執筆者にありません。
アフターケア、無料の相談なども致しません。



免責を明らかにした上で、本文です。

フォトグラメトリソフトのRealityCaptureの処理が完了したとき、スマホに通知が欲しい。そう思ったのは、私が利用しているPCモニタにスピーカーがないため、処理の完了音を設定しても音が鳴らず、気づくことができないからです。

ほかにも、処理の間に他の作業をしていたり、外出したりしているときに処理が終わったのかどうか知ることができれば、もっと有効な時間の使い方ができる、かもしれません。

これまではとりあえずリモートデスクトップで確認していましたが、もっと簡単にしたくて方法を探していました。

結論から言って、処理の完了時にSlackへ通知を送ることができました。

RealityCaptureは、アラインメントやメッシュ生成などの処理の完了時に任意の実行ファイル(.exeや.bat、.pyなど)を実行するように設定できます。
これを利用し、今回はSlackのWebhook経由でスマホへ通知を送るという方法をとりました。

この他にもやり方はあると思いますが、今回の方法は、おそらく比較的簡単な方法だと思います。しかし、ネット上には特にこの設定に関する情報が見当たらないので、書いておくことにします。

重要な部分
・Slackのチャンネル名は英数字のみにしておく
・スクリプト内のWebhookURL、チャンネル名をしっかり書き換える
・プロジェクトを保存するフォルダ名も英数字のみ
・RealityCaptureのデフォルトの引数は残す

2023/10/30 追記
・Pyファイルが呼び出されるものの、VSCodeなどのコードエディターが起動しファイルの中身が表示されるケースの対処法を、末尾の「エラーの対処」の項目に追記しました

2023/11/17 内容の変更
・「そのほか-最短の処理期間について」の項目の内容を変更し追記しました


必要なもの

1.SlackのアカウントとWebhookURL

そもそもSlackは、組織内でのコミュニケーションを効率的に行うことができるメッセージアプリです。私も詳しいわけではないのですが、ビジネス版のLINE、実名表示前提のDiscordというようなイメージです。

・Slackアカウントを用意

メールアドレスがあれば個人でも利用可能です。スマホに通知が欲しいならスマホにアプリを入れてください。
無料版では制限があるようですが、通知が欲しいだけならば全く問題ないです。

Slackを利用したことがないなら、個人的にはスマホのアプリをインストールして設定を済ませた後、Webでログインする方が楽かなと思います。

Slackでは、LINEのトークグループのような役割を「チャンネル」というものが果たしています。
Slackに登録したとき、このチャンネルを作ることになるので、それを利用するか、ほかの好きな名前のチャンネルを作ることができます。

チャンネルの名前は漢字かな混じりのものではなく、アルファベットのみ
にしておいてください。漢字かな混じりの場合、エラーが起きる可能性があります。

私はめんどくさいので「#realitycapture」というチャンネルを作っておきました。

・Webhook URLを取得

アカウントを用意し、利用したいチャンネルを用意したら、次にWebhook URLの発行をします。

上のURLにアクセスし、必要な設定を行います。

インテグレーションの設定

 インテグレーションの設定

項目ごとに見ていきます。
①チャンネルへの投稿

先ほど用意したチャンネル名を入力(私の場合は「realitycapture」と入力)

②WebhookURL

これをコピーして後で触れるスクリプトにペーストして利用します。なんらかの問題が起きてURLを変更したい場合もこのページで再生成することができます。

③説明ラベル

このURLがなんなのか分かるように書いておきます。内容によって後の工程が変化することはありません。

④名前をカスタマイズ

この名前が通知を送るbotの名前になります。私の場合は安直に「RealityCapture」にしました。

⑤アイコンをカスタマイズする

好きな画像を設定してください。これが通知を送るbotのアイコンになります。

アイコンの画像については、RealityCaptureのロゴを利用するのが著作権法の私的利用の範囲に収まるのかがわからないので、自分で用意しました。
ネット上で拾った画像をなんらかのサーバにアップロードするには注意が必要です。

アイコンと名前がどこに使われるか
作者談「RealityCaptureのロゴにインスピレーションを受けて…(以下略)」

この画像を利用しても構いませんが、再配布はやめてください。
自分で用意した方が楽しいのでおすすめです。

これらの設定が終わったら設定を保存します。これらの設定はURLの利用開始後も変更できるので、気軽に試してください。

2.インターネットに接続しているWindowsPC

通知は、PCのターミナルでスクリプト(実行ファイル)を実行したのち、SlackのIncoming Webhookを通じてインターネット経由でSlackのサーバで処理され、スマホやPCのSlackアプリに送信されることになります。

もちろん通知を受け取りたいデバイスもインターネットに接続されている必要があります。

3.Python

今回はPythonを使ってコードを書きました。

①インストール
PCにPythonがない場合はインストールしておいてください。執筆時点の最新版は3.11.5でした。

3.11.5でなくてもいいです。
以前にPythonを入れた気がするなら、コマンドプロンプト(もしくはPowerShell)で

Python --version

を実行し、Pythonが利用可能か調べてください。このとき「Python?なんそれ」と言われた場合は、PATHを通す(後述)か、大人しくインストールしてください。

Windows向けのインストーラーをダウンロード。四角く囲った青文字をクリックすればOK

インストール先はインストーラーがデフォルトで指定する場所で構いません。ただし、この文字の羅列はインストールした場所を表す住所のようなものなので、インストール時に確認しておいてください。

Install NowでOK

デフォルトでは

C:\Users\Username\AppData\Local\Programs\Python\Python311

にインストールされます(このとき、Usernameの部分は皆さんそれぞれが設定している名前なのです)。

②PATHを通す
PATHを通すとは、先ほどの「C:\Users\Username\AppData\Local\Programs\Python\Python311」のようなフォルダの住所をコマンドプロンプトが把握できるようにすることです。

ここでは説明を省きます。「Python PATH 通す」「Python 環境変数 設定」などで調べれば色々出てくるので見てみてください。

最終的に、

「C:\Users\Username\AppData\Local\Programs\Python\Python311」「C:\Users\Username\AppData\Local\Programs\Python\Python311\Script\」が設定されていればOKです(※インストール場所によって異なります)。

この設定ができたら、コマンドプロンプトで

Python --version

を行い、以下のようにバージョンが表示されればPythonそのものの準備はOKです。

4.必要なライブラリを用意

Python にはライブラリと呼ばれる拡張コードがたくさん用意されている…そうです。私も詳しくはありません。気になったらChatGPTに教えてもらってください。

今回必要なのは「requests」というライブラリです。このライブラリをインストールするにはPythonにデフォルトで用意されているpipというコマンドを使います。

コマンドプロンプトで以下のコードを実行するとインストールできます。

pip install reqests

インストール先はデフォルトのルールに従って決定されるので、特に指定する必要はありません。

(このときAnaconda3を利用しているとpipがうまくいかないことがあるようです。)

上のコードを実行するとダウンロードとインストールが自動で行われます。(コマンドプロンプトの画面がザザーッと流れます)。

処理が終わったら、

requests --version

を実行し、バージョン情報が表示されるかをチェックします。表示されない場合、正しくインストールが行われていません。コードが正しいかを確認してください。

5.スプリクト(.py)を用意する

まず、スプリクトや実行ファイルを保存しておくフォルダを用意します。

私の場合は、
C:\Users\Username\
の下に、RealityCaptureNotificationというフォルダを用意し、
さらにその中にNotification1というフォルダを用意しました。

場所はどこでも大丈夫ですが、一般的には自分で見つけられないような階層にはしない方がいいです。

フォルダが用意できたら、Windowsのメモ帳アプリを開きます。そこに以下のコードをコピペします。

import sys
import requests
import json

# Slack WebhookURL
webhook_url = 'https://hooks.slack.com/services/your/webhook/url' # ここにWebhookURLをペースト

# 通知するチャンネルを指定
channel = "#general"  # ここを通知したいチャンネル名に変更

# 引数を取得
args = sys.argv[1:]

# 引数をSlack通知メッセージに含める
message = "RealityCaptureからの通知: {}".format(" ".join(args))

# Slackに通知を送信
payload = {
    'channel': channel,
    'text': message
}
headers = {'Content-Type': 'application/json'}
response = requests.post(webhook_url, data=json.dumps(payload), headers=headers)

# レスポンスのステータスコードを確認
if response.status_code == 200:
   print("通知が成功しました")
else:
   print("通知に失敗しました。ステータスコード:", response.status_code)

大事なことですが、2箇所変更する部分があります

# Slack WebhookURL
'https://hooks.slack.com/services/your/webhook/url'
の部分にWebhookURLをペーストします。

# 通知するチャンネルを指定
"#general"
の部分にチャンネル名を書きます。私の場合は「#realitycapture」です。

それぞれ、みなさんが用意したものにそれぞれ書き換えてください。

間違いなく書き換えたら、名前をつけて保存しますが、ファイルの名前は名前は英数字のみにしておいてください。拡張子は、デフォルトで入力されている.txtを消して、.pyにしてください。

私の場合は「RCnotify.py」にしました。

保存先は5の手順の冒頭で用意したフォルダの中にします。私の場合は
C:\Users\Username\RealityCaptureNotification\Notification1
です。

6.テストしてみる

コマンドプロンプトを開き、以下のコードを実行します。このとき、5の最初にご自身が用意したディレクトリになるようにしてください。

cd C:\Users\Username\RealityCaptureNotification\Notification1

これはコマンドプロンプトに「いまからここで作業するよ〜」と教えてあげるコードです。これをしないと、コマンドプロンプト君は必要なファイルを見つけることができません。

うまくいくと、若干表示が変わります。具体的にはコマンドプロンプトを開いた時に、カーソルが点滅している行に
C:\Users\>
という文字列が出ていますが、これが
C:\Users\Username\RealityCaptureNotification\Notification1>
となります。カレントディレクトリを正しく移動できたということになります。

上手く移動できたら、.pyファイルに書かれたスクリプトが実際に動くかどうかテストします。

python RCnotify.py

と打ち込んで、処理が終わるとPCやスマホのSlackの指定したチャンネルに、WebhookURL取得時に設定した名前、アイコンのbotからメッセージが来ます。

今回用意したコードのままならば、
「RealityCaptureからの通知です:」
というメッセージが来るはずです。

Slackに通知が来る

メッセージに書かれる文章については、先ほどのスクリプトの中の「message = "RealityCaptureからの通知: {}".format(" ".join(args))」のうち、いま太字部分で強調した部分をいじることでカスタムできます。

連続で動作させて通知設定を確かめたい場合は、「python RCnotify.py」を気が済むまで実行してください。コマンドプロンプトを開き直した場合は「cd」コマンドを忘れないでください。

スマホの通知設定、Slackの通知設定などを見直し、必要な通知が来るようにしておきましょう。Slackの場合、アプリの通知設定/モバイル通知のタイミングという項目があり、そこで「アクティブ時でも通知を送信する」にすると通知に気づきやすいです。

iPhoneの場合、おやすみモードなどの集中モードを利用していても通知が欲しい場合は、集中モードの設定から例外のアプリを設定できますが、iPhoneをおやすみモードに変更したタイミングで、Slackの通知も止まってしまうようです。それでもスレッドの中にメッセージは届いているので、慌てず確認してください。

7.RealityCaptureに設定する

RealityCaptureではワークフロー/アプリケーション/設定から、「動作終了後の通知」を設定します。

動作とコマンドラインの内容を変更するのですが、まず、デフォルトで入っているコマンドラインを確認します。デフォルトでは

postprocess.exe "プロセス$(processId)は$(sceneName)シーンの$(processResult)コードによって$(processDuration:d)秒で終了しました。"

日本語設定のRCでのデフォルトの文章

と書いてあるはずです。バージョンによって細かな違いはあるかもしれません。「postprocess.exe」の部分を.pyファイルのディレクトリに書き変えます。

"C:\Users\Username\RealityCaptureNotification\Notification1\RCnotify.py" "プロセス$(processId)は$(sceneName)シーンの$(processResult)コードによって$(processDuration:d)秒で終了しました。"

一文が長すぎてnoteの表示では見切れているかもしれませんが、

"C:\Users\Username\RealityCaptureNotification\Notification1\RCnotify.py" "プロセス$(processId)は$(sceneName)シーンの$(processResult)コードによって$(processDuration:d)秒で終了しました。"

というように書き変えます。何度でも言いますがこのときディレクトリはご自身が用意したものに合わせてください。

今回は、後半の「"プロセス$(processId)は$(sceneName)シーンの$(processResult)コードによって$(processDuration:d)秒で終了しました。"」の部分はデフォルトそのままにしておいてください。

このコマンドの意味は、
「"C:\Users\Username\RealityCaptureNotification\Notification1\RCnotify.py"」に対し「"プロセス$(processId)は$(sceneName)シーンの$(processResult)コードによって$(processDuration:d)秒で終了しました。"」という引数(ひきすう)を渡して実行させるものです。

これによって、プロセス名や処理にかかった時間などが通知に記載されます。

この引数を通知の文章の後ろにくっつける処理をしているのが、スクリプトの中の「message = "RealityCaptureからの通知: {}".format(" ".join(args))」の太字部分です。

シンプルに「処理が終わりました」という通知が良ければ、引数も消して、「{}".format(" ".join(args))」の部分も削除して大丈夫です。好きにカスタムしてください。

表示内容をさらにいじってみたい場合は、以下のRealityCaptureのヘルプなどをご覧ください。

Application Settings /Progress End Notification

ちなみに、RealityCaptureのデフォルトでは

postprocess.exe "プロセス$(processId)は$(sceneName)シーンの$(processResult)コードによって$(processDuration:d)秒で終了しました。"

と書いてありますが、上記のヘルプでは

"C:\Users\user\Desktop\post-op.bat" "シーン $(sceneName) で $(processDuration:d) 秒後に、プロセス $(processId) が結果コード $(processResult) で終了しました。"

と書いてあり、実行ファイルへのディレクトリ部分は""で囲ってあるので、""で囲った方が無難かと思います。

ここが設定できたら、適当にプロジェクトを処理してみて、実際の動作を確認してみてください。

そのほか-最短の処理期間について

RealityCaptureのワークフロー/アプリケーション/動作終了後の通知
の設定の中には「最短の処理期間」という項目がありますが、RealityCaptureのヘルプページに書いてある説明がかなり分かりにくくなっています。

処理が終わってから、コマンドを実行するまでの時間を決めることができます。単位は秒なので、私の場合は15秒の間隔を空けるような設定になっています。

早い方がいい、のはそれはそうなんですが、これは引数「"プロセス$(processId)は$(sceneName)シーンの$(processResult)コードによって$(processDuration:d)秒で終了しました。"」に含まれるprocessId、sceneName、processResult、processDuration:dなどの数値が、RealityCaptureのログファイルに書き込まれるのを待つ意味合いがあるのではないかと推測しています。PCの処理能力などによってここは変える必要があるかもしれません。

以下に説明を追記しました(2023/11/17)

ヘルプページ(Application Settings)では、

「Minimal process duration Set a minimal duration after which RealityCapture will execute the notification task.
This value is in seconds. For practical reasons, this value should be greater than 60.
(最短の処理期間はRealityCaptureが通知タスクを実行する最小時間を設定します。この値は秒単位です。実用的な理由から、この値は60より大きくする必要があります。)」

https://rchelp.capturingreality.com/en-US/appbasics/appsettings.htm

と書いてあります。次に、

Keys and Valuesのページでは、Minimal process durationのキーは「appProcessActionTime」という名前になっていると書いてあります。
デフォルトでは15(つまり15秒)であるとも書いてあります。

すでにデフォルトの値が60秒よりも短くなってしまっています。先ほどの「この値は60より大きくする必要があります」とは何だったのでしょう。謎です。

さらに、Error-handling Commandsのページで、appProcessActionTimeの説明は以下のようになっています。

「appProcessActionTime set to 0 means that we are interested in all processes whose duration is at least 0 seconds - so we are actually interested in every single process.
appProcessActionTimeを0に設定すると、持続時間が少なくとも0秒であるすべてのプロセスに関心があることを意味する。)」

https://rchelp.capturingreality.com/en-US/tutorials/commandline_5.htm

これは、アプリケーションを利用しているうちに行う数ある操作のうち、Minimal process duration=appProcessActionTimeに設定した以上の時間(秒)を要したプロセスの終了時に、何らかの処理をトリガーにできるというように読めます。

例えば、単にプロジェクトを保存しただけで通知が来ては面倒だから、処理に15秒以上かかったプロセスだけの注目し、通知を送るというような使い方ができるということです。

当初の「Minimal process duration Set a minimal duration after which RealityCapture will execute the notification task(最短の処理期間はRealityCaptureが通知タスクを実行する最小時間を設定します)」の説明では、翻訳しているとはいえ、何を指しているかがあいまいで意味が取りにくいものになっているように感じます。

入力画像枚数が大きなのプロジェクトでは保存に15秒以上かかってしまうことがあります。そういった際にいちいち通知が来てしまうのが煩わしいようであれば、最短の処理期間=Minimal process duration=appProcessActionTimeの秒数を長めに設定するといいでしょう。そういった意味では、とりあえず60秒に設定しておくとちょうどいいかもしれません。

ここまで追記(2023/11/17)

ちなみにヘルプページでは

This value is in seconds. For practical reasons, this value should be greater than 60.
(実用的な理由から、この値は 60 より大きい必要があります。)

https://rchelp.capturingreality.com/en-US/appbasics/appsettings.htm

と書いてあるので、60秒くらいが安定するのかもしれません。しかし私のRCのバージョンでは、以前に設定をいじってなければデフォルトは15秒になっています。

最後に重要な部分をもう一度振り返り
・Slackのチャンネル名は英数字のみにしておく
・スクリプト内のWebhookURL、チャンネル名はしっかり書き換える
・保存するフォルダも英数字のみ
・RealityCaptureのデフォルトの引数は残す

エラーの対処

1.コードエディターが起動してしまう

処理完了時にRealityCaptureからPyファイルが呼び出されるものの、VSCodeなどのコードエディターが起動し、ファイルの中身が表示されてしまう場合があります。

これはファイルに関連付けされたソフトが起動してしまうことで、意図した動作にならないエラーです。

対処法としては、Pyファイルのプロパティを開き、「プログラム」という項目を確認。ここでは「Visual Studio Code」が既定アプリになっていて、ファイルが実行されるとVSCodeが起動してしまいます。

①右側の「変更」を押下して
②「.pyアプリの既定のアプリを選択する」のパネルが出たら、
③「Python」選択し、
④プロパティパネル下部のOKを押します
これで設定は完了

以上で、正常にコードが実行できるようになると思います。

以上、RealityCaptureの処理終了をSlackで通知する方法についてでした。何か間違いがあればコメントください。

コードについてはChatGPTに相談して書いてもらったので、常識と異なる部分があるかもしれません。改善点や追加できることはたくさんありそうですが。

喜びの声

最後まで読んでいただきありがとうございます!

書いている人:@YoneharaRyuhei

ぼくのnoteを読んでいただきありがとうございます!写真、カメラ、美術などいろんな記事を書いていきますので、すこしでも面白いと思っていただけたならサポートをお願いします‼