Simulador de vehículo J1939
Simulador de vehículos con soporte CAN J1939
Descripción general
El Simulador de Vehículos ( gva-vehicle-sim ) es una herramienta integral de pruebas y desarrollo para la plataforma GVA (Arquitectura Genérica de Vehículos). Ofrece una simulación realista de la dinámica del vehículo con generación integrada de mensajes de bus CAN J1939 , lo que permite realizar pruebas de hardware en el circuito sin necesidad de hardware físico del vehículo.
Beneficios de la simulación J1939 para la generación de mensajes
🎯 Ventajas de desarrollo y pruebas
Desarrollo independiente del hardware
- Desarrollar y probar aplicaciones GVA sin hardware CAN físico
- No se necesitan ECU de vehículos costosos ni bancos de pruebas
- Desarrollo paralelo en múltiples equipos
Comportamiento realista del vehículo
- Genera números de grupo de parámetros J1939 (PGN) y números de parámetros sospechosos (SPN) auténticos
- Simula la dinámica realista del vehículo (velocidad, RPM, cambios de marcha, frenado)
- Proporciona datos de sensores sincronizados en el tiempo
Reducción de costos
- Elimina la necesidad de vehículos de prueba físicos en las primeras etapas del desarrollo.
- La interfaz CAN virtual (
vcan0) permite realizar pruebas en cualquier estación de trabajo Linux - Reduce el desgaste del hardware físico
Prototipado rápido
- Bucle de retroalimentación instantánea para el desarrollo de algoritmos
- Fácil creación y reproducción de escenarios
- Tasas de mensajes y patrones de datos configurables
Pruebas de integración
- Validar la funcionalidad de la puerta de enlace J1939
- Flujo de datos de prueba de CAN a temas DDS
- Verificar la capacidad de respuesta de la HMI a los parámetros del vehículo
Pruebas reproducibles
- Comportamiento determinista del vehículo
- Escenarios de prueba repetibles
- Línea de base consistente para pruebas de regresión
Soporte de mensajes J1939
✅ PGN totalmente compatibles (implementados en el simulador de vehículos)
El simulador de vehículo genera activamente los siguientes mensajes J1939 a través de CAN y los publica en DDS mediante la puerta de enlace:
| PGN | Maleficio | Nombre | Tasa | SPN | Descripción |
|---|---|---|---|---|---|
| 61443 | 0xF003 | EEC2 - Controlador electrónico del motor 2 | 50 ms | 91, 92 | Posición del pedal del acelerador, porcentaje de carga del motor |
| 61444 | 0xF004 | EEC1 - Controlador electrónico del motor 1 | 100 ms | 190, 512, 513 | Velocidad del motor (RPM), par solicitado por el conductor, par motor real |
| 61445 | 0xF005 | ETC2 - Controlador electrónico de transmisión 2 | 100 ms | 522, 523, 524 | Posición del embrague, marcha seleccionada, marcha actual |
| 61449 | 0xF009 | VDC2 - Control dinámico del vehículo 2 | 100 ms | 1807, 1808 | Ángulo del volante, velocidad de guiñada |
| 65253 | 0xFEE5 | HORAS - Horas del motor | 1s | 247 | Total de horas de funcionamiento del motor |
| 65256 | 0xFEE8 | VDS - Dirección/velocidad del vehículo | 250 ms | 517, 519, 586 | Velocidad sobre el suelo, rumbo de la brújula, curso |
| 65258 | 0xFEEA | ALT - Altitud | 1s | 580 | Altitud GPS sobre el nivel del mar |
| 65262 | 0xFEEE | ET1 - Temperatura del motor 1 | 1s | 110, 174, 175 | Temperatura del refrigerante del motor, temperatura del combustible, temperatura del aceite |
| 65263 | 0xFEEF | EFLP - Nivel/presión del líquido del motor | 500 ms | 96, 100, 94 | Nivel de combustible, presión de aceite, presión de suministro de combustible |
| 65265 | 0xFEF1 | CCVS - Control de crucero/Velocidad del vehículo | 100 ms | 84, 597, 598 | Velocidad del vehículo basada en las ruedas, interruptor de freno, interruptor de embrague |
| 65267 | 0xFEF3 | VP - Posición del vehículo | 250 ms | 584, 585 | Latitud y longitud del GPS |
| 65269 | 0xFEF5 | AMB - Condiciones ambientales | 1s | 108, 171 | Presión barométrica, temperatura del aire ambiente |
| 65271 | 0xFEF7 | VEP1 - Energía eléctrica del vehículo 1 | 1s | 167, 168, 158 | Voltaje de la batería, voltaje del alternador, voltaje del sistema de carga |
| 65276 | 0xFEFC | DD - Pantalla de tablero | 1s | 182, 183 | Consumo de combustible (L/h), economía de combustible instantánea |
| 0xEF00 | 0xEF00 | PROP_A - Propietario A (IONNIC USM) | 250 ms | - | Control de LED para el panel IONNIC USM ES-Key |
Lista detallada de SPN (todos los parámetros admitidos)
| SPN | Nombre del parámetro | PGN | Unidad | Resolución | Compensar | Rango |
|---|---|---|---|---|---|---|
| 84 | Velocidad del vehículo basada en ruedas | 65265 | kilómetros por hora | 1/256 kilómetros por hora | 0 | 0-250 km/h |
| 91 | Posición del pedal del acelerador | 61443 | % | 0,4% | 0 | 0-100% |
| 92 | Porcentaje de carga del motor a la velocidad actual | 61443/61444 | % | 1% | 0 | 0-100% |
| 94 | Presión de suministro de combustible | 65263 | kPa | 4 kPa | 0 | 0-1000 kPa |
| 96 | Nivel de combustible | 65263 | % | 0,4% | 0 | 0-100% |
| 100 | Presión de aceite del motor | 65263 | kPa | 4 kPa | 0 | 0-1000 kPa |
| 108 | Presión barométrica | 65269 | kPa | 0,5 kPa | 0 | 0-125 kPa |
| 110 | Temperatura del refrigerante del motor | 65262 | °C | 1°C | -40 | -40 a +210°C |
| 158 | Voltaje del sistema de carga | 65271 | V | 0,05 V | 0 | 0-3212 V |
| 167 | Voltaje del alternador | 65271 | V | 0,05 V | 0 | 0-3212 V |
| 168 | Voltaje de la batería | 65271 | V | 0,05 V | 0 | 0-3212 V |
| 171 | Temperatura del aire ambiente | 65269 | °C | 0,03125 °C | -273 | -273 a +1735 °C |
| 174 | Temperatura del combustible | 65262 | °C | 1°C | -40 | -40 a +210°C |
| 175 | Temperatura del aceite del motor | 65262 | °C | 0,03125 °C | -273 | -273 a +1735 °C |
| 182 | Tarifa de combustible | 65276 | L/h | 0,05 L/h | 0 | 0-3212 L/h |
| 183 | Economía de combustible instantánea | 65276 | kilómetros por litro | 1/512 km/L | 0 | 0-125 km/L |
| 190 | Velocidad del motor | 61444 | RPM | 0,125 RPM | 0 | 0-8031 RPM |
| 247 | Total de horas del motor | 65253 | h | 0,05 horas | 0 | 0-210.554.060 horas |
| 512 | Par motor según demanda del conductor | 61444 | % | 1% | -125 | -125% a +125% |
| 513 | Par motor real | 61444 | % | 1% | -125 | -125% a +125% |
| 517 | Velocidad sobre el suelo | 65256 | kilómetros por hora | 1/256 kilómetros por hora | 0 | 0-250 km/h |
| 519 | Curso sobre tierra | 65256 | grados | 1/128 grados | 0 | 0-360° |
| 522 | Posición del pedal del embrague | 61445 | % | 0,4% | 0 | 0-100% |
| 523 | Transmisión de corriente de transmisión | 61445 | engranaje | 1 | -125 | -125 a +125 |
| 524 | Marcha seleccionada de la transmisión | 61445 | engranaje | 1 | -125 | -125 a +125 |
| 580 | Altitud | 65258 | metro | 0,125 metros | -2500 | -2500 a +5531 m |
| 584 | Latitud | 65267 | grados | 10⁻⁷ grados | -210 | -90° a +90° |
| 585 | Longitud | 65267 | grados | 10⁻⁷ grados | -210 | -180° a +180° |
| 586 | Marcación de la brújula | 65256 | grados | 1/128 grados | 0 | 0-360° |
| 597 | Interruptor de freno | 65265 | - | 2 bits | - | Apagado/Encendido/Error/No disponible |
| 598 | Interruptor de embrague | 65265 | - | 2 bits | - | Apagado/Encendido/Error/No disponible |
| 899 | Modo de par motor | 61444 | - | 1 | 0 | 0-15 (enumeración) |
| 1807 | Ángulo del volante | 61449 | genial | 1/1024 rad | -31.374 | -31,374 a +31,374 rad |
| 1808 | Velocidad de guiñada | 61449 | rad/s | 1/8192 rad/s | -3.92 | -3,92 a +3,92 rad/s |
Total: 15 PGN, 33 SPN simulados activamente
🔲 PGN no compatibles (aún no implementados)
El simulador de vehículos no genera actualmente los siguientes mensajes J1939. Estos representan posibles mejoras futuras:
| PGN | Maleficio | Nombre | Prioridad | Caso de uso | Complejidad |
|---|---|---|---|---|---|
| 61440 | 0xF000 | ERC1 - Controlador electrónico del retardador 1 | Bajo | Control del freno del motor/retardador | Medio |
| 61441 | 0xF001 | EBC1 - Controlador electrónico de freno 1 | Alto | ABS, estado del sistema de frenos | Alto |
| 61442 | 0xF002 | ETC1 - Controlador electrónico de transmisión 1 | Medio | Modo de transmisión, cambio en progreso | Medio |
| 64971 | 0xFDCB | VDHR - Distancia del vehículo (alta resolución) | Alto | Odómetro con resolución de 5 mm | Bajo |
| 64972 | 0xFDCC | TCO1 - Tacógrafo | Medio | Tarjeta de conductor, velocidad del tacógrafo | Bajo |
| 65132 | 0xFE6C | TPMS - Monitoreo de presión de neumáticos | Medio | Presión y temperatura de los neumáticos individuales | Medio |
| 65217 | 0xFEC1 | PTODE - Participación en la conducción de la PTO | Bajo | Estado de la toma de fuerza | Bajo |
| 65248 | 0xFEE0 | VDIST - Distancia del vehículo de alta resolución | Alto | Distancia total con una resolución de 5 m | Bajo |
| 65251 | 0xFEE3 | ECFG - Configuración del motor | Bajo | Marca, modelo y número de serie del motor | Bajo |
| 65252 | 0xFEE4 | SHUTDN - Apagado | Bajo | Anulación de apagado del motor | Bajo |
| 65260 | 0xFEEC | VI - Identificación del vehículo | Medio | Transmisión VIN completa (implementación parcial) | Bajo |
| 65279 | 0xFEFF | CCVS1 - Control de crucero/Velocidad del vehículo 1 | Medio | Datos de control de crucero mejorados | Bajo |
| 65098 | 0xFE4A | EBC2 - Controlador electrónico de freno 2 | Alto | Estado del freno de cada rueda | Alto |
| 65099 | 0xFE4B | EBC3 - Controlador electrónico de freno 3 | Medio | Desgaste del forro de freno | Medio |
| 65110 | 0xFE56 | IC1 - Condiciones de entrada/escape 1 | Bajo | Presión/temperatura del colector de admisión | Medio |
| 65172 | 0xFE84 | RQST - Solicitud | Bajo | Solicitar PGN específico de la ECU | Medio |
| 65226 | 0xFECA | AT1I - Postratamiento 1 Gas de admisión | Bajo | Entrada del filtro de partículas diésel | Bajo |
| 65227 | 0xFECB | AT1O - Postratamiento 1 salida de gas | Bajo | Salida DPF, sensor NOx | Bajo |
| 65247 | 0xFEDF | EFL/P2 - Nivel/presión del líquido del motor 2 | Bajo | Presiones de fluido adicionales | Bajo |
| 65266 | 0xFEF2 | LFE - Economía de combustible | Medio | Economía de combustible promedio/viaje | Bajo |
| 65270 | 0xFEF6 | TD - Turbocompresor | Bajo | Presión de refuerzo, velocidad de la turbina | Medio |
| 65272 | 0xFEF8 | VEP2 - Energía eléctrica del vehículo 2 | Bajo | Autobuses eléctricos adicionales | Bajo |
¿Por qué no se implementan?
| Razón | PGN afectados | Contar |
|---|---|---|
| No es relevante para el simulador básico de vehículo. | ERC1, PTODE, SHUTDN, ECFG, AT1I, AT1O, TD | 7 |
| Requiere modelo de física de neumáticos | Sistema de gestión de la presión de los neumáticos (TPMS) | 1 |
| Requiere modelo con ABS/freno | EBC1, EBC2, EBC3 | 3 |
| Requiere transmisión avanzada | ETC1 | 1 |
| Baja prioridad / cosmética | VI (VIN), VDHR, VDIST, TCO1, LFE | 5 |
| Requiere modelo de escape/emisiones | IC1, AT1I, AT1O | 3 |
| A nivel de protocolo (no datos del vehículo) | RQST | 1 |
| Versiones duplicadas/mejoradas | CCVS1, EFL/P2, VEP2 | 3 |
Total: 22 PGN no compatibles
🛠️ Características técnicas
- Compatibilidad con la red de carreteras OpenDRIVE : siga la geometría realista de la carretera
- Simulación de transmisión automática : cambios de marcha en función de la velocidad y el acelerador
- Dinámica basada en la física : aceleración, frenado y dirección con restricciones realistas
- Integración DDS : publicación directa en temas PSM automotrices J1939
- GUI Qt6 : visualización en tiempo real y control manual
Arquitectura de puerta de enlace J1939 a DDS
El siguiente diagrama de secuencia ilustra el flujo de datos completo desde los mensajes del bus CAN J1939 a través de la puerta de enlace hasta los suscriptores DDS:
(speed, RPM, gear) Sim->>CAN: Send PGN 61444
(EEC1: Engine Speed) Sim->>CAN: Send PGN 65265
(CCVS: Vehicle Speed) Sim->>CAN: Send PGN 61445
(ETC2: Transmission) Note over CAN,Decoder: CAN Reception Phase CAN->>Reader: Read CAN frame (29-bit ID) Reader->>Reader: Validate frame Reader->>Decoder: emit canFrameReceived() Note over Decoder,Gateway: J1939 Decode Phase Decoder->>Decoder: Extract PGN from CAN ID
(bits 24-8) Decoder->>Decoder: Extract source address
(bits 7-0) Decoder->>Decoder: Extract priority
(bits 28-26) Decoder->>Decoder: Decode SPNs from payload
(bit position, scale, offset) Decoder->>Gateway: emit j1939MessageDecoded() Note over Gateway,DDS: DDS Publishing Phase Gateway->>Gateway: Create C_Parameter_Group_Definition
(if first time) Gateway->>DDS: Publish PGN definition loop For each SPN in message Gateway->>Gateway: Create C_Parameter message
(sourceID, PGN, SPN, value) Gateway->>Gateway: Set metadata
(timestamp, status) Gateway->>DDS: Publish parameter end Note over DDS,HMI: Consumption Phase DDS->>HMI: onSampleReceived()
(C_Parameter) HMI->>HMI: Update speedometer HMI->>HMI: Update tachometer HMI->>HMI: Update gear indicator Note over Gateway: Status Reporting (1 Hz) Gateway->>Gateway: Update data source status Gateway->>DDS: Publish C_Data_Source
(gateway health)
Explicación del diagrama de secuencia
1. Fase de generación de mensajes
- El simulador de vehículos calcula parámetros realistas del vehículo en función de las entradas del conductor y la física.
- Codifica parámetros en tramas CAN J1939 con la estructura PGN/SPN adecuada
- Transmite a la interfaz CAN virtual (vcan0)
2. Fase de recepción de CAN
- El hilo Qt de SocketCanReader lee continuamente desde la interfaz CAN
- Valida el formato del marco CAN (ID extendida de 29 bits)
- Emite señal Qt con datos de cuadro sin procesar
3. Fase de decodificación J1939
- El decodificador J1939 extrae información del protocolo del ID CAN:
- PGN : Número de grupo de parámetros (identifica el tipo de mensaje)
- Dirección de origen : Identificador de la ECU (0-253)
- Prioridad : Urgencia del mensaje (0=máxima, 7=mínima)
- Decodifica la carga útil de datos en SPN individuales mediante la configuración:
- Posición y longitud de la broca
- Factor de escala y desplazamiento
- Unidades de ingeniería
4. Fase de publicación de DDS
- Gateway publica
C_Parameter_Group_Definition(metadatos PGN) en la primera aparición - Para cada SPN en el mensaje:
- Crea un mensaje
C_Parametercon valor y estado - Agrega marca de tiempo e identificación de fuente
- Publica en el tema DDS
- Crea un mensaje
- Las actualizaciones de estado periódicas (1 Hz) publican el estado de la puerta de enlace
5. Fase de consumo
- Las aplicaciones GVA (HMI, LDMX) se suscriben a los temas DDS J1939
- Recibir actualizaciones de parámetros a través del middleware DDS
- Actualizar elementos de la interfaz de usuario (velocímetro, tacómetro, indicador de marcha)
Detalles del protocolo
Estructura de identificación CAN J1939 (29 bits)
Bits 28-26: Priority (0-7)
Bit 25: Reserved
Bit 24: Data Page (DP)
Bits 23-16: PDU Format (PF)
Bits 15-8: PDU Specific (PS) - group extension or destination
Bits 7-0: Source Address (SA)
PGN = (DP << 16) | (PF << 8) | (PS if PF >= 240 else 0)Ejemplo de decodificación de trama CAN
CAN ID: 0x18F00400
Binary: 00011000111100000000010000000000
Priority: 0x6 (bits 28-26) = 6 (normal priority)
Reserved: 0 (bit 25)
DP: 0 (bit 24)
PF: 0xF0 (bits 23-16) = 240 (broadcast)
PS: 0x04 (bits 15-8) = 4 (group extension)
SA: 0x00 (bits 7-0) = 0 (engine controller)
PGN = (0 << 16) | (240 << 8) | 4 = 61444 (EEC1 - Engine Controller 1)Inicio rápido
1. Construye un simulador de vehículos
cd build
cmake ..
make gva-vehicle-sim2. Configurar CAN virtual
sudo scripts/test/j1939/setup-vcan.sh3. Iniciar el simulador de vehículos
# GUI mode with OpenDRIVE track
./build/bin/gva-vehicle-sim \
--domain=0 \
--opendrive=data/opendrive/ZalaZONE_full.xodr \
--can-interface=vcan0
# Headless mode with J1939 only
./build/bin/gva-vehicle-sim \
--domain=0 \
--can-interface=vcan0 \
--headless4. Iniciar la puerta de enlace J1939
./build/bin/gva-j1939-gateway \
--domain=0 \
--interface=vcan0 \
--config=/etc/gva/j1939-config.json5. Monitor con LDMX
./build/bin/ldmx
# Navigate to J1939 tab to see live parametersConfiguración
Configuración del simulador de vehículos
Crear vehicle-sim-config.json :
{
"j1939": {
"enabled": true,
"sourceAddress": 0,
"gatewayResourceId": 1000,
"updateRateHz": 10
},
"vehicle": {
"maxSpeed": 120.0,
"maxRpm": 6000,
"gearRatios": [3.5, 2.5, 1.8, 1.3, 1.0, 0.8],
"engineIdleRpm": 800
}
}Configuración de la puerta de enlace J1939
Consulte /etc/gva/j1939-config.json para obtener definiciones de PGN/SPN y parámetros de escala.
Casos de uso
1. Desarrollo de HMI
- Desarrollar el tablero del vehículo sin vehículo físico
- Pruebe la representación y las animaciones del grupo de instrumentos
- Validar umbrales de advertencia/alarma
2. Pruebas de algoritmos
- Pruebe algoritmos de conducción ecológica con consumo de combustible simulado
- Validar la lógica del mantenimiento predictivo
- Prueba la toma de decisiones en la conducción autónoma
3. Pruebas de integración
- Verificar el flujo de datos de extremo a extremo: CAN → DDS → Aplicación
- Pruebe el rendimiento de la puerta de enlace bajo carga
- Validar la sincronización de datos entre subsistemas
4. Capacitación y demostración
- Entorno seguro para la formación de operadores
- Demostraciones de clientes sin vehículo
- Herramienta educativa para la arquitectura GVA
Características de rendimiento
| Métrico | Valor |
|---|---|
| Tasa de generación de tramas CAN | Hasta 100 Hz por PGN |
| Latencia de publicación de DDS | < 5 ms (local) |
| Rendimiento de la puerta de enlace | > 1000 PGN/seg |
| Uso de CPU (simulador + puerta de enlace) | < 10% (sistema de 4 núcleos) |
| Huella de memoria | ~50 MB (combinados) |
Comparación: física vs. simulada
| Aspecto | Vehículo físico | Simulador |
|---|---|---|
| Costo del hardware | $50,000+ | $0 (solo software) |
| Tiempo de configuración | Horas (cableado, configuración) | Minutos |
| Reproducibilidad | Limitado (variabilidad del conductor) | Perfecto (determinista) |
| Seguridad | Riesgo de daños/lesiones | Riesgo cero |
| Control de escenarios | Difícil (clima, tráfico) | Control completo |
| Registro de datos | Requiere equipo | Incorporado |
| Pruebas paralelas | Un vehículo a la vez | Varias instancias |
Solución de problemas
Problemas comunes
Interfaz CAN no encontrada
# Verify vcan0 exists
ip link show vcan0
# Recreate if needed
sudo scripts/test/j1939/setup-vcan.shNo hay mensajes DDS
# Check gateway is running
pgrep -a gva-j1939-gateway
# Verify domain ID matches
./build/bin/gva-j1939-gateway --domain=0
./build/bin/gva-vehicle-sim --domain=0La puerta de enlace no decodifica los mensajes
# Check CAN frames are being sent
candump vcan0
# Verify configuration file
cat /etc/gva/j1939-config.jsonSolicite una demostración hoy.