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データから計算した各サブキャリアの振幅と位相の変化をみて、ひとやものの動きがあったかどうかなど推定することができます。

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

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


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

振幅のデータをリアルタイムでプロットしてみました。

横軸はサブキャリアです。

動体検知への応用

周期的な動きを検知するプログラムをAIに書いてもらいました。処理はエッジで完結しています。

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


espressif/esp-csiを利用するうえでの注意

今回はexamples/get-startedのcsi_recvとcsi_sendのを利用しました。
ESP32に書き込むまでの手順は同じ階層のcsi_recv_router配下にあるので注意が必要です。
またESP32-C5のWiFi6と5Ghzを利用するにはrecv側のファームでマクロの定義を少し変更したり、send側とチャンネルを合わせたりする必要があります。

0 件のコメント:

コメントを投稿