Simulator Kenderaan J1939
Simulator Kenderaan dengan Sokongan J1939 CAN
Gambaran Keseluruhan
Simulator Kenderaan ( gva-vehicle-sim ) ialah alat pengujian dan pembangunan yang komprehensif untuk platform GVA (Senibina Kenderaan Generik). Ia menyediakan simulasi dinamik kenderaan yang realistik dengan penjanaan mesej bas CAN J1939 bersepadu, membolehkan pengujian perkakasan-dalam-gelung tanpa memerlukan perkakasan fizikal kenderaan.
Manfaat Simulasi J1939 untuk Penjanaan Mesej
🎯 Kelebihan Pembangunan & Pengujian
Pembangunan Bebas Perkakasan
- Membangun dan menguji aplikasi GVA tanpa perkakasan CAN fizikal
- Tidak perlu ECU kenderaan atau bangku ujian yang mahal
- Pembangunan selari merentasi pelbagai pasukan
Tingkah Laku Kenderaan yang Realistik
- Menjana Nombor Kumpulan Parameter (PGN) J1939 yang tulen dan Nombor Parameter yang Disyaki (SPN)
- Mensimulasikan dinamik kenderaan yang realistik (kelajuan, RPM, pertukaran gear, brek)
- Menyediakan data sensor yang disegerakkan mengikut masa
Pengurangan Kos
- Menghapuskan keperluan untuk kenderaan ujian fizikal dalam pembangunan awal
- Antara muka CAN Maya (
vcan0) membolehkan pengujian pada mana-mana stesen kerja Linux - Mengurangkan haus dan lusuh pada perkakasan fizikal
Prototaip Pantas
- Gelung maklum balas segera untuk pembangunan algoritma
- Penciptaan dan ulangan senario yang mudah
- Kadar mesej dan corak data yang boleh dikonfigurasikan
Pengujian Integrasi
- Sahkan fungsi gerbang J1939
- Aliran data ujian daripada topik CAN ke DDS
- Sahkan tindak balas HMI terhadap parameter kenderaan
Ujian Boleh Diulang
- Tingkah laku kenderaan deterministik
- Senario ujian yang boleh diulang
- Garis dasar yang konsisten untuk ujian regresi
📊 Sokongan Mesej J1939
✅ PGN yang Disokong Sepenuhnya (Dilaksanakan dalam Simulator Kenderaan)
Simulator kenderaan secara aktif menjana mesej J1939 berikut melalui CAN dan menerbitkannya kepada DDS melalui gerbang:
| PGN | Heks | Nama | Kadar | SPN | Penerangan |
|---|---|---|---|---|---|
| 61443 | 0xF003 | EEC2 - Pengawal Enjin Elektronik 2 | 50ms | 91, 92 | Kedudukan pedal pemecut, peratus beban enjin |
| 61444 | 0xF004 | EEC1 - Pengawal Enjin Elektronik 1 | 100ms | 190, 512, 513 | Kelajuan enjin (RPM), tork permintaan pemandu, tork enjin sebenar |
| 61445 | 0xF005 | ETC2 - Pengawal Penghantaran Elektronik 2 | 100ms | 522, 523, 524 | Kedudukan klac, gear terpilih, gear semasa |
| 61449 | 0xF009 | VDC2 - Kawalan Dinamik Kenderaan 2 | 100ms | 1807, 1808 | Sudut stereng, kadar yaw |
| 65253 | 0xFEE5 | JAM - Jam Enjin | 1s | 247 | Jumlah jam operasi enjin |
| 65256 | 0xFEE8 | VDS - Arah/Kelajuan Kenderaan | 250ms | 517, 519, 586 | Kelajuan di atas tanah, arah kompas, haluan |
| 65258 | 0xFEEA | ALT - Ketinggian | 1s | 580 | Ketinggian GPS di atas paras laut |
| 65262 | 0xFEEE | ET1 - Suhu Enjin 1 | 1s | 110, 174, 175 | Suhu penyejuk enjin, suhu bahan api, suhu minyak |
| 65263 | 0xFEEF | EFLP - Aras/Tekanan Bendalir Enjin | 500ms | 96, 100, 94 | Aras bahan api, tekanan minyak, tekanan penghantaran bahan api |
| 65265 | 0xFEF1 | CCVS - Kawalan Pelayaran/Kelajuan Kenderaan | 100ms | 84, 597, 598 | Kelajuan kenderaan berasaskan roda, suis brek, suis klac |
| 65267 | 0xFEF3 | Naib Presiden - Jawatan Kenderaan | 250ms | 584, 585 | Latitud GPS, longitud |
| 65269 | 0xFEF5 | AMB - Keadaan Ambien | 1s | 108, 171 | Tekanan barometrik, suhu udara ambien |
| 65271 | 0xFEF7 | VEP1 - Kuasa Elektrik Kenderaan 1 | 1s | 167, 168, 158 | Voltan bateri, voltan alternator, voltan sistem pengecasan |
| 65276 | 0xFEFC | DD - Paparan Papan Pemuka | 1s | 182, 183 | Kadar bahan api (L/j), penjimatan bahan api serta-merta |
| 0xEF00 | 0xEF00 | PROP_A - Hak Milik A (IONNIC USM) | 250ms | - | Kawalan LED untuk panel IONNIC USM ES-Key |
Senarai SPN Terperinci (Semua Parameter yang Disokong)
| SPN | Nama Parameter | PGN | Unit | Resolusi | Ofset | Julat |
|---|---|---|---|---|---|---|
| 84 | Kelajuan Kenderaan Berasaskan Roda | 65265 | km/j | 1/256 km/j | 0 | 0-250 km/j |
| 91 | Kedudukan Pedal Pemecut | 61443 | % | 0.4% | 0 | 0-100% |
| 92 | Peratus Beban Enjin pada Kelajuan Arus | 61443/61444 | % | 1% | 0 | 0-100% |
| 94 | Tekanan Penghantaran Bahan Api | 65263 | kPa | 4 kPa | 0 | 0-1000 kPa |
| 96 | Tahap Bahan Api | 65263 | % | 0.4% | 0 | 0-100% |
| 100 | Tekanan Minyak Enjin | 65263 | kPa | 4 kPa | 0 | 0-1000 kPa |
| 108 | Tekanan Barometrik | 65269 | kPa | 0.5 kPa | 0 | 0-125 kPa |
| 110 | Suhu Penyejuk Enjin | 65262 | °C | 1°C | -40 | -40 hingga +210°C |
| 158 | Voltan Sistem Pengecasan | 65271 | V | 0.05 V | 0 | 0-3212 V |
| 167 | Voltan Alternator | 65271 | V | 0.05 V | 0 | 0-3212 V |
| 168 | Voltan Bateri | 65271 | V | 0.05 V | 0 | 0-3212 V |
| 171 | Suhu Udara Ambien | 65269 | °C | 0.03125°C | -273 | -273 hingga +1735°C |
| 174 | Suhu Bahan Api | 65262 | °C | 1°C | -40 | -40 hingga +210°C |
| 175 | Suhu Minyak Enjin | 65262 | °C | 0.03125°C | -273 | -273 hingga +1735°C |
| 182 | Kadar Bahan Api | 65276 | L/j | 0.05 L/j | 0 | 0-3212 L/j |
| 183 | Penjimatan Bahan Api Segera | 65276 | km/L | 1/512 km/L | 0 | 0-125 km/L |
| 190 | Kelajuan Enjin | 61444 | RPM | 0.125 RPM | 0 | 0-8031 RPM |
| 247 | Jumlah Jam Enjin | 65253 | h | 0.05 jam | 0 | 0-210,554,060 jam |
| 512 | Tork Enjin Permintaan Pemandu | 61444 | % | 1% | -125 | -125% hingga +125% |
| 513 | Tork Enjin Sebenar | 61444 | % | 1% | -125 | -125% hingga +125% |
| 517 | Kelajuan di Atas Tanah | 65256 | km/j | 1/256 km/j | 0 | 0-250 km/j |
| 519 | Kursus Atas Tanah | 65256 | darjah | 1/128 darjah | 0 | 0-360° |
| 522 | Kedudukan Pedal Klac | 61445 | % | 0.4% | 0 | 0-100% |
| 523 | Gear Arus Penghantaran | 61445 | gear | 1 | -125 | -125 hingga +125 |
| 524 | Gear Terpilih Transmisi | 61445 | gear | 1 | -125 | -125 hingga +125 |
| 580 | Ketinggian | 65258 | m | 0.125 m | -2500 | -2500 hingga +5531 m |
| 584 | Latitud | 65267 | darjah | 10⁻⁷ darjah | -210 | -90° hingga +90° |
| 585 | Longitud | 65267 | darjah | 10⁻⁷ darjah | -210 | -180° hingga +180° |
| 586 | Galas Kompas | 65256 | darjah | 1/128 darjah | 0 | 0-360° |
| 597 | Suis Brek | 65265 | - | 2 bit | - | Mati/Hidup/Ralat/Tidak Tersedia |
| 598 | Suis Klac | 65265 | - | 2 bit | - | Mati/Hidup/Ralat/Tidak Tersedia |
| 899 | Mod Tork Enjin | 61444 | - | 1 | 0 | 0-15 (penghitungan) |
| 1807 | Sudut Stereng | 61449 | rad | 1/1024 rad | -31.374 | -31.374 hingga +31.374 rad |
| 1808 | Kadar Yaw | 61449 | rad/s | 1/8192 rad/s | -3.92 | -3.92 hingga +3.92 rad/s |
Jumlah: 15 PGN, 33 SPN yang disimulasikan secara aktif
🔲 PGN yang Tidak Disokong (Belum Dilaksanakan)
Mesej J1939 berikut tidak dijana oleh simulator kenderaan pada masa ini . Ini mewakili potensi penambahbaikan masa hadapan:
| PGN | Heks | Nama | Keutamaan | Kes Penggunaan | Kerumitan |
|---|---|---|---|---|---|
| 61440 | 0xF000 | ERC1 - Pengawal Perencat Elektronik 1 | Rendah | Kawalan brek/rencat enjin | Sederhana |
| 61441 | 0xF001 | EBC1 - Pengawal Brek Elektronik 1 | Tinggi | ABS, status sistem brek | Tinggi |
| 61442 | 0xF002 | ETC1 - Pengawal Penghantaran Elektronik 1 | Sederhana | Mod penghantaran, peralihan sedang dijalankan | Sederhana |
| 64971 | 0xFDCB | VDHR - Jarak Kenderaan (Resolusi Tinggi) | Tinggi | Odometer dengan resolusi 5mm | Rendah |
| 64972 | 0xFDCC | TCO1 - Takograf | Sederhana | Kad pemandu, kelajuan dari takograf | Rendah |
| 65132 | 0xFE6C | TPMS - Pemantauan Tekanan Tayar | Sederhana | Tekanan/suhu tayar individu | Sederhana |
| 65217 | 0xFEC1 | PTODE - Penglibatan Pemacu PTO | Rendah | Status pengangkut kuasa | Rendah |
| 65248 | 0xFEE0 | VDIST - Jarak Kenderaan Resolusi Tinggi | Tinggi | Jumlah jarak dengan resolusi 5m | Rendah |
| 65251 | 0xFEE3 | ECFG - Konfigurasi Enjin | Rendah | Jenama enjin, model, nombor siri | Rendah |
| 65252 | 0xFEE4 | SHUTDN - Penutupan | Rendah | Penggantian penutupan enjin | Rendah |
| 65260 | 0xFEEC | VI - Pengenalan Kenderaan | Sederhana | Transmisi VIN penuh (implan separa) | Rendah |
| 65279 | 0xFEFF | CCVS1 - Kawalan Jelajah/Kelajuan Kenderaan 1 | Sederhana | Data kawalan pelayaran yang dipertingkatkan | Rendah |
| 65098 | 0xFE4A | EBC2 - Pengawal Brek Elektronik 2 | Tinggi | Status brek roda individu | Tinggi |
| 65099 | 0xFE4B | EBC3 - Pengawal Brek Elektronik 3 | Sederhana | Haus lapisan brek | Sederhana |
| 65110 | 0xFE56 | IC1 - Keadaan Masuk/Ekzos 1 | Rendah | Tekanan/suhu manifold pengambilan | Sederhana |
| 65172 | 0xFE84 | RQST - Permintaan | Rendah | Minta PGN khusus daripada ECU | Sederhana |
| 65226 | 0xFECA | AT1I - Rawatan Selepas 1 Gas Pengambilan | Rendah | Saluran masuk penapis zarah diesel | Rendah |
| 65227 | 0xFECB | AT1O - Rawatan Selepas 1 Gas Keluar | Rendah | Soket DPF, sensor NOx | Rendah |
| 65247 | 0xFEDF | EFL/P2 - Paras/Tekanan Bendalir Enjin 2 | Rendah | Tekanan bendalir tambahan | Rendah |
| 65266 | 0xFEF2 | LFE - Penjimatan Bahan Api | Sederhana | Penjimatan bahan api purata/perjalanan | Rendah |
| 65270 | 0xFEF6 | TD - Pengecas Turbo | Rendah | Tekanan rangsangan, kelajuan turbin | Sederhana |
| 65272 | 0xFEF8 | VEP2 - Kuasa Elektrik Kenderaan 2 | Rendah | Bas elektrik tambahan | Rendah |
Mengapa Ini Tidak Dilaksanakan
| Sebab | PGN yang terjejas | Kiraan |
|---|---|---|
| Tidak berkaitan dengan sim kenderaan asas | ERC1, PTOD, SHUTDN, ECFG, AT1I, AT1O, TD | 7 |
| Memerlukan model fizik tayar | TPMS | 1 |
| Memerlukan model ABS/brek | EBC1, EBC2, EBC3 | 3 |
| Memerlukan transmisi lanjutan | DLL1 | 1 |
| Keutamaan rendah / kosmetik | VI (VIN), VDHR, VDIST, TCO1, LFE | 5 |
| Memerlukan model ekzos/pelepasan | IC1, AT1I, AT1O | 3 |
| Peringkat protokol (bukan data kenderaan) | RQST | 1 |
| Versi pendua/dipertingkatkan | CCVS1, EFL/P2, VEP2 | 3 |
Jumlah: 22 PGN yang tidak disokong
🛠️ Ciri-ciri Teknikal
- Sokongan Rangkaian Jalan OpenDRIVE : Ikuti geometri jalan yang realistik
- Simulasi Transmisi Automatik : Perubahan gear berdasarkan kelajuan dan pendikit
- Dinamik Berasaskan Fizik : Pecutan, brek, stereng dengan kekangan yang realistik
- Integrasi DDS : Penerbitan terus kepada topik PSM Automotif J1939
- GUI Qt6 : Visualisasi masa nyata dan kawalan manual
Senibina Gerbang J1939 hingga DDS
Gambar rajah jujukan berikut menggambarkan aliran data lengkap daripada mesej bas CAN J1939 melalui pintu masuk kepada pelanggan 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)
Penjelasan Gambarajah Jujukan
1. Fasa Penjanaan Mesej
- Simulator Kenderaan mengira parameter kenderaan yang realistik berdasarkan input dan fizik pemandu
- Mengekod parameter ke dalam bingkai CAN J1939 dengan struktur PGN/SPN yang betul
- Menghantar ke antara muka CAN maya (vcan0)
2. Fasa Penerimaan CAN
- Utas Qt SocketCanReader membaca secara berterusan daripada antara muka CAN
- Mengesahkan format bingkai CAN (ID lanjutan 29-bit)
- Memancarkan isyarat Qt dengan data bingkai mentah
3. Fasa Dekod J1939
- J1939Decoder mengekstrak maklumat protokol daripada CAN ID:
- PGN : Nombor Kumpulan Parameter (mengenal pasti jenis mesej)
- Alamat Sumber : Pengecam ECU (0-253)
- Keutamaan : Kecemasan mesej (0=tertinggi, 7=terendah)
- Menyahkod muatan data ke dalam SPN individu menggunakan konfigurasi:
- Kedudukan dan panjang bit
- Faktor skala dan ofset
- Unit kejuruteraan
4. Fasa Penerbitan DDS
- Gateway menerbitkan
C_Parameter_Group_Definition(metadata PGN) pada kejadian pertama - Untuk setiap SPN dalam mesej:
- Mencipta mesej
C_Parameterdengan nilai dan status - Menambah cap waktu dan pengenalpastian sumber
- Menerbitkan ke topik DDS
- Mencipta mesej
- Kemas kini status berkala (1 Hz) menerbitkan kesihatan gerbang
5. Fasa Penggunaan
- Aplikasi GVA (HMI, LDMX) melanggan topik J1939 DDS
- Terima kemas kini parameter melalui perisian tengah DDS
- Kemas kini elemen UI (speedometer, takometer, paparan gear)
Butiran Protokol
Struktur ID CAN J1939 (29-bit)
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)Contoh Penyahkodan Bingkai 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)Mula Pantas
1. Bina Simulator Kenderaan
cd build
cmake ..
make gva-vehicle-sim2. Sediakan CAN Maya
sudo scripts/test/j1939/setup-vcan.sh3. Mulakan Simulator Kenderaan
# 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. Mulakan Gerbang J1939
./build/bin/gva-j1939-gateway \
--domain=0 \
--interface=vcan0 \
--config=/etc/gva/j1939-config.json5. Pantau dengan LDMX
./build/bin/ldmx
# Navigate to J1939 tab to see live parametersKonfigurasi
Konfigurasi Simulator Kenderaan
Cipta 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
}
}Konfigurasi Gerbang J1939
Lihat /etc/gva/j1939-config.json untuk definisi PGN/SPN dan parameter penskalaan.
Kes Penggunaan
1. Pembangunan HMI
- Membangunkan papan pemuka kenderaan tanpa kenderaan fizikal
- Uji pemaparan dan animasi kluster instrumen
- Sahkan ambang amaran/penggera
2. Pengujian Algoritma
- Uji algoritma pemanduan eko dengan penggunaan bahan api simulasi
- Sahkan logik penyelenggaraan ramalan
- Uji proses membuat keputusan pemanduan autonomi
3. Pengujian Integrasi
- Sahkan aliran data hujung ke hujung: CAN → DDS → Aplikasi
- Prestasi gerbang ujian di bawah beban
- Sahkan penyegerakan data merentasi subsistem
4. Latihan & Demonstrasi
- Persekitaran selamat untuk latihan pengendali
- Demonstrasi pelanggan tanpa kenderaan
- Alat pendidikan untuk seni bina GVA
Ciri-ciri Prestasi
| Metrik | Nilai |
|---|---|
| Kadar penjanaan bingkai CAN | Sehingga 100 Hz setiap PGN |
| Latensi penerbitan DDS | < 5 ms (tempatan) |
| Daya pemprosesan gerbang | > 1000 PGN/saat |
| Penggunaan CPU (simulator + get laluan) | < 10% (sistem 4-teras) |
| Jejak ingatan | ~50 MB (gabungan) |
Perbandingan: Fizikal vs. Simulasi
| Aspek | Kenderaan Fizikal | Simulator |
|---|---|---|
| Kos Perkakasan | $50,000+ | $0 (perisian sahaja) |
| Masa Persediaan | Waktu (pendawaian, konfigurasi) | Minit |
| Kebolehulangan | Terhad (kebolehubahan pemacu) | Sempurna (deterministik) |
| Keselamatan | Risiko kerosakan/kecederaan | Risiko sifar |
| Kawalan Senario | Sukar (cuaca, lalu lintas) | Kawalan penuh |
| Pembalakan Data | Memerlukan peralatan | Terbina dalam |
| Pengujian Selari | Satu kenderaan pada satu masa | Pelbagai contoh |
Penyelesaian masalah
Isu-isu Biasa
Antara Muka CAN Tidak Ditemui
# Verify vcan0 exists
ip link show vcan0
# Recreate if needed
sudo scripts/test/j1939/setup-vcan.shTiada Mesej 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=0Gerbang Tidak Menyahkod Mesej
# Check CAN frames are being sent
candump vcan0
# Verify configuration file
cat /etc/gva/j1939-config.jsonMinta demonstrasi hari ini.