ごえもん・シナモンのピグマリオン計画
プログラムA こけ過ぎ矯正!

2001年11月25日
アイボはアイボライフというソフトウェアで自律活動しているんだけど、まー動作はすべてプログラム済なわけです。
それはしかたないんだけど、ある動作、たとえばボールを蹴る動作でこけても全然頓着しません。こけてもこけても同じフォームでボールを蹴ってはこけ続けます。理想的にはこけたらフォームをちょっと矯正してみてこけないフォーム、それでいて目的であるボールはしっかりと蹴れるフォームを見つけ出すっていうのです。が、さすがに今のアイボと、私の技術力にはそれは期待できません。
しかたがないのでとりあえず、見ていていらいらしない程度にフォームを修正してこけにくいアイボにしてあげようと思います。

1.どの動作でこけるのか  
アイボの自律活動にはいろいろといらいらさせられる部分がありますが、今回は「こけやすい動作」これに限ってあげてみます。
  1. ボールをサイドに蹴りだす動作(ボールを蹴る動作)
  2. こけてから立ち上がり、頭を掻く動作
  3. 立ってボールにお手をする動作
大体この3種類だと思います。特に「3」はこけて立ち上がってまたこける。(それも中途半端に) まったく間抜けのきわみです。ボールを蹴りだす動作でも安定しているのもあれば不安定なのもあってすべてというわけじゃありません。
2.動作のモーションファイルを見つけ出す  
アイボの自律活動のモーションは「sysmtn.oda」と、「motion.oda」に納められています。歩く動作などは直接コーディングされているようで、矯正除外です。アイボブラウザーで調べたところ、対象になるモーションは以下のとおりでした。
  1. ボールをサイドに蹴りだす動作
    • アクションファイル:KICKL40_STD
      モーションファイル:stdl009 sysmtn.oda
    • アクションファイル:KICKR40_STD
      モーションファイル:stdl010 sysmtn.oda
    • アクションファイル:KICKL_STD
      モーションファイル:stdl003 sysmtn.oda
    • アクションファイル:KICK-LEFT
      モーションファイル:stdl003 sysmtn.oda
    • アクションファイル:KICK-RIGHT
      モーションファイル:stdl004 sysmtn.oda
    • アクションファイル:1ROLLL_STD
      モーションファイル:std011 motion.oda
    • アクションファイル:1ROLLL2_STD
      モーションファイル:stdl003 sysmtn.oda
    • アクションファイル:1ROLLR_STD
      モーションファイル:std012 sysmtn.oda
    • アクションファイル:1ROLLR2_STD
      モーションファイル:stdl004 sysmtn.oda
  2. こけてから立ち上がり、頭を掻く動作
    • アクションファイル:9ALIVE
      モーションファイル:ris013 sysmtn.oda
  3. 顔を掻く動作
    • アクションファイル:1SCRATCH_STD
      モーションファイル:cd#31_n sysmtn.oda
  4. 立ってボールにお手をする動作
    • アクションファイル:1LTOUCHL_STD
      モーションファイル:std009 motion.oda
    • アクションファイル:1LTOUCHL2_STD
      モーションファイル:stdl001 sysmtn.oda
    • アクションファイル:1LTOUCHR_STD
      モーションファイル:std010 sysmtn.oda
    • アクションファイル:1LTOUCHR_STD
      モーションファイル:stdl002 sysmtn.oda
    • アクションファイル:1STOUTCHL_STD
      モーションファイル:std013 motion.oda
    • アクションファイル:1STOUTCHL2_STD
      モーションファイル:stdl005 sysmtn.oda
    • アクションファイル:1STOUTCHR_STD
      モーションファイル:std014 sysmtn.oda
    • アクションファイル:1STOUTCHR2_STD
      モーションファイル:stdl006 sysmtn.oda

3.ODAファイルを編集する  
「sysmtn.oda」「motion.oda」はバイナリーファイルで、中を覗いてもなんだかよく判りません。幸い暗号化はされていないのでダンプファイルからフォーマットを想像し、タブ区切りファイルに変換する(そしてまたバイナリーファイルに戻す)Perlプログラムを作りました。
  • ODAファイル→タブ区切りファイル:csv.pl
  • タブ区切りファイル→ODAファイル:oda.pl
使い方はコマンドツールから以下の要領で、
  • ex. perl csv.pl sysmtn.oda sysmtn.csv
  • ex. perl oda.pl sysmtn.csv sysmtn.pl
どちらもエラー処理などしていないのでご使用の際にはバックアップをするように。

対象のモーションはいずれも片側の前足をあげてのアクション。こける原因は前足を上げることで重心が前に移動するためと考えられるので、上げる前足と対角位置の後ろ足をオリジナルより縮めて重心が後よりになるようにする。
  • 股関節を -55度→-60度
  • 膝関節を  95度→ 100度
とした。
4.結果  
結果としてはそこそここけにくくなったと思います。
まだ、横に前足を伸ばしてボールを蹴る場合にこける(半コケ)場合がよく見られます。後足だけではなく、全体の調整をしなければならないのかもしれません。
とりあえず、「sysmtn.oda」「motion.oda」はすべてチェックして、前足を浮かせるモーションは修正しました。
キーフレームを増やすと修正しなければならない個所が多くなり、ODAファイル自体のサイズが変わるので手をつけられない状態です。次に考えている、オーディオODAファイルの操作にはファイルサイズの変更が必須なので同時に考えて行きたいと思います。

資料

ODAファイル上でのモーター定義とその部位


ODAファイルフォーマット
4f 4d 54 4e ←固定
###(0)###
00 00 00 00 ←インデックス(0)
↓18hbyte(上の行の4byteを含む)
18 00 00 00 04 00 00 00 01 00 01 00 02 00 00 00 00 00 00 00
###(1)### ~~~~~~~~~~~キーフレーム数
01 00 00 00 ←インデックス(1)
↓38hbyte(上の行の4byteを含む)
38 00 00 00
0e 73 69 74 62 32 23 73 69 74 62 2e 6b 66 6d
↑バイト数、以下データ本体(バイト数自体は含まれない)
10 53 6f 6e 79 20 43 6f 72 70 6f 72 61 74 69 6f 6e
0c 44 52 58 2d 37 30 30 5f 4c 65 67 73
00 00 00 ←余り?
###(2)###
02 00 00 00 ←インデックス(2)
↓102hbyte(上の行の4byteを含む)
20 01 00 00
0c 00 ←モーターの数:12
13 50 52 4d 3a 2f 72 32 2f 63 30 2d 4a 6f 69 6e 74 3a 6a 30
↑PRM:/r2/c0-Joint:j0(右前足の縦方向関節)
16 50 52 4d 3a 2f 72 32 2f 63 30 2f 63 31 2d 4a 6f 69 6e 74 3a 6a 31
19 50 52 4d 3a 2f 72 32 2f 63 30 2f 63 31 2f 63 32 2d 4a 6f 69 6e 74 3a 6a 32
13 50 52 4d 3a 2f 72 33 2f 63 30 2d 4a 6f 69 6e 74 3a 6a 30
16 50 52 4d 3a 2f 72 33 2f 63 30 2f 63 31 2d 4a 6f 69 6e 74 3a 6a 31
19 50 52 4d 3a 2f 72 33 2f 63 30 2f 63 31 2f 63 32 2d 4a 6f 69 6e 74 3a 6a 32
13 50 52 4d 3a 2f 72 34 2f 63 30 2d 4a 6f 69 6e 74 3a 6a 30
16 50 52 4d 3a 2f 72 34 2f 63 30 2f 63 31 2d 4a 6f 69 6e 74 3a 6a 31
19 50 52 4d 3a 2f 72 34 2f 63 30 2f 63 31 2f 63 32 2d 4a 6f 69 6e 74 3a 6a 32
13 50 52 4d 3a 2f 72 35 2f 63 30 2d 4a 6f 69 6e 74 3a 6a 30
16 50 52 4d 3a 2f 72 35 2f 63 30 2f 63 31 2d 4a 6f 69 6e 74 3a 6a 31
19 50 52 4d 3a 2f 72 35 2f 63 30 2f 63 31 2f 63 32 2d 4a 6f 69 6e 74 3a 6a 32
00 00 ←余り?
###(3)###
03 00 00 00 ←インデックス(3)
↓86hbyte(上の行の4byteを含む)
86 00
00 00 00 00 00 00 00 00 ←キーフレーム間隔(第一フレームは必ず0)
aa 85 08 00 00 00 00 00 76 ac fa ff 00 00 00 00 88 cc 00 00 76 ac fa ff
00 00 00 00 88 cc 00 00 7e b0 ee ff 52 84 0c 00 62 1d 0e 00 b8 06 ec ff 50 fd 07 00 f0 f7 17 00
50 00 00 00 00 00 00 00 ←50h×16ms=1.28s
aa 85 08 00 00 00 00 00 76 ac fa ff 00 00 00 00 88 cc 00 00 76 ac fa ff
00 00 00 00 88 cc 00 00 eb 58 f5 ff 12 20 06 00 2d 44 00 00 eb 58 f5 ff 12 20 06 00 2d 44 00 00
~~~~~~~~~~~~~~~~~~~~~~~~8byteでひとつの関節角度データ:558506(0885AAh)/17453.3=32度