この記事は鈴鹿高専Advent Calendar 2022 22日目の記事です。
はじめに
この記事では鈴鹿高専祭に展示した、某7つの球を集める漫画作品に登場するエネルギーを打ち出す技をARで誰でも出せるようにした作品の話をします。
なお、私自身はその漫画を読んだことがありませんし、その技も使えませんので原作とずれていても怒らないでください。
企画について
実はこの作品は、高専祭四日前に部として出せる作品があまりないことに気がつき、何かできることはないかと雑談をしていた時に顧問の教員がちらっとおっしゃったことをもとにしています。(多分その雑談中では誰も本当に作ってくるとは思ってもいなかったであろう...)
高専祭四日前であり高専祭二日前の日は学校が休みなので、その時点で部に顔を出せるのは雑談の翌日と高専祭前日の二回のみです。流石に何の相談もせずに前日に出すのは避けたかったので、雑談した日の夜の一夜だけでデモを完成させ、翌日の部活で話そうと企みました。
つまり、一夜で大体完成させる必要があったので、開発期間の高速化を優先し、既存のシステムを組み合わせて即席で作品を構築することにしました。
とりあえず動かすまでの2時間
デモ完成までの二時間でやったことです。
設計(10分)
考えた結果、ARのための位置推定には使用したことのあるposenetを主軸に行うことに決定しました。
ARの合成にはunityでエフェクトを表示しOBSというYoutubeなどで配信をする際に使うストリーミングソフトでその映像をカメラ画像と合成することにします。posenetでpythonを利用しているので、pythonで完結させても良かったのですが、時間がかかりそうで怖かったので、obsを使用した合成という強引な手法を使うことにしました。
Unityとposenet(Python)間はUDPで通信しています。(部のPCのスペックが不明だったため、万が一の時はUnityとPosenetを別PC間でUDPしてケアする意味もある)
開発
Posenet(Python)(40分)
Posenetにより、手と腰の位置推定を行い、その座標をUDPでUnityに送信します。
実は第一の落とし穴がここにありました。Posenetがtensorflowの1系を利用していたのです。
私は、ノートPCとしてM1 macを利用しているのですが、tensorflowの1系はうまく動きません。ということで、開発に家のWindowsのデスクトップを使用することとなり、学校での開発は不可能になりました。
Posenetが推定した関節の位置情報をそのままUDPで送ります。
実際には{頂点番号}:{x座標},{y座標}
の形で直接Unityに送りつけました。
Unity(70分)
姿勢を解析し、エネルギーのエフェクトを描画するためだけのUnityです。
まず、気を貯める姿勢を検出します。これは、左右の手の距離から判断しています。Posenetは片手が隠れていても両手分の位置を推定してくれるので愚直に両手間の距離を求めて閾値以内かで判断できます。
次に、エネルギーの放出の姿勢を検知します。エネルギーの放出の姿勢は胴体から両手を一定以上離した時と設計時点で定義していたため、胴体のx座標を左右の肩の位置の中間点から求め、中間点と両手のx座標の距離で判断しています。しかし、ここで閾値を一定にしてしまうと、腕の長さが短い小さな子供などが体験をするときに、大人と同じ設定では胴体と両手の距離が足りずにエネルギーが出せません。そこで、身長に応じて胴体から離さなければならない両手の距離の閾値を動的に更新するように設計しました。
前日の準備
作品自体は素早く完成させることにより、どうにか高専祭当日で展示できることになりました。ですが、前日の準備で思いもよらないトラブルが発生し、かなり苦労をしました。
まず、プロジェクターとモニターのに画面出力を行う予定だったのですが、展示用PCがWindows Serverだったので、古いグラフィックボートに対応したドライバーが正規の方法でインストールできず、詰まります。(どうにか、ドライバーを入れてくださった先輩、ありがとうございました)
また、姿勢推定でPythonからWebカメラを利用するのですが、Webカメラのドライバーもまともに入らず、PythonがWebカメラを認識しないトラブルもありました。
最も苦労したのが、Pythonのパッケージのインストールです。Anaconda環境、素のPythonへのパッケージインストールを試みたのですが、どのバージョンのPythonでもパッケージが入らなかったのです。しまいにはpipコマンドでOpenSSLのエラーが出てきてしまい、どうしようもなくなりました。(準備日が10/29で OpenSSLの脆弱性の修正リリースが11/1なのでOpenSSLのせいにしたい...が調査はできていない)
まとめ
PosenetとUnityという既存技術をOBSで無理やり組み合わせたキメラで時短してどうにか当日までに作品を作った話でした。時間さえあればもう少しまともな開発をしたかったです。
前日の準備日に本番PCで動かないというトラブルがあったので、もう少し前から動けていればよかったのかなと思います。
最後に、高専祭前日の準備日に遅くまで手伝ってくださった先輩方、本当にありがとうございます。