Вождение и безопасность
Tracelet может превратить необработанный поток данных о местоположении и акселерометре в значимый поток. события о том, как движется устройство — полностью на устройстве, без облака звонки. В 3.3.0 добавлены три независимые функции:
| Особенность | Что это вам говорит | Вы включаете его с помощью | Вы слушаете |
|---|---|---|---|
| Автомобильные мероприятия | «Водитель резко затормозил/сильно ускорился/резко повернул/превысил скорость» | НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ |
| Транспортный режим | «Пользователь сейчас ходит/бегает/ездит на велосипеде/в транспортном средстве» | НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ |
| Авария и падение | «Возможно, только что произошло столкновение (или падение)» | НОТРАНС0ЛАТЕ | НОТРАНС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 имеет:
| Поле | Значение |
|---|---|
| НОТРАНС0ЛАТЕ | harsh_braking, harsh_acceleration, harsh_cornering или speeding |
| НОТРАНС0ЛАТЕ | 0.0–1.0 — насколько далеко прошло пороговое значение (удобно для оценки) |
| НОТРАНС0ЛАТЕ | Измеренное число: перегрузка для суровых условий, км/ч сверх допустимого для превышения скорости |
| НОТРАНС0ЛАТЕ | Скорость на данный момент, м/с |
latitude / longitude / timestamp | Где и когда |
Настройка порогов
Все пороговые значения указаны в g (1 g ≈ 9,81 м/с², сила тяжести). По умолчанию следуйте общепринятой практике страхования/парка — вам редко придется ее менять:
| Вариант | По умолчанию | Что он делает |
|---|---|---|
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Тормозите сильнее → harsh_braking |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Ускорьтесь сильнее → harsh_acceleration |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Поворот сильнее этого → harsh_cornering |
| НОТРАНС0ЛАТЕ | 0 (выкл.) | Ограничение скорости; 0 отключает обнаружение превышения скорости |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Благодать превыше предела, прежде чем она засчитается |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Должно быть, слишком долго (избегайте коротких всплесков) |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Игнорировать события со скоростью ниже этой скорости (шум парковки) |
Почему иногда нет событий? События вождения рассчитываются на основе данных о скорости 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})');
});| Вариант | По умолчанию | Что он делает |
|---|---|---|
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Главный выключатель |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Если true, объединенный режим отменяет действия ОС при принятии решений об использовании батареи. Если false (по умолчанию), он просто аннотирует — значение ОС остается основным |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Новый режим должен действовать так долго, прежде чем о нем будет сообщено (перестанет мерцать) |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Ниже этот режим отображается как unknown |
Аннотация или переопределение: по умолчанию классификатором является второе мнение.
сообщает о режиме, но не меняет способ выборки данных GPS Tracelet. Большинству приложений этого нужно.
Устанавливайте fusedClassifierAuthoritative: true только в том случае, если вы специально хотите, чтобы
результат для управления поведением батареи/выборки.
3. Обнаружение столкновений и падений
Готовность к производству. Обнаружение сбоев поставляется со стабильным конвейером на устройстве: Обработчик правил по умолчанию, а также дополнительно обученная лицензированная модель сбоев AI. на наборе данных о сбоях CC0 / public-domain, поэтому он разрешен для коммерческого использования. в производственных приложениях. Обнаружение падения по-прежнему остается добровольным и оптимальным. Отслеживать текущие исследование точности в Проблеме № 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сconfirmDeadline. - Показать интерфейс обратного отсчета. Пользователь может отменить (
cancelImpact) или подтвердить сейчас (НЕ ПЕРЕВОДИЛОСЬ). - Если они ничего не сделают до истечения крайнего срока → сработает подтвержденное событие
crash.
| Вариант | По умолчанию | Что он делает |
|---|---|---|
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Обнаружение аварий транспортных средств |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Личное падение (максимальное усилие — больше ложных тревог) |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Сила удара (g) считается столкновением. Снижен с 3,0 на основе большого исследования полевых данных (при 3,0 g пропущено ~половина реальных аварий); способствует отзыву, поскольку обратный отсчет отмены обнаруживает ложные тревоги. Настройтесь, если видите слишком много подсказок. |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Должно быть, двигались так быстро (подтверждение) |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Отменить продолжительность обратного отсчета |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Подавить кандидатов с низким уровнем доверия |
Tracelet предоставляет вам окно запуска и отмены — он никогда не выключает телефон. звонит или связывается со службами экстренной помощи. Создание фактического потока SOS/чрезвычайных ситуаций ответственность вашего приложения (и позволяет вам контролировать UX и легальную копию).
Подтверждение сохраняется после закрытия приложения
Жестокое воздействие часто заканчивается тем, что ОС убивает приложение — телефон выбрасывается,
транспортное средство останавливается, устройство переходит в режим сна. Если обратный отсчет отмены
живет только в памяти, подтвержденный crash/fall никогда не сработает.
Tracelet делает обратный отсчет безопасным: в тот момент, когда
potential_crash/potential_fall поднимается, он сохраняется на диске и
пробуждение запланировано сразу после истечения крайнего срока. Если приложение все еще живо, оно
подтверждает нормально и снимает пробуждение с охраны; если его убили, то пробуждение
повторно генерирует подтвержденное событие из нового процесса, чтобы ваш поток SOS продолжал работать.
| Платформа | Механизм |
|---|---|
| Андроид | Точный сигнал тревоги AlarmManager (setExactAndAllowWhileIdle, срабатывает даже в режиме Doze) пробуждает получателя, который повторно доставляет подтвержденное событие. |
| 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
),
));| Вариант | По умолчанию | Что он делает |
|---|---|---|
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Конечная точка лицензирования, которая активирует модель. null ⇒ чистый механизм правил |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Ваш лицензионный ключ (со страницы «Получить лицензию») |
| НОТРАНС0ЛАТЕ | НОТРАНС1ЛАТЕ | Вероятность, при которой модель зафиксирует сбой |
Если модель не может быть активирована по какой-либо причине (офлайн, неверный ключ), SDK автоматически возвращается к обработчику правил — ваше приложение продолжает работать.
Получить лицензию
Получите ключ на странице Получить лицензию: войдите в систему, введите свой
идентификатор приложения и скопируйте готовый к вставке ключ (или полный ImpactConfig
фрагмент).
- лицензия разработчика — для отладочных сборок и эмуляторов. Просто идентификатор вашего приложения, ничего лишнего настраивать.
- лицензия на продукт — для вашего поставляемого приложения; также нужен сертификат подписи вашего приложения
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 при сбое) или тестирования компонентов пользовательского интерфейса. Страница примера приложения Вождение и безопасность и наложение 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поток; они никогда не меняют ваше местоположение, одометр или синхронизацию.