二足歩行ロボットコミュニティサイト

【サイトの使い方】  【サイトマップ】  【お問い合わせ】 
ロボット動画  |   ロボット写真  |   BBS  |   ダウンロード  |   イベント予定  |   スタッフ日記  |   リンク  |  
ログイン パスワード    新規登録   パスワード紛失  

 

第6回 モーションデータのフォーマットを解読する

前回の記事から少し時間が空いてしまいましたが、新たなネタが浮上してきたので解説したいと思います。
今回はRobovieMaker自体の使い方ではなく、より内部的な「モーションファイルのフォーマット」という部分について説明していきます。
今回画像がほとんど無く文章ばかりの内容で大変読みづらいかと思いますが、どうかお付き合いください。

モーションファイルはテキスト形式

RobovieMakerのモーションファイルは、拡張子がtxtであることからも分かるように、テキスト形式で記録されています。
そのため、メモ帳などで開いて編集することができます。

モーションファイルをフォーマットに基づいて改変することでRobovieMakerを使用せずにモーションを変更したり、別のモーションを作成したりすることができます。
特に、逆運動学算など高度な計算に基づいたパラメトリックなモーションを作成したい場合、excel等の表計算ソフトでポーズスライダの値を計算してVBAなどでフォーマットに基づいたテキストを出力することで実現できます。

モーションファイルの書式はRobovieMaker for VS-RC003とRobovieMaker2でそれぞれ異なり、内容を変更するには実はRobovieMaker for VS-RC003の形式の方が向いています。
RobovieMaker2のモーションファイルでは条件分岐や演算などより高度なことができるのですが、その分書式がより複雑で他のプログラムから生成しづらい仕組みになっています。
一方、RobovieMaker for VS-RC003のモーションはポーズごとの書式が整っており、プログラムなどからも自動生成しやすい仕組みになっています。
RobovieMaker2でもRobovieMaker for VS-RC003のモーションを読み込むことが可能なので、モーションの中身をいじりたい場合はとりあえずRobovieMaker for VS-RC003のフォーマットだけを覚えればよいかと思います。
ただし、RobovieMaker2でモーションを保存すると、必ずRobovieMaker2のフォーマットで上書きされるので注意してください。
また、基本的にRobovieMakerで読み込みが保障できるモーションデータはRobovieMakerから保存されたもののみになります。一度テキストエディタなどで編集したファイルが正しく読み込めるかについては保障できませんので注意してください。

RobovieMaker for VS-RC003のモーションフォーマット

まずはRobovieMaker for VS-RC003のフォーマットについて説明します。
とりあえずモーションファイルをテキストエディタで開いてみましょう。下記は、RB2000のサンプルモーション「ダンス\決めポーズ.txt」の中身です。

_MOTION_FORMAT:[ POSEDEF_WORD_N ]
_ENABLE_AXIS:[64]
_POSE:[40]-[0X0000,0x2b01,0X0000,........,0X0000,0X0000,0X0000]-[1]-[-1]-[[RB2000音声ファイル\drum(サイド1).wav]]
_POSE:[10]-[0X0000,0x2b01,0X0000,........,0X0000,0X0000,0X0000]-[2]-[3]-[[RB2000音声ファイル\drum(サイド1).wav]]
_POSE:[10]-[0X0000,0x2b01,0X0000,........,0X0000,0X0000,0X0000]-[1]-[3]-[[RB2000音声ファイル\drum(サイド1).wav]]
_POSE:[30]-[0X0000,0x2652,0X0000,........,0X0000,0X0000,0X0000]-[-1]-[-1]-[[RB2000音声ファイル\drum(サイド1).wav]]
※ポーズの設定は長くなるので一部省略しています。

基本的な書式は「設定項目:[(パラメータ1)]-[(パラメータ2)]-....」といった形で行の先頭に設定項目名、それに続いて[]に囲まれてデータを記録しています。
なお、記述中得に指定の無い限り、変更前と変更後の書式はなるべく一致させてください。
例えばアルファベットの大文字・小文字、文字の全角・半角、[]の括弧の数([]か[[]]か)、また、1行で複数のデータを設定する場合の各データの記述順序など、書式を間違えると正しくデータが読み込めなくなる場合があります。

RobovieMaker for VS-RC003のモーションは「モーションのフォーマットタイプ」「使用するポーズスライダの数」「個別のポーズのパラメータ」の三つに大きく分かれます。
「_MOTION_FORMAT:」はモーションデータのフォーマットタイプの設定です。RobovieMaker for VS-RC003のフォーマット形式を指定する場合、後に続く[]に「POSEDEF_WORD_N 」と記述します(アルファベットの大文字・小文字を含め記述を間違えないようにしてください)。

「_ENABLE_AXIS:」は、モーションファイル中で一つのポーズに記録されているポーズスライダのパラメータ数を表します。後に続く[]に1〜64の数値を記述します。この数値は0番のポーズスライダから連続していくつのポーズスライダを使用するかという設定です。例えば16なら0〜15番目まで、32なら0〜31番目までのポーズスライダが各ポーズに値を記録しているということになります。
例えば0,3〜5,8〜12番目など間を抜かしてデータを記録することはできませんが、後述のポーズの設定に登場する「0x????」と「0X????」の違いという設定で、必要なポーズスライダだけに値を設定するような、間を抜かした記録が可能です。

「_POSE:」は、モーション中のポーズ一つの設定を表します。この設定項目には複数のパラメータが含まれており、下記のような内訳となっております。

_POSE:[遷移時間]-[ポーズスライダの値]-[nextポーズ]-[breakポーズ]-[[音声ファイルパス]]

また、ポーズ番号はファイルに記録されている順番で上から割り当てられます。それではパラメータごとに詳細を説明していきます。
[遷移時間]は、1〜239の範囲で数値を記述します。これは素直に数値を記述するだけですね。

[ポーズスライダの値]は、ポーズ中の各ポーズスライダの値を0番から順番に記録しています。数値の記述は16進数で、数値の頭に「0x????」及び「0X????」のどちらかの接頭句(この違いは後述します)を付け、それに続いて数値を4桁で記述します。パラメータは一つずつコンマで区切り、必ず_ENABLE_AXIS:で設定した数だけパラメータを記述します。
この書式が守られないと数値が正しく読み込まれないので注意してください。

ちなみに、ポーズスライダの値を角度など画面の表示から取得・逆算したい場合などは、以下をご参照ください。

ポーズスライダの実際の値
「ポーズスライダの値」に記録するのはポーズスライダの実際の値。
上記ポップアップバルーンの最後に表示される。

ポーズスライダの設定ダイアログ
ポーズスライダの設定ダイアログの「数値設定」の項目で、数値の可動範囲やそれに対する角度の分解能などを設定する。個々から実際の値を逆算できる
また、フラグ設定で「基準ポーズ相対値」にチェックを入れていると、表示上は基準ポーズの位置を±0にして実際のサーボモータの値がオフセットされているので注意

数値の頭につける「0x????」と「0X????」の違いは、「モーションファイルの記録時にポーズスライダを有効にしているかどうか」です。
例えばRobovieMaker上で0〜14のポーズスライダは「スライダ有効」に、15〜29のポーズスライダは「スライダ無効」に設定した状態でモーションをファイルに保存すると、前者は「0x????」、後者は「0X????」の書式でデータが記録されます。

モーション読み込みの際に数値の記述が「0X????」の場合、RobovieMakerのデフォルトの設定では該当するポーズスライダに対して、ファイルに記述している数値を読み込まず代わりにファイル読み込み時点の基準ポーズの値を代入します。
そのため、例えばプログラムなどからモーションを自動生成する際に未使用のポーズスライダの値を「0X????」で記述すれば、プログラム側で余計なデータの読み込みを行なうことはありません。
内容がよく理解できない方は、とりあえず「使わないポーズスライダには「0X0000」を記述しておく」とすれば問題ありません。

次の[nextポーズ]-[breakポーズ]は、モーション中のポーズの実行順序を設定する項目です。
RobovieMaker for VS-RC003を使った経験がある方には懐かしいかと思いますが、この項目には画面上の値をほぼそのまま記録しています。
RobovieMaker for VS-RC003のnextポーズ、breakポーズに関する解説は下記のページを参照してください。
【モーション作成 ループ構造について

値を変更する場合は、RobovieMaker上でnext、breakポーズを設定するのとまったく同じ感覚で行ないます。ただ、画面上で未設定(「---」の表示)の場合は、代わりに-1を記述します。
例えばモーションの終了ポーズはnextポーズに-1を記述し、またbreakポーズを使用しないポーズもbreakポーズに-1を記述します。

なお、RobovieMaker上で設定不可能だったように、nextポーズやbreakポーズに自分自身の番号を設定することはできません。
また、ファイルに記録されているポーズ数以上の値を設定することもできません。

最後の[[音声ファイルパス]]は、ポーズに割り当てる音声を指定します。
ただし、使用できる音声ファイルはRobovieMakerで行なったように音声ファイルリストに登録されているファイルのみです。
リストに見当たらない音声ファイルの場合、読み込み時に警告が表示されます。
また、ファイルパスは基本的に相対パスとなり、ファイル読み込み時のロボットプロジェクトからの相対パスが適用されます。
この設定を変更する場合は必ず[[]]のように二重の[]で括ってください。一重の[]で括ると項目が無視されます。
音声を設定しない場合は「[[]]」のように間に何も記述せず括弧のみ記述してください。

RobovieMaker2のモーションファイルフォーマット

さて、次にRobovieMaker2のモーションファイルフォーマットを説明します。RobovieMaker2になるとはっきり言ってはかなりややこしくなります。
RobovieMaker2では、条件分岐や変数演算などの機能が追加され、説明する内容も大きく増えるため、ポーズ・分岐・演算などのブロックの種類ごとに項目を分けて説明したいと思います。

ちなみに、RobovieMaker2のモーションファイルにも「_MOTION_FORMAT:」と「_ENABLE_AXIS:」の設定が存在します。
「_MOTION_FORMAT:」は「POSEDEF_V1R4」、「_ENABLE_AXIS:」は二つ減って「1〜62」までの設定となります。

ブロック共通の設定、及びスタート・エンドブロック

RobovieMaker for VS-RC003ではモーションの記録がポーズ単位だったのに対し、RobovieMaker2ではブロック単位での記録となります。
一つのブロックの記録は、「名称」「表示座標」「矢印接続先」などのブロックに共通する設定と、ブロックの種類に応じた個別の設定の二つに大きく分かれます。

まずはブロック共通の設定、及びスタートブロックとエンドブロックについて解説します。
それではモーションファイルをテキストエディタで開いてスタートブロックとエンドブロックの記録部分を抜粋してみましょう。

・スタートブロックの記録
_MOTION_INFO:[[]]-[50]-[10]-[6]-[0]-[1]-[-1]
_STARTMOT:

・エンドブロックの記録
_MOTION_INFO:[[ END ]]-[92]-[647]-[16]-[46]-[-1]-[-1]
_ENDMOT:

両者とも2行で記録され、1行目にはブロック共通の設定、2行目にはブロックの種類ごとの設定が記述されます。

「_MOTION_INFO:」はブロック共通の設定を行なう項目です。各パラメータは下記の通りです。

_MOTION_INFO:[[ブロックの名称]]-[表示X座標]-[表示Y座標]-[フロー(矢印)の折り返しまでの長さ(通常)]-[フローの折り返しまでの長さ(分岐)]-[通常のフローの接続先]-[分岐のフローの接続先]

ほとんどのパラメータは見たままですね。
[[ブロックの名称]]は、音声ファイルの設定のように二重の[]で括ります。基本的にRobovieMakerではテキストの記録項目は、テキスト中に存在する文字と括弧の混同を回避するため必ず二重の[]で括ります。

次の[表示X座標]-[表示Y座標]はブロックのモーションエリア中の表示座標を設定します。必ず0以上の値を入力してください。

次の[フローの折り返しまでの長さ(通常)]-[フローの折り返しまでの長さ(分岐)]は、ブロック同士を接続しポーズの実行順序を表すフロー(矢印)の折り返し地点までの距離です。この距離はフローの根元から最初の折り返しまでの長さを現します。
分岐のフローはループブロック及び分岐ブロックにしか備わっていませんが、モーションファイルではすべてのブロックに設定が存在します。

[通常のフローの接続先]-[分岐のフローの接続先]は、いわゆるnextポーズ、breakポーズの設定とまったく同じで、ブロックのフローの接続先を設定します。
設定値の意味もnext、breakポーズと同じく「ファイルに記録されている順に上から各ブロックに割り当てられた番号」を記述します。
フローをどこにも接続していない場合は-1を記述します。
こちらも、分岐、ループブロック以外のすべてのブロックに対して分岐のフローの設定が存在しますが、本来分岐のフローが存在しないブロックは、必ずこの設定を-1にしてください。

ブロック共通の設定の説明が終わったので、個別のブロックの設定について説明したいと思います。まずは最も簡単なスタートブロックとエンドブロックの設定を説明します。
これらのブロックをモーションに記録する場合は、スタートブロックの場合は「_STARTMOT:」、エンドブロックの場合は「_ENDMOT:」を、それぞれ「_MOTION_INFO:」の次の行に記述するだけです。
他に何も設定は必要ありませんが、アルファベットの大文字・小文字や「_」「:」等の記述、及びその他誤字などに気をつけてください。

なお、モーション中には必ず一つだけスタートブロックを記録してください。スタートブロックが存在しない、また、スタートブロックが複数存在するモーションを作成すると、正しく読み込めない場合があります。
また、エンドブロックはモーション中に存在しなくても一応動作しますが、できればモーションに記録してください。

ポーズブロックの説明

次にポーズブロックの書式について説明します。
ポーズブロックはRobovieMaker for VS-RC003の書式と共通する部分が多く、比較的容易に理解できるかと思います。

ポーズブロックのパラメータは下記の通りになります。

_POSE:[遷移時間]-[ポーズスライダの値]-[[音声ファイルパス]]-[サーボモータ脱力機能の設定]

[遷移時間]、[ポーズスライダの値]、[[音声ファイルパス]]については、前述の説明とまったく同じなので省きます。

[サーボモータ脱力機能の設定]は、RobovieMaker2で追加された「サーボモータの個別脱力機能」に関する設定です。
この項目では、30桁の2進数で30chの各サーボモータの個別脱力機能設定を行ないます。
数値は左から順にサーボモータのch0〜ch29に相当し、数値が0か1かでポーズスライダ左横のチェックボックスの状態が変わります。
ややこしいのは、数値を0にするとチェックボックスにチェックが入り、1にするとチェックボックスからチェックが消えるということです。
なお、この設定は必ず30桁で記述してください。30桁以外の数値を記述すると読み込み時にエラーが発生する可能性があります。また、数値は必ず0か1を記述してください。これ以外の文字では正常にデータが読み込まれない場合があります。

ちなみに、next、breakポーズの設定はブロック共通の項目に含まれるためここで記述する必要はありません。

ループブロックの説明

次にループブロックの説明です。
ループブロックもスタート・エンドブロック並みに設定が簡単で、「_MOTION_INFO:」の次の行に「_OLDLOOP:」と記述するだけです。
なお、ループブロックには分岐のフローが備わっているため、ブロック共通の設定での分岐のフローに関係がある項目もちゃんと設定する必要があります。

演算ブロックの設定

演算ブロックは、「変数対定数」と「変数対変数」の二種類の記述が存在します。ただ、両者の書式設定はほとんど同一です。
まずは「変数対定数」の書式について説明します。「変数対定数」の書式は以下の通りです。

_VARCON:[結果代入変数]-[計算方法]-[定数]

[結果代入変数]と[定数]は、RobovieMakerのダイアログで設定する項目そのままですね。前者は0〜255、後者は-32768〜32767の範囲でそれぞれ記述してください。
[計算方法]は、ダイアログ上では「代入」「加算」「減算」「乗算」「除算」の五種類から選択しましたが、ファイルには各種類を番号に置き換えた値で記録されます。値は「0=代入」「1=加算」「2=減算」「3=乗算」「4=除算」がそれぞれ相当します。

次に「変数対変数」の書式について説明します。「変数対変数」の書式は以下の通りです。

_VARVAR:[結果代入変数]-[計算方法]-[参照変数]

こちらもほとんど「変数対定数」と同じですね。
[結果代入変数]-[計算方法]は「変数対定数」まったく同一です。
[参照変数]には、[結果代入変数]と同じく0〜255の値を記述してください。

分岐ブロックの設定

最後に分岐ブロックの設定について説明します。
分岐ブロックの書式は下記の通りになります。

_MIF:[参照変数]-[条件設定]-[条件詳細]

[参照変数]はそのままですね。0〜255の範囲で設定してください。
[条件設定]は、演算ブロックの計算方法と同じように、ダイアログ上の項目を数値に置き換えて記録されています。
それぞれの項目と数値との相対関係は、「0=未定義」「1=閾値以上」「2=閾値以下」「3=ビット合致」「4=閾値=」「5=閾値≠」「6=常に成立」「7=常に比成立」となります。

[条件詳細]は、[条件設定]で選択した条件に使用するパラメータが記録されます。この設定は、選択した条件によってパラメータの意味が若干異なるため、条件別に説明したいと思います。

「0=未定義」「6=常に成立」「7=常に比成立」は、[条件詳細]の内容に関わらず常に同じ結果になるため、[条件詳細]にはどの値を記述しても意味がありません。基本的には0を記述してください。
「1=閾値以上」「2=閾値以下」「4=閾値=」「5=閾値≠」は、[条件詳細]に任意の閾値を設定します。-32768〜32767の範囲で数値を記述してください。
「3=ビット合致」は、[条件詳細]合致させるビットと各ビットへのマスクを記述します。ただし、記述そのものは-32768〜32767の範囲の数値で行い、上位8bitに条件成立値、下位8bitに有効ビットの選択の値をそれぞれ設定します。

最後に

さて、駆け足でモーションファイルのフォーマットについて説明してきましたが、実際に理解するには中身を少しずつ書き換えていくと良いかと思います。
モーションデータの内容を直接いじることで、パラメとリックなモーション作成外にもRobovieMakerではできなかった面白いことができるようになるかもしれません。
もっとも、将来的にはパラメトリックなモーションもすべてロボットの制御ソフトウェア上でできるようになるのではないかと思います。


前のページ
第5回 サーボモータ出力式の拡張設定
コンテンツのトップ 次のページ
第7回 自律バトルモーションの作成(前編)


検索
Loading
メインメニュー