ソフトウェアエンジニア T.K.
2025.11.28
本記事では、測域センサー(LiDAR)で取得した距離データを、人の「タッチ操作」として認識し、最終的に Windows のマルチタッチイベントとして扱えるようにするまでの一連の処理フローをご紹介します。
今回の構成では、HOKUYO UST-10 を2台使用し、壁面や大型スクリーンに対する非接触型のタッチインターフェースを実現しています。
HOKUYO UST-10 は TCP 接続に対応しており、通信プロトコルとして SCIP 2.0 を使用します。
距離データの取得には、連続測定コマンドを利用します。
MD0000108001000このコマンドにより、指定した角度範囲・分解能で距離データがストリームとして返却されます。
取得できるデータは ASCII 文字列としてエンコードされているため、以下の処理が必要になります。
TCP ソケットで文字列データを受信
SCIP フォーマットに従ってデコード
距離値を数値配列として保持
この段階では、各要素は「角度に対応した距離値」を持つ一次元配列です。
次に、取得した距離データの中から 人の手や指に相当する部分を検出します。
測域センサーの距離配列には、壁・床・ノイズなども含まれるため、
局所的に点が密集している部分を「タッチ候補」として抽出します。
具体的には、
隣接する測定点同士の距離差を計算
一定の距離閾値以下で連続する点群を 1つのクラスタ とみなす
といった 密度ベースのクラスタリングを行います。
この処理により、手や指など、比較的近距離に現れる物体を候補として切り出します。

UST-10 から得られるデータは、
距離 r
センサー中心からの角度 θ
で表される 極座標データです。
これをアプリケーション上で扱いやすい 2次元平面座標へ変換します。
X = r × cos(θ)
Y = r × sin(θ)この変換により、各測定点はセンサーを原点とした XY 座標上の点群として扱えるようになります。
本システムでは、2台の測域センサーを設置しているため、それぞれの座標系を 1つの共通座標系に統合する必要があります。
センサーA:タッチエリア左上に設置
センサーB:タッチエリア右上に設置
それぞれのセンサーで取得した点群を、
回転(向きの補正)
平行移動(設置位置の補正)
することで、グローバルなタッチエリア座標にマッピングします。
最終的には、このグローバル座標を
スクリーン解像度
表示エリアサイズ
に合わせて スクリーン座標系へ変換します。

2台のセンサーの点群を統合した後、
改めてクラスタリングを行います。
これは、
両センサーで同一の手を検出している可能性
センサー境界付近での重複検出
を考慮するためです。
各クラスタについて、
重心(中心点)
を計算し、この点を 1つのタッチポイント(代表点)として扱います。

タッチ操作として成立させるためには、
フレーム間で同一タッチを追跡する必要があります。
前フレームのタッチポイントと
現フレームのタッチポイント
の距離を比較し、
移動量が小さい
位置が近い
場合は 同一IDとして紐付けます。
新しく出現したポイント:タッチダウン
既存IDが移動:タッチムーブ
対応するポイントが消失:タッチアップ
また、一定時間更新されないIDは自動的に削除し、
タッチアップとして扱います。
この仕組みにより、
マルチタッチ
複数ユーザーの同時操作
を安定して扱うことが可能になります。

最終的に得られたタッチポイントは、
Windows が提供する マルチタッチ入力API を使って OS に通知します。
InjectSyntheticPointerInput
各タッチポイントに一意の Touch ID を割り当て
TOUCHINPUT 構造体に
位置
ID
状態(Down / Move / Up)
を設定
フレームごとに入力イベントを注入
これにより、
ドラッグ
ピンチ
複数指操作
といったジェスチャーも、通常のタッチディスプレイと同様に扱えるようになります。
測域センサーを用いることで、物理的なタッチパネルを使わずに、
大型ディスプレイや壁面をインタラクティブな操作面として活用できます。
今後は、
ノイズ除去の高度化
ユーザー識別精度の向上
ジェスチャー認識の拡張
などを行うことで、さらに実用性の高いインターフェースへ発展させることが可能です。
本記事が、LiDAR を用いたインタラクション開発の参考になれば幸いです。
関連する記事
この人が書いた記事