Zagreb, bez zaobilaznih ruta.
Google Maps ne zna da stepenice postoje. Putem po Zagrebu zna. Aplikacija računa rute oko prijavljenih prepreka i daje glasovne upute za slijepe osobe koji mogu koristiti samo mikrofon.
Problem
Standardna navigacija ne razlikuje pješake. Za osobu u kolicima, jedna stepenica na ruti znači povratak na početak. Ovaj projekt skuplja prijave prepreka od stvarnih korisnika i koristi ih pri izračunu svake rute.
Osobe u kolicima
Rute zaobilaze stepenice i visoke rubnjake koje su prijavljene u bazi.
Slijepe osobe
Samo mikrofon, bez dodirivanja ekrana. Aplikacija razumije normalnu rečenicu na hrvatskom.
Crowdsourcing
Korisnici prijavljuju prepreke direktno na karti. Odmah postaju dio baze za sve.
Grad Zagreb
Baza prepreka je otvorena. Može je koristiti i gradski ured za planiranje.
Što pokreće aplikaciju
Claude Haiku
Parsira što korisnik kaže i odlučuje što aplikacija treba napraviti.
Groq Whisper
Pretvara govor u tekst. Posebno podešen za hrvatska mjesta i ulice.
ORS Wheelchair
Routing engine koji računa rute bez stepenica i visokih rubnjaka.
ZET Real-time
Žive pozicije tramvaja i autobusa na karti, bez osvježavanja stranice.
Kako početi
Nema instalacije. Otvorite putempozgu.andric.studio u pregledniku i krenite.
Koraci
Odaberite profil
Gore u izborniku odaberite Kolica, Slijepi, Opće ili Bicikl. Od toga ovisi koji se algoritam koristi i koje prepreke vidite.
Unesite polazište i odredište
Upišite ulicu ili kliknite 📍 da aplikacija uzme vašu lokaciju. Zadnjih 5 adresa pamti se automatski.
Kliknite "Traži pristupačnu rutu"
Ruta se crta na karti plavom linijom, zaobilazi sve prijavljene prepreke za vaš profil.
Pratite upute
Skretnice su vidljive na karti. Kod slijepog profila aplikacija govori udaljenost u koracima, bez da trebate gledati ekran.
Prijavite prepreke
Tipka + dolje desno. Tapnite mjesto na karti, odaberite tip, gotovo.
Profili
Ovisno o profilu mijenja se i što vidite na karti i kako se računa ruta.
Kolica
Wheelchair routing- OpenRouteService wheelchair profil
- Zaobilazi stepenice, visoke rubnjake i oštećene rampe
- 149 prijavljenih prepreka u bazi
- Skretnice s procjenom trajanja puta
Slijepi
AI Voice mode- Automatska aktivacija mikrofona
- Udaljenost izražena u koracima
- Groq Whisper + Claude Haiku pipeline
- 22 snimljene fraze na hrvatskom za brže odgovore
- Wake word detekcija
Opće pješačenje
OSRM foot- OSRM foot profil — brze rute
- Prikazuje rubnjake i ostale prepreke
- Manji broj prepreka relevantnih za pješake
Bicikl
OSRM cycling- OSRM cycling profil
- Može se kombinirati s prikazom Bajs stanica
- Stanice javnih bicikala
Glasovne naredbe
U slijepom profilu mikrofon se uključuje sam. Govorite normalnom rečenicom na hrvatskom, aplikacija shvati što trebate.
Primjeri
Kako to radi ispod haube
Detekcija govora
Browser sam detektira kad govorite, bez posebnih biblioteka. Šalje isječke od 3 sekunde na server.
Prepoznavanje govora
Groq Whisper pretvara audio u tekst. Ima poseban popis 80+ zagrebačkih ulica i okretišta da bolje razumije HR izgovor.
Razumijevanje namjere
Claude Haiku čita transkript i odlučuje što treba napraviti: postaviti odredište, pokrenuti navigaciju, zaustaviti je itd.
Glasovni odgovor
22 unaprijed snimljene fraze na hrvatskom za česte odgovore. Za sve ostalo koristi se Web Speech API.
Prijave prepreka
Prepreke prijavljuju korisnici, a odmah se koriste pri izračunu ruta za sve ostale.
Što se može prijaviti
Stepenice
Ulazi u zgrade, pothodnici, prijelazi bez rampe.
Visoki rubnjak
Rubnjaci koje kolica ne mogu prijeći.
Kamene kocke
Neujednačene površine otežane za kolica i štap.
Oštećena rampa
Rampa koja postoji ali ne funkcionira.
Ostalo
Gradilišta, zatvoren prolaz, privremene prepreke.
Kako prijaviti
Kliknite "+"
Zeleni + dolje desno. Karta prelazi u mod prijave.
Tapnite lokaciju
Kliknite točno mjesto na karti. Otvara se forma za unos.
Odaberite tip
Stepenice, rubnjak, oštećena rampa ili ostalo. Opis je opcionalan.
Odmah aktivno
Prepreka se odmah vidi na karti i ulazi u izračun ruta za sve.
/admin: tablica svih prepreka, verifikacija i brisanje. Svi korisnički inputi su zaštićeni od XSS napada.
Slojevi i karte
U panelu postavki (⚙ gore desno) birate stil karte i što se prikazuje na njoj.
Vrste karte
Standardna
OpenStreetMap, zadana. Ulice i nazivi vidljivi.
Satelit
Snimke iz zraka, visoka rezolucija.
Topografija
Reljef i visinske linije terena.
Sivkasta
Tamna paleta, prepreke su uočljivije.
Opcijski slojevi
Gužva u prometu
Boje cesta prema brzini prometa u realnom vremenu (TomTom).
Javni prijevoz
Gdje su tramvaji i autobusi upravo sada.
Bajs
Stanice javnih bicikala s brojem slobodnih komada.
Zdravstvo
Bolnice i ljekarne. Dežurne (0-24h) posebno označene.
Moja lokacija
Prati GPS i drži kartu centriranu na vas.
Prilagodba boja
Oko 8% muškaraca ne razlikuje neke boje. Aplikacija ima 4 palete koje mijenjaju boje prepreka na karti.
Standardna
Zadana paleta.
Deuteranopija
Crveno-zeleno sljepilo (~8% muškaraca).
Protanopija
Ne razlikuju crvenu boju (~2% muškaraca).
Tritanopija
Plavo-žuto sljepilo (~0.003%).
Akromatopsija
Potpuno sljepilo boja — visoki kontrast.
Arhitektura
Flask backend, SQLite baza, vanjski routing API-jevi i AI servisi.
┌── Browser (Leaflet.js) ───────────────────────────┐
│ Routing UI | Voice UI (VAD+TTS) | Map + Layers │
└───────┬─────────┬─────────────────────┘
| |
┌─────────┬─────────┬─ Flask (port 5072) ──┐
│ /api/route /api/voice-stt /api/obstacles │
│ /api/geocode /api/ai-command /api/zdravstvo │
└───────┬─────────┬───────────┬────────┘
| | |
ORS/OSRM Groq Whisper SQLite DB
Nominatim Claude Haiku + ZET WebSocket
+ TomTom/Bajs
Python / Flask
Backend i REST API. PM2 drži proces pokrenutim.
SQLite
Baza prepreka. Nema potrebe za PostgreSQLom.
Leaflet.js
Karta s više stilova i oznakama prepreka.
Claude Haiku
Razumijevanje glasovnih naredbi na hrvatskom. Vraća samo JSON.
Deployment
# PM2 pokretanje pm2 start app.py --name inova-wheelchair --interpreter python3 # Nginx reverse proxy server { server_name putempozgu.andric.studio; location / { proxy_pass http://localhost:5072; } } # SSL certbot --nginx -d putempozgu.andric.studio
API
Baza pokreće https://putempozgu.andric.studio/api/. Čitanje je otvoreno, bez autentikacije.
Prepreke
| Metoda | Endpoint | Opis |
|---|---|---|
| GET | /api/obstacles | Sve prepreke (opcija ?verified=1) |
| POST | /api/obstacle | Prijava prepreke. Body: {lat, lon, type, description} |
| POST | /api/obstacle/<id>/verify | Verifikacija (admin) |
| DELETE | /api/obstacle/<id> | Brisanje (admin) |
Routing i geocoding
| Metoda | Endpoint | Opis |
|---|---|---|
| POST | /api/route | Izračun rute. Body: {start, end, profile} |
| GET | /api/geocode?q= | Geocoding (Photon → Nominatim fallback) |
| GET | /api/terminals | ZET terminusi za autocomplete |
AI i glasovni endpointi
| Metoda | Endpoint | Opis |
|---|---|---|
| POST | /api/voice-stt | Audio blob → tekst (Groq Whisper). Limit: 10/min/IP |
| POST | /api/ai-command | Tekst → JSON akcija (Claude Haiku). Limit: 10/min/IP |
| GET | /api/tts-manifest | Lista predsnimljenih HR TTS fraza |
Javni slojevi
| Metoda | Endpoint | Opis |
|---|---|---|
| GET | /api/zdravstvo | Bolnice i ljekarne s koordinatama |
| GET | /api/bajs-stations | Bajs stanice s brojem bicikala |
| GET | /api/stats | Statistike aplikacije |
Primjer — Prijava prepreke
POST /api/obstacle { "lat": 45.8134, "lon": 15.9775, "type": "stairs", "description": "Nepristupačan ulaz u pothodnik" } // Odgovor: { "id": 247, "status": "created" }
Izvorni kod
Kompletan izvorni kod aplikacije. Ukupno 4 datoteke.
Učitavanje...