人間のあるべき姿の探索

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

人形になれるシステムを作るVer0.1

ロボットを遠隔操作する為のシステムのプロトタイプを構築しました。

youtube.com

背景

前々から人形が動くと嬉しい!と思っていたので動かしています。

基本的には人形内部に埋め込まれたモータが直結したコンピュータに直に動かすための処理を実装していたため、物理的に接続されたボタンを押す、カメラに映った顔の位置を判定して自律的にそちらを向く、といったその空間に閉じた仕組みでした。

それとは別に、人型ロボットの界隈では昔から実験方法としてWizard of Oz法というロボットを操作して自律に見せかける、といった方法があります。関連する話題だとVRChatなど何かしらの物理的媒体を使って自分以外の何かしらの肉体に憑依する、といった体験が気軽にできるようになっています。

そこで、人形に憑依できたら嬉しい!ということで考えたところ、拡張の方向性として他のPC、欲を言えば目の前じゃなくて、例えば外に持ち出したり友人の家にいる人形に憑依できたら嬉しいので、やっています。因みに、こういったシステム自体は上述のとおりいくつかあるのですが、なぜやるかというと、人形が可愛いからです。ロボットも可愛いといえば可愛いですが、好みの方向性を追求すると誰かが実現するのを待つより自分で作った方が早いので。

アーキテクチャ


大まかな機能および採用理由は以下の通りです

  • 遠隔操作画面:Reactで画面を作成。画面上のボタンを押してロボットに命令を送ることを想定していたのですが、その際に画面更新をしない、コンポーネントを作りやすい、といった点で採用しました。
  • クラウドサービス:Azure上にWeb APIとRedis Cacheを用意し、データを一度DBに置く形にしました。全体的に使用経験があるというのが大きいですが、.NET Frameworkで簡単にREST APIを作成できる点とAzureフルマネージドな機能で諸々の連携が楽だった為採用しました。
    Redis cacheはデータの一時的な保存に使われるKey-Valueストアで、具体的な利用法として認証情報みたいな頻繁にアクセスするが処理自体は軽い、みたいなものに適しています。今回のケースだとロボットの姿勢は2自由度の姿勢情報がint型で入っている程度のものなので、ロボットのIDをKeyとして値を読み書きできるようにしました。
  • ロボット操作プログラム:Pythonで簡単なscriptを作成しました。正直言語は何でもよいのですが、今回はロボット操作用PCにJetson nanoを使用していることからサッとスクリプトを書いて動かしたかったのと、Arduinoなどで使用されているC++ライクな言語が通信周りや文字列処理の部分で機能不足と感じたため、Pythonを採用しました。あとモータを動かすためにPCA9685を使用しているのですが、そのライブラリを使用する際に深く考えずにサッと書ける、というのが割と大きいです。

検討した点・今後の展望

パフォーマンス的に間に合うのか

間に合う仕様にしました。操作用PCの画面からロボットに命令が届くまでにネットワークを経由する必要があり、どれだけデータサイズが小さくて通信がボトルネックになることは想定していました操作画面からHttpRequestでデータをWebAPIにおいてCacheに保存、までで体感100msはかかっていました。
そこで、ロボットPCのプログラムでは同期的に操作用PCから送られた値をすべて再現するのではなく、1秒間隔で値を読みに行って間の姿勢は補完する仕様にしました。
実際人間は偶に鋭敏な動きをしますが基本的に数100msくらいは惰性で動いているので、ロボットPC側で制御してしまった方が確実でした(値のバリデーションやスムージングなどをサーボモータの管理部分で行っていて、これらを仲介したお陰でデータが来ない数100msの間も自動で動くようになっています)。

認証周りはどうしたのか

計画だけして本格的には手を付けてないです。方針だけ示すと、基本的にはAzureADにお世話になるかと思います。AzureADでアカウントを作成・もしくは既存のアカウントを登録して、ロボット操作PCでは画面上でサインイン画面を表示するのが適切かと思います。ロボットPC側はいちいち認証画面を出すのが面倒ですが、認証情報を事前に登録してシークレットIDを記載しておけば自動で認証する機能がAzureで提供されているので、そのあたりの障壁は低いんじゃないかと思います。

憑依しているのか

していません。2つの課題が存在します。

まず、現段階では画面操作で命令を送る以上没入感の課題があります。今回はクラウドシステムを活用して遠隔操作ができることの実証がメインだったので、今後React製の画面を置き換える形でスマホの姿勢取得してサーバに送るUnityアプリを作る等、上記アーキテクチャの改良及び要素の置き換えをしていければと思います。

また、根本的な話として人間から人形に姿勢を送るのみで人形から人間へのフィードバックがありません。このあたりの解決法としては人形の頭にスマホを挿してZoomを繋ぐことで音声及び映像を人形の視覚・聴覚として配信することで解決できます。一応Jetson nanoにカメラとイヤホンを接続すれば同じことはできますが、ディスプレイが無いのでスマホを挿した方が楽です。

ただ、上記パフォーマンス面での仕様から読み取りの速度に限界がある為、HMDのような形でスマホを使用することを考えると、遅延がかなり気になるので遅延が問題となる場合はそもそもクラウドを経由せずP2Pでクライアントごとに直に通信する必要があるかなと思います。Zoomの通信遅延は体感400msくらいかかりますが、Redis Cacheの書き込み・読み取りをそれぞれ早めに見積もって100msとしても、姿勢情報を送ってロボットが動いて人間が動くまでに600msくらいの遅延が発生するので、ちょっとリアルタイムというには違和感を感じてしまうかなと思います(そもそも通話は400ms以上の遅延で違和感を感じるといわれていますね…)。

終わりに

改良が必要な点もありますが、ひとまずクラウドを使用して最低限遠隔操作ができるシステムが構築できました。

労働しながらでも人形やシステム開発をやっていきたいですね。