2026年3月31日火曜日

ESP32でCSIをみる

ESP32では公式SDKを使ってCSIを観察することができます。

CSI(チャネル状態情報)とは、Wi-Fi通信における送信機から受信機へ電波が伝わる際の「歪み」や「変化」を細かく記録したデータのことです。
Wi-Fi(OFDM方式)では、一つのチャンネルをさらに細かい周波数帯(サブキャリア)に分割してデータを運んでいます。CSIは、このサブキャリア一本一本が、壁や障害物によってどのように減衰し、位相(タイミング)がずれたかを複素数データとして保持しています。

https://github.com/espressif/esp-csi
ここでEspressif社によるCSIツールのサンプルコードがみれます。 実際に動かすと以下のようにデータが流れてきます。

主なデータとしてrssiMACアドレス使用しているWi-Fiチャンネルマイコン内部のタイムスタンプ、そして核心となるIQデータがあります。
IQデータから計算した各サブキャリアの振幅と位相の変化をみて、ひとやものの動きがあったかどうかなど推定することができます。

  • 振幅:大きな動きで変化する
  • 位相:微小な動きでも変化する

位相データの性質を利用することで、呼吸や心拍といった周期的な動きを観察できるようです。


リアルタイムデータのプロット

リアルタイムの振幅と位相のデータをプロットしました。

振幅データ

位相データ


動体検知への応用

振幅データを利用して動体検知などのプログラムも作れます。 以下のようにESP32を対面させます。実際には80cm~1mほど離して動かしました。

Top-KPercentileという手法を組み合わせて、特に振幅が変化したいくつかのサブキャリアだけに着目するようにすると、うまく検知できるようになりました。

振幅の変化から周期的な動きを検出することもできます。 AIの提案でFFT(高速フーリエ変換)を使ったものと自己相関を使ったものの二つのアプローチから試しましたが、体感的に後者のほうがうまく検出できている気がします。

0 件のコメント:

コメントを投稿