運転と安全性
Tracelet は生の位置情報と加速度計のストリームを 意味のあるものに変えることができます デバイスが「どのように」動いているかに関するイベント — クラウドを使用せず、完全にデバイス上で 呼び出します。 3.3.0 で追加された、3 つの独立した機能があります。
|特集 |それがあなたに伝えること | | を使用して有効にします。 | で聞きます。 |---|---|---|---| | 運転イベント | 「ドライバーは急ブレーキをかけた / 急加速した / 急ハンドルを切った / スピードを出しました」 |非トランスレート |翻訳1遅い | | トランスポートモード | 「ユーザーは現在、歩いたり、走ったり、自転車に乗ったり、乗り物に乗ったりしています。」 |非トランスレート |翻訳1遅い | | 衝突と落下 | 「衝突(または落下)が起こったばかりかもしれません」 |非トランスレート |翻訳1遅い |
ここでのすべてはデフォルトでオプトインおよびオフになっています。 機能を有効にしない場合は、 そのエンジンはまったく作成されていません。既存の追跡はまったく同じように動作します。 前に。必要なものだけをオンにします。
これは誰のためのものですか? (実際の例)
- 使用量ベースの保険 / 車両の安全 → 運転イベントにより、旅行ごとに提供されます サーバー側を使用しない危険な運転(急ブレーキ、スピード違反)の画像 処理。
- 配達 / フィールドサービス アプリ → 輸送モード により、各旅行にタグを付けることができます 運転 と 徒歩 (例: 「バンを降りてドアまで歩いた」)。
- 単独労働者 / ライドシェア / 個人安全アプリ → 衝突と落下の検出 信頼できるトリガー(ユーザーの「大丈夫です」キャンセルウィンドウ付き)を提供します。 SOSフローを開始します。
任意の組み合わせを有効にすることができます。これらは独立しています。
1. 走行イベント(テレマティクス)
30秒バージョン
// 1. Turn it on (e.g. with a 50 km/h limit for speeding)
await Tracelet.ready(Config(
telematics: TelematicsConfig(
enableDrivingEvents: true,
speedLimitKmh: 50,
),
));
// 2. Listen
Tracelet.onDrivingEvent((event) {
print('${event.kind} — severity ${event.severity}');
});
// 3. Start tracking as usual
await Tracelet.start();それでおしまい。デバイスが移動すると、次のようなイベントが発生します。
harsh_braking — severity 0.82
speeding — severity 0.40各フィールドの意味
すべての DrivingEvent には次の機能があります。
| フィールド | 意味 |
|---|---|
| 非トランスレート | harsh_braking、harsh_acceleration、harsh_cornering、または speeding |
| 非トランスレート | 0.0–1.0 — しきい値をどれだけ超えたか (スコアリングに便利) |
| 非トランスレート | 測定された数値: 過酷なイベントの場合は G 力、スピード違反の場合は 制限を超えるkm/h** |
| 非トランスレート | 現時点の速度 (m/s) |
latitude / longitude / timestamp | どこで、いつ |
しきい値の調整
すべてのしきい値は g (1 g ≈ 9.81 m/s²、重力の引力) 単位です。デフォルト 一般的な保険/車両の慣例に従ってください。変更する必要はほとんどありません。
| オプション | デフォルト | 何をするのか |
|---|---|---|
| 非トランスレート | 翻訳1遅い | これより強くブレーキをかける → harsh_braking |
| 非トランスレート | 翻訳1遅い | これ以上加速→ harsh_acceleration |
| 非トランスレート | 翻訳1遅い | これより難しいコーナー → harsh_cornering |
| 非トランスレート | 0 (オフ) | 制限速度; 0 は速度超過の検出を無効にします。 |
| 非トランスレート | 翻訳1遅い | 制限を超える前に猶予を与えてください |
| 非トランスレート | 翻訳1遅い | この長さは制限を超えている必要があります (短いブリップを避ける) |
| 非トランスレート | 翻訳1遅い | この速度未満のイベント (駐車場の騒音) を無視します。 |
時々イベントがないのはなぜですか? 運転イベントは GPS 速度から派生します。 更新は 1 秒に 1 回程度で、少しうるさいです。 Traletet は意図的に好意を示します 感度よりも精度 — 境界線のイベントを見逃すよりもむしろ見逃してしまいます。 オオカミを叫ぶ。最良の結果を得るには、実際に運転しながら (歩きながらではなく) 使用してください。
2. トランスポートモード
ユーザーが still、walking、running、cycling、または
vehicle、加速度計の動きと GPS 速度を組み合わせたもの。
await Tracelet.ready(Config(
classifier: ClassifierConfig(enableFusedClassifier: true),
));
Tracelet.onModeChange((event) {
print('Now: ${event.mode} (confidence ${event.confidence})');
});| オプション | デフォルト | 何をするのか |
|---|---|---|
| 非トランスレート | 翻訳1遅い | マスタースイッチ |
| 非トランスレート | 翻訳1遅い | true の場合、融合モードはバッテリー決定のための OS のアクティビティをオーバーライドします。 false (デフォルト) の場合、注釈を付けるだけで、OS の値が引き続き使用されます。 |
| 非トランスレート | 翻訳1遅い | 新しいモードは、報告される (ちらつきが停止する) までに、これほど長く存続する必要があります。 |
| 非トランスレート | 翻訳1遅い | この下では、モードは unknown |
アノテーションとオーバーライド: デフォルトでは、分類子は セカンドオピニオン です。
はモードを報告しますが、Tracelet が GPS をサンプリングする方法は変更しません。ほとんどのアプリはこれを必要とします。
特に融合が必要な場合にのみ、fusedClassifierAuthoritative: true を設定します。
結果はバッテリー/サンプリング動作を駆動します。
3. 衝突・落下検知
実稼働対応。 クラッシュ検出には、安定したオンデバイス パイプラインが付属しています。 ルール エンジン (デフォルト)、およびオプションのライセンス付き AI クラッシュ モデル トレーニング済み CC0 / パブリックドメイン クラッシュ データセット上 - したがって、商用利用が許可されています 実稼働アプリで。転倒検出はオプトインおよびベストエフォートのままです。進行中の追跡 問題 #183 の精度調査。
衝突の可能性(移動中の強い衝撃)、またはオプションで衝突を検出します。 個人的な秋。誤報はコストがかかるため、検出は裏付けられています (大きな衝撃だけでは決して十分ではありません)、ユーザーに キャンセルまでのカウントダウンを与えます。
await Tracelet.ready(Config(
impact: ImpactConfig(
enableCrashDetection: true,
confirmWindowMs: 15000, // 15s for the user to say "I'm fine"
),
));
Tracelet.onImpact((event) async {
if (event.isPotential) {
// Show a big "Are you OK?" countdown screen.
// If the user taps "I'm fine":
await Tracelet.cancelImpact(event.id);
// If they tap "Get help now":
// await Tracelet.confirmImpact(event.id);
} else {
// event.kind == 'crash' (or 'fall') — confirmed.
// The user didn't cancel in time → start your SOS flow.
}
});流れの仕組み
- 高速移動中に強い衝撃を受けると、
potential_crashイベントが発生します。 非トランスレート。 - カウントダウン UI を表示します。ユーザーは キャンセル (
cancelImpact) または 今すぐ確認できます (翻訳されていません)。 - 期限までに何もしなかった場合 → 確認された
crashイベントが発生します。
| オプション | デフォルト | 何をするのか |
|---|---|---|
| 非トランスレート | 翻訳1遅い | 車両衝突検知 |
| 非トランスレート | 翻訳1遅い | 個人的な転倒 (ベストエフォート — 誤警報が増加) |
| 非トランスレート | 翻訳1遅い | 衝突としてカウントされる衝撃強度 (g)。大規模な現場データ調査に基づいて 3.0 から引き下げられました (3.0 g は実際の衝突事故の約半分を逃しました)。キャンセルカウントダウンが誤ったアラームを検出するため、リコールが優先されます。プロンプトが多すぎる場合は調整してください。 |
| 非トランスレート | 翻訳1遅い | こんなに速く動いていたに違いない (裏付け) |
| 非トランスレート | 翻訳1遅い | カウントダウンの長さをキャンセル |
| 非トランスレート | 翻訳1遅い | 信頼性の低い候補者を抑制する |
Tracelet は トリガーとキャンセル ウィンドウを提供します。電話をかけることはありません 緊急サービスに電話または連絡します。実際のSOS/緊急フローの構築は、 あなたのアプリの責任(そしてあなたがUXと合法的なコピーを制御することを可能にします)。
確認はアプリが強制終了されても存続します
暴力的な衝撃は、多くの場合、OS によるアプリの強制終了で終わります。つまり、携帯電話が投げられたり、
車両が停止すると、デバイスは Doze 状態になります。キャンセルカウントダウンの場合
メモリ内にのみ存在するため、確認された crash/fall は黙って起動されません。
Tracelet はカウントダウンを プロセスデスセーフ にします。
potential_crash/potential_fall が発生すると、ディスクに永続化され、
ウェイクアップは締め切り直後に備えてあります。アプリがまだ生きている場合は、
正常に確認し、ウェイクアップを解除します。殺されたら目覚める
確認されたイベントを新しいプロセスから再発行するため、SOS フローは引き続き実行されます。
| プラットフォーム | メカニズム |
|---|---|
| アンドロイド | 正確な AlarmManager アラーム (setExactAndAllowWhileIdle、Doze 中でも発生) は、確認されたイベントを再配信する受信機を起動します。 |
| iOS | 期限にスケジュールされたローカル通知は、アプリが停止している間でもユーザーに警告します。確認されたイベントは、次回 SDK を実行するときに (バックグラウンドでの再起動またはフォアグラウンドで) 再配信されます。ユーザー向けアラートに対する通知権限を付与します。再配信はどちらの方法でも機能します。 |
ユーザーがキャンセルすると、永続化された候補が削除され、ウェイクアップが解除されます。 キャンセルされた候補は、再起動後に再確認されることはありません。
実際の衝突や落下を裏付ける追加の手がかり
大きな衝撃だけでは十分ではありません。それは、誤報が多すぎる原因となります。 そのため、Tracelet は、通常は現実世界の出来事の間に起こる追加の現実世界の手がかりを探します。 衝突または落下。手がかりが多ければ多いほど、その確信度は高まります。これらの手がかりは、 Tracelet は さらに 自信を持っていただけます。実際のイベントは決してキャンセルされません。
- 携帯電話が落ちていた — 誰かが携帯電話を落としたり、携帯電話を盗んだりする直前 落下すると、携帯電話は一時的に無重力状態になります。フォールをさらに盛り上げるスポッティング 信じられる。
- その後はすべてが静止していました — 実際に転倒した後、その人と電話は 通常は動きを停止します。その突然の静けさは強い兆候です。
- 車が突然停止した — 実際の衝突では、車両は高速から停止します。 1、2秒でほとんど止まりました。速度の急激な低下は衝突を後押しします。
- 圧力による「ポップ」 — 重大な衝突(またはエアバッグの作動)により、急速な衝撃が発生します。 車内の気圧の変化。圧力センサーを備えた携帯電話では、 これに注目してください。これがない携帯電話ではこのチェックをスキップするだけで、デメリットはありません。
オプション: ライセンス付き AI クラッシュ モデル
デフォルトでは、衝突検出は ルール エンジン (G しきい値 + 速度) を使用します。 上記の裏付け) — 追加のセットアップは不要で、そのまま使用できます。より高い精度を目指して AI クラッシュ モデル を有効にできます。これは、ゲート クラッシュを学習したモデルです。 固定閾値の代わりに学習された確率。
オプトインでオンデマンドでダウンロード (決して埋め込まれない) なので、基本 SDK サイズ は変わっていない。これを有効にするには、ライセンス キーを取得し、設定でそれを指定します。
await Tracelet.ready(Config(
impact: ImpactConfig(
enableCrashDetection: true,
crashModelUnlockUrl: 'https://unlock.ikolvi.com/unlock',
crashModelLicenseKey: '<your license key>',
crashModelThreshold: 0.5074, // rf_probability_threshold from training
),
));| オプション | デフォルト | 何をするのか |
|---|---|---|
| 非トランスレート | 翻訳1遅い | モデルをアクティブ化するライセンス エンドポイント。 null ⇒ 純粋なルールエンジン |
| 非トランスレート | 翻訳1遅い | ライセンス キー ([ライセンスの取得] ページから) |
| 非トランスレート | 翻訳1遅い | モデルがクラッシュのフラグを立てる確率 |
何らかの理由(オフライン、無効なキー)でモデルをアクティブ化できない場合、SDK 自動的にルール エンジンにフォールバックします - アプリは動作し続けます。
ライセンスを取得する
ライセンスの取得 ページからキーを取得します。サインインし、あなたのパスワードを入力します。
アプリケーション ID を入力し、すぐに貼り付けられるキー (または完全な ImpactConfig) をコピーします。
スニペット)。
- 開発ライセンス — デバッグ ビルドとエミュレータ用。アプリ ID だけで、追加のものはありません 設定。
- 製品ライセンス — 出荷されたアプリ用。アプリの署名証明書も必要です
SHA-256 (Play Console → アプリの整合性 → アプリ署名、または
./gradlew signingReport)。
ポータルには、発行されたキーのリストも表示され、キーを即座に取り消すことができます。
運転せずに試してみる(シミュレーション)&データベースアクセス
Tracelet には、テレマティクス イベントと一連の診断 API を保存する専用のデータベース テーブルが含まれています。これらは Tracelet Doctor 診断オーバーレイによって頻繁に使用されますが、物理的に車を運転したり衝突させたりすることなく、アプリ内で直接使用してカスタム診断画面を構築したり、安全フローをテストしたりすることもできます。
データベースからテレマティクスを取得する
すべての運転イベントと衝撃イベントは、ローカル SQLite データベースに自動的に保存されます。これらの構造化された記録を取得して、危険な運転行為の履歴を表示できます。
// Fetch the 50 most recent telematics events from the database
final events = await Tracelet.getTelematicsEvents(50);
for (final event in events) {
print('Event Type: \${event.eventType}'); // e.g. harsh_braking, crash
print('Severity: \${event.severity}');
print('Location: \${event.latitude}, \${event.longitude}');
}イベントのシミュレーション
模擬テレマティクス イベントをネイティブ追跡エンジンに直接挿入できます。これは、アプリの反応 (クラッシュ時に SOS 画面を表示するなど) をテストしたり、UI コンポーネントをテストしたりするのに最適です。サンプル アプリの 運転と安全 ページと Tracelet Doctor オーバーレイは、この API を使用して、開発者がボタン経由でイベントをトリガーできるようにします。
// Simulate a harsh braking event (named arguments)
await Tracelet.simulateTelematicsEvent(
eventType: 'harsh_braking',
severity: 0.85, // 0.0 to 1.0
latitude: 37.422,
longitude: -122.084,
);データベースのクリア
診断状態をリセットする必要がある場合、またはローカル データベースからテレマティクス イベントの履歴をクリアする必要がある場合は、キューをパージできます。
await Tracelet.destroyTelematicsEvents();自動テストでは、Dart から直接エンジンを駆動することもできます (flutter_rust_bridge 経由で公開されます)。example/integration_test/behavior_simulation_test.dart を参照してください。
権限
- 運転イベントには、すでに使用している位置情報の許可のみが必要です 追跡 — 余分なものは何もありません。
- 輸送モード と 衝突/落下 は加速度センサーを使用します。 Android では、 モーション検出のためにすでに実行されています (新しい権限はありません)。 iOS では、 モーションとフィットネス の使用説明により、精度が向上します。を参照してください。 iOS および Android の設定ページ。
知っておいてよかった
- オンデバイス & 確定的 — すべての検出は共有 Rust コアで実行されます。いいえ ネットワーク、クラウド モデルなし、Android と iOS で同じ結果。
- ドライビング イベントは Web でも機能します (GPS から派生したものです)。
- サイドチャネル — これらのイベントは通常のイベントと並行して配信されます
onLocationストリーム;位置情報、走行距離計、同期が変更されることはありません。