Bakulog

獏の夢日記的な何か。

UnityのモーションをPepperに適用する(前編:リアルタイム編)

タイトル通りです。

 

もくじ

  • 概要
  • 準備とプログラムのダウンロード
  • 実行手順
  • プログラム(Choregraphe側)
  • プログラム(Unity側)
  • もっと活用するために

 

1. 概要

Pepperの開発者が口にする苦労話のなかで「Pepperの動きを作り込むのがめんどくさい!」という意見を多く聞くので、有用そうな対応の一つとしてUnityからヒューマノイドのモーションを持ってきてPepperに適用する例を紹介します。…とはいってもUnityからPepperへモーションを持ち込むアプローチは大きく二通りに分かれます。

  • リアルタイムにUnityのキャラモーションを送る方法
  • 事前にUnity上でモーションのログをとってPepper用の動きにコンパイルする

前者の方法は遠隔制御など、Pepperがリアルタイムで動いてる事自体をウリにしたアプリケーションで使えます。いっぽう後者の方法はPepperのアプリ用に動きを作るときに便利です。

 

そこで今回は前半の「リアルタイム編」と称し、リアルタイムでモーションを送りつける方法を順に見ていきます。後半の非リアルタイムな方法は実装方針が変わってくるので別件で紹介します。

 

2. 準備とプログラムのダウンロード

プログラムはコチラGoogle Driveリンクからダウンロードできます。また動作環境は以下の通りです。私はWindows 8.1でやってますがMac等でも出来るハズです。

  • OS: 下記ソフトが動くなら何でも
  • Unity(ver5.0以上, 私が使ってたのは5.2.2)
  • Choregraphe(最新のやつ)

実行および読解に必要な前提知識は下記の通り。

  • Unityの基本処理
  • C#(Unity側のプログラム)
  • Python(Pepper側のプログラム)

 

 

3. 実行手順

3-1. Unity側

  • 配布プログラムの中に"UnityForPepper"というUnityプロジェクトディレクトリがあるのでUnityで開く
  • UnityちゃんをWebサイトから3Dキャラモデル(ver1.2)をダウンロードしてモデルを配置(※計算の都合でUnityちゃん以外のモデルだと頭のモーションがうまく取れません。)
  • プログラムのAssetにあるスクリプト"UnityForPepper/UdpSender"をモデルにアタッチ
  • UdpSenderの設定が下記のようになってることを確認

u2p_unity_setting

 

3-2. Choregraphe側

  • Choregrapheプロジェクトファイル"PepperByUnity/PepperByUnity/PepperByUnity.pml"を開く
  • プロジェクトにはボックスが1つだけ配置されているのでパラメータ設定を開き、次のようになっていることを確認

u2p_choregraphe_setting

それと、実行結果を見るためにメニューバーの「表示」から「ロボットビュー」を選び、ロボットビューを開いておいてください。もしここでPepperではなくNaoが表示されている場合、メニューバーの「編集」->「設定」から「バーチャルロボット」のタブを開き、モデルとしてPepperを選んでください。Naoのままだとサンプルがうまく動きません。

 

3-3. 実行

UnityとChoregrapheプロジェクトを順に実行してください。どっちから動かしても構いませんがUnityがアクティブになっていないとUDP送信処理が行われないことだけ注意してください。

 

Unityちゃんに添付されたスクリプトの機能では画面右上のNextとかBackと書かれたボタンを押すとポーズが変化していくので、PepperがUnityちゃんの動きに追随してくれていれば成功です。なお追随する動きは頭と腕だけで、後述しますがポーズによってはあまりうまく再現出来てません。下に出してるのは比較的うまくいった例です。

u2p_demo1

u2p_demo2

u2p_demo3

 

 

4. プログラム(Choregraphe側)

プログラムの中身について簡単に。

まずはChoregraphe、つまりPepper側のプログラムから見ていきます。コードは若干大仰ですが、内容は比較的シンプルで以下の処理を行ってるだけです。

  1. UDPでバイナリ値が飛んでくるのでstructモジュールでアンパック
  2. 関節の値に上限や下限があるので値を抑える
  3. 下記のPepper制御APIメソッドを使い、実際に関節の目標値をセット
self.motion.setAngles(self.jointNames, destAngles, self.fractions)

上記の関数では第一引数に関節の名前一覧、第二引数に目標角度を与えています。ラストの第三引数に与えているのは各関節をどの程度素早く動かすかの指標(0.0だとほぼ動かず1.0だと全速力)で、次のような指針で事前に調整する必要があります。

  • 手の開閉(グー/パー)などは動きが小さく、素早く動かしても安全なので速めに設定
  • 腕全体の上下など大きい部分の動きは、あまり速く動かすと危険かつ見た目にもなんかキモくなるので遅めに設定

 

またサンプルでは使ってませんが、実用上はUDPタイムアウトを適用した方がいいこともあります。タイムアウトを有効化するにはボックスのパラメータの"Timeout"を秒単位で指定してください(例: 10秒でタイムアウトとしたい場合は10.0)

 

5. プログラム(Unity側)

Unity側のプログラムではPepperに投げつけるデータ配列をRobotMotionDataというクラスで用意し、キャラモデルから実際に値を計算してUDPで投げつけています。

重要なのはPepperの角度表現はオイラー角ベースなためUnityのクオータニオンはそのままだと使えない点で、若干頑張って計算する必要があります。

角度の計算処理は"UnityForPepper/MotionCalculation"スクリプトで実装していますが、内容としては「手計算で主に関節の方向へ着目してForward Kinematicを陽に解いてる」だけなのであまり気にしないでも構いません。ただここの計算は若干ミスってるらしく一部の動きが正確に再現できない原因になっています。動きが気に入らない場合は上記スクリプトに手直しを行ってください。

 

 

6. もっと活用するために

本題は以上ですが、最初の方にも書いた通りリアルタイム制御が本当に生きるのはモーションキャプチャのような外部操縦デバイスと組み合わせた場合です。

私が自力で試したorほかの方がやってるのを見た事例ではKinectセンサーによる方法(以前の記事に書いたHUG ProjectがPepper App Challengeでデモしてた方法)とPerception Neuronでやる方法の二つがありますが、どっちでも結構よく動いてたのを確認しています。参考までにPerception Neuronを使ってPepperを動かした時の動画を貼っておきます。

https://twitter.com/baku_dreameater/status/665791682378493952

もちろん他のでも使えるやつなら何でもいいので、使えそうなモーキャプと組み合わせてアプリ制作に役立てて下さい。

 

次回は非リアルタイムな連携方法として、UnityのデータをChoregrapheで使えるTimelineボックスに変換する方法を紹介します。続報にご期待下さい。