オーディオ型の振動子を用いた触覚デバイスの実装方法
この記事に書いてあること
本記事では、オーディオ型の振動子を用いた触覚デバイスの実装方法について解説します。
触覚の話
触覚とは、身体を通して外界から加わる圧力や振動などの力学的な刺激を受け取り、それを脳が処理して知覚として成立させる感覚です。人間は一般的に1Hz程度の低周波から数百Hz、さらには数千Hzの高周波帯まで感じ取ることができるとされており、スマートフォンの通知で感じる振動(およそ100~200Hz)は、その代表的な例にあたります。スマートフォンのバイブレーションは、皮膚に直接小刻みな振動や圧力を与えることで認識されますが、こうした周波数帯を変調することで、ざらざらした感触やつるつるした感触など、多様な触感を生み出せることが知られています。
触覚には、大きく分けて表層感覚と深部感覚があります。表層感覚は、皮膚表面に存在するメルケル盤やマイスナー小体、パチニ小体などの受容器を通して、指先で感じる質感の違いや細かな振動刺激をとらえます。一方、深部感覚は筋・腱・関節に由来し、筋紡錘や腱受容器が筋肉の長さや張力、関節の角度の変化などを感知します。この深部感覚を振動によって誤作動させると、実際には関節の角度が変わっていないにもかかわらず、曲げ具合が変わったように感じる「腱振動錯覚」が生じます。例えば、80Hz付近の振動を腱に与えると、筋紡錘が刺激を受けて脳が誤った関節位置情報を得るため、身体が動いていないにもかかわらず動いたように錯覚するのです。
こうした表層感覚と深部感覚の両方に働きかける触覚技術は、VRとの組み合わせによって、大きな可能性を秘めています。例えば、視覚情報と組み合わせて指先の皮膚を振動させることで、実際には存在しない物体に触れているかのような感触を生み出すことができます。さらに、深部感覚を利用した振動刺激を付与することで、重量感や動作感といった身体感覚を仮想的に再現し、没入感を高めることが可能になります。このような技術は、新しいインタラクションの設計にもつながります。
本記事の目標
このように、周波数を変化させることで、人間の複数の感覚チャネルに働きかけることが可能になり、新しいインタラクション手法や触感の提示が実現できます。個人的に結構面白い分野だと思います。しかし、気軽に試せる実装方法は、ネットや文献を探してもなかなか見つかりませんでした。詳細な情報が記載されていなかったり、高価な機材を使用していたりすることが多く、再現が難しい場合が多いように感じました。そこで本記事では、筆者ができるだけ安価に実装した方法を共有し、同様の研究を行う人や、これから試してみたい人の選択肢を広げることを目標にしています。
実装に使ったもの
実装に使ったものを書いていきます。オーディオ型の振動子は右と左を独立して動かすことができるので1つのアンプにつき2つの振動子を独立して操作することができます。そのため、2つの振動子を使用する場合の予算感は、振動子2つ(10,000円)+アンプ1つ(1,229円)+オーディオケーブル(1,510円)+電線(749円)で、合計13,488円程度になると考えられます。(Amazonではクーポンが適用されることも多いため、もう少し安くなる可能性があります。)
私の場合は3つ以上の振動子を動かす必要がありアンプが複数台必要になりイヤホンジャックが不足しました。そこで、USBサウンドカードを利用することで、追加のオーディオ出力を確保しました。また、USBポートも足りなくなったため、USBハブでポートを増設しました。3つ以上の振動子を使う場合はこんな感じで増設できます。
使ったデバイスを表にしておきます。
品名 | 値段 | URL |
---|---|---|
PC (Windows, Macは未検証) | - | - |
スピーカータイプの振動子 | 約5000円/個 | リンク |
アンプ AK170 | 1,229円/個 | リンク |
オーディオケーブル | 1510円/個 | リンク |
電子工作用の電線ケーブル | 749円/個 | リンク |
usbハブ | 990円/個 | リンク |
USBサウンドカード | 1099円/個 | リンク |
実装方法
1つのアンプ、2つの振動子を動かす方法について書いていきます。尚この実装は3つ以上の振動子にスケールすることができます。筆者が使用したプログラムの一部を以下に載せます。
import sounddevice as sd
import numpy as np
# サンプリングレート
fs = 44100
# 振動のパラメータ
duration = 0.1 # 秒
frequency = 70 # Hz
amplitude = 1.0
# サイン波の生成
t = np.linspace(0, duration, int(fs * duration), endpoint=False)
myarray = amplitude * np.sin(2 * np.pi * frequency * t).astype('float32')
# 左右独立の振動データ
right_channel_data = np.column_stack((np.zeros_like(myarray), myarray))
left_channel_data = np.column_stack((myarray, np.zeros_like(myarray)))
# 出力デバイスのインデックス
device_index_a = 1
# 音声を再生する関数
def play_sound(data):
try:
with sd.OutputStream(device=device_index_a, samplerate=fs, channels=2, dtype='float32') as stream:
stream.write(data)
except Exception as e:
print(f"Error playing sound: {e}")
# 左右の振動を再生
def play_vibration_left():
play_sound(left_channel_data)
def play_vibration_right():
play_sound(right_channel_data)
このプログラムでは、Pythonでオーディオを再生するためのライブラリであるsounddevice(ASIO対応)と、振動用のサイン波データを生成するための数値計算ライブラリであるnumpyを使用します。振動波形を作成する際には、frequency(振動の周波数, Hz)とduration(振動の長さ, 秒)のパラメータを設定し、np.column_stack() を用いて左右独立の振動波形データを作成しています。オーディオデバイスの設定については、sd.query_devices() を実行することでコンソール上にデバイスの一覧が表示されるため、適切なオーディオデバイス(アンプ)の番号を確認し、device_index_a に設定してください。音声の再生方法として、play_vibration_right() を実行すると右側の振動を、play_vibration_left() を実行すると左側の振動を再生できます。
また、振動子を3つ以上に増やしてスケールさせる場合は、追加の出力デバイスのインデックスを指定し、それぞれのデバイスに対応した再生関数を作成することで簡単に拡張が可能です。
応用(Unityの通信)
筆者はこのシステムをUnityと連携させ、VRアプリケーションと通信できるようにしています。具体的には、socket通信を用いてUnity側からコマンドを送信し、Python側でそのコマンドを受け取って対応する振動を再生する仕組みを実装しました。これにより、VRアプリケーションの操作に応じてインタラクティブに振動を提示することができます。
また、ASIOドライバを使用することで、イヤホンやスピーカーなどの音響機器も指定・操作が可能です。そのため、上記のスクリプトにmp3などの音声データを再生する関数を追加すれば、振動デバイスとオーディオデバイスを一元管理することができます。Windows環境では出力デバイスが1つしか選択できない制約があるため、この方式が特に適していると感じています。
さらに、振動とmp3の音声データを同時に再生する場合は、非同期処理(マルチスレッド)を活用しました。具体的には、ThreadPoolExecutor を用いることで、複数のオーディオ処理を同時に実行できるようにしました。ただし、より効率的な方法があるかもしれないです笑
終わりに
このように実装すれば、振動デバイスを活用した様々な体験が可能になります。研究用途に限らず、オーディオ振動の応用はとても面白いので、ぜひいろいろ試してみてください!
例えば、振動子を顎につけて、YouTubeにあるケンタッキーを食べるASMRを流してみると、食感を感じるような新しい体験ができると思います(結構楽しかった)。こんな分野をソニックシーズニングといったりします。
また、振動子を足首の前後につけ、片足立ちした状態で、80Hzの振動を0.1秒ごとに前後に切り替えてみると、地面が揺れているような錯覚を体験できます(KineSwayと調べると詳細が書いた論文が出てきます。もしかすると論文は大学のネットワークからしかアクセスできないかも、、、)。結構わかりやすく揺れると思いますが研究室内で試したところ個人差は見られました。
振動子の使い方次第では、マッサージ的な用途にも応用できるかもしれません(試したことはありませんが…笑)。ぜひ自分なりのアイデアで楽しんでみてください!
また、この記事に書いてあることが間違えていたり、詳細について知りたい人がいれば気軽にXに連絡をください!
触覚の知見を深めるうえで参考になりそうなサイト
Discussion