» »

Beleženje udeležbe v prometu

Beleženje udeležbe v prometu

«
1
2

jype ::

Zajemanje podatkov z Bluetooth GPS enote, montirane na čelado:
http://aufbix.org/gpspys60/

Izrisovanje teh GPS podatkov na video, zajet s kamero, montirano na kolo:
#!/usr/bin/python
#-*- coding: utf-8 -*-
import cv, sys, os, pyexif, datetime, time, calendar
from lxml import html
kml = html.parse(sys.argv[2])
offset = int(sys.argv[3])
tsdata = list()
for x in kml.iter('placemark'):
        if x.getchildren()[0].tag != 'name':
                continue
        try:
                data = list(x.iter('td'))
                if not data:
                        continue
                lon = data[0].text.split(':',1)[1].replace(' ', '')
                lat = data[1].text.split(':',1)[1].replace(' ', '')
                if lon.startswith('-'):
                        lon='W'+lon
                else:
                        lon='E'+lon
                if lat.startswith('-'):
                        lat='S'+lat
                else:
                        lat='N'+lat
                alt = '%d m' % int(round(float(data[2].text.split(':',1)[1].strip().split(' ', 1)[0])))
                spd = data[3].text.split(':',1)[1]
                if 'km/hour' in spd:
                        spd = '%4.1f km/h' % float(spd.strip().split(' ', 1)[0])
                else:
                        spd = '%4.1f km/h' % 0.0
                hdg = '%d degrees' % int(round(float(data[4].text.split(':',1)[1].replace(' ', ''))))
                gpsclk = data[5].text.split(':',1)[1].replace(' ', '')
                try:
                        ts = calendar.timegm(datetime.datetime.strptime(gpsclk, '%Y-%m-%dT%H:%M:%SZ').timetuple())
                except:
                        ts = calendar.timegm(datetime.datetime.strptime(gpsclk, '%Y-%m-%dT%H:%M:%S.%fZ').timetuple())
                tsdata.append(dict(ts=ts, hdg=hdg, alt=alt, spd=spd, gpsclk=gpsclk, lat=lat, lon=lon))                                                                                                                           
        except Exception, m:                                                                                                                                                                                                     
                raise                                                                                                                                                                                                            
                print m                                                                                                                                                                                                          
exif = pyexif.ExifEditor(sys.argv[1])                                                                                                                                                                                            
start = int(time.mktime(datetime.datetime.strptime(exif.getTag('CreateDate'), '%Y:%m:%d %H:%M:%S').timetuple()))                                                                                                                 
duration = exif.getTag('Duration')                                                                                                                                                                                               
dur = 0                                                                                                                                                                                                                          
i = 0                                                                                                                                                                                                                            
for chunk in reversed(duration.split(':')):                                                                                                                                                                                      
        dur += int(chunk) * 60**i                                                                                                                                                                                                
        i += 1                                                                                                                                                                                                                   
capture = cv.CaptureFromFile(sys.argv[1])                                                                                                                                                                                        
fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)                                                                                                                                                                         
height = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT))                                                                                                                                                        
width = int(cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH))                                                                                                                                                                                              
cv.NamedWindow('title', cv.CV_WINDOW_AUTOSIZE)                                                                                                                                                                                   
c = 0                                                                                                                                                                                                                            
font1 = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, cv.CV_AA)                                                                                                                                                            
font2 = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 5, cv.CV_AA)                                                                                                                                                            
data = dict(ts='unknown',hdg='unknown',alt='unknown',spd='unknown',lat='unknown',lon='unknown',gpsclk='unknown',)                                                                                                                
color1 = cv.CV_RGB(255, 20, 20)
color2 = cv.CV_RGB(10, 10, 10)
if len(sys.argv) == 5:
        writer = cv.CreateVideoWriter(  filename=sys.argv[4],
                                                                        fourcc=cv.CV_FOURCC('F','M','P','4'),
                                                                        fps=fps,
                                                                        frame_size=(width,height),
                                                                        is_color=1)
else:
        writer = None

def txt(img, text, x, y):
        cv.PutText(img, text, (x, y), font2, color2)
        cv.PutText(img, text, (x, y), font1, color1)

while True:
        ts = start + c / fps
        if tsdata and tsdata[0]['ts'] < ts + offset:
                data = tsdata.pop(0)
        img = cv.QueryFrame(capture)
        if not img:
                break
        txt(img, 'heading: %(hdg)s' % data, 10, 30)
        txt(img, 'pos: %(lat)s' % data, 10, 60)
        txt(img, '     %(lon)s' % data, 10, 90)
        txt(img, 'alt: %(alt)s' % data, 10, 120)
        txt(img, 'speed: %(spd)s' % data, 10, 150)
        txt(img, 'gps clock: %(gpsclk)s' % data, 10, height-30)
        txt(img, 'cam clock: %s' % time.asctime(time.localtime(ts)), 630, height-30)
        #cv.SaveImage('img%05d.jpg' % c, img)
        if writer:
                cv.WriteFrame(writer, img)
        else:
                cv.ShowImage('title', img)
                key = cv.WaitKey(1)
                if key == ord('q'):
                        break
        c+=1

jype ::

GPS sprejemnik, s katerega telefon zajema podatke:



V delu je še en del vizualizacije, a še vsaj nekaj tednov ni pričakovati, da bi ga lahko pokazal.

Zgodovina sprememb…

  • spremenilo: jype ()

Invictus ::

Lahko pa se kupi tudi tako kamero ...

http://contour.com/products/contour-gps
"Life is hard; it's even harder when you're stupid."

http://goo.gl/2YuS2x

jype ::





Problem s contour je ta, da ga nimam - pa da mu kljub vsemu manjka cel kup senzorjev (bi pa bilo lažje sinhronizirat zajem kamere in različnih senzorjev z GPS uro). Verjetno bom raje kupil Hero 2.

Poleg zgoraj omenjenega sem poskušal zajemat še accelerometer in magnetometer v telefonu, a bi moral nekako zagotoviti, da je telefon togo pritrjen na okvir kolesa (kadar je v žepu pod vodoodporno obleko, se glede na kolo toliko premika, da so podatki neuporabni), kar pa je težko narediti vodotesno.

jype ::

Pithlit ::

jype je izjavil:

kar pa je težko narediti vodotesno.

Double ziplock bag. Če ne greš ravno plavat bi moralo zdržat. Ni pa grozno estetsko.
Life is as complicated as we make it...

jype ::

Pithlit> Če ne greš ravno plavat bi moralo zdržat.

Žal grem ravno plavat.

s51as ::

yjpe tole je pa zlo dobr
It's just me myself and I

Rias Gremory ::

@jype
si sam napisal kodo?
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

Isotropic ::

gopro kamerca

jype ::

LinksysOne> si sam napisal kodo?

Tako grde kode jaz nikol ne bi kazal javnosti!

Ja, sem, v 10 minutah. Ko bom imel čas, bom iz tega naredil nekaj, kar ne zgleda kot barakarsko naselje (in bo podpiralo še par reči, ki bodo awesome).

Rias Gremory ::

Umm zakaj je pa grda koda?
O veliki jype nauči me pythona. :D Tega jaz ne bi napisal niti v sanjah. ;((
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

jype ::

Uh, strahotno grozna koda je.

Pravilno bi bilo imeti par generatorjev, ki jim lahko podaš odmik (da lahko sinhroniziraš različne vire podatkov), potem pa ti vračajo podatke glede na interno uro.

Vse skupaj bi moralo biti zavito v razred, ki ga lahko razširiš s svojimi viri podatkov in svojimi načini izpisovanja in izrisovanja, ne da bi moral pri tem skrbeti za vse ostale komponente.

Nenazadnje manjkajo tudi komentarji - program bere en kup različnih zapisov in iz vsakega pobira določene reči, nikjer pa ne piše niti kaj pomenijo, niti kako se jih predrugači, da postanejo uporabni za izpis v videu, kar pomeni da bo branje programa čez nekaj let precej bolj zahtevno, kot je bilo njegovo pisanje.

Rias Gremory ::

Saj komentarje dokaj hitro napisane. Class se pa samo na začetku naredi in potem v njega piše, ali se motim?
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

jype ::

Ja, ampak če tle navrh "class" napišem bo še vedno skrpucalo :)

Bom, enkrat, preden umrem!

Rias Gremory ::

Verjamem vate.
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

krneki0001 ::

jype, zamenjaj telefon. Sonim z GPS-jem sicer stane 400 evrov, ampak proizvajalec garantira da brez problemov deluje 1m pod vodo eno celo uro.
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

jype ::

Bi, pa ni najbolj prijazna platforma za programirat na njej.

Letalec ::

jype je izjavil:

Pithlit> Če ne greš ravno plavat bi moralo zdržat.

Žal grem ravno plavat.


Obstajajo tudi ti. "kože za telefone" ki zgledajo kakor kondom, in tudi uporaba je identična, zdrži dolgotrajno potopitev. Zadeva pa stane mislim da cca. 4€. Če ne padaš na marketinške fore in uporabiš navaden kondom, je skoraj Đabe. Kot nalašč za plavat :).

jype ::

To zgleda prima, žal pa mora zdržat tudi fizične obremenitve - telefon mora biti togo pritrjen na bicikl (t.j. ves čas orientiran enako glede na okvir), da lahko merilniki pospeška od sebe dajejo uporabne podatke.

Zelo verjetno bom (po koncu poletja, prej ne bom utegnil) raje naredil svoj vodoodporen paket senzorjev, ker v telefonih še vedno ni žiroskopa, ki bi ga potreboval za "umetni horizont", s katerim bi lahko računal in na posnetek risal sile, ki delujejo na kolo (tudi med zavoji), ki bo prek bluetooth povezave obscene količine meritev stresal mobilnemu telefonu.

s51as ::

Lahko bi pritrdil telefon pod sedež kolesa. Tako ga zavaruješ že s konstrukcijo sedeža. Žiroskop pa verjetno najlažje dobiš s kakega modela helihopterja. Ali pa Kaj takega
It's just me myself and I

jype ::

Ja, saj že imam en arduino nano in gor obešeno vse živo (razen gps), manjka pa bluetooth povezava.

Tako reč je precej lažje spravit v vodotesno ohišje in jo imet privijačeno na fajfo na biciklu, kjer lahko z utripanjem ledic spremljaš delovanje, ker imaš potem telefon še vedno, well, mobilen.

s51as ::

Potem pa kupi en IP68 ohišje pa daj notri kar misliš dat pa pritrdi kamor misliš pritrdit.
IP68 je popolna odpornost na prah in popolna vodotesnost (trajna potopitev).
It's just me myself and I

jype ::

Ja. Ampak jaz rad s telefonom tudi telefoniram, občasno, zato ga ne bi rad imel v takem ohišju privijačenega na bicikl :)

s51as ::

Skoraj pozabljena funkcija telefona, ki res včasih prav pride...

Eh... včas je blo ensotavnej... si se usedu na bicikl pa si šu... zdej pa nikamor ne moreš če ti en senzor ne pove da se kolo v pravo smer vrti...
It's just me myself and I

jype ::

Letos sem bil brez kamer samo enkrat in ravno takrat se je vame zaletel en hipi!

Pa tok dobr posnetek bi bil!

Gre za zabavo, ne za kakršnokoli nujo.

Rias Gremory ::

Ampak bi pa lahko naredil dober sistem beleženja na ta način. :)
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

s51as ::

jype sej vem, mi je zelo impresivno tole tvoje znanje. Nebi drgač niti pomislu da bi kej takega lahko sam naredil, če bi znal pa vsekakor bi.

Za taka bolj trda srečanja imam jaz en triosni accelerometer, ki meri do 2000g, odporen je pa do 5000g. Sam pospeškomer sicer ne rabi napajanja, samo za zajem podatkov mam pa eno škatlo ki se priklopi na 220 tako da ni praktično za na kolo. Sem pa videl da že obtajajo sicer nekoliko počasnejši ampak po moje še vedno dovolj dobri DAci napajani skozi USB to je pa že 5V in gre tudi kako drugače :D
It's just me myself and I

krneki0001 ::

jype je izjavil:

Bi, pa ni najbolj prijazna platforma za programirat na njej.



A nima sonim jave. Tam bi ti to moralo vse delat.

http://sonim-sdk-for-the-java-tm-me-pla...
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

Zgodovina sprememb…

jype ::

Java (MIDP še posebej) je precej žalostno okolje za hitro pisanje prototipov.

krneki0001 ::

Osebno je zame java navaden dre*.

A misliš da kakega C in C++ pa nebi spravil gor?

Če se da ruby na nokii X6 lepo laufat, bi se pomoje tudi na sonimu c in c++.
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

jype ::

Imaš enak problem: Predolg razvojni cikel. Z Ruby in Python in celo Javascriptom bi šlo brez težav. Precej pomembno je, da lahko kodo spreminjaš kar "na terenu", torej s telefonom samim.

Gandalfar ::

Glede na to imas produkcijo dvakrat na dan, te pomojem ne bi bolelo, ce bi rabil nov binary naredit na laptopu na vsaki strani poti.

jype ::

Če bi bil tak povprečnež kot tisti tip iz kiberpipe, morda. Jaz pregledujem podatke (in spreminjam kodo) medtem ko čakam na semafor.

Gandalfar ::

Slisat je grozno nevarno za ostale udelezence v prometu.

jype ::

A tipkanje po telefonu med čakanjem na zeleno luč?

Morda. K temu me je nagovorila Mobitelova reklama, oni so krivi.

black ice ::

jype je izjavil:

Če bi bil tak povprečnež kot tisti tip iz kiberpipe, morda.

Govoriti o sebi v tretji osebi je indic (morebitnih) psihičnih težav. >:D

jype ::

Me zanima čemu mnogi mislijo, da samo jaz kolesarim v tem mestu.

Rias Gremory ::

Zbujaš preveč pozornosti in mislimo, da je vsak kolesar v Ljubljani jype. :P
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

Gandalfar ::

> A tipkanje po telefonu med čakanjem na zeleno luč?

Ja, ker ne mores zacet dovolj hitro in s tem oviras promet. Poleg tega nisi popolnoma skoncentriran na promet okoli sebe in nisi sposoben pravocasno opazit nevarnih (sebi in drugim) udelezencev.

jype ::

Maš prav, delam na retinal projector sistemu in seveda

d4vid ::

Živjo, bi se dalo naredit nekaj podobnega s RPi in web kamero/RPi kamero? Doma imam tudi Garmin GPS (za v avto), bi se dalo s to opremo posnet podobno kot od jype-a?
Main PC: Asus PN50 | AMD Ryzen 5 4500U | 16 GB RAM | 256 GB SSD
PC2: HP Z400 | Intel Xeon L5630 | 6 GB RAM | 120 GB SSD
Laptop: HP Elitebook 840G1 | Intel i5 | 8 GB RAM | 256 GB SSD

krneki0001 ::

Komot.
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

d4vid ::

krneki0001 je izjavil:

Komot.

Lahko poveš kaj veČ?
Main PC: Asus PN50 | AMD Ryzen 5 4500U | 16 GB RAM | 256 GB SSD
PC2: HP Z400 | Intel Xeon L5630 | 6 GB RAM | 120 GB SSD
Laptop: HP Elitebook 840G1 | Intel i5 | 8 GB RAM | 256 GB SSD

krneki0001 ::

Rabiš nmea183 parser, ki parsa podatke iz GPS-a in to potem združiš z videom (dodaš kot podnapise ali kakorkoli).
Asrock X99 Extreme 4 | Intel E5-2683V4 ES | 64GB DDR4 2400MHz ECC |
Samsung 250GB M.2 | Asus 1070 TI | 850W Antec | LC Tank Buster

Rias Gremory ::

Ja najprej malo pogruntaj kako bi bilo idealno montirano. Pa je ta garmin samo sprejemnik (tako kot pri jypu na čeladi) ali cela navigacija?

Rabil boš eno kul kamero (magar tisto uradno za Pi), ki jo bo R-Pi sinhroniziral z GPS podatki. Pi bo moral še sparsat GPS podatke in jih potem narisat na video z OpenCV na primer.
Mirno gledamo, kako naš svet propada,
saj za časa našega življenja ne bo popolnoma propadel.

d4vid ::

Rias Gremory je izjavil:

Ja najprej malo pogruntaj kako bi bilo idealno montirano. Pa je ta garmin samo sprejemnik (tako kot pri jypu na čeladi) ali cela navigacija?

Rabil boš eno kul kamero (magar tisto uradno za Pi), ki jo bo R-Pi sinhroniziral z GPS podatki. Pi bo moral še sparsat GPS podatke in jih potem narisat na video z OpenCV na primer.


Garmin je komplet navigacija, Nuvi 40.

Kamero bom dobil, zaenkrat web kamero, ki je bol slaba, mogoče bom kupil potem to original za PI, sam zanima me če je možnost podalševanja kabla, ker bi jo jaz zmontiral spredaj na skuter, pi pa bi bil v prtlažniku.
Main PC: Asus PN50 | AMD Ryzen 5 4500U | 16 GB RAM | 256 GB SSD
PC2: HP Z400 | Intel Xeon L5630 | 6 GB RAM | 120 GB SSD
Laptop: HP Elitebook 840G1 | Intel i5 | 8 GB RAM | 256 GB SSD

jype ::

Na Nuviju maš GPX tracke, ki jih lahko uporabiš.

O kamerah na RPi ne vem ničesar.

Podatke z videom lahko združiš na veliko načinov, zgoraj opisani je samo prvi, ki mi je prišel pod roke.

SeMiNeSanja ::

Kam smo prišli....zdaj eni rabijo accelometer, da vedo, da jih je nekdo zgazil, ali pa da so zleteli s ceste?

Kje so tisti časi, ko se je vsak večji negativni pospešek še meril po glasnosti kletvic.....

Me zanima, če ti ljudje sploh še vedo, da vozijo po prazni gumi, če nimajo tlakomera na ventilčku, ki preko bluetooth-a sproži alarm na telefonu.

d4vid ::

Dej jokaj kje drugje.
Rad bi se snemal (youtube pa to a veš) da pokažem kakšno hitrost je sposoben doseči moped.

Sam sem doma na kmetiji, tako da ne skrbet da nebi vedel kdaj mam prazno gumo ali pa kdaj me je kdo zgazil. Znam dost stvari, dost stvari sem že preživel. Glej oprosti, da hočem naredit nekaj da se zamotim in ne viset cel čas na PCju.
Main PC: Asus PN50 | AMD Ryzen 5 4500U | 16 GB RAM | 256 GB SSD
PC2: HP Z400 | Intel Xeon L5630 | 6 GB RAM | 120 GB SSD
Laptop: HP Elitebook 840G1 | Intel i5 | 8 GB RAM | 256 GB SSD
«
1
2


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Bolha parser/pajek - prejemanje obvestil o novih oglasih

Oddelek: Programiranje
214339 (3337) rokko
»

[Python3] Izvajanje ukazov po določenem času

Oddelek: Programiranje
211445 (1055) noraguta
»

Električno stikalo z oddaljenim nadzorom

Oddelek: Elektrotehnika in elektronika
131370 (889) Torx
»

Python - problem

Oddelek: Programiranje
132783 (2513) slevin
»

Program za dopis avtorja slike

Oddelek: Programska oprema
71464 (1316) MihaFirst

Več podobnih tem