memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

ProcessingでURG-04LX-UG01を使ってみる

ゼミ室に以前購入したレンジセンサー(北陽URG-04LX-UG01)がありました。

購入したのはずいぶん昔のことです。LeapMotionもKinectもない時代です。

このセンサーはセンサーを中心として周囲240度の距離データ(分解能は0.36度)を得ることができます。

先日のシンポジウムでサッカーのフィールド横にレンジセンサーを配置してプレイヤーの位置を特定する。。。という研究を見かけました。そういえば、そのオモチャ版がうちにもあったな。。。と。

また、使うときがくるかもしれません(使えないかもしれません)。

そこでいまどきの環境で動くか試してみました、というのがこのエントリーの趣旨です。

以前、Macで動かしたよ、というエントリーを書いていたようです。ぐぐって自分のエントリーにぶちあたる。。。よくある話です。やったことを覚えていない。。。

また、忘れるでしょうから、以下、いろいろとメモしておきます。

まず、本体のファームウェアをアップデートしました。まず、製品ページにアクセスします

残念ながら、アップデートプログラムはWinしか対応していないのでMacで稼働しているVirtualBoxを起動しURG-04LX-UG01を接続してみると。。。なぜか認識されない。ググるとこちらに解決方法がありました。Oracle VM VirtualBox Extension Packを入れないといけませんでした。

で、とりあえずURG-04LX-UG01のファームをアップデートできました。で、VirtualBoxは必要ありません。あとはMacで作業します。

その後、Mac側にURG-04LX-UG01を認識させて、データ確認ツールをMacにダウンロード&インストールし、URG-04LX-UG01が正常に動作することを確認します。

ここでデバイス名(/dev/tty.usbmodem****)を得ることができます。これはあとのプログラムで利用します。

その次。

メーカーさんが提供してくれているJavaライブラリとそのサンプルプログラムをもとにProcessingで動く環境を整えました。

以下の囲みはやらなくていいです。あくまで僕自身のメモとして。

メーカーさんのJavaプロジェクトはNetBeansプロジェクトのため、NetNBeansで開きビルドするとurg_java_lib.jarファイルが生成されます。これを利用します。さらに、64ビット環境ではrxtxライブラリが動作しないのでこちらから取得します。そしてこちらを参考にロックファイルを作成しました。

Processing用のライブラリはこちらに置きました。

このライブラリを動かすには以下を実行する必要があります。ロックファイルを生成するフォルダを作成しています。たまにProcessing上で異常終了するとロックファイルが残るので手動で削除する必要がある場合がありますのでご注意を。

sudo mkdir /var/lock && sudo chmod 777 /var/lock

で、以下がProcessingのサンプルです。

汚いですが。。。とりあえず動きます。何かキーを押すと停止できます。

import com.kristou.urgLibJ.Connection.SerialConnection;
import com.kristou.urgLibJ.RangeSensor.Capture.CaptureData;
import com.kristou.urgLibJ.RangeSensor.Capture.CaptureSettings;
import com.kristou.urgLibJ.RangeSensor.RangeSensorInformation;
import com.kristou.urgLibJ.RangeSensor.UrgDevice;
import gnu.io.*;
import com.kristou.urgLibJ.RangeSensor.Capture.CaptureData.Step;

UrgDevice device;

void setup() {
  device = new UrgDevice(new SerialConnection());

  // Connect to the sensor
  if (device.connect("/dev/tty.usbmodem1421")) {
    println("connected");

    //Get the sensor information
    RangeSensorInformation info = device.getInformation();
    if (info != null) {
      System.out.println("Sensor model:" + info.product);
      System.out.println("Sensor serial number:" + info.serial_number);
    } else {
      System.out.println("Sensor error:" + device.what());
    }

    //Set the continuous capture type, Please refer to the SCIP protocol for further details
    device.setCaptureMode(CaptureSettings.CaptureMode.MD_Capture_mode);

    //We set the capture type to a continuous mode so we have to start the capture
    device.startCapture();
  }
 
  if (! device.isConnected()) {
    println("not connected: " + device.what());
    exit();
  }
  
  size(700, 700);
  frameRate(10);
  stroke(255);
}

void draw() {
  float w2 = width / 2.0;
  float h2 = height / 2.0;

  background(0);
  
  //Data reception happens when calling capture
  CaptureData data = device.capture();
  if (data != null) {
    float th = 0;
    for (Step s : data.steps) {
      float v = s.distances.get(0) / 5;
      line(w2, h2, w2 + v * cos(th / 180 * PI), h2 + v * sin(th / 180 * PI));
      th += 0.36;
    }
  } else {
    println("Sensor error:" + device.what());
  }
}

void keyPressed() {
  //Stop the cature
  device.stopCapture();

  //Disconnect from the sensor
  device.disconnect();
  
  exit();
}

で、動かしている様子が以下です。

www.youtube.com

とりあえずいまどきのMac環境でも動かせることを確認しました。