ぱぱっちの私事で恐縮ですが

ぱぱっちの日常の出来事で、何か皆さんのお役に立てそうなことがあったら、日記に書こうと思っています。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
残り2週間強ですが、仕事の都合もあり投入できる時間は残り少ないです。ということで、行き詰まってます(汗)

こういう時は残作業を吐き出して順位付けして気持ちを落ち着けるべく、つらつら考えていることをブログに書きます。

今回の目標は、Lightは「ロボゼロ以外のロボットから1勝」、「予選徒競走の完走、できれば通過はビリでもいいから本戦参加」、「ちょっとでもかっこよく動いて、ロボゼロはカッコイイと言ってもらう」です。

本戦参加はちょっとハードルが高過ぎる気がしますが、既に完走している他のロボゼロが存在すること、前回は完走できませんでしたが、あと数台上位だったら予選通過できたことを考えると、完走できて予選通過できないなら、ロボゼロの基本性能はそれまで、と割り切る時期なのかな、との考えからです。

・・・数少ない大会参加経験ですが、過去の反省点を集約すると
①歩行、移動が安定していない。すぐ転ぶ。
②操縦に不慣れ。
③①で動作に自信がないから、操縦に集中できないのでますます動きが鈍る。
と完全な悪循環でした。

これらの原因は、
①ハードについて、ついつい気になる部分をレギュレーションに影響がありそうでも大会ギリギリまで修正してしまう。
②モーション作成のコツがつかめていないのに、あまり実用的でないモーションばかり作って時間を無駄にする。
③①と②のせいで、大会直前まで操縦する時間がない。
とこれもまた悪循環なのでした。

ですので、今回は、
①ハードはいじらない。
②歩行モーションを中心に移動モーションを徹底的に見直して転ばないようにする。攻撃モーションは最低限だけ。
③十分操縦練習する。
と決めて望んでいるのですが、早くも②でつまずいてます(汗)

二足歩行ロボットである以上、人間を模しているわけですから人間の格闘技に準じた動き(歩行・移動)にしたいのですが、ルールを守りながら実現するのが難しい動きがいくつかあります。また関節数の制限から物理的にできない動きもあります。ここ何回かの大会の参加ロボットを見る限り、まだ実践しているロボットはなさそうなので、手本もなくどうやって実現しようか思案中ですが、なんとか間に合わせたい。。。。とやっているうちに歩行モーションの刷新が進まなかったりw

さて愚痴ばかり言っていても始まらないので、ここからが本題。なぜ歩行モーションを刷新する気になったかというと、きっかけはニナガワさんが実験してくださったサーボ制御とインタプリタの非同期の裏ワザです。
ニナガワさんのように前向きな使い方がある一方で、今まで作ったモーションの見直すべき点を示唆してくれています。

①一番時間のかかるサーボに必要な時間(最短所要時間)よりも短い時間を指定しているMOVE文を使ったモーションは
期待通りの動きをしていない。
例:RXコントローラーのモーションジェネレータで作った歩行モーションは、短い歩行ピッチ(速い歩行)を指定すると命令文は生成されるけれども、十分足が上がらない。
②最短所要時間の基準となるサーボが、指や立っている時の腰のヨー軸のような体の安定性にあまり影響ないサーボの場合、その部分の目標値を変えなければ、「裏ワザ」を使って体全体の動きをもっと速くできる。
例:指は頻繁に開け閉めしないで、開けるときは次のモーションでも開けたままにしておけば良い。

①は次の大会も徒競走でゴム板をひくことになっていますので、モーションジェネレータで作った歩行を使っている現状はかなり致命的です。ということでDr.GIY師匠の歩行モーションを参考に刷新することに決めました。
他にも①②の状態になっているモーションはいくつもありそうです。ふぅ~orz
スポンサーサイト
今のところ以下の処理をするExcelマクロを作りました。

・CALL文は、呼んだ先のサブルーチンの内容を展開する。
・空行とコメントは全て削除する。
・一度も呼び出されないラベルは削除する。
・展開をすませた後のサブルーチン自体は削除する。(これは転送するプログラムを短くするためです。)

効果のないものもあるかもしれませんが、とりあえず昔のBASICのときのテクニックで通用しそうな感じのものをやってみてますし、今後も思いついたら試してみようかなと思っています。

マクロで処理したプログラムはそれはもう読みにくいです(笑)
ですが、先日の関東ロボット練習会で何人かのロボゼロユーザーの方にマクロを適用する前後のプログラムを実際にロボゼロで動作させて比較して見ていただいて、効果があると感想をいただきました。
「CALL文はなるべく使わない」という方針に従い、プログラムのCALL文を「CALL文で呼ばれたラベルからRETURN文までのプログラム」に置き換えるExcelマクロを作ってみました。
置き換えによりプログラムは長くなって読みにくくなりますが、JUMP文に置き換えるわけではないので、少しは速度の改善が期待できるのではないかと。

私のロボゼロは、右向き用と左向き用のプログラムが別々のファイルに保存されているので、右向き用だけプログラムの命令(MOVE文を除く)の数が可能な限り少なくなるよう見なおしてから、このマクロを使ってCALL文を1つも使わないプログラムファイルに変換してみました。

で、右向きと今までどおりの左向きで操作して比較してみると・・・劇的に速くなるわけではありませんが、少しキビキビとした感じが出てきました。あるモーションと次のモーションの間でロボゼロが少し考えこんでいる時間が短くなったような気がします。

MK84さんの推察通りインタプリタ方式だとするならば、他にインタプリタ向けに最適化できるテクニックがないか調べてみたいと思います。

先日ホビーロボットに詳しい方々やロボゼロユーザーとお話した際に、常々の感想をぶつけてみました。
「ロボゼロのCPUボード”HSWB-04F”って処理速度が遅くない??」
大半の方が「遅いのでは」との認識でした。ただ、他のホビーロボットに使われているCPUボードとの相対比較を(主観が含まれていたとしても)実際にやった方はいなかったので、事実確認はできませんでした。

自分もロボゼロと(動かし方がわからない)ロボザックしか持っていないので比較できないので確かめようがないのですが、少なくとも「遅い」と思っている方が多い以上、それなりのプログラムの組み方を考えなければいけないと思います。

そこで仮説をもとに簡単な実験をしてみました。
<<仮説>>
1.CALL文を使うと極端に遅くなる。
2.IF文を使うと遅くなる。
3.INPUTADC文を使うと遅くなる。
※JUMP文を否定してしまうとロジックの制御ができないので、JUMP文は遅延原因から除外。

<<実験方法>>
ロボゼロをホームポジションから左腕肘だけ真っすぐ伸ばし、それから左腕を上げて、上げきったところで肘だけを元通り曲げて、最後にホームポジションに戻す。
この動作をさせる際に、腕を上げるのにかかった時間を測る。
※肘を伸ばしたり、曲げたりするのはストップウォッチで測るときに開始と終了がわかりやすいように。


<<結果>>
手動計測で10回ずつ測った平均で比較です。
遅くなる理由を何も入れないと約3.5秒に対して、
 CALL文を追加すると約1秒増える
 IF文を追加すると約0.5秒増える
 INPUTADC文を追加してもほとんど増えない。
 CALL文とIF文を同時に追加すると約1.5秒増える。

<<結論>>
CALL文はできれば使わない。(メンテナンス性は低下するけど、都度都度プログラムを書く)
IF文も可能なら使わない。(余計な判断はさせない。)
INPUTADC文はあまり影響なさそう。

ということで、次のステップとしては、CALL文をなるべく使わないプログラムの作り方を模索したいと思います。

<<テストに使ったプログラム>>
;基本形
:MOTION_START
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
MOVE(0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
V00=0
:MOTION_LOOP
MOVE(0,V00,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10)
V00=V00+10
JUMPIF(V00,<,801,MOTION_LOOP)
:MOTION_END
MOVE(0,800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
JUMP(TEST_END)

:TEST_END


;CALL文
:MOTION_START
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
MOVE(0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
V00=0
:MOTION_LOOP
MOVE(0,V00,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10)
CALL(TEST_LOGIC)
JUMPIF(V00,<,801,MOTION_LOOP)
:MOTION_END
MOVE(0,800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
JUMP(TEST_END)

:TEST_LOGIC
V00=V00+10
RETURN

:TEST_END

;IF文
:MOTION_START
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
MOVE(0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
V00=0
:MOTION_LOOP
MOVE(0,V00,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10)
JUMPIF(V00,<,801,TEST_LOGIC_END)
:TEST_LOGIC_END
V00=V00+10
JUMPIF(V00,<,801,MOTION_LOOP)
:MOTION_END
MOVE(0,800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
JUMP(TEST_END)

:TEST_END

;INPUTADC文
:MOTION_START
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
MOVE(0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
V00=0
:MOTION_LOOP
MOVE(0,V00,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10)
V01=INPUTADC(1)
V00=V00+10
JUMPIF(V00,<,801,MOTION_LOOP)
:MOTION_END
MOVE(0,800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
JUMP(TEST_END)

:TEST_END

;CALL文+IF文
:MOTION_START
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
MOVE(0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
V00=0
:MOTION_LOOP
MOVE(0,V00,0,400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10)
CALL(TEST_LOGIC)
JUMPIF(V00,<,801,MOTION_LOOP)
:MOTION_END
MOVE(0,800,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1200)
MOVE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2400)
JUMP(TEST_END)

:TEST_LOGIC
JUMPIF(V00,<,801,TEST_LOGIC_END)
:TEST_LOGIC_END
V00=V00+10
RETURN

:TEST_END
P1010671.jpg
1/12に第9回U1Kに参加しました。

前回の6台出場から9台とライバル?!が一気に1.5倍、場所もアキバ大好祭り内となり、スケールが大きくなりました。
会場がベルサール秋葉原の地下でしたので、お客さんが1階より少ないかと思っていましたが、そんなことは全くなく、小さいお子さん、カップル、女性のグループ等々、普段の秋葉原では見かけないお客さんもかなりいて、皆さん立ち止まって見てくださっていました。

今回総合優勝したA4さんのテルルが、動作が安定してきちんと動いているし外見も二足歩行ロボットにしては相当カワイイこともあって、観客の関心のひきつけ役に大きく貢献していました。

競技内容はアールティさんのページに記載してあるとおりとして、今回の結果ですが。。。
1.ロボメイズ
 転倒回数が前回よりも多かったですが、横移動が速くなっていたこともあって若干の記録更新。とは言っても、順位はかなり下の方です。
2.パイルダー
 前回キューブを持ちあげられなかったので、今回は3個以上運んで1つは積み上げるつもりでしたが、途中無線トラブル等もあり、前回同様、缶を2個運んだだけでした。いちおうキューブは持ち上げたのですが、転んでキューブの上に自分が載ってしまい、起上りできないことまでは想定していませんでした。
3.バトル
 初戦がスオガと決まった時点で、壊れなければいいやぐらいだったので、負けたこと自体はなんとも思っていないのですが、もう少し戦っているっぽい感じにもっていけないとお客さんはつまらないだろうなぁ。
 敗者復活戦の晶との対戦は、完全にあの”顔”にやられました。パンチがあたっているのに滑る滑る。(どのロボットのことかは写真を見て考えてみて!)
4.ランブル
 気がついたら特別賞をとった大きなロボットの転倒に巻き込まれていました。

今回の反省点・課題を整理しました。
1.モーションとモーションの間が大きい(無駄な内部処理がまだまだありそう。)
2.やや前のめり。歩行中に前に転倒することが多い。
3.微調整ができるように旋回の量を少なくしたが、少なすぎた。目的の位置に達するまでの時間がかかり過ぎ。
4.実際に転倒してから、転倒していると自動判定されるまでの時間がかかり過ぎ。起き上がりコマンド受付までの待ち時間が長いし、ジャイロが切れないのでブルブルとカッコ悪い。
5.脱力モーションは用意してあるが、とっさに使える位置のキー配置ではない。
6.脱力する前に指は広げる。(ケーブルを掴んでしまって離れない時に困る。)
7.転倒をいち早く検出して、自動的に脱力(受け身)を取るようにしたい。(腕のサーボのギア欠けが多発しているので。)
8.ファイティングポーズで前に出ている手が意外と攻撃されやすいかもしれない。(偶然かも知れないが、スオガに引っ掛けられて転倒させられてしまった。)
9.CPUボードの処理が遅いのをカバーするプログラミング手法を考える。
10.無線の瞬断が起きているっぽいので原因調査をする。
11.まだまだ歩行系のモーションに安定感がないので、きっちり移動できるようにする。
12.横反転は用意してあるので、(ゼムネスがやっていた)ずり上がり、ずり下がりを用意する。
13.ルールを最大限活用するように、リングアウトからの復帰モーションを作る

来月のROBO-ONEまでに何とかしたいことだらけですが、キビキビと動くロボットにするためにも、とりあえず1と9から取り組んでみようかと思っています。
2014年になりました。
今年もマイペースでロボット製作を続けようかなと思っています。
新年最初のイベントは1/12(日)予定の第9回U1Kです。
昨年わんだほーろぼっとか~にばる以降、全くロボゼロを動かしていなかったので、さすがに1週間前から準備を始めないと、ということで本日、新年最初のロボ製作活動を行いました。

今日は家庭の事情で自宅では製作できなかったので、どこでやろうかなぁ、と考えていたのですが、ろぼとまさんはまだお休みなので、昨年開拓した秋葉原のナノラボさんに行きました。
ナノラボさんは、工作用スペースのレンタルサービスをやっていて、価格も"ドリンク飲み放題”を考えればかなりリーズナブルだと思います。
今日は、同じ時間帯にいらっしゃった方と雑談しながら作業してましたが、お店の方や略して「SOS団」の団長さん?!から3Dプリンタの活用方法を教えてもらったり、X68000のFM音源やファミコンを使って曲作りをされている方とお話して、ファMIDIコントローラーを紹介していただいたりと、ロボット以外の情報をいろいろ仕入れられて面白かったです。

肝心のロボゼロの作業の方ですが、いつの間にか壊れていたサーボギアの交換と加速度センサーの配線の見直しを終えて、やっとハード的には落ち着きましたが、まだモーションには全く手付かずなので、来週までに間に合うのかちょっと心配になってきました。
内容はともかく一応第8回で第3位だったし、今回は会場がアールティさんではなく、ベルサール秋葉原の「アキバ大好き!祭り」内と人目につくところなので、少し頑張らねばと思ってはいるのですが。。。

さて、次回のROBO-ONEまで1ヶ月ちょっととなりましたが、こういう直前の時期に限っていろいろとアイデアが湧いて、ハード的にいじりたくなります。でも今回はグッと我慢してVer3のままとし、モーションづくりに専念して少しでも結果につなげたいと思います。

あと、今年はできればCADを習得して、切削や3Dプリントなど外部サービスを活用できるようになりたいなぁ。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。