Symulator pojazdu J1939
Symulator pojazdu z obsługą J1939 CAN
Przegląd
Symulator pojazdu ( gva-vehicle-sim ) to kompleksowe narzędzie testowe i programistyczne dla platformy GVA (Generic Vehicle Architecture). Zapewnia realistyczną symulację dynamiki pojazdu ze zintegrowanym generowaniem komunikatów magistrali CAN J1939 , umożliwiając testowanie w pętli sprzętowej bez konieczności instalowania fizycznego sprzętu w pojeździe.
Korzyści z symulacji J1939 w generowaniu wiadomości
🎯 Zalety rozwoju i testowania
Rozwój niezależny od sprzętu
- Twórz i testuj aplikacje GVA bez fizycznego sprzętu CAN
- Nie ma potrzeby stosowania drogich sterowników ECU ani stanowisk testowych
- Równoległy rozwój w wielu zespołach
Realistyczne zachowanie pojazdu
- Generuje autentyczne numery grup parametrów J1939 (PGN) i numery podejrzanych parametrów (SPN)
- Symuluje realistyczną dynamikę pojazdu (prędkość, obroty silnika, zmiana biegów, hamowanie)
- Zapewnia zsynchronizowane w czasie dane z czujników
Redukcja kosztów
- Eliminuje potrzebę fizycznych pojazdów testowych na wczesnym etapie rozwoju
- Wirtualny interfejs CAN (
vcan0) umożliwia testowanie na dowolnej stacji roboczej z systemem Linux - Zmniejsza zużycie sprzętu fizycznego
Szybkie prototypowanie
- Natychmiastowa pętla sprzężenia zwrotnego do rozwoju algorytmów
- Łatwe tworzenie i odtwarzanie scenariuszy
- Konfigurowalne szybkości przesyłania wiadomości i wzorce danych
Testowanie integracyjne
- Sprawdź funkcjonalność bramy J1939
- Przepływ danych testowych z CAN do tematów DDS
- Sprawdź reakcję HMI na parametry pojazdu
Powtarzalne testy
- Deterministyczne zachowanie pojazdu
- Powtarzalne scenariusze testowe
- Spójna linia bazowa do testów regresyjnych
📊 Obsługa wiadomości J1939
✅ W pełni obsługiwane PGN-y (zaimplementowane w symulatorze pojazdu)
Symulator pojazdu aktywnie generuje następujące komunikaty J1939 przez magistralę CAN i publikuje je w systemie DDS za pośrednictwem bramy:
| PGN | Klątwa | Nazwa | Wskaźnik | SPN-y | Opis |
|---|---|---|---|---|---|
| 61443 | 0xF003 | EEC2 - Elektroniczny sterownik silnika 2 | 50 ms | 91, 92 | Pozycja pedału przyspieszenia, obciążenie silnika w procentach |
| 61444 | 0xF004 | EEC1 - Elektroniczny sterownik silnika 1 | 100 ms | 190, 512, 513 | Prędkość obrotowa silnika (obr./min), moment obrotowy wymagany przez kierowcę, rzeczywisty moment obrotowy silnika |
| 61445 | 0xF005 | ETC2 - Elektroniczny sterownik skrzyni biegów 2 | 100 ms | 522, 523, 524 | Pozycja sprzęgła, wybrany bieg, aktualny bieg |
| 61449 | 0xF009 | VDC2 - Kontrola dynamiki pojazdu 2 | 100 ms | 1807, 1808 | Kąt kierownicy, prędkość odchylenia |
| 65253 | 0xFEE5 | GODZINY - Godziny pracy silnika | 1s | 247 | Całkowita liczba godzin pracy silnika |
| 65256 | 0xFEE8 | VDS – Kierunek/Prędkość pojazdu | 250 ms | 517, 519, 586 | Prędkość nad ziemią, kierunek kompasu, kurs |
| 65258 | 0xFEEA | ALT - Wysokość | 1s | 580 | Wysokość GPS nad poziomem morza |
| 65262 | 0xOPŁATA | ET1 - Temperatura silnika 1 | 1s | 110, 174, 175 | Temperatura płynu chłodzącego silnika, temperatura paliwa, temperatura oleju |
| 65263 | 0xFEEF | EFLP – Poziom/ciśnienie płynu silnikowego | 500 ms | 96, 100, 94 | Poziom paliwa, ciśnienie oleju, ciśnienie dostarczania paliwa |
| 65265 | 0xFEF1 | CCVS – Tempomat/Prędkość pojazdu | 100 ms | 84, 597, 598 | Prędkość pojazdu oparta na kołach, przełącznik hamulca, przełącznik sprzęgła |
| 65267 | 0xFEF3 | VP - Pozycja pojazdu | 250 ms | 584, 585 | Szerokość i długość geograficzna GPS |
| 65269 | 0xFEF5 | AMB - Warunki otoczenia | 1s | 108, 171 | Ciśnienie barometryczne, temperatura powietrza otoczenia |
| 65271 | 0xFEF7 | VEP1 - Zasilanie elektryczne pojazdu 1 | 1s | 167, 168, 158 | Napięcie akumulatora, napięcie alternatora, napięcie układu ładowania |
| 65276 | 0xFEFC | DD - Wyświetlacz deski rozdzielczej | 1s | 182, 183 | Zużycie paliwa (l/h), chwilowe zużycie paliwa |
| 0xEF00 | 0xEF00 | PROP_A - Własnościowy A (IONNIC USM) | 250 ms | - | Sterowanie LED dla panelu IONNIC USM ES-Key |
Szczegółowa lista SPN (wszystkie obsługiwane parametry)
| SPN | Nazwa parametru | PGN | Jednostka | Rezolucja | Zrównoważyć | Zakres |
|---|---|---|---|---|---|---|
| 84 | Prędkość pojazdu na kołach | 65265 | km/h | 1/256 km/h | 0 | 0-250 km/h |
| 91 | Pozycja pedału przyspieszenia | 61443 | % | 0,4% | 0 | 0-100% |
| 92 | Obciążenie silnika w procentach przy aktualnej prędkości | 61443/61444 | % | 1% | 0 | 0-100% |
| 94 | Ciśnienie dostarczania paliwa | 65263 | kPa | 4 kPa | 0 | 0-1000 kPa |
| 96 | Poziom paliwa | 65263 | % | 0,4% | 0 | 0-100% |
| 100 | Ciśnienie oleju silnikowego | 65263 | kPa | 4 kPa | 0 | 0-1000 kPa |
| 108 | Ciśnienie barometryczne | 65269 | kPa | 0,5 kPa | 0 | 0-125 kPa |
| 110 | Temperatura płynu chłodzącego silnika | 65262 | °C | 1°C | -40 | -40 do +210°C |
| 158 | Napięcie układu ładowania | 65271 | V | 0,05 V | 0 | 0-3212 V |
| 167 | Napięcie alternatora | 65271 | V | 0,05 V | 0 | 0-3212 V |
| 168 | Napięcie akumulatora | 65271 | V | 0,05 V | 0 | 0-3212 V |
| 171 | Temperatura powietrza otoczenia | 65269 | °C | 0,03125°C | -273 | -273 do +1735°C |
| 174 | Temperatura paliwa | 65262 | °C | 1°C | -40 | -40 do +210°C |
| 175 | Temperatura oleju silnikowego | 65262 | °C | 0,03125°C | -273 | -273 do +1735°C |
| 182 | Stawka paliwa | 65276 | l/h | 0,05 l/godz. | 0 | 0-3212 l/h |
| 183 | Natychmiastowa oszczędność paliwa | 65276 | km/l | 1/512 km/l | 0 | 0-125 km/l |
| 190 | Prędkość obrotowa silnika | 61444 | obr./min | 0,125 obr./min | 0 | 0-8031 obr./min |
| 247 | Całkowita liczba godzin pracy silnika | 65253 | H | 0,05 godz. | 0 | 0-210 554 060 godzin |
| 512 | Moment obrotowy silnika na żądanie kierowcy | 61444 | % | 1% | -125 | -125% do +125% |
| 513 | Rzeczywisty moment obrotowy silnika | 61444 | % | 1% | -125 | -125% do +125% |
| 517 | Prędkość nad ziemią | 65256 | km/h | 1/256 km/h | 0 | 0-250 km/h |
| 519 | Kurs nad ziemią | 65256 | stopień | 1/128 stopnia | 0 | 0-360° |
| 522 | Pozycja pedału sprzęgła | 61445 | % | 0,4% | 0 | 0-100% |
| 523 | Przekładnia prądowa | 61445 | bieg | 1 | -125 | -125 do +125 |
| 524 | Wybrany bieg skrzyni biegów | 61445 | bieg | 1 | -125 | -125 do +125 |
| 580 | Wysokość | 65258 | M | 0,125 m | -2500 | -2500 do +5531 m |
| 584 | Szerokość | 65267 | stopień | 10⁻⁷ stopni | -210 | -90° do +90° |
| 585 | Długość geograficzna | 65267 | stopień | 10⁻⁷ stopni | -210 | -180° do +180° |
| 586 | Namiar kompasu | 65256 | stopień | 1/128 stopnia | 0 | 0-360° |
| 597 | Przełącznik hamulca | 65265 | - | 2 bity | - | Wył./Wł./Błąd/Niedostępne |
| 598 | Przełącznik sprzęgła | 65265 | - | 2 bity | - | Wył./Wł./Błąd/Niedostępne |
| 899 | Tryb momentu obrotowego silnika | 61444 | - | 1 | 0 | 0-15 (wyliczenie) |
| 1807 | Kąt kierownicy | 61449 | rad | 1/1024 rad | -31.374 | -31,374 do +31,374 radów |
| 1808 | Prędkość odchylenia | 61449 | rad/s | 1/8192 rad/s | -3,92 | -3,92 do +3,92 rad/s |
Łącznie: 15 PGN, 33 SPN aktywnie symulowane
🔲 Nieobsługiwane PGN-y (jeszcze nie zaimplementowane)
Następujące komunikaty J1939 nie są obecnie generowane przez symulator pojazdu. Stanowią one potencjalne przyszłe udoskonalenia:
| PGN | Klątwa | Nazwa | Priorytet | Przypadek użycia | Złożoność |
|---|---|---|---|---|---|
| 61440 | 0xF000 | ERC1 - Elektroniczny sterownik retardera 1 | Niski | Sterowanie retarderem/hamulcem silnikowym | Średni |
| 61441 | 0xF001 | EBC1 - Elektroniczny sterownik hamulca 1 | Wysoki | ABS, stan układu hamulcowego | Wysoki |
| 61442 | 0xF002 | ETC1 - Elektroniczny sterownik skrzyni biegów 1 | Średni | Tryb skrzyni biegów, zmiana biegów w toku | Średni |
| 64971 | 0xFDCB | VDHR – Odległość pojazdu (wysoka rozdzielczość) | Wysoki | Licznik kilometrów z rozdzielczością 5 mm | Niski |
| 64972 | 0xFDCC | TCO1 - Tachograf | Średni | Karta kierowcy, prędkość z tachografu | Niski |
| 65132 | 0xFE6C | TPMS – monitorowanie ciśnienia w oponach | Średni | Indywidualne ciśnienie/temperatura opon | Średni |
| 65217 | 0xFEC1 | PTODE - Włączanie napędu WOM | Niski | Status wału odbioru mocy | Niski |
| 65248 | 0xFEE0 | VDIST – odległość pojazdu w wysokiej rozdzielczości | Wysoki | Całkowita odległość z rozdzielczością 5 m | Niski |
| 65251 | 0xFEE3 | ECFG – Konfiguracja silnika | Niski | Marka, model, numer seryjny silnika | Niski |
| 65252 | 0xFEE4 | SHUTDN - wyłączenie | Niski | Ominięcie wyłączenia silnika | Niski |
| 65260 | 0xFEEC | VI - Identyfikacja pojazdu | Średni | Pełna skrzynia biegów VIN (częściowa implementacja) | Niski |
| 65279 | 0xFEFF | CCVS1 - Tempomat/Prędkość pojazdu 1 | Średni | Ulepszone dane tempomatu | Niski |
| 65098 | 0xFE4A | EBC2 - Elektroniczny sterownik hamulca 2 | Wysoki | Status hamulca indywidualnego koła | Wysoki |
| 65099 | 0xFE4B | EBC3 - Elektroniczny sterownik hamulca 3 | Średni | Zużycie okładzin hamulcowych | Średni |
| 65110 | 0xFE56 | IC1 - Warunki wlotowe/wydechowe 1 | Niski | Ciśnienie/temperatura kolektora dolotowego | Średni |
| 65172 | 0xFE84 | RQST - Prośba | Niski | Poproś o konkretny PGN z ECU | Średni |
| 65226 | 0xFECA | AT1I – Oczyszczanie spalin 1 wlotu gazu | Niski | Wlot filtra cząstek stałych | Niski |
| 65227 | 0xFECB | AT1O – Oczyszczanie spalin 1, wylot gazu | Niski | Wylot DPF, czujnik NOx | Niski |
| 65247 | 0xFEDF | EFL/P2 – Poziom/ciśnienie płynu silnikowego 2 | Niski | Dodatkowe ciśnienia płynu | Niski |
| 65266 | 0xFEF2 | LFE - Oszczędność paliwa | Średni | Średnie zużycie paliwa na trasie | Niski |
| 65270 | 0xFEF6 | TD - Turbosprężarka | Niski | Ciśnienie doładowania, prędkość turbiny | Średni |
| 65272 | 0xFEF8 | VEP2 - Zasilanie elektryczne pojazdu 2 | Niski | Dodatkowe autobusy elektryczne | Niski |
Dlaczego nie są one wdrażane
| Powód | Dotknięte PGN-y | Liczyć |
|---|---|---|
| Nie dotyczy podstawowego symulatora pojazdu | ERC1, PTODE, SHUTDN, ECFG, AT1I, AT1O, TD | 7 |
| Wymaga modelu fizyki opon | TPMS | 1 |
| Wymagany model z ABS/hamulcem | EBC1, EBC2, EBC3 | 3 |
| Wymaga zaawansowanej skrzyni biegów | ETC1 | 1 |
| Niski priorytet / kosmetyka | VI (VIN), VDHR, VDIST, TCO1, LFE | 5 |
| Wymagany model wydechowy/emisyjny | IC1, AT1I, AT1O | 3 |
| Poziom protokołu (nie dane pojazdu) | RQST | 1 |
| Wersje duplikowane/ulepszone | CCVS1, EFL/P2, VEP2 | 3 |
Łącznie: 22 nieobsługiwane PGN-y
🛠️ Cechy techniczne
- Obsługa sieci drogowej OpenDRIVE : podążaj za realistyczną geometrią drogi
- Symulacja automatycznej skrzyni biegów : zmiana biegów w zależności od prędkości i przepustnicy
- Dynamika oparta na fizyce : Przyspieszanie, hamowanie, kierowanie z realistycznymi ograniczeniami
- Integracja DDS : bezpośrednie publikowanie w tematach J1939 Automotive PSM
- Qt6 GUI : Wizualizacja w czasie rzeczywistym i sterowanie ręczne
Architektura J1939 do bramy DDS
Poniższy diagram sekwencji ilustruje kompletny przepływ danych od komunikatów magistrali CAN J1939 poprzez bramkę do abonentów 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)
Wyjaśnienie diagramu sekwencji
1. Faza generowania wiadomości
- Symulator pojazdu oblicza realistyczne parametry pojazdu na podstawie danych wprowadzanych przez kierowcę i praw fizyki
- Koduje parametry do ramek CAN J1939 z odpowiednią strukturą PGN/SPN
- Przesyła do wirtualnego interfejsu CAN (vcan0)
2. Faza odbioru CAN
- Wątek Qt SocketCanReader ciągle odczytuje dane z interfejsu CAN
- Sprawdza format ramki CAN (rozszerzony identyfikator 29-bitowy)
- Wysyła sygnał Qt z surowymi danymi ramki
3. Faza dekodowania J1939
- Dekoder J1939 wyodrębnia informacje o protokole z identyfikatora CAN:
- PGN : Numer grupy parametrów (identyfikuje typ wiadomości)
- Adres źródłowy : Identyfikator ECU (0-253)
- Priorytet : Pilność wiadomości (0=najwyższa, 7=najniższa)
- Dekoduje ładunek danych na poszczególne SPN-y przy użyciu konfiguracji:
- Pozycja i długość bitu
- Współczynnik skali i przesunięcie
- Jednostki inżynieryjne
4. Faza publikacji DDS
- Gateway publikuje
C_Parameter_Group_Definition(metadane PGN) przy pierwszym wystąpieniu - Dla każdego SPN w wiadomości:
- Tworzy komunikat
C_Parameterz wartością i statusem - Dodaje znacznik czasu i identyfikację źródła
- Publikuje w temacie DDS
- Tworzy komunikat
- Okresowe aktualizacje statusu (1 Hz) publikują informacje o stanie bramy
5. Faza konsumpcji
- Aplikacje GVA (HMI, LDMX) subskrybują tematy J1939 DDS
- Odbieraj aktualizacje parametrów za pośrednictwem oprogramowania pośredniczącego DDS
- Zaktualizuj elementy interfejsu użytkownika (prędkościomierz, obrotomierz, wyświetlacz biegów)
Szczegóły protokołu
Struktura identyfikatora CAN J1939 (29-bitowa)
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)Przykład dekodowania ramek 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)Szybki start
1. Zbuduj symulator pojazdu
cd build
cmake ..
make gva-vehicle-sim2. Konfiguracja wirtualnej sieci CAN
sudo scripts/test/j1939/setup-vcan.sh3. Uruchom symulator pojazdu
# 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. Uruchom bramę J1939
./build/bin/gva-j1939-gateway \
--domain=0 \
--interface=vcan0 \
--config=/etc/gva/j1939-config.json5. Monitoruj za pomocą LDMX
./build/bin/ldmx
# Navigate to J1939 tab to see live parametersKonfiguracja
Konfiguracja symulatora pojazdu
Utwórz plik 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
}
}Konfiguracja bramy J1939
Definicje PGN/SPN i parametry skalowania można znaleźć w /etc/gva/j1939-config.json .
Przypadki użycia
1. Rozwój HMI
- Utwórz tablicę rozdzielczą pojazdu bez fizycznego pojazdu
- Test renderowania i animacji zestawu wskaźników
- Sprawdź progi ostrzegawcze/alarmowe
2. Testowanie algorytmów
- Testuj algorytmy jazdy ekologicznej z symulowanym zużyciem paliwa
- Sprawdź logikę konserwacji predykcyjnej
- Testuj autonomiczne podejmowanie decyzji podczas jazdy
3. Testowanie integracyjne
- Zweryfikuj przepływ danych od początku do końca: CAN → DDS → Aplikacja
- Test wydajności bramy pod obciążeniem
- Sprawdź synchronizację danych między podsystemami
4. Szkolenie i demonstracja
- Bezpieczne środowisko do szkolenia operatorów
- Pokazy dla klientów bez pojazdu
- Narzędzie edukacyjne dla architektury GVA
Charakterystyka wydajności
| Metryczny | Wartość |
|---|---|
| Szybkość generowania ramek CAN | Do 100 Hz na PGN |
| Opóźnienie publikacji DDS | < 5 ms (lokalnie) |
| Przepustowość bramy | > 1000 PGN/sek. |
| Wykorzystanie procesora (symulator + bramka) | < 10% (system 4-rdzeniowy) |
| Ślad pamięci | ~50 MB (łącznie) |
Porównanie: fizyczne i symulowane
| Aspekt | Pojazd fizyczny | Symulator |
|---|---|---|
| Koszt sprzętu | 50 000+ dolarów | 0 zł (tylko oprogramowanie) |
| Czas konfiguracji | Godziny (okablowanie, konfiguracja) | Protokół |
| Powtarzalność | Ograniczona (zmienność sterownika) | Doskonały (deterministyczny) |
| Bezpieczeństwo | Ryzyko uszkodzenia/urazu | Zero ryzyka |
| Kontrola scenariuszy | Trudne (pogoda, ruch) | Pełna kontrola |
| Rejestrowanie danych | Wymaga sprzętu | Wbudowany |
| Testowanie równoległe | Jeden pojazd na raz | Wiele instancji |
Rozwiązywanie problemów
Typowe problemy
Nie znaleziono interfejsu CAN
# Verify vcan0 exists
ip link show vcan0
# Recreate if needed
sudo scripts/test/j1939/setup-vcan.shBrak wiadomości 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=0Brama nie dekoduje wiadomości
# Check CAN frames are being sent
candump vcan0
# Verify configuration file
cat /etc/gva/j1939-config.jsonZamów demonstrację już dziś.