こうしろうがEclipse+Visual Editorでカメラ台帳というGUIアプリを作成している傍らで,父はEclipse+LDT(leJOS Development Toolset)でMindStormsのプログラムを作っている。どうも逆のようだが,どっちもEclipseを使っている。
こうしろうがはまっていたのは年月である。カメラの購入日を日までは覚えてないだろう,もしくは管理する必要もないだろうという理由で年月だけを記憶する仕様にしているのだが,MySQLデータベース上の対応するフィールドのデータ型はdate型になっている。このdate型のフィールドに年月をどう収めればよいか悩んだようだ。画面上で選択された年+月に00をつないで格納しようとしたのだがエラーになった。「データベースはありえない日付は弾くだろうな。」日を1日に固定して年+月+01と編集したほうがいいと思うが,口には出さない。いろいろ悩んでみるのもよいだろう。
MindStormsで作るロボットで意外となやましいのが,ナビゲーションである。移動した距離を計測する明らかな方法がないので,50cm前進するとか,45度ちょうど曲がるという動作が難しい。
このページの下の方に書いてあるようにLeJOSにはTimingNavigatorクラスというものがある。
---------------------------------------------------------- TimingNavigator n = new TimingNavigator(Motor.C, Motor.A, 2.07f, 1.4515f); ----------------------------------------------------------TimingNavigatorクラスのインスタンスを生成するには,右のタイヤを回すモータ,左のタイヤを回すモータ,ロボットが100cm進むのに必要な秒数,ロボットが360度回転するのに必要な秒数をパラメータとして渡す。秒数はfloat型で指定する。
ということは,タイヤの大きさやギヤの組み合わせでスピードが違うのだから,作成したロボットで実測しなくてはいけない。先ほど紹介したページには,4mで計測して4で割った値を指定すると正確だと書いてあるが,日本の住宅で4mの直線はなかなか確保できにくい。もちろん,我が家から少し離れた砺波市の散居村のお屋敷のような家なら,玄関の横幅が数メーターあり,廊下はボーリングができそうな幅と長さがあったりするが,我が家の地面はそんなに大きくはない。だから,100cmを何回か走らせて,Excelで平均値を求めた。360度の回転には2秒もかからないので計測が大変だった。実際は,プログラムを作成してから何度も調整した。
100cm真っ直ぐ進み,90度方向を変え,10cm進んだところだ。TimingNavigatorクラスではX座標,Y座標を指定してロボットを走らせる。
---------------------------------------------------------- package navi; import josx.platform.rcx.*; import josx.robotics.*; class TimingNavi { public static void main(String [] args) { TimingNavigator n = new TimingNavigator(Motor.C, Motor.A, 2.07f, 1.4515f); n.gotoPoint(100,0); n.gotoPoint(100,10); n.gotoPoint(50,50); LCD.showNumber(Motor.A.getPower()+Motor.C.getPower()); try {Button.RUN.waitForPressAndRelease();} catch (InterruptedException e) {} } } ----------------------------------------------------------ロボットはX,Y座標を(100,0),(100,10),(50,50)と移動していく。
つまりこんな風に,勝手に向きを変えて進んでくれるのだ。TimingNavigatorクラスを使えば,かなり複雑なコースでも進んでいくことができるだろう。
ここまでナビゲートできるようになってはじめて,モータのパワーを設定していないことに気が付いた。モータのパワーは0から7の範囲で指定できる。デフォルトはいくつだろうと調べるために追加したコードが,
LCD.showNumber(Motor.A.getPower()+Motor.C.getPower());
である。
AとCのパワーを足したら6と表示されたので,デフォルトが3であることがわかる。
最後のButton.RUN.waitForPressAndRelease();を指定しておくと,RUNボタンを押すことでプログラムが終了する。