週刊ロビ 増刊73号:ロビのココロを探る3
勝手に週刊「ロビ」増刊73号です。
さて、今回の「ロビのココロの中を探る」は"歩行4S.RM4"です。
"歩行4S.RM4"は、ファイル名からなんとなく分かるように「前に進んで」に対する動作が書かれているファイルになります。
今回はこのファイルの中を少し覗いてみたいと思います
BLOCK文(ブロック)について
"<medit>"と"</medit>"の中に"<block name=..."から始まる文があります。ブロック文ではそのブロックの名称(編集アプリのアイコンの座標やリンク)などが記述されます。
JUMP文(ジャンプ:跳ぶ)について
プログラムを見て行くと"<jump adr="0x00001318"/>"といった書式でプログラムの跳び先を示していることが分かります。このadr(アドレス)が示しているのはファイルの先頭から何バイト目(何文字目)に跳ぶかを示しています。
ということで、ジャンプだけをたどってみて、どんな風にプログラムが進んで行っているのかをblock名の部分で、ざっと並べてみます。
- 最初ブロック名なし
- CALCULATION ~(最初の方の)
- POSE 6
- POSE 1
- POSE 2
- POSE 3
- POSE 4
- POSE 9
- POSE 7
- POSE 10
- POSE 8
- POSE 11
- CALCULATION ~(後の方の)
- IF~ (で分岐:偽ならPOSE2へ)
- POSE 2~
- POSE 1~
- POSE 5
- END
- RETURN
となってますね。
結構行ったり来たりしてますので、カーソルの位置までの文字数が分かるエディタを使えば調べるのが簡単かもしれませんね
あと、ジャンプ先は文字数なので、プログラムを手作業で書き換える時は、文字数が変わって正しくジャンプできなくなるといけないので注意して下さい。だいたいmedit文ごとに2行改行があるので、もしかすると2〜3文字増えても大丈夫かも?しれませんけど...ネ。
ポーズと角度について
各サーボの角度を指定することによって、ポーズを作ります。64個までのサーボが扱えて、block名がPOSE○○となっている部分の後に、ID1から2バイトごとで64個の値が並んでいます。
これら64個の値はメモリーアドレスの0x0a00から2バイトごと書き込むということで、"<mem_w size="2" adr="0x0a00">"という書式から始まって、128個の値が並んで、その後"</mem_w>"でくくられています。
サーボの角度の値は、16進数で書かれててぱっと見分かりにくいですが、角度は0.1度単位なので、値は10倍された値になっています。つまり0x0123は10進数で291になります。これを10で割って、29.1度ということになります
2バイト:角度で、2バイト:サーボパワーの計4バイトでひとつのサーボに対するデータです。(なお65個目からLEDの情報が入っています)
サーボ動作速度について
サーボの動作速度(回転速度)はで書いたポーズの後に記述されています。実際にはひとつひとつの回転速度を指定してたら大変なことになるので、あるポーズを取っていたところからで書いたポーズにサーボの角度が到達するまでの時間を指定するだけで、サーボごとに回転しなくてはいけない角度から回転速度を逆算して動いてくれます。
書式は"<mem_w size="2" adr="0x0b00">0x0032</mem_w>"となっています。メモリーアドレスの0x0b00に書かれた値、上記の場合は0x0032が速度になります。この値は20ms単位のようです。上記の場合は0x32は10進数で50です。50x20ms=1000ms つまり1秒ということになります。
"歩行4S.RM4"のファイル内のすべての動作速度の部分の3桁目を1に例えば0x0032だったら0x0132といった感じに書き換えて歩かせてみたのを撮ってみました。ゆっくりでも意外と安定して歩いてますよ
-----------------------
-----------------------
WAIT文(ウエイト:待つ)について
この命令はサーボの動作等が終わるまで待つという命令になるかと思います。WAIT文の書式は"<wait size="1" adr="0x0b43"/>"になります。
先ほども書きましたが、あるポーズからあるポーズへ動く時、個々のサーボの動かなくては行けない角度はまちまちです。多く動かなくてはいけないサーボもあれば、少しでいいサーボもあります。
多く動かなくてはいけないサーボの中には、サーボの最大回転速度を超えていて、指定した時間内に目的の角度に到達できないサーボも出てくるかもしれません。動作途中で次の動作をしてしまえば、例えばまだ足が床についていないのに、反対側の床に着いている足を上げる動作を始めてしまうかもしれません。
WAIT文はこういった場合に役に立つので基本的にはポーズごとに書いておくと良いかと思いますが、動作が到達してないのに次の動作をさせる。つまり、次々と次の動作を起こさせることで、切れのいいモーションを作ることが可能になったりします。そして、さらに本来の目的の到達点より少し大きくポーズを作っておき、設定した到達点でなく、目的の到達点で次の動作をさせるといった高度な設定をすれば、もっとキレキレのモーションを作れたりします。まぁ上級過ぎて私には到底できませんけど
CALC文(カルク:計算)について
"<calc>"の前のcalcのblock文に関しては後日ということで、"<calc>"の中に関して、"歩行4S.RM4"では、3回出てきますが、使われている計算は、代入と引き算と比較の3種類になります。
まず最初のcalcについて
- <const data="1"/>
- <mem_w size="2" adr="0x0f00"/>
は、1を変数用のメモリーアドレス0x0f00に書き込むということを意味しています。
また、2つ目のcalcについて
- <mem_r size="2" adr="0x0f00"/>
- <const data="1"/>
- <sub/>
- <mem_w size="2" adr="0x0f00"/>
変数用のメモリーアドレス0x0f00から値を読み込み、その値から1を引いて(subtraction)、また0x0f00に書き込むということを意味しています。
最後に3つ目のcalcは
- <mem_r size="2" adr="0x0f00"/>
- <const data="0"/>
- <sub/>
- <eq/>
- <jump adr="0x000032bb"/>
となってます。0x0f00の値を読み込み、その値から0を引いて??、その値が0と同じ(equal)なら0x32bbにジャンプするという意味になるかと思います。
ということで、最初のcalcで歩数を書き込んで、ループごとに2つ目のcalcで1ずつ引いて、3つ目のcalcで0ならループを抜けるといった感じになっています。
ポーズは右脚、左脚の2歩分のループになっているので、従って、最初のcalcの<const data="1"/>を<const data="5"/>とすれば10歩あるくことになりますね
その他
ファイルのコードですが、
- 改行コード:CR+LF
- 文字コード:ShiftJIS
です。ま、改行コードはいいんですが、文字コードはねぇ〜、もぉいい加減S-JISから卒業してほしいですと思います。 Unicode対応できない文字とか使ってたりするし困る
さて、今回は結構長めに書きましたが、アレンジできるようなところがあれば(自己責任でということで)あれこれやってみて下さい
----------------
にほんブログ
| 固定リンク
「週刊 ロビ」カテゴリの記事
- RoVoCoMo2(2019.02.10)
- RoVoCoMo v0.5公開(2017.07.29)
- Robiscope v1.8.0を公開(2017.07.29)
- RoVoCoMo v0.1公開(2017.07.02)
この記事へのコメントは終了しました。
コメント
何時も、楽しく拝見しております。
「ロビのココロの中を探る」は、ロビのココロを操作しているようで、楽しいですね。
私は、素人ですが「ロビのココロ」を覗いたら、タイマーモード15分、ロビのスイッチオン機能が、後で追加?
ワクワクして読んでおります。
投稿: | 2014年8月17日 (日) 21時56分
獣道さえ無いところを分け入っていくところがいいですね。 その昔、ツールもなく紫外線消去ロムのワンチップICに全くの素手で立ち向かった時を思い出しました。 このRM4言語の素性と簡単な開発環境が実現できたらいいですね。 がんばって!!
投稿: Novicio | 2014年8月17日 (日) 22時54分
コメントありがとうございます。
>タイマーモード15分、ロビのスイッチオン機能が、後で追加?
そうなんですか?まだ全部の心を覗けてないからなぁ...どこにあるんだろう!?(^^)
Novicioさん
>RM4言語の素性と簡単な開発環境が実現できたらいいですね。
どこまで解析できるかわかりませんが、少しでも簡単にカスタマイズできるような環境を作れればいいですよね(^^)
投稿: micono | 2014年8月18日 (月) 11時20分
StartupファイルやRM4ファイルの詳しい解説をありがとうございます。
お陰さまで、少しいじることができそうで、楽しみが増えました。
これからも無理のない範囲で、ロビに関する情報を発信して頂けましたら、とてもとても有り難いです。
投稿: JijyTadano | 2014年8月18日 (月) 12時13分
プログラムの解析ありがとうございます。
参考にもらいます。(もらいました)
バイト数が変わったらそれ以降のアドレスを全部書き換えなければいけないのでめんどくさいのでやっていませんでたが、この方法だと簡単に対応できますね。
私の方の記事(URLリンク参照)に追記してこのページのリンクをはらせてもらいました。
投稿: クラフト親父 | 2014年8月20日 (水) 07時32分
いつも楽しみにしています。
「ロビのココロの中を探る」は、わくわくしながら読んでいます。わからない事もたくさんありますが、私なりに理解できるところからやってみようと思っています。
とりあえず、前に進むのを、6歩、歩くようにできました。
これからも、解析頑張ってください。
投稿: doratyan | 2014年8月21日 (木) 16時42分
プログラムの解析記事、ありがとうございます。
プログラムは、変更できないと思い込んで、SDカードを覗くこともしなかったのですが、いじくれることがわかり、ワクワクしています。
ご多分に漏れず、私のロビも歩行で後ろに倒れてしまいます。
ゆっくり歩くように変更して、歩き方、倒れ方を観察しています。
ジャンプ先を変更するような変更は、私には出来ないかもしれませんが、Bzエディタ(http://www.vcraft.jp/soft/bz.html)など、バイナリエディタで開いてみれば、ジャンプ先の確認が出来ますよね。
また、16進電卓は、Windowsのcalc.exeで表示をプログラマにして使用しています。ご参考まで
これからも、解説記事を期待しています。
投稿: oku | 2014年8月21日 (木) 23時43分
皆さ〜ん(^^)
まとめてで申し訳ありませんが、コメントありがとうございます(^^) 今週は帰省中で、週末にまとめて書いてるブログが書けないので、74号の内容をどうしようかと考えてますが、できるだけ毎週増刊号を書いて行きたいと思ってますので、これからも宜しくお願いします。
投稿: micono | 2014年8月22日 (金) 23時40分
いつも勉強させて頂いていただき、ありがとうございます。気になって、RM4ファイルの行数、文字数からjump adr先を調べるツールを作ってみました。とび先の/meditまでCR・LFの改行文字も全てカウントしていました。おかげで、子供の音声を録音したファイルを同じ文字数ファイル名で再生する事が出来ました。
投稿: ピクルス | 2014年8月24日 (日) 14時41分