◆ Lego Mindstoms NXT - leJOS - (7) トライボット・オブジェクト
前回、トライボットを動かすプログラムを作りました。これをもと
に、トライボット・クラスを作ってみましょう。
■ トライボットクラス
まず、「物が置かれるまで停止」や、「タッチするまで前進」など
をメソッドとして扱えるようにします。この、物を置かれるまで停
止などは、超音波センサーを使っていますが、そのようなセンサー
やモーターなどを標準のポートにつなげたトライボット・オブジェ
クトや、標準とは別のポートにつけることもできるようにします。
操作用の各メソッドは、その実行時間をミリ秒単位で返すようにし
ます。とりあえず、つけておけば何かの役に立つかもしれません。
さらに、センサーのしきい値も標準値を用意し、なにも指定しなけ
れば、しきい値として標準値を使うようにしましょう。
また、将来は複数台のトライボットを使えるようにするため、個々
のオブジェクトを識別できるように名前をつけられるようにします。
他と区別つくように、パッケージ tb としておきます。
□ 定数の概要
---
static int LIGHT_THRESHOLD
光センサーで明暗を分ける標準のしきい値
static int SOUND_THRESHOLD
音センサーで音を聞き分ける標準のしきい値
static int ULTRASONIC_THRESHOLD
超音波センサーの前に物を置いたことを検知する標準の
しきい値
---
□ コンストラクタの概要
---
Trybot(String name)
トライボットを、すべて標準ポートで生成します。
Trybot(String name, float wheelDiameter, float trackWidth,
Motor leftMotor, Motor rightMotor, Motor arm,
TouchSensor touchSensor, SoundSensor soundSensor,
LightSensor lightSensor,
UltrasonicSensor ultrasonicSensor)
トライボットを、指定されたポートで生成します。
---
□ メソッドの概要
---
long closeArm(long millis)
指定されたミリ秒間、アームを閉じます。
long forwardUntilDark()
暗くなるまで前進します。
long forwardUntilDark(long threshold)
暗くなるまで前進します。
long forwardUntilTouch()
タッチされるまで前進します。
Motor getArm()
アームを取得します。
LightSensor getLightSensor()
光センサーを取得します。
String getName()
名前を取得します。
SoundSensor getSoundSensor()
音センサーを取得します。
TouchSensor getTouchSensor()
タッチセンサーを取得します。
UltrasonicSensor getUltrasonicSensor()
超音波センサーを取得します。
long openArm(long millis)
指定されたミリ秒間、アームを開きます。
long reverseMilliSeconds(long millis)
指定されたミリ秒間後退します。
long rotetoLeftMilliSeconds(long millis)
指定されたミリ秒間左回転します。
long stopUntilAnySound()
音がするまで停止します。
long stopUntilAnySound(long threshold)
音がするまで停止します。
long stopUntilPut()
物が置かれるまで停止します。
long stopUntilPut(long threshold)
物が置かれるまで停止します。
---
□ 上記APIに基づいたクラス
*
*
* @param name 名前
*
*/
public Trybot(String name) {
this(name, 5.6f, 13f, Motor.C, Motor.B, Motor.A, new TouchSensor(
SensorPort.S1), new SoundSensor(SensorPort.S2),
new LightSensor(SensorPort.S3), new UltrasonicSensor(
SensorPort.S4));
}
/**
* トライボットを、指定されたポートで生成します。
*
* @param name 名前
* @param wheelDiameter 車輪径
* @param trackWidth トラック幅
* @param leftMotor 左モーター
* @param rightMotor 右モーター
* @param arm アーム
* @param touchSensor タッチセンサー
* @param soundSensor 音センサー
* @param lightSensor 光センサー
* @param ultrasonicSensor 超音波センサー
*/
public Trybot(String name, float wheelDiameter, float trackWidth,
Motor leftMotor, Motor rightMotor, Motor arm,
TouchSensor touchSensor, SoundSensor soundSensor,
LightSensor lightSensor, UltrasonicSensor ultrasonicSensor) {
super(wheelDiameter, trackWidth, leftMotor, rightMotor);
this.name = name;
this.arm = arm;
this.touchSensor = touchSensor;
this.soundSensor = soundSensor;
this.lightSensor = lightSensor;
this.ultrasonicSensor = ultrasonicSensor;
}
/**
* タッチされるまで前進します。
* @return このメソッドの実行にかかった時間
*/
public long forwardUntilTouch() {
long startTime = System.currentTimeMillis();
forward();
while (!touchSensor.isPressed())
;
return System.currentTimeMillis() - startTime;
}
/**
* 暗くなるまで前進します。
* @return このメソッドの実行にかかった時間
*/
public long forwardUntilDark() {
return forwardUntilDark(LIGHT_THRESHOLD);
}
/**
* 暗くなるまで前進します。
* @param threshold 暗くなるしきい値
* @return このメソッドの実行にかかった時間
*/
public long forwardUntilDark(long threshold) {
long startTime = System.currentTimeMillis();
forward();
while (lightSensor.readValue() >= threshold)
;
stop();
return System.currentTimeMillis() - startTime;
}
/**
* 指定されたミリ秒間後退します。
* @param millis 後退する時間(ミリ秒)
* @return このメソッドの実行にかかった時間
*/
public long reverseMilliSeconds(long millis) {
long startTime = System.currentTimeMillis();
backward();
NxtUtil.pause(millis);
stop();
return System.currentTimeMillis() - startTime;
}
/**
* 指定されたミリ秒間左回転します。
* @param millis 回転する時間(ミリ秒)
* @return このメソッドの実行にかかった時間
*/
public long rotetoLeftMilliSeconds(long millis) {
long startTime = System.currentTimeMillis();
getLeft().backward();
getRight().forward();
NxtUtil.pause(millis);
stop();
return System.currentTimeMillis() - startTime;
}
/**
* 指定されたミリ秒間、アームを閉じます。
* @param millis 閉じる時間(ミリ秒)
* @return このメソッドの実行にかかった時間
*/
public long closeArm(long millis) {
long startTime = System.currentTimeMillis();
arm.backward();
NxtUtil.pause(millis);
arm.stop();
return System.currentTimeMillis() - startTime;
}
/**
* 指定されたミリ秒間、アームを開きます。
* @param millis 開く時間(ミリ秒)
* @return このメソッドの実行にかかった時間
*/
public long openArm(long millis) {
long startTime = System.currentTimeMillis();
arm.forward();
NxtUtil.pause(millis);
arm.stop();
return System.currentTimeMillis() - startTime;
}
/**
* 物が置かれるまで停止します。
* @return このメソッドの実行にかかった時間
*/
public long stopUntilPut() {
return stopUntilPut(ULTRASONIC_THRESHOLD);
}
/**
* 物が置かれるまで停止します。
* @param threshold 物が置かれるしきい値
* @return このメソッドの実行にかかった時間
*/
public long stopUntilPut(long threshold) {
long startTime = System.currentTimeMillis();
stop();
while (ultrasonicSensor.getDistance() >= threshold)
;
return System.currentTimeMillis() - startTime;
}
/**
* 音がするまで停止します。
* @return このメソッドの実行にかかった時間
*/
public long stopUntilAnySound() {
return stopUntilAnySound(SOUND_THRESHOLD);
}
/**
* 音がするまで停止します。
* @param threshold 音を認識するしきい値
* @return このメソッドの実行にかかった時間
*/
public long stopUntilAnySound(long threshold) {
long startTime = System.currentTimeMillis();
stop();
while (soundSensor.readValue() <= threshold)
;
return System.currentTimeMillis() - startTime;
}
// 標準のゲッターの記載は省略します。
}
------------------------------------------------------
もちろん、これだけのメソッドでは、足りません。
「物が置かれるまで停止する」というメソッドがあれば、当然、
「物が置かれると前進する」などのメソッドも必要です。
ただ、あまり作りすぎてしまうと、メモリーが足りなくなると思い
ますので、必要なものだけを作っておいた方がいいでしょう。(も
う、すでに作りすぎているかもしれませんが。。。)
■ このクラスを作って Trybot01 を作り変えます。
かなりすっきりしました。でも、これはやりすぎかもしれません。
この調子でやっていったら、メソッドは際限なく増えてきますね。
□ Trybot trybot = new Trybot("trybot"); // (1)
名前を指定して Trybot オブジェクトを生成します。これは、すべ
て標準のポートを利用しています。
以上
前回、トライボットを動かすプログラムを作りました。これをもと
に、トライボット・クラスを作ってみましょう。
■ トライボットクラス
まず、「物が置かれるまで停止」や、「タッチするまで前進」など
をメソッドとして扱えるようにします。この、物を置かれるまで停
止などは、超音波センサーを使っていますが、そのようなセンサー
やモーターなどを標準のポートにつなげたトライボット・オブジェ
クトや、標準とは別のポートにつけることもできるようにします。
操作用の各メソッドは、その実行時間をミリ秒単位で返すようにし
ます。とりあえず、つけておけば何かの役に立つかもしれません。
さらに、センサーのしきい値も標準値を用意し、なにも指定しなけ
れば、しきい値として標準値を使うようにしましょう。
また、将来は複数台のトライボットを使えるようにするため、個々
のオブジェクトを識別できるように名前をつけられるようにします。
他と区別つくように、パッケージ tb としておきます。
□ 定数の概要
---
static int LIGHT_THRESHOLD
光センサーで明暗を分ける標準のしきい値
static int SOUND_THRESHOLD
音センサーで音を聞き分ける標準のしきい値
static int ULTRASONIC_THRESHOLD
超音波センサーの前に物を置いたことを検知する標準の
しきい値
---
□ コンストラクタの概要
---
Trybot(String name)
トライボットを、すべて標準ポートで生成します。
Trybot(String name, float wheelDiameter, float trackWidth,
Motor leftMotor, Motor rightMotor, Motor arm,
TouchSensor touchSensor, SoundSensor soundSensor,
LightSensor lightSensor,
UltrasonicSensor ultrasonicSensor)
トライボットを、指定されたポートで生成します。
---
□ メソッドの概要
---
long closeArm(long millis)
指定されたミリ秒間、アームを閉じます。
long forwardUntilDark()
暗くなるまで前進します。
long forwardUntilDark(long threshold)
暗くなるまで前進します。
long forwardUntilTouch()
タッチされるまで前進します。
Motor getArm()
アームを取得します。
LightSensor getLightSensor()
光センサーを取得します。
String getName()
名前を取得します。
SoundSensor getSoundSensor()
音センサーを取得します。
TouchSensor getTouchSensor()
タッチセンサーを取得します。
UltrasonicSensor getUltrasonicSensor()
超音波センサーを取得します。
long openArm(long millis)
指定されたミリ秒間、アームを開きます。
long reverseMilliSeconds(long millis)
指定されたミリ秒間後退します。
long rotetoLeftMilliSeconds(long millis)
指定されたミリ秒間左回転します。
long stopUntilAnySound()
音がするまで停止します。
long stopUntilAnySound(long threshold)
音がするまで停止します。
long stopUntilPut()
物が置かれるまで停止します。
long stopUntilPut(long threshold)
物が置かれるまで停止します。
---
□ 上記APIに基づいたクラス
------------------------------------------------------ package tb; import lejos.navigation.Pilot; import lejos.nxt.LightSensor; import lejos.nxt.Motor; import lejos.nxt.SensorPort; import lejos.nxt.SoundSensor; import lejos.nxt.TouchSensor; import lejos.nxt.UltrasonicSensor; import u.NxtUtil; /** * トライボットで必要な操作を管理するクラスです。 名前を指定するだけで、すべて標準のポートでこのオブジェクトを生成できます。 * * @author marunomaruno * @version 1.0, 2008/06/24 * @since 1.0 */ public class Trybot extends Pilot { /** * 超音波センサーの前に物を置いたことを検知する標準のしきい値 */ public static final int ULTRASONIC_THRESHOLD = 51; // 物を置くしきい値 /** * 音センサーで音を聞き分ける標準のしきい値 */ public static final int SOUND_THRESHOLD = 50; // 音のしきい値 /** * 光センサーで明暗を分ける標準のしきい値 */ public static final int LIGHT_THRESHOLD = 40; // 光のしきい値 private String name; // 名前 private Motor arm; // アーム private TouchSensor touchSensor; // タッチセンサーオブジェクト private SoundSensor soundSensor; // 音センサーオブジェクト private LightSensor lightSensor; // 光センサーオブジェクト private UltrasonicSensor ultrasonicSensor; // 超音波センサーオブジェクト /** * トライボットを、すべて標準ポートで生成します。 標準ポートは以下のとおりです。 * **
-
*
- 左モーター: ポート B *
- 右モーター: ポート C *
- アーム: ポート A *
- タッチセンサー: ポート 1 *
- 音センサー: ポート 2 *
- 光センサー + ライト: ポート 3 *
- 超音波センサー: ポート 4 *
*
*
* @param name 名前
*
*/
public Trybot(String name) {
this(name, 5.6f, 13f, Motor.C, Motor.B, Motor.A, new TouchSensor(
SensorPort.S1), new SoundSensor(SensorPort.S2),
new LightSensor(SensorPort.S3), new UltrasonicSensor(
SensorPort.S4));
}
/**
* トライボットを、指定されたポートで生成します。
*
* @param name 名前
* @param wheelDiameter 車輪径
* @param trackWidth トラック幅
* @param leftMotor 左モーター
* @param rightMotor 右モーター
* @param arm アーム
* @param touchSensor タッチセンサー
* @param soundSensor 音センサー
* @param lightSensor 光センサー
* @param ultrasonicSensor 超音波センサー
*/
public Trybot(String name, float wheelDiameter, float trackWidth,
Motor leftMotor, Motor rightMotor, Motor arm,
TouchSensor touchSensor, SoundSensor soundSensor,
LightSensor lightSensor, UltrasonicSensor ultrasonicSensor) {
super(wheelDiameter, trackWidth, leftMotor, rightMotor);
this.name = name;
this.arm = arm;
this.touchSensor = touchSensor;
this.soundSensor = soundSensor;
this.lightSensor = lightSensor;
this.ultrasonicSensor = ultrasonicSensor;
}
/**
* タッチされるまで前進します。
* @return このメソッドの実行にかかった時間
*/
public long forwardUntilTouch() {
long startTime = System.currentTimeMillis();
forward();
while (!touchSensor.isPressed())
;
return System.currentTimeMillis() - startTime;
}
/**
* 暗くなるまで前進します。
* @return このメソッドの実行にかかった時間
*/
public long forwardUntilDark() {
return forwardUntilDark(LIGHT_THRESHOLD);
}
/**
* 暗くなるまで前進します。
* @param threshold 暗くなるしきい値
* @return このメソッドの実行にかかった時間
*/
public long forwardUntilDark(long threshold) {
long startTime = System.currentTimeMillis();
forward();
while (lightSensor.readValue() >= threshold)
;
stop();
return System.currentTimeMillis() - startTime;
}
/**
* 指定されたミリ秒間後退します。
* @param millis 後退する時間(ミリ秒)
* @return このメソッドの実行にかかった時間
*/
public long reverseMilliSeconds(long millis) {
long startTime = System.currentTimeMillis();
backward();
NxtUtil.pause(millis);
stop();
return System.currentTimeMillis() - startTime;
}
/**
* 指定されたミリ秒間左回転します。
* @param millis 回転する時間(ミリ秒)
* @return このメソッドの実行にかかった時間
*/
public long rotetoLeftMilliSeconds(long millis) {
long startTime = System.currentTimeMillis();
getLeft().backward();
getRight().forward();
NxtUtil.pause(millis);
stop();
return System.currentTimeMillis() - startTime;
}
/**
* 指定されたミリ秒間、アームを閉じます。
* @param millis 閉じる時間(ミリ秒)
* @return このメソッドの実行にかかった時間
*/
public long closeArm(long millis) {
long startTime = System.currentTimeMillis();
arm.backward();
NxtUtil.pause(millis);
arm.stop();
return System.currentTimeMillis() - startTime;
}
/**
* 指定されたミリ秒間、アームを開きます。
* @param millis 開く時間(ミリ秒)
* @return このメソッドの実行にかかった時間
*/
public long openArm(long millis) {
long startTime = System.currentTimeMillis();
arm.forward();
NxtUtil.pause(millis);
arm.stop();
return System.currentTimeMillis() - startTime;
}
/**
* 物が置かれるまで停止します。
* @return このメソッドの実行にかかった時間
*/
public long stopUntilPut() {
return stopUntilPut(ULTRASONIC_THRESHOLD);
}
/**
* 物が置かれるまで停止します。
* @param threshold 物が置かれるしきい値
* @return このメソッドの実行にかかった時間
*/
public long stopUntilPut(long threshold) {
long startTime = System.currentTimeMillis();
stop();
while (ultrasonicSensor.getDistance() >= threshold)
;
return System.currentTimeMillis() - startTime;
}
/**
* 音がするまで停止します。
* @return このメソッドの実行にかかった時間
*/
public long stopUntilAnySound() {
return stopUntilAnySound(SOUND_THRESHOLD);
}
/**
* 音がするまで停止します。
* @param threshold 音を認識するしきい値
* @return このメソッドの実行にかかった時間
*/
public long stopUntilAnySound(long threshold) {
long startTime = System.currentTimeMillis();
stop();
while (soundSensor.readValue() <= threshold)
;
return System.currentTimeMillis() - startTime;
}
// 標準のゲッターの記載は省略します。
}
------------------------------------------------------
もちろん、これだけのメソッドでは、足りません。
「物が置かれるまで停止する」というメソッドがあれば、当然、
「物が置かれると前進する」などのメソッドも必要です。
ただ、あまり作りすぎてしまうと、メモリーが足りなくなると思い
ますので、必要なものだけを作っておいた方がいいでしょう。(も
う、すでに作りすぎているかもしれませんが。。。)
■ このクラスを作って Trybot01 を作り変えます。
かなりすっきりしました。でも、これはやりすぎかもしれません。
この調子でやっていったら、メソッドは際限なく増えてきますね。
------------------------------------------------------ import tb.Trybot; /** * トライボット」使用 * 前進し、そこでタッチしたものをつかみ、後退、回転し、 * 黒線があるところまで前進し、黒線のところでつかんだものを離す。 * * @author maruno * @version 1.0, 2008-06-20 * @since 1.0 */ public class Trybot02 { public static void main(String[] args) { // トライボットオブジェクトの生成 Trybot trybot = new Trybot("trybot"); // (1) // 物が置かれるまで停止 trybot.stopUntilPut(); // タッチするまで前進 trybot.forwardUntilTouch(); // 音がするまで停止 trybot.stopUntilAnySound(); // アームを閉じる trybot.closeArm(500); // 後退 trybot.reverseMilliSeconds(500); // 回転 trybot.rotetoLeftMilliSeconds(500); // 黒線のところまで前進して停止 trybot.forwardUntilDark(); // アームを開く trybot.openArm(500); } } ------------------------------------------------------
□ Trybot trybot = new Trybot("trybot"); // (1)
名前を指定して Trybot オブジェクトを生成します。これは、すべ
て標準のポートを利用しています。
以上
※コメント投稿者のブログIDはブログ作成者のみに通知されます