HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Ultra-Widebandを使用してランナーを追跡するローカルポジショニングシステムを構築する

Building a local positioning system to track runners using Ultra-Wideband (zeus.ugent.be)

98 pointsby robinpdev8 コメント

要約

ベルギーのゲント大学のZeus WPIチームは、毎年恒例のランニングレース「12Urenloop」でランナーの位置を正確に追跡するために、Ultra-Wideband (UWB) 技術を用いたローカルポジショニングシステムを開発しました。このシステムは、既存のBluetoothベースのシステムよりも高精度な位置測定と、より詳細なランナーの統計情報を提供することを目指しています。

全文翻訳

English 12Urenloopは、ゲントのSint-Pieters広場で開催される年次のランニングレースです。参加する学生団体のチームは、可能な限り多くのラップを完了しようと、12時間のリレーレースを走ります。各チームには1つのバトンが割り当てられているため、一度にトラックに入れるランナーは1人だけです。 Zeus WPIは、しばらくの間12Urenloopのラップカウントを行ってきました。最初は、ランナーのビブ番号を手入力する手動カウントシステムで、次に2011年以降はバトン内のBluetoothモジュールに基づいた自動カウントシステムで実施しました。過去のハードウェアとソフトウェアに関する詳細については、2011年のブログ記事をお読みください。2019年から2022年の間、スタック全体がオーバーホールされ、よりモダンなハードウェア、ウェブサイトに表示されるランナーのおおよその位置、および広範な冗長性、耐障害性、監視機能が追加されました。それに関する詳細なブログ記事もあります。 トラック上を移動するチームのロゴと推定位置を示す12urenloop.beのライブトラッキングサイト UWBとは何か? 今年の10月末頃、入手が容易で比較的安価なハードウェアを使用したUltraWideBandハードウェアのオンラインデモをいくつか見ました。UltraWideBandは、送信機/受信機のセンチメートルレベルのローカライゼーションに焦点を当てた無線通信規格です。これは、無線スペクトル(500 MHz)の大部分を使用するため、信号の反射を無視するのに非常に優れているため可能です。これにより、受信したパケットの非常に早い開始時点を識別できます。これをピコ秒レベルの正確なクロックと組み合わせ、パケットが送信された時間と受信された時間を比較すると、送信機と受信機の間の(光速での)伝送時間を計算できます。その時間を光速で掛けると、送信機と受信機の間の距離が得られます。 固定位置にある複数のUWB送信機から移動するUWB送信機(タグ)までの距離を測定できれば、タグの位置を計算できます。これはGPSが使用するのと同じ原理ですが、より小規模です。この技術は、iPhoneやAirTagなどに使用されており、AirTagまでの距離と方向を示します。また、UWB信号は暗号化できるためリレー攻撃に強く、車に近づくとロックが解除される新しい車のキーにも使用されています。 この技術で何が可能になるか? UWBは、いくつかの大きな利点を提供するため、2011年頃から12Urenloopでの使用が検討されていました。正確な位置測定:現在のBluetoothシステムは、回路上の進捗状況を(速度を計算することによって)良好に推定しますが、実際の位置測定はできません。ポジショニングにより、人がスタートラインを横切った正確な瞬間にラップをカウントできます。これは、12Urenloopでは各チームにスタートラインがあるため(各団体のテントに)、ランニングレースで使用される既存のRFIDシステムでは不可能です。個々のランナーに関するより詳細な統計情報:最大/最小速度、コーナリング速度など。多数の観客からのBluetooth信号によるノイズが多いため、よりクリーンな信号が得られます。 自分で構築するものは通常安価です 既製のRTLS(リアルタイムロケーションシステム)ソリューションは、必要なすべてのハードウェアとソフトウェアを備えていますが、学生が主催するレースの予算を超えています(ゲントに拠点を置くPozyxのスターターキットはすでに約5000ユーロです)。近年、UWBモジュールの価格は急落しており、公式にパッケージ化されたQorvoモジュール(Pozyxが使用し、AppleのU1チップと互換性がある)で1モジュールあたり約19〜25ユーロ、統合マイクロコントローラーを備えたアフターマーケットパッケージモジュール(クローン)ではわずか12ユーロです。したがって、12UrenloopでUWBシステムがどれほど実現可能で有用であるかを検討するのに良い時期だと思われました。 詳しく見ると、特にマイクロコントローラーに関しては、複数のタグのポジショニングをサポートするオープンソースソフトウェアはほとんどありません。利用可能なコードのほとんどは、単一のタグを複数のアンカーで追跡することに焦点を当てています。これは、それがはるかに簡単だからです。複数のタグとアンカーがある場合、すべてのUWBモジュールは、送信が許可されるタイミングを調整する必要があります。すべての通信は単一のチャネルで行われるため、何も他のものと衝突しません。モジュール間の同期は、タグあたり毎秒1〜10回の測定レートを達成するために、ミリ秒単位である必要があります。それを念頭に置いて、3つのアンカーを固定位置に配置し、その位置を決定する2つのタグを持つセットアップを構築するために、5つのDWM3000 UWBモジュールを注文しました。UWBモジュールを駆動するために、ESP32-WROOMを選択しました。これは安価(4ユーロ)で、BluetoothとWi-Fiを備えており、すでにクラブルームの地下にありました。コードはArduinoフレームワークで書かれており、他のマイクロコントローラーにも簡単に移植できます。 Wemos D1 Uno(Arduino UnoフォームファクターのESP32-WROOMボード)上の2つのDWM3000デブボードシールド チューニングとテスト UWBモジュールのDW3000チップセットは、SPI経由で制御され、数百のレジスタと約1ダースのコマンドを読み書きします。Qorvo(製造元)は、特定の関数を実装しやすくするためのSDKを提供していますが、これはNRF52やSTM32ファミリーなど、ごく一部のマイクロコントローラーにしか対応しておらず、Espressifチップには対応していません。幸いなことに、Arduinoフレームワークへのドライバーライブラリのポートがあります。 最初の数週間の焦点は、DWM3000 UWBモジュールが12Urenloopでの使用に適しているかどうかを判断することでした。モジュールの範囲は十分か(目標は少なくとも30メートル)、測定された距離は十分に正確か、そして回路上に15個のタグ(ランナーごとに1つ)がある場合、どのくらいの頻度で位置を測定できるかです。無線フレーム構造と送信電力のためにレジスタを大幅にチューニングした後、約50メートルまでの距離を測定することに成功しました。アンカーに大きなアンテナを使用すれば、さらに大幅に改善できる可能性があります。視線が2つのモジュールの間にない場合、または近くに多くの金属がある場合(どちらも無線信号の反射を引き起こします)、範囲は悪化します。 開けた場所での視線距離テストの距離とRSSI値のグラフ。40メートル歩いて、数回方向転換して戻ってくる。 少しキャリブレーションを行った後、5メートル以内で約2センチメートルの許容誤差で2つのモジュール間の距離を測定することに成功しました。より長い距離では、正確さを保つためにモジュールごとに少し追加のキャリブレーションが必要ですが、その後はダブルサイドレンジング方式(両方のUWBモジュールがお互いの距離を測定する)を使用して10センチメートルの許容誤差を維持できます。 これらの初期結果の後、ポジショニングテストを行う時期が来ました。2つのアンカーモジュールをクラブルームの角に配置し、3番目のタグモジュールが各アンカーへの距離測定を交互に行いました。アンカーは、Wi-Fi経由でMQTTを使用して、それらの距離をタグに送信します。三角測量された位置は、Bevyで構築されたダッシュボードによってリアルタイムで視覚化されました。 左は三角測量アプリケーションのライブ出力、右はクラブルームのウェブカメラです。 このシステムを、誰も無線チャネルで互いに干渉することなく、高速で2つのタグで動作させるには、アンカー間の同期が必要です。アンカーは、メッセージを送信するタイミング、および他のアンカーが測定を行うのを待つ必要があるタイミングを知る必要があります。実装では、これはすべてのアンカー間で共有されるクロックを通じて機能します。各アンカーには、間隔内のタイムスロットが割り当てられます。たとえば、1秒の間隔と10ミリ秒のタイムスロットを使用すると、毎秒100回の距離測定が可能です。 アンカー(青)とタグ(赤)の送信ステータス(オンまたはオフ)のオシロスコープトレース。アンカーが2つのタグにレンジング要求を送信しており、割り当てられたタイムスロットごとに順番に処理されているのがわかります。青いパルスのすぐ下に見える赤いパルスは、青いアンカーからの要求に対する赤いタグの応答です。他の赤いパルスは、システム内の他の2つのアンカーへの応答であり、それらもレンジングを送信しています。