41
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ArduinoAdvent Calendar 2020

Day 25

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

Last updated at Posted at 2020-12-16

###はじめに
最近、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とかです。すすすごい!
DW1000_Channels.png
#インパルス方式
因みに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測位が出来ます)

IMG_5650.JPG

#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 ゴメン…

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

41
17
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?