Skip to Content
Conceptos básicosConducción y seguridad

Conducción y seguridad

Tracelet puede convertir la ubicación sin procesar + el flujo del acelerómetro en significativo eventos sobre cómo se mueve un dispositivo, completamente en el dispositivo, sin nube llamadas. Agregadas en 3.3.0, hay tres características independientes:

CaracterísticaLo que te diceLo habilitas conEscuchas con
Eventos de conducción”El conductor frenó fuerte / aceleró fuerte / tomó una curva cerrada / está acelerando”TelematicsConfigTracelet.onDrivingEvent
Modo de transporte”El usuario ahora camina / corre / anda en bicicleta / en un vehículo”ClassifierConfigTracelet.onModeChange
Choque y caída”Es posible que haya ocurrido un choque (o una caída)“ImpactConfigTracelet.onImpact

Aquí todo se activa y desactiva de forma predeterminada. Si no habilitas una función, su motor ni siquiera se crea: su seguimiento existente se comporta exactamente como antes. Enciende sólo lo que necesitas.


¿Para quién es esto? (ejemplos del mundo real)

  • Seguro basado en el uso/seguridad de la flotaeventos de conducción te dan un valor por viaje imagen de conducción arriesgada (frenadas bruscas, exceso de velocidad) sin ningún tipo de servidor tratamiento.
  • Aplicaciones de entrega/servicio de campomodo de transporte te permite etiquetar cada viaje como conducir versus caminar (por ejemplo, “dejó la camioneta y caminó hacia la puerta”).
  • Aplicaciones para trabajadores solitarios/viajes compartidos/seguridad personaldetección de accidentes y caídas le brinda un disparador confiable (con una ventana de cancelación del usuario “Estoy bien”) para iniciar un flujo SOS.

Puedes habilitar cualquier combinación: son independientes.


1. Eventos de conducción (telemática)

La versión de 30 segundos

// 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();

Eso es todo. A medida que el dispositivo se mueva, obtendrás eventos como:

harsh_braking — severity 0.82 speeding — severity 0.40

Qué significa cada campo

Cada DrivingEvent tiene:

CampoSignificado
kindharsh_braking, harsh_acceleration, harsh_cornering o speeding
severity0.01.0: qué tan lejos estaba del umbral (útil para calificar)
valueEl número medido: fuerza g para eventos difíciles, km/h por encima del límite para exceso de velocidad
speedVelocidad actual, en m/s
latitude / longitude / timestampDónde y cuándo

Ajustando los umbrales

Todos los umbrales están en g (1 g ≈ 9,81 m/s², la fuerza de gravedad). Los valores predeterminados Siga las prácticas comunes de seguros/flotas; rara vez será necesario cambiarlas:

OpciónPredeterminadoQué hace
harshBrakingG0.40Frene más fuerte que esto → harsh_braking
harshAccelerationG0.35Acelera más fuerte que esto → harsh_acceleration
harshCorneringG0.40Esquina más dura que esta → harsh_cornering
speedLimitKmh0 (desactivado)Límite de velocidad; 0 desactiva la detección de exceso de velocidad
speedingToleranceKmh5Gracia sobre el límite antes de que cuente
speedingMinDurationMs3000Debe estar por encima del límite durante este tiempo (evita breves interrupciones)
minSpeedForEventsKmh5Ignorar eventos por debajo de esta velocidad (ruido de estacionamiento)

¿Por qué a veces no hay eventos? Los eventos de conducción se derivan de la velocidad del GPS, que Se actualiza aproximadamente una vez por segundo y es un poco ruidoso. Tracelet favorece deliberadamente precisión sobre sensibilidad: preferiría perderse un evento límite que llora lobo. Para obtener mejores resultados, utilícelo mientras conduce (no mientras camina).


2. Modo de transporte

Le indica si el usuario es still, walking, running, cycling o está en un vehicle, combinando el movimiento del acelerómetro con la velocidad del GPS.

await Tracelet.ready(Config( classifier: ClassifierConfig(enableFusedClassifier: true), )); Tracelet.onModeChange((event) { print('Now: ${event.mode} (confidence ${event.confidence})'); });
OpciónPredeterminadoQué hace
enableFusedClassifierfalseInterruptor maestro
fusedClassifierAuthoritativefalseSi true, el modo fusionado anula la actividad del sistema operativo para las decisiones sobre la batería. Si false (predeterminado), simplemente anota: el valor del sistema operativo permanece a cargo
modeSwitchDwellMs8000Un nuevo modo debe persistir durante tanto tiempo antes de que se informe (deja de parpadear)
minModeConfidence0.6Debajo de esto, el modo se informa como unknown
autoTuneFromTransportModefalseSi true, un modo comprometido también resintoniza los filtros de ubicación. Ver abajo

Anotar versus anular: de forma predeterminada, el clasificador es una segunda opinión: informa un modo pero no cambia la forma en que Tracelet muestrea el GPS. La mayoría de las aplicaciones quieren esto. Sólo configure fusedClassifierAuthoritative: true si desea específicamente que se fusione resultado para impulsar el comportamiento de la batería/muestreo.

Ajuste automático de los filtros de ubicación

Nuevo en 3.8.0.

El seguimiento con precisión de distancia necesita diferentes umbrales de filtro para diferentes actividades. Caminar es el caso difícil: a ~1,4 m/s el ruido de fondo del GPS es grande fracción de lo lejos que realmente se movió, por lo que un filtro flojo registra la inquietud como distancia. En el coche ocurre lo contrario: los umbrales estrechos desperdician bienes reales. movimiento.

No puedes elegir una configuración por adelantado. Tus usuarios no declaran “ahora estoy corriendo”, y una sola sesión contiene habitualmente una caminata hasta el comienzo del sendero, una carrera y una volver andando. Entonces dejemos que el clasificador decida:

await Tracelet.ready(Config( classifier: ClassifierConfig( enableFusedClassifier: true, // required autoTuneFromTransportMode: true, ), ));

Cuando un modo se confirma, Tracelet intercambia cuatro umbrales por valores adecuados para él:

ModadistanceFiltertrackingAccuracyThresholdodometerAccuracyThresholdmaxImpliedSpeed
still25 metros15 metros10 metros3 m/s
walking8 metros15 metros10 metros4 m/s
running12 metros25 metros15 metros9 m/s
cycling20 metros30 metros20 metros20 m/s
vehicle30 metros50 metros30 metros60 m/s
unknownsus valores configurados se restauran

El jogging no tiene ningún remo a propósito: cae dentro de la banda running (6–20 km/h), que es exactamente por qué un “preajuste de jogging” orientado al usuario habría sido ficción.

Cómo se mantiene predecible:

  • La resintonización ocurre solo en un cambio de modo comprometido (ya está controlado por la confianza) y rebotado por modeSwitchDwellMs: nunca por lectura del sensor, por lo que los umbrales no puedo charlar.
  • Los umbrales se intercambian en su lugar. Su odómetro se mantiene continuo a través de un cambio de modo en lugar de perder un segmento.
  • Los valores aplicados llegan al evento onModeChange y al registro de depuración, por lo que un autotune nunca es silencioso.
  • unknown restaura lo que haya configurado. Tracelet no adivina cuando no lo sabe.
  • Desactivar autoTuneFromTransportMode (o enableFusedClassifier) desactivado en El tiempo de ejecución restaura los umbrales configurados inmediatamente; la característica nunca deja atrás sus efectos una vez que lo apagas.

Ver lo que se aplicó

ModeChangeEvent.appliedTuning lleva los cuatro umbrales que se establecieron fuerza. Es null cuando el autotuning está desactivado y cuando el modo es unknown (que restaura sus propios valores):

Tracelet.onModeChange((event) { final tuning = event.appliedTuning; if (tuning == null) { print('${event.mode} — your configured thresholds are in force'); } else { print('${event.mode} → distanceFilter ${tuning.distanceFilter} m, ' 'odometerAccuracyThreshold ${tuning.odometerAccuracyThreshold} m'); } });

Los mismos valores aparecen en el registro con debug: true y logLevel: verbose:

auto-tune: 'walking' → distanceFilter=8.0m trackingAccuracy=15m odometerAccuracy=10m maxImpliedSpeed=4m/s

Leyendo lo que está vigente ahora mismo

onModeChange le informa sobre el momento en que se confirma un modo. Para preguntar cuál es el los filtros se utilizan en cualquier momento, incluso cuando no se ha producido ningún cambio de modo durante horas - use Tracelet.getCurrentLocationTuning():

final tuning = await Tracelet.getCurrentLocationTuning(); print('in force: distanceFilter ${tuning?.distanceFilter} m, ' 'trackingAccuracyThreshold ${tuning?.trackingAccuracyThreshold} m');

Esto se lee desde el procesador de ubicación nativo, no desde la configuración que usted colocar. Esa distinción importa: Tracelet.activeConfig es un espejo del lado Dart de el último Config que ingresaste, por lo que informa lo que solicitaste, no lo que El filtro está realmente usando, y no puede mostrarle ningún ajuste automático, porque un ajuste automático cambia los umbrales sin ninguna llamada de configuración.

Devuelve null antes de que una sesión de seguimiento haya creado un procesador, y siempre null en Web, que no tiene un estado de filtro equivalente.

Esto anula los valores geo.distanceFilter y geo.filter.* que establezca, mientras un modo esté comprometido. Ese es el objetivo de la característica, pero no significa que sus umbrales configurados no son los que están vigentes en tiempo de ejecución: llame getCurrentLocationTuning() para ver qué es realmente. Déjalo false (el predeterminado) si necesita que se respeten sus valores exactos.


3. Detección de accidentes y caídas

Listo para producción. La detección de fallos se entrega con una canalización estable en el dispositivo: motor de reglas de forma predeterminada, además de un modelo de choque de IA con licencia opcional entrenado en un conjunto de datos de fallos CC0/dominio público, por lo que está autorizado para uso comercial en aplicaciones de producción. La detección de caídas sigue siendo voluntaria y de mejor esfuerzo. Seguimiento en curso investigación de precisión en el Nº 183 .

Detecta un posible choque (un impacto fuerte mientras se mueve) u, opcionalmente, un caída personal. Debido a que las falsas alarmas son costosas, la detección está corroborada (una gran sacudida por sí sola nunca es suficiente) y le da al usuario una cuenta regresiva para cancelar.

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. } });

Cómo funciona el flujo

  1. Un impacto fuerte mientras te mueves rápido → obtienes un evento potential_crash con a confirmDeadline.
  2. Muestra una interfaz de usuario de cuenta regresiva. El usuario puede cancelar (cancelImpact) o confirmar ahora (NO TRADUCIDO).
  3. Si no hacen nada antes de la fecha límite → se activa un evento crash confirmado.
OpciónPredeterminadoQué hace
enableCrashDetectionfalseDetección de accidentes de vehículos
enableFallDetectionfalseCaída personal (mejor esfuerzo – más falsas alarmas)
crashGThreshold2.0Fuerza de impacto (g) para contar como choque. Reducido de 3,0 según un gran estudio de datos de campo (3,0 g omitieron ~ la mitad de los accidentes reales); favorece la recuperación ya que la cuenta regresiva de cancelación detecta falsas alarmas. Sintonice si ve demasiadas indicaciones.
crashMinSpeedKmh25Debe haber estado moviéndose así de rápido (corroboración)
confirmWindowMs15000Cancelar duración de la cuenta regresiva
minImpactConfidence0.6Reprimir a los candidatos de baja confianza

Tracelet te proporciona el activador y la ventana de cancelación: nunca genera teléfono Llama o contacta a los servicios de emergencia. Construir el flujo SOS/emergencia real es responsabilidad de su aplicación (y le permite controlar la UX y la copia legal).

La confirmación sobrevive a la eliminación de la aplicación.

Un impacto violento a menudo termina con el sistema operativo matando la aplicación: el teléfono sale disparado, el vehículo se detiene, el dispositivo entra en modo Dormir. Si la cuenta regresiva de cancelación vivía sólo en la memoria, el crash/fall confirmado silenciosamente nunca se dispararía. Tracelet hace que la cuenta atrás muerte del proceso sea segura: en el instante en que potential_crash/potential_fall se genera, se persiste en el disco y se El despertador está armado para justo después de la fecha límite. Si la aplicación todavía está activa, confirma normalmente y desarma el despertador; si fue asesinado, el despertar reemite el evento confirmado desde un proceso nuevo para que su flujo SOS aún se ejecute.

PlataformaMecanismo
AndroidUna alarma AlarmManager exacta (setExactAndAllowWhileIdle, se dispara incluso en Doze) despierta un receptor que vuelve a enviar el evento confirmado.
iOSUna notificación local programada en la fecha límite alerta al usuario incluso cuando la aplicación está inactiva; el evento confirmado se vuelve a entregar la próxima vez que se ejecute el SDK (reinicio en segundo plano o en primer plano). Otorgue permiso de notificación para la alerta dirigida al usuario; la reenvío funciona de cualquier manera.

Un usuario cancelar elimina el candidato persistente y desarma el despertador, por lo que El candidato cancelado nunca se vuelve a confirmar después de un reinicio.

Pistas adicionales que confirman un choque o caída real

Una gran sacudida por sí sola no es suficiente: causaría demasiadas falsas alarmas. Entonces Tracelet busca pistas adicionales del mundo real que normalmente ocurren durante una experiencia real. chocar o caer. Cuantas más pistas ve, más seguro está. Estas pistas sólo pueden hacen que Tracelet tenga más confianza: nunca cancelan un evento real.

  • El teléfono se estaba cayendo: justo antes de que alguien dejara caer su teléfono o tomara un Al caer, el teléfono queda brevemente ingrávido. Manchas que hacen que una caída sea más creíble.
  • Todo quedó en calma después — después de una caída real, la persona y el teléfono normalmente deja de moverse. Esa quietud repentina es una señal fuerte.
  • El auto se detuvo repentinamente — en un choque real, el vehículo pasa de rápido a Casi se detuvo en uno o dos segundos. Una fuerte caída en la velocidad respalda un choque.
  • Un “pop” de presión: un choque grave (o la activación de una bolsa de aire) provoca un rápido Cambio en la presión del aire dentro del automóvil. Los teléfonos que tienen un sensor de presión pueden note esto; Los teléfonos sin uno simplemente omiten esta verificación, sin ningún inconveniente.

Opcional: el modelo de accidente de IA con licencia

De forma predeterminada, la detección de accidentes utiliza un motor de reglas (el umbral g + velocidad corroboración anterior): sin configuración adicional, funciona desde el primer momento. Para mayor precisión puedes habilitar el modelo de bloqueo de IA: un modelo entrenado que bloquea los bloqueos en un probabilidad aprendida en lugar de un umbral fijo.

Es opt-in y descargado bajo demanda (nunca integrado), por lo que el tamaño base del SDK no ha cambiado. Para activarlo, obtenga una clave de licencia y apunte su configuración hacia ella:

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 ), ));
OpciónPredeterminadoQué hace
crashModelUnlockUrlnullPunto final de licencia que activa el modelo. null ⇒ motor de reglas puras
crashModelLicenseKeynullSu clave de licencia (desde la página Obtener una licencia)
crashModelThreshold0.5Probabilidad de que el modelo indique un accidente

Si el modelo no se puede activar por algún motivo (fuera de línea, clave no válida), el SDK vuelve automáticamente al motor de reglas: tu aplicación sigue funcionando.

obtener una licencia

Obtenga una clave de la página Obtener una licencia: inicie sesión, ingrese su ID de aplicación y copie una clave lista para pegar (o la clave ImpactConfig completa). retazo).

  • licencia de desarrollo: para emuladores y compilaciones de depuración. Solo el ID de tu aplicación, sin más configuración.
  • licencia de producción: para la aplicación enviada; también necesita el certificado de firma de su aplicación SHA-256 (Play Console → Integridad de la aplicación → Firma de la aplicación o ./gradlew signingReport).

El portal también enumera las claves emitidas y le permite revocar una al instante.


Probarlo sin conducir (simulación) y acceso a la base de datos

Tracelet incluye tablas de bases de datos dedicadas para almacenar eventos telemáticos y un conjunto de API de diagnóstico. Estos son muy utilizados por la superposición de diagnóstico Tracelet Doctor, pero también puede usarlos directamente en su aplicación para crear pantallas de diagnóstico personalizadas o probar sus flujos de seguridad sin necesidad de conducir físicamente o chocar un automóvil.

Recuperar telemática de la base de datos

Cada evento de conducción e impacto se conserva automáticamente en la base de datos SQLite local. Puede recuperar estos registros estructurados para mostrar un historial de conductas de conducción riesgosas:

// 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}'); }

Los eventos aparecen los más recientes primero y la sincronización no los elimina de aquí ver: habilitar syncTelematics carga eventos pero deja su historial local intacto.

Enviándolos a tu backend

Configure HttpConfig.syncTelematics: true y los eventos no sincronizados seguirán su modo normal. sincronización de ubicación: una matriz telematics de nivel raíz en el mismo POST, o la suya propia solicitud cuando configura HttpConfig.telematicsUrl. Las cargas fallidas mantienen los eventos en cola en lugar de abandonarlos. Para el esquema de cableado, los límites de procesamiento por lotes y la compensación de puntos finales separados, ver Sincronización telemática 📖.

Simulación de eventos

Puede inyectar eventos telemáticos simulados directamente en los motores de seguimiento nativos. Esto es perfecto para probar la reacción de su aplicación (como mostrar una pantalla de SOS en caso de falla) o probar los componentes de su interfaz de usuario. La página Conducción y seguridad de la aplicación de ejemplo y la superposición Tracelet Doctor utilizan esta API para permitir a los desarrolladores activar eventos mediante botones.

// 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, );

Borrar la base de datos

Si necesita restablecer el estado de diagnóstico o borrar el historial de eventos telemáticos de la base de datos local, puede purgar la cola:

await Tracelet.destroyTelematicsEvents();

En las pruebas automatizadas, también puedes controlar los motores directamente desde Dart (están expuestos a través de flutter_rust_bridge); consulta example/integration_test/behavior_simulation_test.dart.


Permisos

  • Eventos de conducción solo necesitan el permiso de ubicación que ya utilizas para seguimiento - nada extra.
  • Modo de transporte y choque/caída utilizan el acelerómetro. En Android eso es ya se está ejecutando para la detección de movimiento (sin permiso nuevo). En iOS, agregar el La descripción de uso de Movimiento y estado físico mejora la precisión. Ver el iOS y Páginas de configuración de Android.

Es bueno saberlo

  • En el dispositivo y determinista: toda la detección se ejecuta en el núcleo compartido de Rust. No red, sin modelo de nube, mismos resultados en Android e iOS.
  • Los eventos de conducción también funcionan en la Web (se derivan del GPS).
  • Canal lateral: estos eventos se entregan junto con tu canal habitual secuencia onLocation; nunca cambian sus ubicaciones ni su odómetro, y únete a tu carga útil de sincronización solo si optas por syncTelematics.