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 la 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

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.


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

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, odómetro o sincronización.
Last updated on