Pepperの開発環境であるChoregrapheに関連したツールを作ったので内部動作の理屈とあわせて紹介します。
本記事は「UnityのモーションをPepperに適用する(前編: リアルタイム編)」の続きとして後半記事を投稿する前の下準備です。といっても本記事はChoregrapheとXML文書の処理の話題しか扱わず、Unityは一切出てきません。また本記事はChoregraphe2.4.2の仕様に準拠しており、バージョンアップすると不具合が起きる可能性にもご注意ください。
もくじ
- Pepperのビヘイビアファイル(behavior.xar)の中身を調べてみる
- Timelineボックスはbehavior.xarの中でどう定義されるのかな?
- Timeline生成プログラムの配布先と使い方
- まとめと次回予告
Pepperのビヘイビアファイル(behavior.xar)の中身を調べてみる
本節のネタは他の方がQiitaに投稿してる「Pepperのファイル探訪(プロジェクトファイル)」といくらか被ってます。
まず調べ物の前におさらいから。ChoregrapheではPepperやNaoのアプリケーションをいくつかのファイルに分けて管理しています。典型的な例だと次のようなファイルが使われます。
ぜんぶ書いてると面倒なので結論から言いますが、このうちふだんChoregrapheで操作してるボックスやスクリプトの中身は全て"behavior.xar"ファイルの中に書かれています。
今回はTimelineボックスを自動で生成するのがゴールなので次のようにしてbehavior.xarの典型的な例を見てみます。
- Choregrapheでプロジェクトを新規作成
- Timelineボックスをひとつだけ配置して簡単なモーションを作る
- プロジェクトを保存して終了
- behavior.xarファイルをテキストエディタで開く
例はこんな感じ(GitHub)になります。一部抜粋するとこんな感じ。
<?xml version="1.0" encoding="UTF-8" ?> <ChoregrapheProject xmlns="http://www.aldebaran-robotics.com/schema/choregraphe/project.xsd" xar_version="3"> <Box name="root" id="-1" localization="8" tooltip="Root box of Choregraphe's behavior. Highest level possible." x="0" y="0"> <bitmap>media/images/box/root.png</bitmap> <script language="4"> <content> <![CDATA[]]> </content> </script> <Input name="onLoad" type="1" type_size="1" nature="0" inner="1" tooltip="Signal sent when diagram is loaded." id="1" /> <Input name="onStart" type="1" type_size="1" nature="2" inner="0" tooltip="Box behavior starts when a signal is received on this input." id="2" /> <Input name="onStop" type="1" type_size="1" nature="3" inner="0" tooltip="Box behavior stops when a signal is received on this input." id="3" /> <Output name="onStopped" type="1" type_size="1" nature="1" inner="0" tooltip="ボックスBehaviorの終了時に信号を送る。" id="4" /> <Timeline enable="0"> <BehaviorLayer name="behavior_layer1"> <BehaviorKeyframe name="keyframe1" index="1"> <Diagram> <!-- 長いので省略 --> </Diagram> </BehaviorKeyframe> </BehaviorLayer> </Timeline> </Box> </ChoregrapheProject>
リンク先には全部の内容が載ってますが、何が言いたいかというと「これタダのXMLファイルじゃん!」と。XMLなら大概のプログラミング言語で入出力がサポートされてるので何とかなりそうですね。特に今回の場合Timelineボックスを一つだけ生成できれば基本的に必要な要件は満たせるので、なんなら上記リンク先のXMLをひな型にして(XMLではなく)プレーンテキスト整形をやっても問題ないレベルです。
Timelineボックスはbehavior.xarの中でどう定義されるのかな?
behaviorファイルの中がただのXMLだと分かったのでもう少し中身をあらためます。モーションを定義してるTimelineボックスはどんな感じで記述されているのかを見てみましょう。GitHub側ではこのあたりになりますが、いちおうコチラにも抜粋を掲載しておきます。
<Timeline enable="1" fps="25" start_frame="1" end_frame="-1" size="79"> <BehaviorLayer name="behavior_layer1"> <BehaviorKeyframe name="keyframe1" index="1"> <Diagram /> </BehaviorKeyframe> </BehaviorLayer> <ActuatorList model=""> <ActuatorCurve name="value" actuator="HeadPitch" mute="0" unit="0"> <Key frame="30" value="-0.371974" /> <Key frame="60" value="-11.4096" /> <Key frame="79" value="-11.4096" /> </ActuatorCurve> <ActuatorCurve name="value" actuator="HeadYaw" mute="0" unit="0"> <Key frame="30" value="0.425858" /> <Key frame="60" value="0.425858" /> <Key frame="79" value="0.425858" /> </ActuatorCurve> ...
ポイントは以下の3点。
- モーションを定義するタイムラインではTimelineのenable属性を"1"にしておく
- ActuatorCurve要素のactuator属性に動かしたい関節の名前を書く
- Key要素にフレーム番号(時間みたいなもの)と各時間での関節の角度を指定
なお関節角度は度数法で指定します。間違えて弧度法を使うと値が小さすぎて動きが見えなくなるのでご注意下さい。
プログラムの配布先と使い方
「理屈的に出来るよ」では説得力が足りないのでサンプルを作ってGitHubに公開しています。サンプルといってもいちおう実用に堪える出来になっている…はずです。cloneなりzipダウンロードなりで落としてください。C#で実装しておりWindows上で動作します。
ビルド済みの実行ファイル(FileConverterGui.exe)では、関節の名前と角度が書かれているカンマ区切り(CSV)ファイルからビヘイビア(.xar)ファイルを生成する処理を行います。CSVファイルのサンプルはこういう感じです。サンプルはKinectで取得したデータをもとに作ってますが一部値の設定がマズい所があるので、あくまで「自動生成できてる!」と確認する程度に使ってください。
プログラムの実行手順は次の通りです。
- CSVファイルを用意
- ソフトを起動
- 「参照」ボタンを押すか、ファイルをドラッグ&ドロップしてCSVファイルのパスを指定
- (サンプルCSVファイルの場合も)CSVファイルのなかで角度を度数法で記述している場合、「弧度法を用いる」のチェックボックスをオンにする
- 「変換」ボタンを押し、保存先を指定してビヘイビアファイルを出力
- Choregrapheで空のプロジェクトを作って保存し、Choregrapheを閉じてからbehavior.xarを削除
- 削除したbehavior.xarの位置に、4で作成したビヘイビアファイルを"behavior.xar"という名前にして再配置
- 5で作ってChoregrapheのプロジェクトをもう一度開く
以上の手順で自動生成されたTimelineボックスが拾えるので、あとは既存のプロジェクトにコピペして使うなり、タイムラインを微調整するなり好きにしてください。
また細かい設定としては以下のようなのも用意しています。
- データスキップ幅: CSVのデータが高密度すぎる(例えば1行のデータが0.01秒刻みのポーズに対応している、などの)ときにデータをいくつかスキップするための設定。1以上の整数に設定する。
- 出力フレーム幅: Timelineボックスへの出力フレームを1フレーム刻みではなく、もっとまばらにするための設定。1以上の整数に設定する。
この設定はどう使うかというのを具体例で紹介しておきます。
たとえばCSVにはモーションキャプチャのデータが0.01秒刻みで記録されているとします。このデータをぜんぶ使ってしまうとデータとしては多すぎるので、0.2秒ぶんずつの粗いデータを拾いたいとします。この場合はデータスキップ幅を20に設定すればOKで。
次に出力フレーム幅ですが、こちらは読み込んでるデータの密度に合わせて出力するキーフレームの密度を合わせるのに使います。このとき、Choregrapheでは1フレームが約1/25秒に対応することに注意します。例えば0.2秒ずつのデータをCSVから読みだしている場合、出力フレーム幅を5にすることでキーフレームが5フレーム=5/25秒=0.2秒おきに配置されます。
まとめと次回予告
今回は以上です。繰り返しになりますが
この二点がポイントになります。
このシリーズの続きとしては、Unityから取ってきたモーションを今回のサンプルプログラムで利用可能なCSVとしてログ出力させる方法を扱います。内容的には前回の記事と今回の内容を足し合わせていく感じです。続報にご期待下さい。