UWBモジュールとESP32を使って高精度な3D測位をする


はじめに

最近、iPhone11などスマートフォンにUWBの無線機能が搭載された!とのこと
今後、タグ決済クルマのキーなど、生活の様々な場所で利用が広がるらしいです
https://xtech.nikkei.com/atcl/nxt/column/18/01267/00062/
※つい最近AirTagが発表されましたね!追記(2021/4/28)
https://xtech.nikkei.com/atcl/nxt/column/18/00141/042600123/?n_cid=nbpnxt_mled_dm

それを受けて今回はインパルス方式のUWBモジュール(DWS1000 Arduino Shield)を購入して試しに高精度な3D測位を検討してみます!
DW1000のスペックを見ると周波数3.5GHz~6.5GHz、帯域1GHzとかです。すすすごい!

インパルス方式

因みにUWBにも色々通信方式があるのですが今回のヤツはPULSE-POSITION-MODULATIONみたいです。パルスの位置で1/0を送るようです。インパルスなので超広帯域なのですね。こんな面白い方式だとは知りませんでした。

レシピ

DWS1000 Arduino Shield

UWB通信モジュールにArduinoシールドの変換基板が付いたものです(立派ですね)
DCDCコンバータが搭載されているので、USBなどの5V電源からUWBモジュールに3.3Vを供給できます。
電源が不安定でモジュールが動かない!なんて事例もあるようなので、これは結構有難いです。

特徴

シングルチップ、IEEE802.15.4-2011 UWB準拠、超広帯域技術に基づくワイヤレストランシーバー
リアルタイムロケーションシステム(RTLS)で、最大5m / sで移動しているときでも、屋内で10cmの精度でオブジェクトの位置を特定できます。
ワイヤレスセンサーネットワーク(WSN)で、最大6.8Mb / sの高データレート通信を可能にします。
コヒーレント受信機技術のおかげで最大290mの優れた通信範囲。
短いパケット期間は、半径20mで最大11,000の高いタグ密度をサポートします
マルチパスフェージングに対する耐性が高く高フェージング環境での信頼性の高い通信を可能にします。
消費電力が少ないため、モードによってはバッテリーからの長時間動作が可能
(スペック見るだけでなんかワクワクしますね!)

ESP-WROOM-32

ESP32に変換基板が付いたものです。今回はWiFi/Bluetoothとかは使いませんが、将来何かの役に立つかも・・

DWS1000 Arduino ShieldとESP-WROOM-32を接続したもの

これを2台作って片方をTAG、もう片方をAnchorとしてプログラムを書き込みます
(さらにTAGを2台追加すれば3D測位が出来ます)

Arduinoライブラリ

https://github.com/thotro/arduino-dw1000/tree/master/
今回の3D測位ではANCHORとTAGの距離が分かれば良いので
ライブラリの中のDEMOサンプルDW1000Ranging_ANCHORとDW1000Ranging_TAGを使えばよいです

色々調べてみるとESP32でモジュールを動作させるには以下の変更が必要のようです

ライブラリ(arduino-dw1000-masterフォルダ)で以下の3つのファイルをESP32対応に編集します
DW1000Ranging_ANCHOR.ino
DW1000Ranging_TAG.ino
DW1000.cpp

ボードのピン設定をESP32用に変更します

// connection pins
const uint8_t PIN_SCK = 18;
const uint8_t PIN_MOSI = 23;
const uint8_t PIN_MISO = 19;
const uint8_t PIN_SS = 2;
const uint8_t PIN_RST = 15;
const uint8_t PIN_IRQ = 17;
DW1000.cppファイル(176行目)をESP32用に変更します
#ifndef ESP8266 
//↓変更
#ifndef ESP32

構想としては下図のような3D測位の実験をする予定です

UWBモジュール+ESP32でANCHOR(アンカー)3台とTAG(タグ)1台を作って3点測位する

TAGの位置座標を求める計算

GPSの位置測位と似た感じで
以下の計算でいけると思います(某大学1年生に頼んで解いてもらいました)

TAGの座標:$(x,y,z) > 0$
ANCHOR0の座標:$(0,0,0)$
ANCHOR1の座標:$(x_{1},0,0)$
ANCHOR2の座標:$(x_{2},y_{2},z_{2})$

ANCHOR0からTAGまでの距離:$R_{0}$
ANCHOR1からTAGまでの距離:$R_{1}$
ANCHOR2からTAGまでの距離:$R_{2}$

$x = \frac{(x_{1}^2 + R_{0}^2 - R_{1}^2)}{2*x_{1}}$
$c = ( \frac{x_{2}^2 + y_{2}^2 + z_{2}^2 + R_{0}^2 - R_{2}^2}{2} - x_{2}*x)/z_{2}$

$p = -y_{2}/z_{2}$
$q = c^2 + x^2 - R_{0}^2$
$y = -p + \sqrt{(p^2 * c^2 - (1+p^2)*q)}$
$z = \sqrt{(R_{0}^2 - x^2 - y^2)}$

まとめ

購入したUWBモジュールで3D測位をやってみようと考え
モジュールとESP32を接続するときの変更点などを調べてみました
さらに3D測位の計算方法について簡単な検討をしてみました
すみませんが今回はここまでです(m´・ω・`)m ゴメン…


夢の3D測位!(Processingでシミュレーション)