驾驶与安全
Tracelet可以将原始位置+加速度计流变成有意义的 关于设备如何移动的事件 - 完全在设备上,没有云 来电。 3.3.0中添加,有三个独立的功能:
| 特色 | 它告诉你什么 | 您可以使用 | 启用它你听 |
|---|---|---|---|
| 驾驶赛事 | “司机猛刹车/猛加速/急转弯/超速” | 不翻译迟到 | 不翻译晚点 |
| 运输方式 | “用户现在正在步行/跑步/骑自行车/乘车” | 不翻译迟到 | 不翻译晚点 |
| 碰撞和跌倒 | “可能刚刚发生了碰撞(或跌倒)” | 不翻译迟到 | 不翻译晚点 |
**这里的所有内容都是默认选择加入和关闭的。**如果您不启用某项功能, 它的引擎甚至从未被创建——您现有的跟踪行为与 前。仅打开您需要的内容。
这是给谁的? (现实世界的例子)
- 基于使用情况的保险/车队安全 → 驾驶事件为您提供每次行程 没有任何服务器端的危险驾驶图片(急刹车、超速) 加工。
- 送货/现场服务应用程序 → 运输模式可让您将每次行程标记为 驾驶 vs 步行(例如“离开货车,走到门口”)。
- 单独工作者/拼车/个人安全应用程序 → 碰撞和跌倒检测 为您提供一个值得信赖的触发器(带有用户“我很好”取消窗口) 启动 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 — 超过阈值多远(方便评分) |
| 不翻译迟到 | 测量的数字:重力(恶劣事件),公里/小时超过限制(超速) |
| 不翻译迟到 | 当前速度,单位:m/s |
| 不传输 0 晚 / 不传输 1 晚 / 不传输 2 晚 | 地点和时间 |
调整阈值
所有阈值均以 g 为单位(1 g ≈ 9.81 m/s²,重力)。默认值 遵循常见的保险/车队惯例 - 您很少需要更改它们:
| 选项 | 默认 | 它有什么作用 |
|---|---|---|
| 不翻译迟到 | 不翻译晚点 | 比这更用力刹车 → harsh_braking |
| 不翻译迟到 | 不翻译晚点 | 加速比这更难 → harsh_acceleration |
| 不翻译迟到 | 不翻译晚点 | 比这个更难的弯道 → harsh_cornering |
| 不翻译迟到 | NOTTrans1LATE(关闭) | 限速; 0 禁用超速检测 |
| 不翻译迟到 | 不翻译晚点 | 在重要之前就超越限制的恩典 |
| 不翻译迟到 | 不翻译晚点 | 必须超过这么长的限制(避免短暂的短暂停留) |
| 不翻译迟到 | 不翻译晚点 | 忽略低于此速度的事件(停车场噪音) |
为什么有时没有事件? 驾驶事件源自 GPS 速度, 大约每秒更新一次,有点吵。 Tracelet故意偏袒 准确度高于灵敏度——它宁愿错过边缘事件,也不愿错过 狼来了。为了获得最佳效果,请在实际驾驶(而不是步行)时使用它。
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})');
});| 选项 | 默认 | 它有什么作用 |
|---|---|---|
| 不翻译迟到 | 不翻译晚点 | 主开关 |
| 不翻译迟到 | 不翻译晚点 | 如果 true,则融合模式会覆盖操作系统的电池决策活动。如果 false(默认),它只是 注释 — 操作系统值仍然负责 |
| 不翻译迟到 | 不翻译晚点 | 新模式必须在报告之前持续这么长时间(停止闪烁) |
| 不翻译迟到 | 不翻译晚点 | 在此之下,模式报告为 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事件 不翻译迟到。 - 显示倒计时用户界面。用户可以取消(
cancelImpact)或立即确认 (未翻译)。 - 如果他们在截止日期之前没有采取任何行动 → 会触发已确认的
crash事件。
| 选项 | 默认 | 它有什么作用 |
|---|---|---|
| 不翻译迟到 | 不翻译晚点 | 车辆碰撞检测 |
| 不翻译迟到 | 不翻译晚点 | 个人跌倒(尽最大努力 - 更多误报) |
| 不翻译迟到 | 不翻译晚点 | 算作碰撞的冲击强度(g)。根据大型现场数据研究,从 3.0 降低(3.0 g 错过了大约一半的真实碰撞事故);有利于召回,因为取消倒计时会捕获误报。如果您看到太多提示,请进行调整。 |
| 不翻译迟到 | 不翻译晚点 | 一定移动得这么快(佐证) |
| 不翻译迟到 | 不翻译晚点 | 取消倒计时长度 |
| 不翻译迟到 | 不翻译晚点 | 打压信心不足的候选人 |
Tracelet 为您提供触发和取消窗口 — 它永远不会拨打电话 致电或联系紧急服务部门。建立实际的 SOS/紧急流程是 您的应用程序的责任(并让您控制用户体验和合法副本)。
应用程序被杀死后确认仍然存在
暴力撞击通常会导致操作系统杀死应用程序——手机被扔掉,
车辆停下来,设备进入瞌睡状态。如果取消倒计时
只存在于记忆中,确认的 crash/fall 不会默默地触发。
Tracelet 使倒计时 进程死亡安全:
potential_crash/potential_fall 被引发,它被持久化到磁盘并且
唤醒是在截止时间之后准备的。如果该应用程序仍然存在
确认正常并解除唤醒;如果它被杀了,就会醒来
从新进程重新发出已确认的事件,以便您的 SOS 流程仍然运行。
| 平台 | 机制 |
|---|---|
| 安卓 | 精确的 AlarmManager 警报(setExactAndAllowWhileIdle,即使在瞌睡状态下也会触发)会唤醒重新传送已确认事件的接收器。 |
| iOS | 即使应用程序已停止运行,在截止日期安排的本地通知也会提醒用户;下次 SDK 运行时(后台重新启动或前台)将重新传递已确认的事件。授予面向用户的警报的通知权限 - 无论哪种方式都可以重新传递。 |
用户取消删除持久化候选者并解除唤醒,因此 取消的候选人在重新启动后永远不会被重新确认。
确认真实碰撞或跌倒的额外线索
仅仅剧烈震动是不够的——这会导致太多的误报。 因此,Tracelet 会寻找额外的真实世界线索,这些线索通常发生在真实的场景中。 碰撞或跌倒。它看到的线索越多,就越确定。这些线索只能 让 Tracelet 更加自信 - 他们永远不会取消真正的活动。
- 手机掉落 - 就在有人掉落手机或拿走手机之前 跌落时,手机会短暂失重。发现让跌倒次数更多的地方 可信的。
- 之后一切都静止了——真正摔倒之后,人和电话 通常停止移动。突然的寂静是一个强烈的信号。
- 汽车突然停下——在真正的碰撞事故中,车辆从快速变为 几乎在一两秒内就停了下来。速度急剧下降会导致事故发生。
- 压力“爆裂” — 严重碰撞(或安全气囊爆炸)会导致快速 车内气压的变化。具有压力传感器的手机可以 注意这一点;没有此功能的手机只需跳过此检查,没有任何缺点。
可选:经过许可的 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
),
));| 选项 | 默认 | 它有什么作用 |
|---|---|---|
| 不翻译迟到 | 不翻译晚点 | 激活模型的许可端点。 null ⇒ 纯规则引擎 |
| 不翻译迟到 | 不翻译晚点 | 您的许可证密钥(来自“获取许可证”页面) |
| 不翻译迟到 | 不翻译晚点 | 模型标记崩溃的概率 |
如果模型因任何原因(离线、密钥无效)无法激活 SDK 自动回退到规则引擎 - 您的应用程序继续运行。
获得许可证
从 获取许可证 页面获取密钥:登录,输入您的
应用程序 ID,并复制准备粘贴的密钥(或完整的 ImpactConfig
片段)。
- 开发许可证 — 用于调试版本和模拟器。只需您的应用 ID,无需额外 设置。
- 产品许可证 — 适用于您发布的应用程序;还需要您的应用程序签名证书
SHA-256(Play 控制台 → 应用程序完整性 → 应用程序签名,或
./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。
权限
- 驾驶活动只需要您已使用的位置权限 跟踪 — 没什么额外的。
- 运输模式和碰撞/跌落使用加速度计。在安卓上是这样的 已运行运动检测(无新权限)。在 iOS 上,添加 运动与健身使用描述提高了准确性。请参阅 iOS 和 Android 设置页面。
很高兴知道
- 设备上和确定性 — 所有检测都在共享 Rust 核心中运行。不 网络,无云模型,Android 和 iOS 上的结果相同。
- 驾驶活动也可在网络上进行(它们源自 GPS)。
- 侧通道 — 这些事件与您的正常情况一起传递
onLocation流;他们永远不会改变您的位置、里程表或同步。