Java/Processingで小型ロボットを簡単に動かせるツールキットPhybotsは、オープンソースで公開されてしばらく経ちますが、正直なところ忙しくてあまり管理に手が回っておらず、すぐ使える配布ファイルもありませんでした。

#五十嵐ERATOのポスターセッションでさまざまな方に興味を示していただけたので、ようやく意を決してProcessingですぐ使えるライブラリの配布を始めました。

Phybotsはいろいろ便利だという話

Phybotsは、右上の写真のようなセットアップで使われることを想定したツールキットです。床や机の上を見下ろすカメラと、ARToolKitマーカーをつけた小型ロボットを、PCやMacに接続して、ロボットを好きな場所に移動させたり、物を押させたりできます。作例はYouTubeのプレイリストPhybots Applicationsに載っています。

ただし、僕はマーカーをつけていない単なるLEGOベースのロボットに特定の動きをさせるプログラムを書くのに使っていますし、3DCGの重畳表示をしないのであれば、マーカーの位置を検出するのもかなり簡単です。Phybotsは2008年の年末に開発が始まり、けっこうな年月をかけてAPIが作りこまれたライブラリなので、用意された機能のサブセットだけでもいろいろ便利なのです。

この記事では、Processing+Phybotsの組み合わせで、カメラ画像からマーカーを検出して、その位置にテキストを表示するコードを紹介します。

Phybotsのインストール

他のProcessing用ライブラリと同じように、PhybotsP5.zipを解凍してできるPhybotsP5フォルダをlibrariesフォルダの中に移動すれば、ライブラリ本体のインストール完了です。

Processingを起動して、メニューのSketch > Import Library…の中にPhybotsP5があれば成功です。(Processing 2.0の場合は、表記がPhybots for Processingに変わります。)

次に、Windowsの場合だけ、Webカメラから綺麗な画質で画像を取ってくるためにDirectShow Java Wrapperをインストールする必要があります。リンク先からダウンロードしたZIPファイルを解凍して、dsj.jarとdsj.dllをPhybotsP5/library/に移動します。

このとき、64bit版のWindowsで64bit版のJava(Processing)を使っている人は、x64フォルダの中に入っているdsj.dllを使ってください。(分からない場合はとりあえずどちらでもいいのでPhybotsP5/library/に移動してください。スケッチを実行したときにUnsatisfiedLinkErrorが出るので分かります。)

スケッチ

PhybotsP5/examples/MarkerDetection/MarkerDetection.pdeを開いてみてください。以下のような内容のスケッチがあるはずです。

import com.phybots.*;
import com.phybots.service.*;
import com.phybots.utils.*;
import com.phybots.p5.*;
import jp.digitalmuseum.napkit.*;

Camera camera;
PhybotsImage img;
MarkerDetector md;
NapMarker marker;

void setup()
{
  // カメラを起動する
  camera = new Camera();
  camera.start();

  // カメラの画像をProcessingで見られるようにする
  img = new PhybotsImage(camera);

  // マーカー検出を始める
  marker = new NapMarker(dataPath("4x4_45.patt"), 55);
  md = new MarkerDetector();
  md.setImageProvider(camera); // このカメラの画像から検出
  md.addMarker(marker); // このマーカーを検出
  md.start();

  size(640, 480);

  // ランタイムデバッグツールを表示する
  Phybots.getInstance().showDebugFrame();
}

void draw()
{
  image(img, 0, 0);

  // 検出結果を取得する
  NapDetectionResult result = md.getResult(marker);
  if (result != null) {
    ScreenPosition p = result.getPosition();
    ScreenRectangle r = result.getSquare();

    // 検出エリアを赤線で囲む
    stroke(255, 0, 0);
    for (int i = 0; i < 4; i ++) {
      ScreenPosition a = r.get(i);
      ScreenPosition b = r.get((i + 1) % 4);
      line(a.getX(), a.getY(), b.getX(), b.getY());
    }

    // 検出結果をテキストで表示する
    fill(255);
    text("confidence: " + result.getConfidence(), p.getX(), p.getY());
  }
}

コメントがあるので、あまり説明するところはないかもしれません。setup()では、カメラ(Camera)が画像を取ってきてマーカー検出器(MarkerDetector)に渡し、マーカー(NapMarker)を検出するようにセットアップしています。draw()では、マーカー検出器に検出結果を尋ね、もし検出されていたら、その位置にいろいろ描くようにしています。

おまじないチックなのは img = new PhybotsImage(camera) あたりでしょうか。これは、もともとJava用のライブラリだったPhybotsをProcessingに接続するための部分で、cameraをPImageとして画面に直接貼り付けられるようにしています。ランタイムデバッグツールについては次で説明します。

プログラムの起動

まず MarkerDetection/data/4x4_45.pdf を印刷してください。自分のマーカーパターンを持っている場合は、スケッチの中の 4x4_45.patt をそのマーカーファイルの名前に書き換えてやればそれが検出されます。

「Run」ボタンをクリックすればスケッチがコンパイルされ、プログラムが起動するはずです。32bit版、64bit版、それぞれのWindowsとMacで動作確認が取れています。WindowsでUnsatisfiedLinkErrorが出た場合は、DirectShow Java WrapperのDLLのbitを確かめてください。その他、起動しない場合は@arcatdmzに聞いてください。

プログラムが起動したら、この画面のように、ふつうのProcessingのウィンドウのほかにもう一つウィンドウが開くはずです。これがランタイムデバッグツールで、PhybotsのAPIの利用状況が分かるようになっています。「サービス」タブで Phybots > Marker Detector を選ぶと、マーカー検出のためのパラメタを調整できます。照明条件によってうまくマーカーが検出されない場合は、ここで二値化の閾値を調整してみてください。

以上、マーカー検出のやり方説明でした!お疲れさまでした。今後も折を見てさまざまなコード例を紹介していきたいと思います。


No Comments

Be the first to start a conversation

Leave a Reply

  • (will not be published)