🐕

測域センサの汎用ツール "HokuyoUtil" を公開しました

2023/05/11に公開

インタラクティブなプロジェクションに広く使われている北陽さん測域センサをもっと便利に使うためのツールを作って、オープンソースで公開しました。Githubで公開しています。

https://github.com/STARRYWORKS-inc/HokuyoUtil

概要

測域センサを使うとこんなことができます。床面や壁面のプロジェクションに触れると反応するようなコンテンツで広く使われています。

このセンサは壁面に触れる手や床面の足の位置をセンサーからの距離と角度という情報で取得できます。インタラクティブコンテンツで利用するには、そのデータを特定の矩形エリア内のXY座標というデータに変換する必要があります。HokuyoUtilはそのセッティングや変換処理を簡単に行えるようにする目的で開発しました。TouchDesignerで開発しているので利用するにはTouchDesignerのインストールが必要です。変換した座標はOSCで出力するので、UnityやUnrealEngine、Electron、openFrameworksなどどんな開発環境でも使えます。

主な特徴

  • GUIで簡単にセットアップ
    検出したい矩形エリアの4点をクリックするだけでセットアップできます
  • パースペクティブ補正
    センサの微妙な傾きや設置面の歪みによって4つの頂点によってできる矩形が歪んでいても補正します
  • 複数台のセンサのデータのマージ
    重複するエリアを複数のセンサで検出したり、広範囲のエリアを複数のセンサで検出するためにそれぞれのセンサで取得された値をマージします
  • トラッキング
    各タッチポイントにIDを付与して同一のタッチを追い続けます
    またトラッキングされたタッチポイントの動きをスムージングすることもできます
  • OSCで座標を出力
    指定された送信先に/touches というアドレスでタッチポイントの数だけ x, y の値をFloatの配列として送信します(サイズやID、新規フラグなども送信可能)

使い方

こちらにチュートリアル動画があります
https://youtu.be/Xxw_gUPUcy8

動画ではTouchDesignerの右上の画面をフルスクリーンモードにしています。フルスクリーンモードにするには右上の「Fullscreen」ボタンをクリックしてください。

本番環境ではマシンの負荷を軽減するため、Peformモードで使用してください。Peformモードにするには左上の「Perform Mode」ボタンをクリックしてください。

  1. タッチを検出したい面に測域センサを設置します。(センサの傾きや設置面の歪みによって正しく取得できない場合があるので面から3〜10cmほど離した方が正しく検出できます)
    <写真>
  2. センサのIPアドレス(デフォルトは192.168.0.10/24)と同じネットワークにPCを接続します

    ムービーの機材構成
  3. HokuyoUtilの「M」のタブで SENSOR_COUNT に使用するセンサの数を入力します
    <キャプチャ>
  4. 「1」のタブで、センサのIPアドレスを入力します(センサのIPアドレス設定は北陽さんのUrgBenriPlusを使います)
    <キャプチャ>
    正しく動作しているとセンサが取得した点が表示されます
  5. 検出したい矩形エリアの左上の頂点をタッチして、画面上のどの部分がタッチされた位置かを確認します
    <キャプチャ>
  6. LEFT_TOPのボタンをONにしてから、画面上のタッチされている部分をクリックします(緑色の点がクリックした場所に表示されます)
    <キャプチャ>
  7. 残り3つの頂点も同様に設定します
    <キャプチャ>
  8. 複数台のセンサを使う場合は同様に他のセンサもセットアップします
  9. 「M」のタブでOSCを送信するホスト、ポートを入力すると検出された座標が送信されます
  10. TouchDesignerのファイルを保存すると設定が保存されます

画面の構成

左上の「M」や「1」のタブによりメイン画面や各センサの設定画面に切り替わります。センサの数はメイン画面の設定(SENSOR_COUNT)で変更できます。
<キャプチャ>

OSCで送信される値について

OSCで送信されるデータはアドレスが「/touches」で、データはFloat型の配列になります。1つ目の数値はTouchDesignerの経過フレーム数、2つ目以降にタッチポイントの数だけX座標、Y座標が送信されます。SEND_ID、SEND_LIFE_TIMEがONになっていると、それらのデータも送信されます。

マージの設定

近い位置にある複数のタッチポイントや、複数台のセンサのデータを1つのタッチポイントとしてまとめる場合、「M」のタブのMEARGE_DISTANCEを調整します。ここで設定された数値より距離が近いタッチポイント同士がマージされます。
0に設定されていると全くマージされません。最大値は1で画面の幅に対する割合で指定します。
例えばOUTPUT_SIZEのXが1920で、MERGE_DISTANCEが0.1だとタッチポイント同士の距離が192(1920 * 0.1)以内の場合1点にまとめられます。
歩いている人をセンシングするような場合、センサから見て足が2つになったり1つに重なったりすることでタッチポイントが増えたり減ったりします。これを1つのタッチポイントとして扱いたいような場合、歩幅くらいに足を広げて立ったときにタッチポイントが1点になるようにこの値を調整します。

トラッキングの設定

検出したタッチポイントをトラッキングする場合、「M」のタブのTRACKING_DISTANCEを調整します。前フレームと比較して、ここで設定された数値より距離が近いタッチポイントは同一のタッチポイントとみなして同じIDが付与されます。
0に設定されているとトラッキングされません。最大値は1で画面の幅に対する割合で指定します。

スムージングについて

SMOOTHINGの値を0より大きい値にすると、トラッキングされているタッチポイントの移動を滑らかにするために前フレームとの差分を平滑化します。

BIRTH_FRAMES / KEEPALIVE_FRAMESについて

ノイズ等により一瞬だけ新たなタッチポイントが出現したり、トラッキングしているタッチポイントを見失う場合があります。これらに対処するために、BIRTH_FRAMESを0より大きい値にすると、新たに出現したタッチポイントがここで指定されたフレーム数連続してトラッキングできるまでは有効なタッチポイントとみなしません。同様にKEEP_ALIVE_FRAMESを0より大きい値にすると、見失ったタッチポイントをここで指定されたフレーム数の間、IDと座標を保持します。
※TRACKING_DISTANCEを0に設定し、BIRTH_FRAMESを1以上の値に設定するとタッチポイントがまったく検出されなくなります

各センサ設定画面

HOKUYO SETTINGS

センサのアクティブ状態とIPアドレスの設定

VIEW

プレビュー画面の位置、ズームの調整

LEFT_TOP / RIGHT_TOP / RIGHT_BOTTOM / LEFT_BOTTOM

出力する座標の左上/右上/右下/左下となる点を指定
UIをクリックして「ON」の状態にしてから右側の画面をクリックすると各ポイントにあった色の点がクリックされた位置に表示され、その場所が出力する座標の矩形の頂点となります。

OUTPUT_POSITION

広い範囲を複数台のセンサでカバーする際のセンサのカバー範囲のX,Y座標 (0-1)
例えば2台のセンサで左右60%ずつをカバーする場合1台目はRIGHT_TOPとRIGHT_BOTTOMのXを0.6に設定し、2台目はLEFT_TOPとLEFT_BOTTOMのXを0.4に設定します。それらの座標は最終的にメイン画面で設定されたOUTPUT_SIZEの範囲で複数台のデータがマージされて出力されます。

メイン画面

SENSOR_COUNT

センサーの台数
複数のセンサーを使う場合はここに台数を入力してください(最大4台まで)

OSC_HOST

OSCの送信先ホスト名

OSC_PORT

OSCの送信先ポート

OUTPUT_SIZE

座標を出力する矩形の幅と高さ (x, y)
例えばXを1920、Yを1080にするとFull-HDのサイズのピクセル値がそのまま送信されます。

MERGE_DISTANCE

複数の座標を1つにマージする距離の閾値 (0, 1)
矩形の幅を1として正規化された数値で、この閾値より距離が小さい座標は1つにまとめられて中間点の座標が出力されます。
センサーから見て、歩いてる人など2本の足が1つに重なったり2つになったりして座標の数が増えたり減ったりする場合や複数のセンサーを使う場合に便利です。
複数のセンサーを使う場合、この値をゼロにすると1点しか検出していなかったとしてもセンサーの台数分出力されてしまいます。

TRACKING_DISTANCE

トラッキングしてID付与する際に同一IDとする前フレームとの距離の閾値 (0-1)
矩形の幅を1として正規化された数値で、この閾値より前フレームとの距離の差が小さい場合は同一IDとしてトラッキングします。

SMOOTHING

同一IDの座標の移動を平滑化する強さ (0-1)
トラッキングされているタッチポイントの移動を滑らかにするために前フレームとの差分を平滑化します。

BIRTH_FRAMES

トラッキング時に新規の座標が出現してから、有効な点と見なすまでのフレーム数
ノイズなどにより1フレームだけ出現する点や歩いている人の足が一瞬だけ2点になるようなことを防ぐために便利です。

ALIVE_FRAMES

トラッキング時にID付与した座標が消失してから、実際に削除するまでのフレーム数
ノイズなどにより1フレームだけ消失したり、走ってる人の足が宙に浮いて一瞬だけ消えてしまった際にトラッキングが継続できず別のIDが付与されることを防ぐために便利です。

SEND_ID

点のサイズを送信するかどうか

SEND_LIFE_TIME

タッチポイントが出現してからの存続フレーム数を送信するかどうか

FLIP_Y

Y座標を反転するかどうか(OFFの場合は上がゼロ)

OSC受信サンプル

GithubのレポジトリにはElectronのサンプルが含まれています。(/examples/electron)
以下のコマンドでサンプルを実行することができます。(node.jsが必要です)

yarn install
yarn dev

事例

以下のコンテンツで実際に利用しています。

Discussion