Dashboard operator ROV: telemetri real-time, visualisasi attitude 3D (three.js), dan umpan kamera. Dibangun dengan HTML/CSS/JS murni di sisi tampilan, jembatan Node.js di tengah, dan UDP ke Raspberry Pi (ROV).
Browser (dashboard) <--- WebSocket ---> Node.js server <--- UDP ---> Raspi (ROV)
three.js + UI ws://:8080 server.js :14551 telemetri
:14550 command
hydroship/
├─ public/ # dashboard (dibuka di browser)
│ ├─ index.html
│ ├─ css/style.css
│ └─ js/
│ ├─ config.js # << atur IP kamera / model 3D di sini
│ ├─ app.js # WebSocket, telemetri, kontrol, simulator
│ └─ scene.js # three.js: ROV 3D + cincin kompas
│ └─ models/ # taruh rov.glb / rov.fbx di sini (opsional)
├─ server/
│ ├─ server.js # jembatan WebSocket <-> UDP + static server
│ └─ package.json
└─ raspi_rov_example.py # contoh format UDP di sisi ROV
cd server
npm install
npm run sim # server + telemetri palsuBuka http://localhost:8080. ROV 3D akan bergerak mengikuti data simulasi.
Tanpa server pun dashboard tetap hidup: buka
public/index.htmllangsung, ia otomatis masuk mode DEMO (simulator di browser).
- Atur IP di
server/server.js(atau via env):RPI_ADDR= IP Raspberry Pi. - Jalankan server:
cd server && npm install && npm start
- Di Raspi, kirim telemetri UDP ke IP komputer server, port 14551, dan
dengarkan command di port 14550. Lihat
raspi_rov_example.py:python3 raspi_rov_example.py --server <IP_KOMPUTER_SERVER>
- Buka
http://<IP_KOMPUTER_SERVER>:8080di laptop operator.
Wireless dilarang aturan KKI — pastikan semua lewat kabel Ethernet umbilical, satu subnet (mis. laptop 192.168.2.1, Raspi 192.168.2.2).
Telemetri (Raspi → server, UDP JSON):
{ "heading": 112.0, "roll": 2.6, "pitch": 4.0, "depth": 0.0,
"temp": 26.5, "voltage": 15.6, "armed": false, "light": false, "ts": 1718...}Field yang kosong/absen tampil sebagai "—". Sudut dalam derajat, depth meter.
Command (server → Raspi, UDP JSON):
{ "name": "light", "value": true, "t": 1718... } // light/arm/record/snapshot
{ "name": "stop", "value": true } // failsafe: netralkan thrusterDi Raspi, stop HARUS langsung menetralkan semua thruster.
Default memakai model open-frame bawaan (dibuat dari primitif). Untuk pakai model asli ROV Anda:
- Ekspor dari Fusion (
.fbx) atau Blender (.glb). - Taruh di
public/models/, mis.public/models/rov.glb. - Di
public/js/config.js, setMODEL_URL: "models/rov.glb".
Model di-skala & dipusatkan otomatis. Pastikan haluan (depan) menghadap +Z
agar orientasi heading benar; kalau terbalik, rotasikan model di Blender/Fusion
sebelum ekspor, atau tambahkan offset rotasi di scene.js.
Browser tidak bisa memutar RTSP langsung. Paling mudah: ubah ke MJPEG.
- Di Raspi: jalankan
mjpg-streamer(outputhttp://<raspi>:8080/?action=stream), atau transcode RTSP→MJPEG dengan ffmpeg. - Set URL itu di
config.js→CAMERA_URL. - Upgrade kualitas/latensi rendah: pakai WebRTC (mis.
mediamtx/go2rtc) dan ganti<img>jadi<video>diindex.html.
three.js dimuat dari CDN (unpkg) lewat import map. Agar jalan offline:
- Unduh
three@0.169.0(build/three.module.js+ folderexamples/jsm/). - Taruh di
public/vendor/three/. - Ubah import map di
index.htmlagar menunjuk kevendor/three/...(path lokal). Font Google juga sebaiknya di-self-host; jika gagal dimuat, fallback monospace/sans tetap terbaca.
- Spasi = STOP (failsafe) kapan saja.
- Klik & drag pada panel ATTITUDE untuk memutar pandangan 3D.