ロボサバ大会 道中記

ロボサバ大会では、どのようなルートになるか当日までわからない。
そのため選手は、「1マス進む」や「右90°回転」などの個々のプログラムが完成していても、並びを変えないといけないので、全部書き直す必要がある。

そこで、ほっかいどうロボサバでは、リモコン操作で走らせて動きを記録し、何度も動きをそっくり再生できる方法を考えた。


まずは、リモコンの考え方。
これは、学習RPN電卓をちょっと改造して利用させてもらった。
ロボサバとの接続方法や、リモコンキーを読み取るIchigoJamプログラムも、学習RPN電卓のHPに掲載したので参考にしてほしい。


次に「動き」のしくみ。
通常は、OUT命令とWAIT命令を、動きたい順にプログラムを作って実行(RUN)すると、ロボサバはそその通り動く。
例えば、前進2秒、停止3秒、後退2秒という動きをしたいなら、つぎのようなプログラムだ。

10 OUT20:WAIT120
20 OUT0:WAIT180
30 OUT60:WAIT120
40 OUT0

しかし、これだと動きを変えたい時は、行番号を変えてプログラムを直さないといけない。

そこで、ほっかいどうロボサバでは、OUT命令とWAIT命令を配列に覚えさせる方法を考えることにした。
もちろん、命令そのものは配列にはできないので、値だけを入れるのだ。
OUT命令やWAIT命令の数字部分には、変数(配列変数)が使えるのだ。
つぎのプログラムも同じ動きをする。

10 LET[0],20,120,0,180,60,120,0,0
20 FOR I=0 TO 6 STEP 2
30 ?”OUT”;[I],”WAIT”;[I+1]
40 OUT[I]:WAIT[I+1]
50 NEXT

こうして、10行目の配列にOUT値とWAIT値を順に作れば、どんな動きもできるはずだ。
なお、このサンプルプログラムでは、分かりやすいように二つの配列に、それぞれOUT値とWAIT値を入れたが、ほっかいどうロボサバでは一つの配列にOUT値とWAIT値の両方を入れてある。
さらに、OUT値は「動作No」という0~9のインデックスに代えてある。
ちょっと難しいのだが、配列変数の節約と、どんな種類のロボット(OUT命令)も動かせるようにするのが理由なのだ。
プログラムのページの後に、「動作No(D)とOUT値(G)」の対応表を載せてある。


つぎは、動きを記録(覚えさせる)方法だ。
リモコンには、ちょうどいい具合にボタンが並んでいる。
たとえば、8キーを押している間は前進(OUT20)、2キーを押している間は後退(OUT60)というように決めるのだ。
このときの、”押している間”をWAIT値にすればよい。

記録プログラムのサンプルはここでは省くが、もう一つの問題として、電源を切っても、覚えた配列を残しておきたい。
プログラムはSAVE命令で保存できるのだが、配列はこの方法では保存できないのだ。
そこで、リモコン操作時のOUT値とWAIT値を、プログラムの書かれている行に直接保存する方法を試して成功することができた。

10 LET[0],020,120,000,180,060,120,000,000

具体的な説明は省くことにするが、次のページに全プログラムを公開している。
実際のプログラムでは、1つの配列にOUT値とWAIT値をセットで記録しており、すこし改良がしてある。
他にも、余計な機能を入れてしまったので、プログラムがエリア0と1を使い切っているのだ(エリア0に記録、エリア1に再生プログラムを保存)。
一応、リモコンが付いていなければ、ダンスをするようプログラムしてあるので、リモコンが有っても無くても、プログラム入力して入れて試してみるのもいいだろう。


さて、ばっちりプログラムを完成させて大会に勇んで持ち込んだはずなのだが、あっさりコースから脱輪してしまった。
しかも魔のTHE一本橋!、く~っ。

手動作業を記録するということは、人間のミスも記録するということと、ロボサバ自体が直進性がよくないので、微調整するロジックが必要なのだ。

つぎに行く機会があれば、ぜひこれらを盛り込んでリベンジしたいところだ。

つぎのページで、全プログラムを公開。