人間のあるべき姿の探索

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

人形になる為のシステムを作る:人形側アプリケーション

人形になるぞ!

godiva-frappuccino.hatenablog.com

 人形になる為に、人形に機構を仕込みつつHMDで外部から操作できるようにします。HMDのシステムは以下の様に作成しています。今回はHMDからの命令を受けた人形側で人形の機構を動かすまでの流れを作ります。

(ここに記事を貼る)

 人形の内部システムはレイヤー化されたアーキテクチャを採用し、HMDから10fps程度で姿勢が送られるたびにAPI層からInfra層まで値を流していくイメージです。API層は現状UDPでメッセージをもらうため、HMDからの受け口として用意しておきます。今後ローカルネットワークを超える場合にはここにWebRTCServer等が立つイメージです。

 そして、ユースケースとしてはあまり見当たらずLookとしています。HMDから見て特定の方向を人形に注視させる為この名前にしていますが、一般的なHTTPリクエストと異なり値を送り続けることで達成されるユースケースの為少し違和感は感じられます。

 そして、ドメイン層に人形の自由度や内部の機構をモデリングしたRobot及びそのロボットの動作を決定するMoveGeneratorという業務を作成します。これが動作することによって、ロボットの姿勢が決定され、インフラ層に値が送られます。インフラは諸事情でArduinoを経由してサーボモータに値を送ります。

 Domain層はHMD側アプリケーションと同様に簡単な値オブジェクトとして、Angle, Degrees, CentiMeterなどを定義しています。ポイントとしては、人形の姿勢を表す為の角度値のDegreesとサーボモータの角度を示すAngleは共にラジアンで処理される角度値であるものの、別概念である点です。それらをサーボのモデルであるServo、その集合体と機能の集まりであるRobotによって構成します。

 ロボットの首機構のプログラムは悩み途中でまだ綺麗になっていないのですが、初期値を人形の初期姿勢に固定したうえで、HMDから姿勢情報が届くたびにUpdate関数で角度値及び対応するサーボの角度値を更新します。また、HMDからの姿勢は届くタイミングにばらつきがある為、値の更新はかけますが、実際にロボットに姿勢を送るのは別スレッドでタイミング調整をしてから定期的に送信しています。

 Infra層ではシリアル通信を用いてArduinoにサーボの角度を送信するため、適当なフォーマットをArduino側プログラムと取り決めて送ります。ここでは{"servoNum":xx.x}のjsonを送り、Arduino側もJsonで受取ります。ここは一定時間内に読み取れるメッセージ長に制約がある為自分でパーサを書いた方が良い部分なのですが、ひとまず小数点一桁で細かい値を落とせば間に合うことが分かったので、現状はJsonのまま送っています。

 ここまで書くと、人形が動きます。