高度な地理位置情報
Tracelet は単なるバックグラウンド位置ラッパーではありません。これには、GPS ジッター、トンネル停電、高速でのバッテリー消耗など、モバイル地理位置情報における最も困難な問題に対処するために特別に設計された一連の高度なアルゴリズムが含まれています。
1. カルマンフィルター (軌道平滑化)
生の GPS データには本質的にノイズが含まれています。ユーザーが直線の道を歩いている場合、生の座標はランダムに左右にジャンプし、「ギザギザ」の線が作成されます。このギザギザの線の距離を計算すると、ユーザーの合計距離が人為的に最大 20% 膨張します。
仕組み
useKalmanFilter: true を設定することにより、Tracelet は、もともと宇宙船ナビゲーション用に開発された高度な数学的アルゴリズムを適用します。現在の GPS 位置とデバイスの速度 (速度と進行方向) を融合して、ユーザーが実際にどこにいるかを 予測し、効果的にノイズを取り除き、完璧な曲線を生成します。
final config = Config.highAccuracy(
geo: tl.GeoConfig(
filter: tl.LocationFilter(
useKalmanFilter: true, // Enable trajectory smoothing
trackingAccuracyThreshold: 50,
),
),
);2. 推測航法 (トンネルと GPS は拒否)
ユーザーが長いトンネルや地下駐車場に車で進入すると、GPS 衛星への接続が失われます。従来のトラッカーは、実際の地下ルートをスキップして、トンネルの入り口から出口まで単純に直線を描きます。
仕組み
enableDeadReckoning: true を設定すると、Tracelet は GPS が失われたことを検出し、デバイスの内部 IMU (慣性測定ユニット) に即座にシームレスに切り替えます。加速度計とジャイロスコープを使用して、最後に知られた速度に基づいてユーザーの軌道を計算し続け、完全に地下にいるときでも GPS 更新をシミュレートします。
final config = Config.balanced(
geo: tl.GeoConfig(
enableDeadReckoning: true,
deadReckoningActivationDelay: 10, // Wait 10 seconds of no GPS before activating
deadReckoningMaxDuration: 300, // Stop dead reckoning after 5 minutes to prevent drift
),
);3. 弾力性(高速化の最適化)
distanceFilter が 20 メートルに設定されている場合、Tracelet は 20 メートルごとに起動します。ユーザーが直線の高速道路を時速 120 km で運転している場合、1 秒未満で 20 メートルを走行します。これにより、データベースが完全に直線状に何百もの無駄なポイントで溢れかえり、バッテリーが消耗します。
仕組み
Tracelet の Elasticity Engine は高速を検出し、距離フィルターを動的に ストレッチします。 20 メートルのフィルターは、高速道路では自動的に 200 メートルに引き伸ばされ、ユーザーがランプから街に入るときに 20 メートルに縮小される可能性があります。
final config = Config.balanced(
geo: tl.GeoConfig(
disableElasticity: false, // Ensure elasticity is on
elasticityMultiplier: 2.0, // Make the dynamic stretching 2x more aggressive
),
);4. アダプティブモード(バッテリー節約)
従業員の携帯電話のバッテリーが切れそうになった場合、優先すべきは高周波の 5 メートル追跡ではありません。シフトが終了するまで電話が確実に存続するようにする必要があります。
仕組み
enableAdaptiveMode: true を設定すると、Tracelet はオペレーティング システムのバッテリー API を常に監視します。バッテリーが重要なしきい値 (例: 20%、10%) を下回ると、Tracelet は自動的に desiredAccuracy を GPS から Wi-Fi/Cellular にダウングレードし、distanceFilter を拡張して、電話機の動作を維持するのに十分な電力を確保します。
final config = Config.balanced(
geo: tl.GeoConfig(
enableAdaptiveMode: true,
),
);5. まばらなアップデート (携帯電話タワーのみ)
場合によっては、ターンバイターンごとのナビゲーションの精度が必要ない場合もあります。ユーザーがどの都市または近隣にいるのかを大まかに知る必要があるだけです (ソーシャル ネットワーキング アプリや天気予報アプリなど)。
仕組み
enableSparseUpdates を有効にすることで、Tracelet は電力を大量に消費する GPS チップを完全にバイパスします。携帯電話基地局ハンドオフと Wi-Fi 三角測量のみを使用して位置を更新します。バッテリーの消耗がほぼゼロになります。
final config = Config.lowPower(
geo: tl.GeoConfig(
enableSparseUpdates: true,
sparseDistanceThreshold: 500.0, // Only trigger if they move 500m
sparseMaxIdleSeconds: 3600, // Or trigger once an hour even if they haven't moved
),
);6. ライブプロバイダーオプション (ランタイムオーバーライド)
アプリは、SDK が認識できないことを認識していることがあります。配達ドライバーが 30 分の休憩をとったばかりであること、乗客が会場内で待機していること、独自の静止ヒューリスティックが起動されたことなどです。あなたは GPS の使用を「今すぐ」やめて、状況が変化した瞬間に完全な精度に戻したいと考えています。
今までは setConfig() のみのノブでした。ただし、desiredAccuracy と distanceFilter は追跡関連のキーであるため、設定を通じてこれらを変更すると 新しい値が保持され、完全なパイプラインの再起動が実行されます。永続的な設定としては正しいですが、回避可能な追跡ギャップが作成され、一時的な電源ポリシーを適用するためだけにプロセッサの状態が再構築されます。さらに悪いことに、変更は永続化されるため、「低電力」フェーズ中にアプリが強制終了されて再起動されると、精度が低下した状態で永続的に追跡が再開されてしまいます。
仕組み
Tracelet.updateLocationProviderOptions() は、実行中の OS 位置プロバイダーを適切に更新します。stop()、start()、修正ストリームのギャップはありません。
- iOS は、新しい値をライブ
CLLocationManagerに直接割り当てます (desiredAccuracy/distanceFilterは、アクティブなマネージャー上で変更可能です)。 - Android は、新しい
LocationRequestを使用して既存の融合プロバイダー コールバックを再サブスクライブします。同じコールバックを再登録すると、そのリクエストが適切に「置き換え」られるため、サブスクリプションがドロップされることはありません。 - Web にはライブ プロバイダー コントロールがなく、常に
falseを返します。
オーバーライドは意図的に一時的かつプロバイダーのみになっています。
- 永続化された
ConfigとTracelet.activeConfigは決して操作されません。ストレージには何も書き込まれないため、プロセスの再起動は常に実際の構成に戻ります。 - Rust の受け入れポイント フィルターとプロセッサの状態は変更されません。トラックの継続性、走行距離計、およびどの配信ポイントが受け入れられるかはすべて、設定どおりに正確に動作し続けます。
stop()を呼び出すと、オーバーライドが自動的にクリアされます。
// Device confirmed stationary — drop Core Location to ~100m accuracy
// and only deliver a fix every 25 meters:
await Tracelet.updateLocationProviderOptions(
desiredAccuracy: DesiredAccuracy.medium,
distanceFilter: 25,
);
// Movement detected — restore the configured provider options.
// No arguments = clear the override:
await Tracelet.updateLocationProviderOptions();戻り値と検証
この呼び出しは、ライブ アップデートが適用された場合は true を返し、適用できなかった場合は false を返します。フォールバックとしてパイプラインが再起動されることはありません。
| 状況 | 結果 |
|---|---|
| 継続的な追跡がアクティブ (iOS / Android) | true — オプションはライブで適用されます。 |
追跡が開始されていないか、stop() が呼び出されました。翻訳1遅れ | |
| 定期追跡モードがアクティブ | false — 定期的な修正は独自の取得を管理します。 |
| ウェブ | false — ライブプロバイダーの更新はありません |
distanceFilter は有限で非負でなければなりません (それ以外の場合は RangeError がスローされます)。 0 の値は、プロバイダーが生成するすべての修正を要求します (iOS では kCLDistanceFilterNone)。
ランタイム オーバーライドとアダプティブ モード — enableAdaptiveMode (セクション 4) はこれの 自動 バージョンです。SDK がバッテリーを監視し、自動的にダウングレードします。 updateLocationProviderOptions() は、ポリシーが自分のもの (静止検出、シフト休憩、ジオフェンス滞留、カスタム バッテリーしきい値) であり、何も保持したりトラックを中断したりすることなく即座に適用する必要がある場合に使用します。