人間のあるべき姿の探索

思索・人形・エンジニアリング

機構設計のサイズ感の話

人形になるぞ!

godiva-frappuccino.hatenablog.com

 ということで人形に機構を仕込んで動かせるようにしています。そこで、設計するにあたっての話をします。

 今回は等身大のトルソーを作る為、かなりサイズの大きいものとなっており、造形も大味になっていきます。粘土が重くて片手では人形を持ち上げられず、倒したら背後にあるものが壊れる、そんなサイズ感になります。存在感を出すためにはこのサイズと思ったものの、作業量が尋常ではありません。その代わり、造形をする際に脂肪がついていそうな分だけ粘土をもぎ取って貼り付けるとそれっぽくなったり、等身大であるメリットもありました。

godiva-frappuccino.hatenablog.com

 一方で、機構はかなり細かい調整が必要です。例えばサーボモータのマウントを作成するとき、サーボモータの長辺は42mm程です。そして、その前後に丸く穴が開いており、ここにネジを通して固定する部品を作成したのですが、この穴が1.0mmずれると、ネジがまっすぐ入らなくなります。更に、ネジの太さは3.0mmなのですが、3Dプリンタで印刷をする段階で、この穴は少し、感覚的には0.2mmほど縮みます(僕が使用しているプリンタの精度が0.3mmです)。そうするとネジが入らなくなる為、3.3~3.6mm大きく穴を開けます。更に、印刷の方向によっては穴が少し歪んでつぶれる為、3.8mm程にします。3Dプリンタの精度の方がボトルネックになるように、0.2mm単位でのモデリングが求められます。とは言っても、拡大して観察しながら0.2mmこの辺を右に移動…みたいな操作の繰り返しでできるのですが。

 しかし、3Dプリンタの精度は0.3mmといえど印刷の条件やノイズによって少し歪みます。毎回0.1mm単位ではズレが生じますし、真円を描こうとしたのに全体にずれが発生して段差ができてしまうことがあります。それを考慮して、少し大きめに穴を開けたうえでセロテープを2,3周巻いて隙間を埋めたり、ダイヤモンドやすりでひたすら部品を削って0.1mmくらい拡張したりします。セロテープの厚みを実感します。

 粘土の外骨格との干渉もかなり問題になります。モデリング時は胴体の厚みを10mm程度つけた状態でプレビューしていたのですが、内部の機構が干渉します。最終形は色付けした部分が前方に10mmほど余裕がある様に見えるのですが、実際にはこの機構全体を取り外ししてメンテナンスするため、はめ込む際の導線を開けておく必要があります。背中部分も下手に大きくすると、背中の蓋が閉まらなくなるといった問題で、5mm程機構を小さくする、モータをうまく収める、干渉しないよう印刷して動作確認するといったことを繰り返します。

 下図は背中に機構を仕込んだ様子ですが、背中パーツの金属がモータと干渉したり、肩周りもギリギリまで広げないとモータが干渉したり、特に突出部はぶつからないよう実際のモノを見て確認する必要がありました。深夜作業も多かったので、夜モデリングして次の日に印刷してみてみてるとうまくいかない、みたいなこともしばしばありました。

 普段テレビなどを見ていてミリ単位の作業と聞くとすごい!と思いますが、実際には0.2mm隙間があるだけでパーツがぐらついてしまいますし、そういった細かさに対応する集中力が求められるのだなと思いました。そして、そういう意味では3Dプリンタの精度は案外信用ならないと思いました。勿論、フリーハンドで造形するよりは信用できますが、、、

 大きなサイズ感にも、小さなサイズ感にも対応していきたいですね。

人形を作る為のプロジェクト管理

人形になるぞ!

godiva-frappuccino.hatenablog.com

 ということで製作をしているのですが、趣向を少し変えてプロダクトではなくプロジェクト管理の話をします。本業でソフトウェア開発をしているので予算とか納期とか色々気になるのですが、人形になる為の試みは予定管理が非常に難しいです。一般的な人形制作においても、一度胴体を作って満足しても寝て起きてみたらひどくバランスの崩れた体に見えてしまうこともあります。特に凝り性の方はずっと作業に没頭してしまうこともありますが、ここでタイムボックスで切って作業を完了としてしまうと、納得のいかないクオリティで打ち切ることになります。完成を目指す為には打ち切る必要はありますが、展示の締め切りの様な納期を別にして、時間で区切ってはいけないと感じました。区切るなら時間ではなく期間で、追い込まれたらひたすら時間を費やすバッファがあると良いですね。そのバッファは消えます。

 そして、新しく何かを作るにあたっては、その時間の不確実性が増します。今回は機構を3Dで印刷する、等身大サイズのトルソーを作る、粘土用の型を3Dプリントするといった不確定要素がいくつもありました。そういった作業はPoC(Proof of Concept、概念実証)のフェーズが必要になります。これはプロダクトの価値とは別にそもそも実現可能か?どの程度のクオリティで実現できるか?という問いから始まりますし、その結果によって最終的なアウトプットのイメージにも影響するため、かなりプロジェクト管理が大変になります。そこで、二つの軸、WBSを諦める、完成イメージのパターンを場合分けするという方針を採用しました。

WBSを諦める

 まず、WBSを諦めることについて、WBS(Work Breakdown Stracture)とはプロダクトの作成を計画するにあたって作業を管理する為に細かく分割したもので、例えばタスクAはn月m日~o日、タスクBはn月o日~p日で先行タスクがタスクA、みたいな線表を引いていくことで管理します。これによって、いつまでにどの作業ができているかといったことが明確になります。しかし、今回の人形制作はほとんどがPoCと呼べるものでした。特に美術系でアウトプットの形が最後まで工夫できるものは、一つの作業が終わった後にもう一度他の作業を思い返してみて、やり直す…といったことがしばしば発生します。つまり、順番に進むのではなく、幅優先探索ですべてのクオリティをだんだんと上げていく作業になります。

 ということで、タスク一覧のみを洗い出して順番に作業していきます。簡単な優先度をつけるために、ステータス管理をToDo,In Progress, Done, PendingのほかにASAP(As soon as Possible)をつけたステータスを作り、直近での作業を決めました。これはタグでも良いです。しかし、これらは複雑に絡み合っています。眼球のモデリングと頭部のモデリングは干渉しかねないので同時に、そして頭部のモデリングをしているうちにモデリングの共通点で機構の形へのアイデアに寄与することもあります。設計項目はよく木構造で表されますが、実際にはそれなりに密なグラフ構造になっているわけです。このグラフ構造を意識する為に、見た目上は緩い管理をしつつその関連を常に頭の中に浮かべるようにしました。そして、作業については脳内の一次キャッシュとして本当にシンプルなToDo表に落とし込まれました。タスク一覧の管理とToDo管理は別になります。

完成イメージのパターンを場合分けする

 PoCの中で、できるか分からないものはたくさんあります。例えば、今回は首を動かす予定で人間の様に振り向き、頷き、傾げる三方向に動かせることを目標としたのですが、実際にはそれを安定して実現する仕組みが作れず、半年程検討したところで一度首を傾げる方向を削った形で終了することにしました。最終的には納得いかずにもう数か月検討して三方向に動くようになったのですが、ここで必要なのが、まず、最終的なイメージがそれでよいか?を考えることです。どうしても実現しないといけないコンセプトの中心であれば妥協はできません。そもそも首が動かないとなれば動く人形ではなく操作による没入感が極端に低減してしまいますが、傾げる方向は最悪無くても視線は動かせるため、没入感が得られるかもしれません。そこの不確実性は早めに解消する必要がありますが、最終的なアウトプットとして問題がなければ諦めることも可能です。そして、パターンを想定する必要があります。今回だと二方向にしか動かないか、三方向に動くかのパターンがあります。それら全てを検討しつくして、どのパターンであれば納得できるか考えます。

 そして、オプションとしてステップを分けて第二ステップとして三方向に首を動かす実装にアップデートするプロジェクト方針にすることが可能です。ここで必要なのが、後から拡張可能であることです。二方向に動かす機構がピッタリはまるような仕組みを作ったところで、後から三方向に動かす機構ができてもそれが大きすぎて人形の骨格に入らないようであれば意味がありません。実現できた際に差し替え可能か?ということだけでも考えておく必要があります。そこで、可変になりうる部分は差し替え可能にしておく、ということが必要になります。他の例だと、眼球にWebカメラを仕込むかどうか検討中で、一旦シンプルな半球で眼球を作るだけに留めようと思うのですが、眼窩のパーツをシンプルな眼球用に作りこんでしまうと、Webカメラを仕込んで大きくなった眼球を眼窩に納めることができません。そこで、眼窩から差し替えができるように、眼窩パーツをはめ込むための金属部品だけを人形の方には設置しておいて、後から眼窩を設計できるようにしていました。

 これはかなりプログラミングにおけるインターフェースの考えに影響をうけており、業務でパソコンをカタカタしていてよかったと感じたことの一つでした。この辺りの考え方は実装的な意味合いで以前まとめたのですが、これがプロジェクト管理のしやすさにもつながるわけです。

godiva-frappuccino.hatenablog.com

終わりに

 といった感じで、不確実性の高いプロジェクトの管理の話でした。一般的なシステム開発だと実際はある程度線を引いて顧客へのスケジュール説明をして…といった感じになると思いますが、アートの面白いところは締め切りのギリギリに思いついたアイデアが根本からコンセプトを覆しうる、最終的なアウトプットを変えうるインパクトを持つため、それを大切にする必要がある点だと思います。そうなるとプロジェクト管理手法が厳しく押さえつけるのは難しいのですが、緩くガイドラインを引いてやるのがちょうどよい塩梅なのかもしれません。

 

ロボットの部品を3Dプリントする

人形になるぞ!

godiva-frappuccino.hatenablog.com

 ということで人形に機構を仕込んで動かす試みをしているのですが、機構を準備するのも大変です。一般的には金属で切り出したりして作ることが多いかと思います。土台は木で作っておくこともあるかと思います。しかし、人形でやるにあたって、そして一から機構を考えるにあたっては試行錯誤のサイクルを高速で回す必要があり、3Dプリントすることにしました。

 素材はPLAフィラメントを使用しました。いくつか素材はあるのですが、自宅の3Dプリンタに対応しており、ある程度の強度が見込める為です。この辺りについてはもっと詳しい方がたくさんいらっしゃいますが、ひとまず自分で手を動かして強度の確認などをしました。土台はもちろん、サーボホーンもモデリングします。といってもはめ込み部分は既存のモデルを使用しています。印刷にあたってのコツとして、積層型のプリンタでは強度と歪みの方向があります。例えば、サーボホーンの場合ははめ込み部分のサイズがシビアですが、これを縦に積み重ねていくと土台がない部分が少し縦につぶれてしまいます。それを避けるために、穴を上に向ける形で印刷します。ねじを通す用の穴も開いているのですが、ネジが3.0mmの太さであるのに対して、円周が印刷のずれで収縮したりズレで歪むことを考慮して3.6mm程度にします。仮に縦で印刷する場合は、これをさらに広げて、積層方向には3.8mm、横方向には3.6mmといったサイズ感で印刷します。印刷の精度が0.3mmだったはずなので若干ズレが発生するのは仕方ないですが、ネジや機構のはめあいは0.1mm単位での精度の確保が必要なため、そういった調整が必要になります。ずれた場合はひたすらダイヤモンドやすりで削り続けて0.2mmくらい穴を広げることもありました。

 簡易的なねじ止めをするにあたっては、ナットが役に立ちました。場所によるのですが、ネジ止めが難しい箇所はナットを差し込む穴を作り、ナットを入れた後にネジ穴にネジを差し込んで回転、といった流れでパーツ同士をねじ止めできるようにしました。

 ロボットの土台となるパーツについては接着してしまってよいのですが、印刷する際に積層型では真下に空洞があると積み重ねることができずサポート材が必要になる為、パーツを別々に印刷して組み立てることにしました。一列に並べて極力高さをひくくすることで、印刷の時間を短くできます。

 そんなこんなでひたすら試行錯誤をすると、できます。

 

首機構ができるまでの話

人形になるぞ!

godiva-frappuccino.hatenablog.com

 人形に機構を仕込んで動かす試みをする中で、首を3自由度で動かす為の試行錯誤をしていました。最終的には人体でいうところの胸鎖乳突筋に近い形の筋肉を首筋に二本リンク機構で用意したうえで、車軸関節に見立てたモータを配置して3つのモータを連携させて動かすことで人間の首の動作を模倣しました。

godiva-frappuccino.hatenablog.com

 しかし、その途中で様々な失敗がありました。折角なので振り返っていきます。そもそも、最初は2自由度の機構で首をかしげる動作を諦めていました。パンチルト機構で調べると登場する形ですが、これはモータの動きをそのまま首の動きに使用しており、振り向き方向と頷き方向それぞれにモータの軸を配置します。この場合、回転の中心にモータの軸を配置することで、2つまでは安定して配置することができます。しかし、満足できず、試行錯誤を繰り返していました。なんだかんだしっかり作りこみました。

 一年前に作成したこの子と同じ機構です。

www.youtube.com

 とはいえ、早々に胸鎖乳突筋のイメージが脳内にあったので、再現するための機構を探っていました。下にモータを二つ配置して、リンク機構で首関節の中心を引っ張る形にしていました。最初は首の中心部分を球体を差し込む形にしていました。そして、下の部分は単純なリンク機構でまっすぐ引っ張る形にしていました。

 ここで二つ罠があります。まず、機構の素材となるPLAフィラメントの強度の問題がありました。頭部1kgほどを支えながら頻繁に動かす為、それなりの強度が求められるのですが、機構の一点に力がかかってしまう問題があり、結構頻繁に折れていました。そして、もう一つの問題が球体関節を考えるときに遭遇した2自由度リンク機構のゆがみ問題です。首をかしげる方向に動かすと右図の黄色の線のように平行方向の距離が短くなります。これによって、モータ側の黄緑色の可動部と黄色いリンクの接点の角度が変わります。つまり、2自由度分動くジョイントを用意する必要があります。更に、首周辺は球体の為、逆に3自由度分動いてしまい動きがぶれる問題がありました。

 ということで、ユニバーサルジョイントという2自由度のジョイントを購入してはめ込みました。前後左右に回転するけれどねじれはしない、といった感じの機構になります。これを首の中心部、リンクの上端及び下端の計5か所に設置します。あまり高いものではないこともあり少し遊びがある為頭部が少し揺れるのですが、それについては改善点ということで一旦合格としました。このユニバーサルジョイントはネジを差し込めるので、写真をよく見るとねじ止めしているのがわかります。

 モデルはこんな感じです。

 ということで、基本的な機構ができました!あとは細かい話として、モータは基本ねじ止めしているのですが、ねじ止めの穴が一ミリずれた状態で印刷してしまってやりなおし…みたいなこともありました。最初に穴がない状態でモデリングして後から黄色い棒を差し込んで差分をとって穴をあけるのですが、モータのモデルが微妙にずれていたり、うまくいくように見えて実際印刷すると隙間がカツカツだったり、印刷の過程でフィラメントが歪んで楕円形になってネジが刺さらない問題などもありました。単純な印刷というより設計段階での考慮も必要でしたね。

 あとは、ねじを差し込む場合実際にはドライバーでねじ込む必要があるので、ドライバーを通す隙間が必要です。下図の右側は最初支柱とネジ穴が少しかぶさってしまいナットを指で固定できなかった状態です。左側のように支柱の位置を変えることで解決しましたが、この辺りの数ミリの調整で背中の粘土の壁にぶつかるかどうかの瀬戸際でモデリングしていたので、かなり胴体の有機的な形との戦いでした。のどぼとけの辺りに6mmの太いねじを差し込む必要があったのですが、丁度首の支柱があったため、支柱の真ん中にでかいドライバーを通すための穴を開ける必要もありました。

 そういった試行錯誤を経て動くようになりました。結局、最終的な感性物の10倍くらいは試行錯誤で印刷したため、フィラメント代も結構なものになりました。ただ、そういうプロセスを踏まないとできないものだということも理解しました。大変ですね。

 

人形の視界の為の映像リアルタイム転送

人形になるぞ!

godiva-frappuccino.hatenablog.com

 ということで、人形の視界となる映像をWebカメラで取得し、HMDに視界を流し込む仕組みを開発中です。人形の作業の中で、実現可能性の観点で一番苦労しているのが、実はここになります。個人的に電装周りの知識や機構学の知識が足りないので苦労している点はあるのですが、映像の転送については技術的に限界があります。

 まず、データの通信は基本的に少量を高速に送るか、大容量でも低速にもしくは遅延を許可して送ることが多いです。例えば、極端な例ですが格闘ゲームは極限まで遅延を減らしたいところで、わざわざ映像を同期するようなことはせず、お互いのコマンドを送って相手の画面でその描画をします。描画や計算よりも通信の方がボトルネックになるわけですね。ちなみに格闘ゲームなどは投機的実行として先にこう動くと仮定して動かしておいて、後から命令が異なる場合に補正するような仕組みを導入するゲームもあるようです。高速でも一秒で地球を7周半程度なので、ブラジルと日本で遅延10msなどは現実的ではないんですよね。そして、映像を送るYouTubeの場合は1秒とかラグを許容する場合が多いです。リアルタイム通信のZoomなどのWeb会議システムはUDPベースの制御が軽い通信方法をしていますが、それでもローカルネットワークを超える場合は400ms程度の遅延が入ります。これだけずれると会話がしづらいのですね。

 ということで、今回やろうとしているのは低遅延で映像を送ることになります。できることと言えば、ローカルネットワークで可能な限り有線接続をする、そしてUDPベースで信頼性を犠牲にしてとにかく高速に映像を送るというのが解決法です。しかし、有線接続についてもVRChatのようなツールでは専用ケーブルを刺すとその線で通信してくれるのですが、自前のアプリケーションでTCP/UDP通信をする際にその線を使用する方法がわからず…といった感じで情報がつかめず苦戦しているのが現状です。後で遠隔操作を見越してWebRTCに手を出そうとしたのですが、一番使い慣れているクラウドサービスのAzureで使用できるAzure Communication Servicesでは長らくHMDの開発言語であるUnityサポートがなく、無理やり使用する場合もHoloRensでWPFとマルチプロセス実行が必要だったり、とにかくHMDでは難しいというのが現状です。

 今回はシンプルにUDPで小さめの映像を転送するようにしました。送り側はPythonで書いていて、JPG圧縮した後にUDPHMDに映像を投げています。UDPだと映像のサイズに制限がかかるのですが、JPG圧縮すると映像の内容によってバイト数がかなり変わるので、一番サイズが大きい状態で超えないような画面サイズにする必要がありました。JPGの圧縮アルゴリズムを忘れちゃいました。RGB-YCbCr変換をして情報を少し減らしたのちに離散コサイン変換をして量子化、最後にランレングス・ハフマン圧縮をするらしいです。情報をへらすうえでは最初のRGB-CbCr変換でちょっと情報を落とすのとランレングス・ハフマン圧縮で大きく落とすのがコアになっていそうですが、確かにカメラをふさいで画面を真っ暗にするとランレングス・ハフマン圧縮でめちゃくちゃ圧縮されるのか本棚を映している時と比べて半分くらいのバイト数になります。

kuriken12.hatenadiary.org

受け取り側はUnityなので、Update関数が回っている状態で映像が入ってきたらreceiveBytes変数に入った映像をテクスチャに貼り付けていきます。

 

人形を動かす為の部品調達と予算の話

人形になるぞ!

godiva-frappuccino.hatenablog.com

 なる為に、粘土で造形したり中に機構を仕込んだり色々と作業をしているのですが、かかったお金の話をしていきます。それでは、列挙します。

 粘土代は数えるのを忘れてしまったのですが、約20000円程度かかっています。粘土にはラドールという少々硬めの粘土を用いて、これで人形の肉体を作っています。胴体約50cmの高さを20cm辺り500gx4袋使用して土台を作っていました。50cmだと10袋で大体5000円なのですが、これに更に脂肪や筋肉を載せていくので、倍くらいにはなります。そして頭を作るほか、実は7月に一度すべてやり直しているため、その時まで作っていた胴体と頭部に薄めに持っていた粘土代があります。そして、内側には補強の為にプルミエという強度の出る粘土を使用しています。これは一袋400g程で体積と値段は変わらないのですが、途中で収縮度合いが大きくはがれてしまうことに気づいたため、積極的には使用していません。粘土を買うと床がなくなります。いったん塗装については無視しますが、消耗品の下地材や絵の具を購入して使う分としては2000円程度になります。

 そして、造形の際は3Dデータをモデリングして、そのデータを3Dプリンタで印刷して型にしていました。3Dプリントする素材となるフィラメントは1kg3000円程度なのですが、これを型及び機構のパーツの双方に割り振っていきます。更に、印刷の歩留まりは意外と悪く、モデリングのミスでやり直しをすることもあったため、代替8kg程度購入していたようです。25000円程度はかかっていると思われます。そして、3Dプリンタ本体の値段もあり、これについては以前友人からの依頼でほぼ相殺されたのですが、一応40000円かかっています。極力薄く印刷しても、20cm分胴体を巻ける型を印刷すると、数100g消費してしまいます。本当は粘土の重みに耐えられる剛性を持つよう分厚くしたいのですが、お金と時間が足りず、無念…高速3Dプリンタと無限のお金が欲しいところですね。

 ついでに、作業用PCが200000円です。まぁ日常的な作業にも使用しているので良いのですが、UnityやBlenderを触る上ではあった方が良いかなと思っての判断で、ちょっとしたGPUも積んでいます。RTX3060程度で良いから、GPUは積んでおくと良いってマックで女子高生が言ってました。

 サーボモータにはMG996Rという少し強めのトルクのものを3つ使用しています。なんだかんだ故障も含めて7つ購入、その他検証用にもっと強いトルクのサーボをこうにゅうしたこともあり、合計10000円程度になるかと思います。ロボット周りだと、中華性の小型PCが30000円、Arduinoが高騰前に買っていたので3000円、PCA9685はまとめ買いして呼びも含めて2000円程度です。制御周りの方が安いのが意外ですね。

 人形内部にはPLAフィラメント性の機構と粘土を繋ぐための部品を埋め込んでおり、これは摩耗を防ぐために金属を購入しています。金属部品は一からオーダーするとめちゃくちゃ高いので、ホームセンターをひたすら巡りながら頭の中で設計をこねくり回していました。クソでかホームセンターで一時間くらい金折れ金具をグッと睨むみたいなこともしていました。これを続けて、細かいくの字の部品を大量に購入していたりしたら5000円くらいかかりました。それでも熱と摩耗に強い素材は替えが効きませんからね。PLAは200°前後で溶けるので、300Wの電熱器で暫く熱していると歪んで溶けます。あとは細かい部品として機構を綺麗に動かす為のユニバーサルジョイントが3000円とか色んなネジを買いまくっていたら3000円程度になっていたとかはあります。地味に長さとサイズの合ったネジを探したりそれ用の機構のモデリングをするのが大変なんですよね…

最後にVR側の話をすると、PICO4が50000円、その他ケーブル込みで55000円程度になります。要件を満たしつつスペックを…とか考えていたのですが、やはり開発用がメインと考えるとあまり高いものは購入できませんでした。VRChatをやってみたい気持ちがあったのでできることを確認したかったのですが、最近までPICO4にはVRChatのアプリが入っていなかった為ゲーミングノートに繋ぐ必要がありました。

 大体35万円くらいですが、やっぱり一般のロボットと異なり移動ロボットではなくアクチュエータが少なかったり、それらもクオリティを下げているお陰でだいぶ節約できているのが見て取れますね。本当は制御のレベルを上げるのであればダイナミクセルさんのサーボを使用して滑らかにしたいのですが、一旦動くことを担保したいのでこういったレベルに落としています。一度完成したところで、ダイナミクセルサーボを調達して機構から設計しなおして差し替えてみたいですね…!ぬるぬる動いてほしい…!

人形に機構を仕込むためのハード選定

人形になるぞ!

godiva-frappuccino.hatenablog.com

 ということで、人形に機構を仕込んで動かす為の試みを続けています。今回はハードウェアの選定の話をします。ロボットとしての構成は以下の図のようになっています。データフローの説明の為の図なのでソフトウェアとハードウェアが混ざっていますが、まず左の操作用のHMDがPICO4というHMDで、一般的に流通しているVIVEやQuestシリーズとは異なる機種になります。そして、人形側はまず粘土でできた胴体、これは特にいうことがありませんが、その中にロボット用PC、マイコンボードであるArduinoサーボモータを動かすドライバーの役目を担うPCA9685、サーボモータ、そしてUSBカメラで構成されています。

 まず、HMDの選定からです。このプロジェクトの開始が今年の一月ごろだったのですが、元々人形の遠隔操作のツールを選定する中で、スマートフォンを検討していました。しかし、Android端末は元々VRに特化したハードウェアではなく、特に頭にかぶる場合にはそのための器具も必要で、アプリケーションも一から自分で作成する必要があったため、かなり難易度が高いと感じました。センサーも大したものではなく、眼球二つ分をの映像を視差を考慮して画面に映すのは結構面倒でした。Android用のコード書く経験はあまりなかったですし。

 ということで、その辺りの基本的な要件を簡単に満たせるHMDに手を出しました。UnityでVRアプリケーションを書くことは覚悟していたので安価なものを選定したのですが、一般的にはOculus Quest2というものが安価かつ情報も多く、開発向きの機種とされていました。しかし、カメラパススルー機能というHMDを被ったまま外の景色を見られる機能があり、それがOculust Quest2だとモノクロかつ低い解像度でしかできないということを知りました。一応上位機種のQuest ProだとRGBなのですが、当時20万円程度したので、開発用デバイスとして使うだけだと費用を回収できないと思いました。そこで白羽の矢が立ったのがPICO4というわけですね、2022年10月頃発売で未だに開発向けの情報が無く、あまりにもないので僕も記事を書くくらいだったのですが、未だに全然情報がありません。

 因みに、HMDについては未だに開発で困難にぶち当たっています。というのも、カメラ映像の転送のオプションが二つ考えられ、有線接続および無線接続なのですが、通信が高速かつ安定する有線接続についてはあまり有効な手段が確立されていません。一応コミュニティサイトでUSB Type-CからEthernetに変換してPCに刺せば通信できるとの記載があったのですが、ダメでした。これについては昔自作したEthernetが死んでいる可能性があるので別の機会に試してみますが、有線でTCPのような自前で用意したアプリケーションの通信を簡単に動かせる状態ではないようでした。また、Webカメラを直に刺そうとしたのですが、Unity側の都合でWebカメラの映像を投影するためのライブラリが古く、対応するUnityのバージョンが古いためQuestシリーズならまだしも2022年発売のPICOシリーズのSDKとは互換性がないといった状況で、Unityの都合に引っ張られています。といった感じでハードウェアの制約に引っかかる苦労をしています。

youtu.be

 そして、PCについてはラズパイではなく中華性の小型デスクトップPCを使用しています。最終的に人形の外部にPCを置いてデモを行う算段を立てているのですが、設計段階では人形内部に機構と共にPCなどのパーツ一式が入ることを要件としていました。一応今でも入る想定で組んでいますが。そこで、ノートPCはディスプレイがついているので扱いやすいのですが、うすべったいあの形だと有機的な形をした胴体に全然入りません。ということでコロンとした72x72x40mmくらいの小型PCが必要になりました。ここでラズパイを使用することも検討したのですが、ラズパイを3台くらい焼いている身としては、やはり高価なハードウェアを焼いたときのダメージがあたまによぎります。ラズパイ4は一時的な高騰もありましたが、落ち着いた今でも12000円程度、高騰前に確保していたJetson Nanoは40000円近くまで高騰していたこともあり、これを破損したときのダメージはとても大きいと思いました。そこで、サーボモータと接続する部分は直接つなぐのではなく、Arduinoを挟むことによって事故のダメージをArduinoで止めることにしました(ショート時にPCにダメージが来ない配線かどうか確認する必要はあります、どうなんでしょう(確認しろっていわれてるんですが…))。更に、Arduinoはあくまでモータを動かす為のものであまりコードを書き替えたくないので、モータを刺せば命令を投げられるようにしたかったのですが、配線番号をべた書きするようなことは避けたく、そういった依存関係をPCA9685に吸収させることにしました。PCA9685だと16つのサーボまでを論理的な番号で扱えるので、Arduinoのピンのことを気にせずに済みます。一つ難点としては、HMDからサーボモータに命令が流れるまでに各ポイントでの遅延がかさみ、かつ同期するための待ち状態が発生する点があります。これに関してはトレードオフで諦めました。モータを動かすのと映像の転送でそれぞれ200ms程度はひとまず覚悟する結果となりました。

 そして、Webカメラについては検討中ですが、一旦市販のWeb会議用のものを購入しました。眼球にカメラを仕込むために小型カメラをいくつか購入したのですが、Amazonの評価が2.3で評価6件のようなものばかりで、8000円くらい突っ込んでみて一応動くことは確認できたものの、耐久性やデモ中の差し替え、歩留まりなどを考えるとあまり好ましくないように感じました。ひとまず眼球に埋め込むための仕組みは設計しつつ、ヘッドドレスにWebカメラを括り付けるような構成を考えています。耐久性や品質が安定していて安価でAmazonの評価が400件くらいで平均4以上の小型Webカメラが登場したら教えてください。

 というわけで、ハードウェア選定の話でした。考えることが多いですね。