◆ Lego Mindstoms NXT - leJOS - (4) Pilot クラス
前回は、2 つのモーターを管理する PairMotor クラスを作りまし
たが、このクラスと同じようなクラス lejos.navigation.Pilot が
標準で用意されています。もちろん、Pilot クラスは NXT で動く
ロボットを作るための基礎になるクラスとして作られています。
この Pilot クラスを利用して、前回作ったクラス ForwardBack02
を作り直してみましょう。
□ Pilot pilot = new Pilot(5.6f, 13f, Motor.C, Motor.B); // (1)
車輪径 2.1、トラック幅 4.4、左モーター C ポート、右モーター
B ポートでパイロット・オブジェクトを生成します。
なお、車輪径は、車輪の直径、トラック幅は、2 つの車輪の接地点
間の距離です。単位は書かれていないのですが、多分、cm です。
(★) このプログラムでは、いちおう、cm として設定しています。
□ 主なコンストラクタ
---
Pilot(float wheelDiameter, float trackWidth, Motor leftMotor,
Motor rightMotor)
パイロット・オブジェクトを指定された物理パラメーターで生
成します。
---
□ 主なメソッド
---
void backward()
stop() メソッドが呼ばれるまで後退する。
void forward()
stop() メソッドが呼ばれるまで前進する。
int getAngle()
最後にtacho countのリセットをしたときからの回転角度を取
得する。
Motor getLeft()
左側のモーターを取得する。
int getLeftActualSpeed()
左側モーターの実速度(角度/秒)を取得する。負数は後退時の
値。100 ミリ秒ごとに測定。
int getLeftCount()
左側モーターの回転数を取得する。正数は前進時の値。
Motor getRight()
右側のモーターを取得する。
int getRightActualSpeed()
右側モーターの実速度(角度/秒)を取得する。負数は後退時の
値。100 ミリ秒ごとに測定。
int getRightCount()
右側モーターの回転数を取得する。正数は前進時の値。
int getSpeed()
現在の設定速度を取得する。
float getTravelDistance()
回転数をリセットしてからの走行距離を取得する。
float getTurnRatio()
360 度回転するときの比率(★)
boolean isMoving()
NXT ロボットが動いているとき true を返す。
void resetTachoCount()
回転数をリセットする。
void rotate(int angle)
NXT ロボットを回転する。左回転のとき正数、右回転のとき負
数を指定する。
void setSpeed(int speed)
速度(角度/秒)を設定する。
void steer(int turnRate)
指定角度分、NXT ロボットを回転する。 turnRate 値は -200
から 200 の間で指定する。
void stop()
NXT ロボットを停止する。
void travel(float distance)
指定された距離分移動する。正数は前進時の値。
---
□ pilot.forward(); // (2)
ロボットを前進させます。
□ pilot.stop(); // (4)
ロボットを停止します。
□ pilot.backward(); // (5)
ロボットを後退させます。
□ pilot.steer(180); // (1)
NxtUtil.pause(TURN_TIME);
右に 180 度曲がる指定。
なお、steer メソッドを使った場合、動く時間をその直後で指定す
る必要があります。
純粋に指定した角度だけ曲げたいのであれば、rotate メソッドを
使います。ただし、これの場合は、おそらく、床の素材(摩擦具合)
や、バッテリーの残量に影響されて、本当に指定した角度分曲がる
かどうかはわかりません。(★)
前回は、2 つのモーターを管理する PairMotor クラスを作りまし
たが、このクラスと同じようなクラス lejos.navigation.Pilot が
標準で用意されています。もちろん、Pilot クラスは NXT で動く
ロボットを作るための基礎になるクラスとして作られています。
この Pilot クラスを利用して、前回作ったクラス ForwardBack02
を作り直してみましょう。
------------------------------------------------------ import lejos.navigation.Pilot; import lejos.nxt.Motor; import u.NxtUtil; /** * 「トライボット」使用 * 1秒間前進し、その後1秒間停止、1秒間後退する。 * * @author marunomaruno * @version 1.0, 2008/07/04 * @since 1.0 */ public class ForwardBack12 { public static void main(String[] args) { Pilot pilot = new Pilot(5.6f, 13f, Motor.C, Motor.B); // (1) // 前進、1000ミリ秒間 pilot.forward(); // (2) NxtUtil.pause(1000); // 停止、1000ミリ秒間 pilot.stop(); // (4) NxtUtil.pause(1000); // 後退、1000ミリ秒間 pilot.backward(); // (5) NxtUtil.pause(1000); // 停止 pilot.stop(); } } ------------------------------------------------------
□ Pilot pilot = new Pilot(5.6f, 13f, Motor.C, Motor.B); // (1)
車輪径 2.1、トラック幅 4.4、左モーター C ポート、右モーター
B ポートでパイロット・オブジェクトを生成します。
なお、車輪径は、車輪の直径、トラック幅は、2 つの車輪の接地点
間の距離です。単位は書かれていないのですが、多分、cm です。
(★) このプログラムでは、いちおう、cm として設定しています。
□ 主なコンストラクタ
---
Pilot(float wheelDiameter, float trackWidth, Motor leftMotor,
Motor rightMotor)
パイロット・オブジェクトを指定された物理パラメーターで生
成します。
---
□ 主なメソッド
---
void backward()
stop() メソッドが呼ばれるまで後退する。
void forward()
stop() メソッドが呼ばれるまで前進する。
int getAngle()
最後にtacho countのリセットをしたときからの回転角度を取
得する。
Motor getLeft()
左側のモーターを取得する。
int getLeftActualSpeed()
左側モーターの実速度(角度/秒)を取得する。負数は後退時の
値。100 ミリ秒ごとに測定。
int getLeftCount()
左側モーターの回転数を取得する。正数は前進時の値。
Motor getRight()
右側のモーターを取得する。
int getRightActualSpeed()
右側モーターの実速度(角度/秒)を取得する。負数は後退時の
値。100 ミリ秒ごとに測定。
int getRightCount()
右側モーターの回転数を取得する。正数は前進時の値。
int getSpeed()
現在の設定速度を取得する。
float getTravelDistance()
回転数をリセットしてからの走行距離を取得する。
float getTurnRatio()
360 度回転するときの比率(★)
boolean isMoving()
NXT ロボットが動いているとき true を返す。
void resetTachoCount()
回転数をリセットする。
void rotate(int angle)
NXT ロボットを回転する。左回転のとき正数、右回転のとき負
数を指定する。
void setSpeed(int speed)
速度(角度/秒)を設定する。
void steer(int turnRate)
指定角度分、NXT ロボットを回転する。 turnRate 値は -200
から 200 の間で指定する。
void stop()
NXT ロボットを停止する。
void travel(float distance)
指定された距離分移動する。正数は前進時の値。
---
□ pilot.forward(); // (2)
ロボットを前進させます。
□ pilot.stop(); // (4)
ロボットを停止します。
□ pilot.backward(); // (5)
ロボットを後退させます。
------------------------------------------------------ import lejos.navigation.Pilot; import lejos.nxt.Motor; import u.NxtUtil; /** * 「トライボット」使用 * 500ミリ秒間前進し、その後右に180度曲がる。 * @author maruno * @version 1.0, 2008-06-12 * @since 1.0 */ public class TrunRight11 { public static void main(String[] args) { final int MOVE_TIME = 500; final int TURN_TIME = 360; Pilot pilot = new Pilot(5.6f, 13f, Motor.C, Motor.B); // CBモーター前進、500ミリ秒間 pilot.forward(); NxtUtil.pause(MOVE_TIME); // 右に曲がる pilot.steer(180); // (1) NxtUtil.pause(TURN_TIME); // CBモーター停止 pilot.stop(); } } ------------------------------------------------------
□ pilot.steer(180); // (1)
NxtUtil.pause(TURN_TIME);
右に 180 度曲がる指定。
なお、steer メソッドを使った場合、動く時間をその直後で指定す
る必要があります。
純粋に指定した角度だけ曲げたいのであれば、rotate メソッドを
使います。ただし、これの場合は、おそらく、床の素材(摩擦具合)
や、バッテリーの残量に影響されて、本当に指定した角度分曲がる
かどうかはわかりません。(★)
------------------------------------------------------ import java.util.Random; import lejos.navigation.Pilot; import lejos.nxt.LCD; import lejos.nxt.Motor; import u.NxtUtil; /** * 「トライボット」使用 ランダムに10秒間動く。 * * @author maruno * @version 1.0, 2008-07-04 * @since 1.0 */ public class Random11 { public static void main(String[] args) { final int MOVE_LIMIT_TIME = 1000 * 10; Pilot pilot = new Pilot(5.6f, 13f, Motor.C, Motor.B); Random random = new Random(System.currentTimeMillis()); int moveTotalTime = 0; while (moveTotalTime <MOVE_LIMIT_TIME) {
□ int rotateAngle = random.nextInt(401) - 200; // (1)
-200 から 200 までの乱数を設定します。
□ pilot.steer(rotateAngle); // (2)
(1) で取得した乱数値を使って、NXT ロボットを回転させます。
□ LCD.drawInt(pilot.getRightActualSpeed(), 1, 1); // (3)
LCD.drawInt(pilot.getLeftActualSpeed(), 1, 2);
左右のモーターの実測速度を表示します。
以上