IEEE802.11mcとは
IEEE802.11mcは、2016年に追加されたIEEE802.11規格であり、Wi-Fiを用いてFTM(File Timing Measurement)ベースの距離測位を行うための規格となっています。
これにより、アクセスポイント(AP)とステーション(STA)間のToF(Time of Flight)の測定が可能になります。
仕組み(フロー)は下図の通り、イニシエータからレスポンダにFTM要求フレームを送信すると、レスポンダは、時刻t1にFTMフレームを送信します。イニシエータをそのフレームを受信した時刻をt2とします。その後、時刻t3にACKを返すと、レスポンダ側での受信がt4となります。
ここで、ラウンドトリップタイム(RTT)は (t4-t1)-(t3-t2)、距離は、光の速度をcとするとRTT x c / 2で求められます。
FTMをESP32-C3開発キットで体験
このFTMですが、AndroidではAndroid 9 Pieから実装されており、Google Nest Wi-FiとGoogle Pixelの組み合わせでWi-Fi RTT測位ができるようになっています。
が、ここでは、お安く、体験するためESP32-C3開発キットで試してみることにします。
ESP32-S2, S3, C3といくつかシリーズがありますが、こちらも見つつ、(Sigfoxやっていた身としては)低消費電力が好きなので、C3にしました。
あと、本家的には、ESP32-C3-DevKitC-02という開発ボードがあるものの、Micro-USBということのようなので、USB-Cが使えるSeeed Studio XIAO ESP32C3を選択しました。
Arduino IDEの設定
まずは、ESP32系のボードを使った開発をするために、Arduino IDEのPreferencesのAdditional boards manager URLsに下記URLを追加します。
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
ToolメニューのBoard managerを選択し、esp32 by Espressif Systemsをインストールします。
ToolメニューのBoardsにesp32が追加されていますので、その中から、XIAO_ESP32C3を選択します。ちなみに、ESP32-C3-DevKitC-02を購入された場合は、ESP32C3 Dev Moduleを選ぶことになると思います。
これでArduino IDEの設定は完了しました。
次に、2台の開発ボードを繋げます。一方がResponder、もう一方がInitiatorになります。
サンプルコードを動かす
FileメニューのExamplesからWiFi->FTMを選択していくと、FTM_InitiatorとFTM_Responderの2種類のサンプルが見つかりますので、2台用意したそれぞれのボードに対し、InitiatorとResponderのサンプルを書き込みます。
Responderを先に起動し、その後、Initiatorを起動すると、下記のように、想定距離と時間がシリアルモニタで確認できます。
...................
WiFi Connected
Initiating FTM session with Frame Count 16 and Burst Period 200 ms
FTM Estimate: Distance: 36.15 m, Return Time: 241 ns
FTM Estimate: Distance: 36.15 m, Return Time: 241 ns
FTM Estimate: Distance: 32.70 m, Return Time: 218 ns
FTM Estimate: Distance: 34.50 m, Return Time: 230 ns
FTM Estimate: Distance: 34.80 m, Return Time: 232 ns
念のため確かめておきます。
Distance:34.50mの場合、光速を299792458m/s(約30万 km/s)とすると、230nsのReturn Timeの場合、68.95mの往復距離。その半分のDistanceは34.476...m。大体34.5mで合ってますね。
この要領で、複数のResponderとの時間差を求めることで3点測位ができるようになります。
esp-idf
FTM Error: CONF_REJECTED