J1939 Fordonssimulator
Fordonssimulator med J1939 CAN-stöd
Översikt
Fordonssimulatorn ( gva-vehicle-sim ) är ett omfattande test- och utvecklingsverktyg för GVA-plattformen (Generic Vehicle Architecture). Den tillhandahåller realistisk simulering av fordonsdynamik med integrerad J1939 CAN-bussmeddelandegenerering , vilket möjliggör hårdvaru-i-loop-testning utan att fysisk fordonshårdvara krävs.
Fördelar med J1939-simulering för meddelandegenerering
🎯 Fördelar med utveckling och testning
Hårdvaruoberoende utveckling
- Utveckla och testa GVA-applikationer utan fysisk CAN-hårdvara
- Inget behov av dyra fordonsstyrenheter eller testbänkar
- Parallell utveckling över flera team
Realistiskt fordonsbeteende
- Genererar autentiska J1939-parametergruppnummer (PGN) och misstänkta parameternummer (SPN)
- Simulerar realistisk fordonsdynamik (hastighet, varvtal, växlingar, bromsning)
- Tillhandahåller tidssynkroniserade sensordata
Kostnadsminskning
- Eliminerar behovet av fysiska testfordon i tidig utveckling
- Virtuellt CAN-gränssnitt (
vcan0) möjliggör testning på vilken Linux-arbetsstation som helst - Minskar slitage på fysisk hårdvara
Snabb prototypframställning
- Omedelbar återkopplingsslinga för algoritmutveckling
- Enkelt scenarioskapande och uppspelning
- Konfigurerbara meddelandehastigheter och datamönster
Integrationstestning
- Validera J1939-gatewayens funktionalitet
- Testa dataflödet från CAN till DDS-ämnen
- Verifiera HMI:s respons på fordonsparametrar
Reproducerbar testning
- Deterministiskt fordonsbeteende
- Repeterbara testscenarier
- Konsekvent baslinje för regressionstestning
📊 J1939 Meddelandesupport
✅ Fullt stödda PGN:er (implementerade i fordonssimulatorn)
Fordonssimulatorn genererar aktivt följande J1939-meddelanden över CAN och publicerar dem till DDS via gatewayen:
| PGN | Hexagon | Namn | Hastighet | SPN:er | Beskrivning |
|---|---|---|---|---|---|
| 61443 | 0xF003 | EEC2 - Elektronisk motorstyrenhet 2 | 50 ms | 91, 92 | Gaspedalens läge, motorns procentuella belastning |
| 61444 | 0xF004 | EEC1 - Elektronisk motorstyrenhet 1 | 100 ms | 190, 512, 513 | Motorvarvtal (RPM), förarens vridmoment, faktiskt motormoment |
| 61445 | 0xF005 | ETC2 - Elektronisk transmissionsstyrenhet 2 | 100 ms | 522, 523, 524 | Kopplingsläge, vald växel, aktuell växel |
| 61449 | 0xF009 | VDC2 - Fordonsdynamisk kontroll 2 | 100 ms | 1807, 1808 | Rattvinkel, girningshastighet |
| 65253 | 0xFEE5 | TIMMAR - Motortimmar | 1s | 247 | Totalt antal drifttimmar för motorn |
| 65256 | 0xFEE8 | VDS - Fordonsriktning/hastighet | 250 ms | 517, 519, 586 | Fart över grund, kompassriktning, kurs |
| 65258 | 0xFEEA | ALT - Höjd | 1s | 580 | GPS-höjd över havet |
| 65262 | 0xAVGIFT | ET1 - Motortemperatur 1 | 1s | 110, 174, 175 | Motorns kylvätsketemperatur, bränsletemperatur, oljetemperatur |
| 65263 | 0xFEEF | EFLP - Motorvätskenivå/-tryck | 500 ms | 96, 100, 94 | Bränslenivå, oljetryck, bränsletillförseltryck |
| 65265 | 0xFEF1 | CCVS - Farthållare/Fordonets hastighet | 100 ms | 84, 597, 598 | Hjulbaserad fordonshastighet, bromsbrytare, kopplingsbrytare |
| 65267 | 0xFEF3 | VP - Fordonsposition | 250 ms | 584, 585 | GPS-latitud, longitud |
| 65269 | 0xFEF5 | AMB - Omgivningsförhållanden | 1s | 108, 171 | Barometertryck, omgivande lufttemperatur |
| 65271 | 0xFEF7 | VEP1 - Fordonselektrisk kraft 1 | 1s | 167, 168, 158 | Batterispänning, generatorspänning, laddningssystemspänning |
| 65276 | 0xFEFC | DD - Instrumentpanelens display | 1s | 182, 183 | Bränsleförbrukning (L/h), momentan bränsleekonomi |
| 0xEF00 | 0xEF00 | PROP_A - Proprietär A (IONNIC USM) | 250 ms | - | LED-kontroll för IONNIC USM ES-Key-panel |
Detaljerad SPN-lista (alla parametrar som stöds)
| SPN | Parameternamn | PGN | Enhet | Upplösning | Offset | Räckvidd |
|---|---|---|---|---|---|---|
| 84 | Hjulbaserad fordonshastighet | 65265 | km/h | 1/256 km/h | 0 | 0–250 km/h |
| 91 | Gaspedalens position | 61443 | % | 0,4 % | 0 | 0–100 % |
| 92 | Motorns procentuella belastning vid aktuell hastighet | 61443/61444 | % | 1% | 0 | 0–100 % |
| 94 | Bränsletillförseltryck | 65263 | kPa | 4 kPa | 0 | 0–1000 kPa |
| 96 | Bränslenivå | 65263 | % | 0,4 % | 0 | 0–100 % |
| 100 | Motoroljetryck | 65263 | kPa | 4 kPa | 0 | 0–1000 kPa |
| 108 | Barometertryck | 65269 | kPa | 0,5 kPa | 0 | 0–125 kPa |
| 110 | Motorns kylvätsketemperatur | 65262 | °C | 1°C | -40 | -40 till +210°C |
| 158 | Laddningssystemets spänning | 65271 | V | 0,05 V | 0 | 0–3212 V |
| 167 | Generatorspänning | 65271 | V | 0,05 V | 0 | 0–3212 V |
| 168 | Batterispänning | 65271 | V | 0,05 V | 0 | 0–3212 V |
| 171 | Omgivande lufttemperatur | 65269 | °C | 0,03125°C | -273 | -273 till +1735°C |
| 174 | Bränsletemperatur | 65262 | °C | 1°C | -40 | -40 till +210°C |
| 175 | Motoroljetemperatur | 65262 | °C | 0,03125°C | -273 | -273 till +1735°C |
| 182 | Bränslepris | 65276 | l/h | 0,05 l/h | 0 | 0–3212 l/h |
| 183 | Momentan bränsleekonomi | 65276 | km/L | 1/512 km/l | 0 | 0–125 km/l |
| 190 | Motorvarvtal | 61444 | varvtal | 0,125 varv/min | 0 | 0–8031 varv/min |
| 247 | Totalt antal motortimmar | 65253 | h | 0,05 timmar | 0 | 0–210 554 060 timmar |
| 512 | Förarens efterfrågade motormoment | 61444 | % | 1% | -125 | -125 % till +125 % |
| 513 | Faktiskt motormoment | 61444 | % | 1% | -125 | -125 % till +125 % |
| 517 | Hastighet över mark | 65256 | km/h | 1/256 km/h | 0 | 0–250 km/h |
| 519 | Kurs över grund | 65256 | grader | 1/128 grader | 0 | 0–360° |
| 522 | Kopplingspedalens position | 61445 | % | 0,4 % | 0 | 0–100 % |
| 523 | Växellådans strömväxel | 61445 | redskap | 1 | -125 | -125 till +125 |
| 524 | Vald växellåda | 61445 | redskap | 1 | -125 | -125 till +125 |
| 580 | Höjd över havet | 65258 | m | 0,125 meter | -2500 | -2500 till +5531 m |
| 584 | Latitud | 65267 | grader | 10⁻⁷ grader | -210 | -90° till +90° |
| 585 | Longitud | 65267 | grader | 10⁻⁷ grader | -210 | -180° till +180° |
| 586 | Kompassriktning | 65256 | grader | 1/128 grader | 0 | 0–360° |
| 597 | Bromsbrytare | 65265 | - | 2 bitar | - | Av/På/Fel/Ej tillgänglig |
| 598 | Kopplingsbrytare | 65265 | - | 2 bitar | - | Av/På/Fel/Ej tillgänglig |
| 899 | Motorns vridmomentläge | 61444 | - | 1 | 0 | 0-15 (uppräkning) |
| 1807 | Rattvinkel | 61449 | rad | 1/1024 rad | -31,374 | -31,374 till +31,374 rad |
| 1808 | Girningshastighet | 61449 | rad/s | 1/8192 rad/s | -3,92 | -3,92 till +3,92 rad/s |
Totalt: 15 PGN, 33 SPN aktivt simulerade
🔲 PGN:er som inte stöds (inte implementerade ännu)
Följande J1939-meddelanden genereras för närvarande inte av fordonssimulatorn. Dessa representerar potentiella framtida förbättringar:
| PGN | Hexagon | Namn | Prioritet | Användningsfall | Komplexitet |
|---|---|---|---|---|---|
| 61440 | 0xF000 | ERC1 - Elektronisk retarderstyrenhet 1 | Låg | Retarder/motorbromsstyrning | Medium |
| 61441 | 0xF001 | EBC1 - Elektronisk bromsstyrenhet 1 | Hög | ABS, bromssystemstatus | Hög |
| 61442 | 0xF002 | ETC1 - Elektronisk transmissionsstyrenhet 1 | Medium | Sändningsläge, växling pågår | Medium |
| 64971 | 0xFDCB | VDHR - Fordonsavstånd (hög upplösning) | Hög | Kilometerräknare med 5 mm upplösning | Låg |
| 64972 | 0xFDCC | TCO1 - Färdskrivare | Medium | Förarkort, hastighet från färdskrivare | Låg |
| 65132 | 0xFE6C | TPMS - Däcktrycksövervakning | Medium | Individuellt däcktryck/temperatur | Medium |
| 65217 | 0xFEC1 | PTODE - Inkoppling av kraftuttagsdrift | Låg | Kraftuttagsstatus | Låg |
| 65248 | 0xAVGIFT0 | VDIST - Fordonsavstånd med hög upplösning | Hög | Totalavstånd med 5 m upplösning | Låg |
| 65251 | 0xFEE3 | ECFG - Motorkonfiguration | Låg | Motormärke, modell, serienummer | Låg |
| 65252 | 0xFEE4 | SHUTDN - Avstängning | Låg | Åsidosättning av motoravstängning | Låg |
| 65260 | 0xFEEC | VI - Fordonsidentifiering | Medium | Fullständig VIN-överföring (delvis impl.) | Låg |
| 65279 | 0xFEFF | CCVS1 - Farthållare/Fordonshastighet 1 | Medium | Förbättrad farthållardata | Låg |
| 65098 | 0xFE4A | EBC2 - Elektronisk bromsstyrenhet 2 | Hög | Status för individuella hjulbromsar | Hög |
| 65099 | 0xFE4B | EBC3 - Elektronisk bromsstyrenhet 3 | Medium | Bromsbeläggsslitage | Medium |
| 65110 | 0xFE56 | IC1 - Inlopps-/avgasförhållanden 1 | Låg | Insugningsrörets tryck/temp | Medium |
| 65172 | 0xFE84 | RQST - Begäran | Låg | Begär specifikt PGN från ECU | Medium |
| 65226 | 0xFECA | AT1I - Efterbehandling 1 Intagsgas | Låg | Dieselpartikelfilterinlopp | Låg |
| 65227 | 0xFECB | AT1O - Efterbehandling 1 Utloppsgas | Låg | DPF-utlopp, NOx-sensor | Låg |
| 65247 | 0xFEDF | EFL/P2 - Motorvätskenivå/tryck 2 | Låg | Ytterligare vätsketryck | Låg |
| 65266 | 0xFEF2 | LFE - Bränsleekonomi | Medium | Genomsnittlig bränsleekonomi/resa | Låg |
| 65270 | 0xFEF6 | TD - Turboaggregat | Låg | Laddtryck, turbinhastighet | Medium |
| 65272 | 0xFEF8 | VEP2 - Fordonselektrisk kraft 2 | Låg | Ytterligare elektriska bussar | Låg |
Varför dessa inte implementeras
| Resonera | Berörda PGN:er | Räkna |
|---|---|---|
| Inte relevant för grundläggande fordonssimulator | ERC1, PTODE, SHUTDN, ECFG, AT1I, AT1O, TD | 7 |
| Kräver däckfysikmodell | TPMS | 1 |
| Kräver ABS/bromsmodell | EBC1, EBC2, EBC3 | 3 |
| Kräver avancerad överföring | ETC1 | 1 |
| Låg prioritet / kosmetisk | VI (VIN), VDHR, VDIST, TCO1, LFE | 5 |
| Kräver avgas-/utsläppsmodell | IC1, AT1I, AT1O | 3 |
| Protokollnivå (inte fordonsdata) | RQST | 1 |
| Duplicerade/förbättrade versioner | CCVS1, EFL/P2, VEP2 | 3 |
Totalt: 22 PGN:er som inte stöds
🛠️ Tekniska funktioner
- OpenDRIVE-vägnätsstöd : Följ realistisk väggeometri
- Simulering av automatväxellåda : Växlingar baserade på hastighet och gaspådrag
- Fysikbaserad dynamik : Acceleration, bromsning, styrning med realistiska begränsningar
- DDS-integration : Direktpublicering till J1939 Automotive PSM-ämnen
- Qt6 GUI : Visualisering i realtid och manuell kontroll
J1939 till DDS Gateway-arkitektur
Följande sekvensdiagram illustrerar det fullständiga dataflödet från J1939 CAN-bussmeddelanden genom gatewayen till DDS-abonnenter:
(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)
Förklaring av sekvensdiagram
1. Meddelandegenereringsfas
- Fordonssimulatorn beräknar realistiska fordonsparametrar baserat på förarens inmatningar och fysik
- Kodar parametrar i J1939 CAN-ramar med korrekt PGN/SPN-struktur
- Skickar till virtuellt CAN-gränssnitt (vcan0)
2. CAN-mottagningsfas
- SocketCanReader Qt-tråd läser kontinuerligt från CAN-gränssnittet
- Validerar CAN-ramformat (29-bitars utökat ID)
- Sänder ut Qt-signal med rå bilddata
3. J1939 Avkodningsfas
- J1939Decoder extraherar protokollinformation från CAN-ID:
- PGN : Parametergruppnummer (identifierar meddelandetyp)
- Källadress : ECU-identifierare (0-253)
- Prioritet : Meddelandets brådska (0=högst, 7=lägst)
- Avkodar datanyttolasten till individuella SPN:er med hjälp av konfigurationen:
- Bitposition och längd
- Skalfaktor och offset
- Ingenjörsenheter
4. DDS-publiceringsfas
- Gateway publicerar
C_Parameter_Group_Definition(PGN-metadata) vid första förekomsten - För varje SPN i meddelandet:
- Skapar
C_Parametermeddelande med värde och status - Lägger till tidsstämpel och källidentifiering
- Publicerar till DDS-ämnet
- Skapar
- Regelbundna statusuppdateringar (1 Hz) publicerar gatewayens hälsa
5. Konsumtionsfas
- GVA-applikationer (HMI, LDMX) prenumererar på J1939 DDS-ämnen
- Ta emot parameteruppdateringar via DDS-mellanprogramvara
- Uppdatera UI-element (hastighetsmätare, varvräknare, växeldisplay)
Protokolldetaljer
J1939 CAN ID-struktur (29-bitars)
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)Exempel på CAN-ramavkodning
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)Snabbstart
1. Bygg fordonssimulator
cd build
cmake ..
make gva-vehicle-sim2. Konfigurera virtuell CAN
sudo scripts/test/j1939/setup-vcan.sh3. Starta fordonssimulatorn
# 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. Starta J1939-gatewayen
./build/bin/gva-j1939-gateway \
--domain=0 \
--interface=vcan0 \
--config=/etc/gva/j1939-config.json5. Övervaka med LDMX
./build/bin/ldmx
# Navigate to J1939 tab to see live parametersKonfiguration
Konfiguration av fordonssimulator
Skapa 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
}
}J1939 Gateway-konfiguration
Se /etc/gva/j1939-config.json för PGN/SPN-definitioner och skalningsparametrar.
Användningsfall
1. HMI-utveckling
- Utveckla fordonsinstrumentpanel utan fysiskt fordon
- Testa rendering och animationer av instrumentklustret
- Validera varnings-/larmtrösklar
2. Algoritmtestning
- Testa algoritmer för sparsam körning med simulerad bränsleförbrukning
- Validera logik för prediktivt underhåll
- Testa beslutsfattande om autonom körning
3. Integrationstestning
- Verifiera dataflödet från början till slut: CAN → DDS → Applikation
- Testa gatewayens prestanda under belastning
- Validera datasynkronisering mellan delsystem
4. Utbildning och demonstration
- Säker miljö för operatörsutbildning
- Kunddemonstrationer utan fordon
- Utbildningsverktyg för GVA-arkitektur
Prestandaegenskaper
| Metrisk | Värde |
|---|---|
| CAN-bildgenereringshastighet | Upp till 100 Hz per PGN |
| DDS-publiceringslatens | < 5 ms (lokal) |
| Gateway-genomströmning | > 1000 PGN/sek |
| CPU-användning (simulator + gateway) | < 10 % (system med 4 kärnor) |
| Minnesavtryck | ~50 MB (kombinerat) |
Jämförelse: Fysisk vs. Simulerad
| Aspekt | Fysiskt fordon | Simulator |
|---|---|---|
| Kostnad för hårdvara | 50 000+ dollar | 0 kr (endast programvara) |
| Uppställningstid | Timmar (ledningar, konfiguration) | Minuter |
| Reproducerbarhet | Begränsad (förarens variation) | Perfekt (deterministisk) |
| Säkerhet | Risk för skada/personskada | Noll risk |
| Scenariokontroll | Svårt (väder, trafik) | Fullständig kontroll |
| Dataloggning | Kräver utrustning | Inbyggt |
| Parallell testning | Ett fordon i taget | Flera instanser |
Felsökning
Vanliga problem
CAN-gränssnittet hittades inte
# Verify vcan0 exists
ip link show vcan0
# Recreate if needed
sudo scripts/test/j1939/setup-vcan.shInga DDS-meddelanden
# 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=0Gateway avkodar inte meddelanden
# Check CAN frames are being sent
candump vcan0
# Verify configuration file
cat /etc/gva/j1939-config.jsonBegär en demonstration idag.