ESP32-C3開発キットで、ぼっちFTM

# 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**で求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/a06cd3b6-49fc-39b4-fd2f-ab0384e5800b.png)

# FTMをESP32-C3開発キットで体験
このFTMですが、AndroidではAndroid 9 Pieから実装されており、Google Nest Wi-FiとGoogle Pixelの組み合わせでWi-Fi RTT測位ができるようになっています。
が、ここでは、お安く、体験するためESP32-C3開発キットで試してみることにします。

:::note info
ESP32-S2, S3, C3といくつかシリーズがありますが、[こちら](https://lang-ship.com/blog/work/esp32-2022-01/)も見つつ、(Sigfoxやっていた身としては）低消費電力が好きなので、C3にしました。
あと、本家的には、[ESP32-C3-DevKitC-02](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitc-02.html)という開発ボードがあるものの、Micro-USBということのようなので、USB-Cが使える[Seeed Studio XIAO ESP32C3](https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/)を選択しました。
:::

## 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
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/f7344d04-aceb-5a05-c0e7-0254232e0bb9.png)

Toolメニューの**Board manager**を選択し、**esp32 by Espressif Systems**をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/7c40431b-b213-c118-5a39-3a515837eb7f.png)

ToolメニューのBoardsにesp32が追加されていますので、その中から、**XIAO_ESP32C3**を選択します。ちなみに、ESP32-C3-DevKitC-02を購入された場合は、ESP32C3 Dev Moduleを選ぶことになると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/417d34ba-5821-b99e-eda3-52b32e150559.png)

これでArduino IDEの設定は完了しました。
次に、2台の開発ボードを繋げます。一方がResponder、もう一方がInitiatorになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/21a896cd-b49e-65cc-7657-ee98f628de21.png)

## サンプルコードを動かす
FileメニューのExamplesからWiFi->FTMを選択していくと、FTM_InitiatorとFTM_Responderの2種類のサンプルが見つかりますので、2台用意したそれぞれのボードに対し、InitiatorとResponderのサンプルを書き込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/38d61127-2e97-7025-c777-a8786c07f158.png)

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点測位ができるようになります。
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/d6ad10bc-75ba-8124-14d4-f144657c6473.png)](https://twitter.com/ghibi)

[esp-idf](https://github.com/espressif/esp-idf/blob/master/examples/wifi/ftm/main/ftm_main.c)
FTM Error: CONF_REJECTED