Skip to content

Team-Q-PIT/bluetooth-tracker

Repository files navigation

Bluetoothデバイス位置追跡システム

複数のBluetoothビーコンを使用して、周囲のBluetoothデバイスの位置をリアルタイムで可視化するシステムです。

システム概要

ビーコン側

  • Raspberry Pi上で動作するPythonプログラム
  • Bluetoothデバイスの検出とRSSI値の取得
  • 10秒間スキャンを実行してRSSIの平均値を計算
  • 2秒ごとに新しいスキャンを実行
  • サーバーへのデータ送信

サーバー側

  • Node.js & TypeScriptで実装
  • 三点測量法によるデバイスの位置推定
  • WebSocketを使用したリアルタイム通信
  • SQLiteデータベースによるデータ保存

ウェブクライアント

  • Vanilla JavaScriptで実装
  • グリッド上にデバイスの位置を表示
  • デバイスの種類ごとに色分け表示
  • ズーム・パン機能

インストール方法

必要条件

  • Raspberry Pi 5(ビーコン用)× 複数台
  • Bluetooth機能が有効なLinuxサーバー(または開発用PC)

ビーコン側のセットアップ

  1. 依存パッケージのインストール:

    pip install bleak pyyaml aiohttp
    
  2. 設定ファイルのカスタマイズ:

    # config.yaml(各ビーコンごとに設定)
    beacon_id: "beacon-01"  # ビーコンの固有ID
    zone: "building-A"      # 設置ゾーン
    x: 10                   # X座標(メートル)
    y: 20                   # Y座標(メートル)
  3. ビーコンプログラムの実行:

    python beacon.py --config config.yaml --server http://server-ip:3000/api/beacons/data
    

サーバー側のセットアップ

  1. 依存パッケージのインストール:

    npm install
    
  2. TypeScriptのコンパイル:

    npm run build
    
  3. サーバーの起動:

    npm start
    

    開発モードで起動する場合:

    npm run dev
    

使用方法

  1. ビーコンを配置する場所を決め、各ビーコンの座標を設定ファイルに記録します(1メートル単位)
  2. 各ビーコンでスクリプトを実行し、サーバーのIPアドレスを指定します
  3. サーバーを起動します
  4. ウェブブラウザで http://server-ip:3000 にアクセスすると、デバイスの位置がリアルタイムで表示されます

技術的な詳細

位置推定アルゴリズム

このシステムでは、複数のビーコンから収集したRSSI(受信信号強度)データを使用して三点測量法によりデバイスの位置を推定します。

  1. RSSI値を距離に変換:

    距離 = 10 ^ ((送信出力 - RSSI) / (10 * 環境係数))
    

    ここで、送信出力は一般的に-59dBm(1m距離での理論値)、環境係数は2.0〜4.0の間(オープンスペースで2.0、壁などの障害物がある場合は高い値)を使用します。

  2. 最小二乗法による位置推定: 複数のビーコンからの距離情報を基に、最小二乗法を用いてデバイスの最も確からしい位置を計算します。

  3. デバイスが3箇所未満のビーコンで検出された場合は、最も強いRSSI値を持つビーコンの位置を採用します。

RSSIの不安定性への対応

BluetoothのRSSI値は、以下の要因により不安定になりがちです:

  • 人や物による信号の遮断
  • マルチパス効果(反射波による干渉)
  • デバイス自体の特性

これに対応するため、本システムでは以下の工夫を実装しています:

  • 10秒間の連続スキャンによるRSSI値の平均化
  • 高频度のスキャン更新(2秒おき)
  • 位置推定結果の丸め処理
  • 複数ビーコンからのデータ統合

プロジェクトの構成

bluetooth_tracker/
├── beacon.py          # ビーコン側のスクリプト
├── config.yaml        # ビーコン設定ファイル
├── package.json       # サーバー側の依存関係
├── tsconfig.json      # TypeScript設定
├── shell.nix          # Nix環境設定
├── src/               # サーバーソースコード
│   ├── server.ts      # サーバーメイン
│   ├── controllers/   # コントローラー
│   ├── models/        # データモデル
│   └── utils/         # ユーティリティ
├── public/            # Webクライアント
│   ├── index.html     # メインUI
│   └── ...
└── data/              # データベースファイル

注意点

  • ビーコンは少なくとも3台以上設置することで、精度の高い位置推定が可能になります
  • 理想的には、三角形を形成するようにビーコンを配置してください
  • 障害物が少ない環境で使用すると精度が向上します
  • RSSIは環境によって大きく変動するため、実際の位置と誤差が生じる場合があります

トラブルシューティング

ビーコン側の問題

  1. Bluetoothスキャンが失敗する場合:

    sudo systemctl restart bluetooth
    
  2. 権限エラーが発生する場合:

    sudo setcap 'cap_net_raw,cap_net_admin+eip' `which python3`
    

サーバー側の問題

  1. データベースのアクセス権限エラー:

    chown <ユーザー名> data/bluetooth_tracker.db
    chmod 644 data/bluetooth_tracker.db
    
  2. ポート3000が使用中の場合:

    export PORT=3001  # 別のポートを指定してから起動
    npm start
    

将来の拡張

  • ビーコン間の自動同期機能
  • 機械学習による位置推定精度の向上
  • デバイスの移動履歴の追跡と表示
  • カスタムフロアマップのサポート
  • デバイス種別の自動判別機能の強化

ライセンス

MITライセンス

About

Bluetooth ディスカバリを用いたデバイスの位置追跡システム

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published