Phybotsチート・シート

よく使うクラスの一覧をまとめました。

ロボット

Noopy2

addExtensionメソッドでNoopyExtensionを指定して、ロボットに追加で接続したセンサやモータを使えるようになります。

Noopy2 noopy = new Noopy2("btspp://0000deadbeaf");
noopy.addExtension(Accelerometer.class);
noopy.addExtension(DCMotorController.class, Port.DC3);

センサやモータを使うには、次のようにリソースオブジェクトを取得して直接メソッドを呼び出すか、NoopyWithAccelerometerExtension.javaのようにリソースを利用するタスクを定義します。

Accelerometer meter = noopy.requestResource(Accelerometer.class);

サービス

Hakoniwa

シミュレータです。同じjp.digitalmuseum.mr.hakoniwaパッケージのHakoniwaRobotやHakoniwaBoxとあわせて使います。

サンプルはmatereal-samplesのhakoniwaパッケージ以下にたくさんあります。

Camera

Webカメラの撮像を取ってきます。サンプルはmatereal-samplesのcameraパッケージ以下にたくさんあります。解説は「カメラを使う」が詳しいです。

MarkerDetector

マーカー検出を行います。サンプルはmatereal-samplesのmarkerパッケージ以下にたくさんあります。解説は「視覚マーカーを検出する」が詳しいです。

タスク

既知のタスク一覧

ライブラリが最初からサポートしているタスクの一覧はTaskインタフェースのJavadocで見ることができます。

Move

指定位置に移動します。ClickAndRun.javaなどで使われています。

Move task = new Move(x, y);
if (task.assign(robot)) {
	task.start();
}

Push

指定位置に物を押し運びます。BringItHere.javaなどで使われています。

Push task = new Push(entity, x, y);
if (task.assign(robot)) {
	task.start();
}

Rotate

指定した方向を向きます。Moving speakerプロジェクトなどで使われています。

Rotate task = new Rotate(direction);
if (task.assign(robot)) {
	task.start();
}

TracePath(Loosely)

パスを辿って移動します。DrawAndTrace.javaで使われています。Shopping robotプロジェクトのようなことができます。

末尾にLooselyとついているタスクでは、パスを辿る戦略が微妙に異なります。パスを行き過ぎたときに戻らなくなり、結果として、スムースにパスを辿れることが多くなります。

List<Position> path;
 
// Code to get path here.
 
TracePath task = new TracePath(path);
if (task.assign(robot)) {
	task.start();
}

FillPath

パスで囲まれた範囲をくまなく掃くように移動します。LassoAndFill.javaなどで使われています。Sketch and Runプロジェクトのようなことができます。

List<Position> path;
 
// Code to get path here.
 
FillPath task = new FillPath(path);
if (task.assign(robot)) {
	task.start();
}

GoForward, SpinLeft, etc

WheelsControllerインタフェースで定義されているプリミティブな命令を一度呼び出すだけのタスクで、単純に前進したりその場で回転したりします。

DanceDanceDance.javaのように、単純な動作を組み合わせてワークフローを組み上げるときに使うと便利です。

ワークフロー

Workflow

ワークフローを表すクラスです。まずインスタンス化して、

Workflow workflow = new Workflow();

ノード(部品)を足します。

Action a = new Action(robotX, taskA);
Action b = new Action(robotX, taskB);
 
Action c = new Action(robotY, taskC);
Action d = new Action(robotY, taskD);
 
workflow.add(a, b, c, d);

部品の間を状態遷移(Transition)で結びます。TimeoutTransitionで時間切れも指定できます。

workflow.addTransition(new Transition(a, b));
workflow.addTransition(new Transition(c, d));
workflow.addTransition(new TimeoutTransition(c, d, 5000));

必要ならワークフローをforkして同時に二本走らせることもできます。最後にjoinすることで、二本の処理が共に終わったタイミングに同期した処理を書けます。

Fork fork = new Fork(a, b);
Join join = new Join(c, d);
 
workflow.add(fork, join)
workflow.addTransition(new Transition(fork, join));
 
Action e = new Action(robotX, taskE);
workflow.add(e);
workflow.addTransition(new Transition(join, e))

組みあがったワークフローは初期ノードを指定してstart()を呼べば動きだします。

workflow.setInitialNode(fork);
 
workflow.start();