marunomaruno-memo

marunomaruno-memo

Lego Mindstoms NXT - leJOS - (4) Pilot クラス

2008年07月22日 | LEGO
◆ Lego Mindstoms NXT - leJOS - (4) Pilot クラス

前回は、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);

左右のモーターの実測速度を表示します。


以上


最新の画像もっと見る

コメントを投稿