Sisällysluettelo:

Kokeet kehittyneessä tiedonkeräämisessä (Pythonin avulla): 11 vaihetta
Kokeet kehittyneessä tiedonkeräämisessä (Pythonin avulla): 11 vaihetta

Video: Kokeet kehittyneessä tiedonkeräämisessä (Pythonin avulla): 11 vaihetta

Video: Kokeet kehittyneessä tiedonkeräämisessä (Pythonin avulla): 11 vaihetta
Video: Verkkoseminaari tiedon avaamista ja yhteentoimivuutta tukevien palveluiden hyödyntämisestä 2024, Heinäkuu
Anonim
Kokeilut kehittyneessä tiedonkeräämisessä (Pythonin avulla)
Kokeilut kehittyneessä tiedonkeräämisessä (Pythonin avulla)

Tiedonkeruuohjeita on paljon, joten kun halusin rakentaa oman puunkorjuuprojektin, katsoin ympärilleni joukon. Jotkut olivat hyviä, jotkut eivät niin paljon, joten päätin ottaa joitain parempia ideoita ja tehdä oman hakemukseni. Tämä johti hankkeeseen, joka oli edistyneempi ja monimutkaisempi kuin aluksi odotin. Yksi osa siitä tuli sarja kokeita anturitietojen käsittelyssä. Tämän ohjeen avulla voit kokeilla samoja tai vastaavia kokeita.

(Voit tarkastella koko koodia ja ladata sen osoitteesta: Koodi GitHubissa Pääset katsomaan, ehkä toisessa ikkunassa, vain kahdella napsautuksella)

Tyypillisesti tietojen kirjaaminen sisältää seuraavat asiat:

  • Tiedonkeruu: Lue joitakin tietoja anturista. Usein tämä on vain analogisen digitaalimuuntimen (ADC) lukeminen Arduinon kaltaisella laitteella.
  • Tietojen käsittely: ADC -arvoa luettaessa muuntimien lähtö on tavallisesti skaalattava oikeisiin yksiköihin. Voi myös olla tarpeen tehdä joitakin säätöjä kalibroidaksesi arvot anturivirheiden korjaamiseksi.
  • Suodatus: Tiedot sisältävät yleensä jonkin verran kohinaa, tämä voidaan suodattaa, joten etsit datasi signaalia, ei kohinaa.
  • Tietojen tallennus: Tiedot tallennetaan ehkä tekstitiedostoon, ehkä pilveen. Tietojen pitäisi säilyä, vaikka virta katkeaa. Liian paljon dataa on helppo tallentaa, meillä on pieni temppu vähentää tallennustilaa.
  • Datanäyttö: Menetelmät tietojen tarkasteluun, ei oikeastaan datan kirjaaminen, mutta jos et tee jonkinlaista näyttöä tiedoista, miksi kerätä ne?
  • Etäkäyttö: Ei välttämätön, mutta mukava olla.

Useimmat ohjeet sisältävät joitain, mutta eivät kaikkia edellä mainittuja, tai ne tehdään hyvin yksinkertaisella tavalla. Tässä ohjeessa käsitellään 2 usein ohitettua kirjautumisongelmaa ja bonus antaa sinulle keinon piirtää tietosi ilman pilvipalvelua. Voit käyttää koko asiaa tai vetää palasia ja sekoittaa ne omaksi projektiksesi.

Vaihe 1: Työkalut ja materiaalit

Työkalut ja materiaalit
Työkalut ja materiaalit

Tämä esimerkki on kaikki Pythonissa, joten se toimii ja komponentteja voidaan käyttää melkein missä tahansa käyttöjärjestelmässä, mukaan lukien Mac, PC, Linux ja Raspberry Pi.

Jotta voit käyttää tätä ohjeistusta, tarvitset vain käynnissä olevan Python 3.6 -ympäristön ja lataat liitteenä olevan koodin. Kun olet suorittanut määrittämäni koodin, voit muokata sitä omia kokeiluja varten. Kuten Pythonissa tavallista, saatat joutua lisäämään joitain paketteja/moduuleja saadaksesi kaiken toimimaan. Spyder -ympäristössäni on melkein kaikki tarvittavat osat paikallaan (katso: Kaavion opastettavat näkymät Python -näytön kaapimisella). Kun käynnistät ensimmäisen kerran tarkkailun virheilmoitusten varalta, ne ilmoittavat ympäristön puuttuvista osista.

Seuraavat kaksi vaihetta kertovat, kuinka voit rakentaa ja suorittaa oman kokeilun, mutta luultavasti on parempi odottaa, kunnes suoritat mukana olevat kokeilut, ennen kuin yrität kokeilua.

Koodin ymmärtämiseksi sinulla on oltava jonkin verran kokemusta objektisuuntautuneesta Pythonista, selittäen, että tämä ei kuulu tämän ohjeen soveltamisalaan, mutta Googlen pitäisi antaa sinulle tarvitsemasi apu.

Huomaa koodi: (Koodi GitHubissa Pääset katsomaan, ehkä toisessa ikkunassa, vain kahdella napsautuksella) on nyt Python 3.6: ssa, joten 3.6 olisi paras. Vanhempi versio koodista on alla olevissa linkeissä.

Vaihe 2: Kokeen rakentaminen

Kokeilun rakentaminen
Kokeilun rakentaminen

Kokeilun rakentamisessa on kolme ohjelmointivaihetta (ja riviä). Jokainen kokeilu on toiminto Simging_logging.py -tiedoston LoggingSim -objektissa. Katsotaanpa kokeilua 1 (vain ensimmäinen kaavio), jonka suoritamme seuraavassa vaiheessa:

def experiment_with_sample_rates (itse):

print "" "Kokeile näytteenottotaajuuksia Eri näytteenottotaajuuksia muuttamalla delta T" "" self.start_plot (plot_title = "Sample Rates - Part 1/3: Delta T = 1.0") self.add_sensor_data (name = "dt = 1. ", amplitudi = 1., kohina_amp =.0, delta_t = 1., max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot ()

Jokainen kokeilu on kirjoitettu omana funktiona, joten meillä on funktion määrittävä rivi (def -koe…..)

Seuraava, ei kommenttirivi (start_plot (…)) luo objektin kokeelle ja antaa sille nimen.

Seuraava, ei -kommenttirivirivi (add_sensor_data (…)) on jaettu useisiin riveihin. Se simuloi anturia, joka mittaa signaalin mahdollisesti kohinaa ja jonkin verran käsittelyä. Toimintoargumentit ovat seuraavat:

  • nimi: nimi, joka asetetaan viimeiseen kaavioon tietojen tunnistamiseksi
  • amplitudi: kuinka suuri signaali on, käytämme aina amplitudia 1. tässä ohjeessa.
  • noise_amp: kuinka suuri melu on, 0. ei kohinaa, aloitamme tästä.
  • delta_t: mittausten välinen aika, ohjaa näytteenottotaajuutta.
  • max_t: tietojen keräämisen enimmäisaika, käytämme aina 10 tässä ohjeessa.
  • run_ave: käsittely käyttäen keskiarvoa, 0 tarkoittaa ei käsittelyä.
  • trigger_value: käsittely liipaisinta käyttäen, 0 tarkoittaa ei käsittelyä

viimeinen, ei kommenttirivi (self.show_plot ……) näyttää kaavion.

Jotta asiat olisivat hieman monimutkaisempia, kaaviossa voi olla useita rivejä tai useita kaavioita kokeessa, tämän pitäisi olla selvää seuraavista kokeista.

Vaihe 3: Kokeilun suorittaminen

Tämä on koodi kokeilun suorittamiseen. Kuten tavallisesti Pythonissa, se sijoitetaan tiedoston loppuun.

sim_logging = LoggingSim ()

sim_logging.experiment_with_sample_rates ()

Tämä on vain 2 riviä:

  • Luo kirjautumissimulaattori (LoggingSim ())
  • Suorita se (sim_logging.experiment_with_sample_rates ())

Ladatussa koodissa on muutama rivi ja kommentit, sen pitäisi olla helppo selvittää.

Vaihe 4: Kokeile: Näytteenottotaajuus

Kokeilu: Näytteenottotaajuus
Kokeilu: Näytteenottotaajuus
Kokeilu: Näytteenottotaajuus
Kokeilu: Näytteenottotaajuus
Kokeilu: Näytteenottotaajuus
Kokeilu: Näytteenottotaajuus

Tässä määritetty simulaattori antaa aina mukavan tasaisen siniaallon, jonka amplitudi on 1. Tässä kokeessa sekoitamme näytteenottotaajuuteen, joka on säädetty delta_t: llä, näytteiden välinen aikaero. Meillä ei ole melua tai muuta käsittelyä. Koodi käyttää 3 näytteenottotaajuutta (delta_t = 1,0, 0,1 ja 0,01.) Koska kuvaajat laskeutuvat päällekkäin, koe on määritetty tuottamaan 3 erilaista kuvaajaa. Tuloksena olevat kaaviot ovat tämän vaiheen kuvia.

def experiment_with_sample_rates (itse):

print "" "Kokeile näytteenottotaajuuksia Eri näytteenottotaajuuksia muuttamalla delta T" "" self.start_plot (plot_title = "Experiment Sample Rates 1/3: Delta T = 1.0") self.add_sensor_data (name = "dt = 1"). ", amplitudi = 1., kohina_amp =.0, delta_t = 1., max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot () # ------------- ----------------------------------- self.start_plot (plot_title = "Kokeilun näytteenottotaajuudet 2/3: Delta T = 0,1 ") self.add_sensor_data (name =" dt = 1. ", amplitudi = 1., noise_amp =.0, delta_t = 0.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot () # ------------------------------------------------ itse.start_plot (plot_title = "Experiment Sample Rates 3/3: Delta T = 0,01") self.add_sensor_data (nimi = "dt = 1.", amplitudi = 1., kohina_vahvistin =.0, delta_t = 0.01, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot ()

Suorita se käyttämällä riviä: sim_logging.experiment_with_sample_rates ()

Mahdolliset johtopäätökset:

  • Liian alhainen näytteenottotaajuus on todella huono.
  • Korkeat hinnat ovat usein parempia.

(Python 3.6 -koodi GitHubissa alla olevasta linkistä ohjeissa, 2.7)

Vaihe 5: Koe: Näytetään kohinaa

Kokeilu: Näytetään kohinaa
Kokeilu: Näytetään kohinaa

Tässä kokeessa säilytämme saman signaalin, käytämme keskimääräistä näytteenottotaajuutta ja meillä on eri määriä kohinaa (noise_amp =.0,.1, 1.0.) Suorita se komennolla: sim_logging.experiment_showing_noise (). Tulos on yksi kuvaaja, jossa on 3 riviä.

Mahdollinen johtopäätös:

Melu vaikeuttaa signaalin näkemistä, vähennä sitä, jos voit

Koodi:

# ------------------------------------------------

def experiment_showing_noise (self): print "" "Koe, joka näyttää kohinaa Tarkastellaan eri kohinaa muuttamalla kohinan amplitudia." "" self.start_plot (plot_title = "Experiment Showing Noise") self.add_sensor_data (name = "noise = 0.0 ", amplitudi = 1., kohina_amp =.0, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.add_sensor_data (nimi =" kohina = 0,1 ", amplitudi = 1., kohinalamppu =. 1, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.add_sensor_data (name = "noise = 1.0", amplitudi = 1., noise_amp = 1., delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot ()

Vaihe 6: Kokeile: Vähennä melua liukuvalla keskiarvolla

Kokeilu: Vähennä melua liukuvalla keskiarvolla
Kokeilu: Vähennä melua liukuvalla keskiarvolla
Kokeilu: Vähennä melua liukuvalla keskiarvolla
Kokeilu: Vähennä melua liukuvalla keskiarvolla

Liukuva keskiarvo (esimerkiksi pituus 8) tekee viimeiset 8 mittausta ja keskiarvo. Jos melu on satunnainen, toivomme sen olevan keskimäärin lähes 0. Suorita koe käyttämällä: sim_logging.experiment_showing_noise (). Tulosta yksi kuvaaja.

Mahdolliset johtopäätökset:

  • Liukuva keskiarvo poistaa suuren osan melusta
  • Mitä pidempi liukuva keskiarvo, sitä enemmän melua vähennetään
  • Pidempi liukuva keskiarvo voi vähentää ja vääristää signaalia

Koodi:

# ------------------------------------------------

def experiment_with_moving_average (self): print "" "Experiment with MovingAverage Tarkastellaan eri MovingAverage muuttamalla pituutta. Kaikilla on sama melu." "" # ------------------ ------------------------------ self.start_plot (plot_title = "MovingAverage-Part 1/2: No Moving Average") self.add_sensor_data (name = "ave len = 0", amplitudi = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot () self.start_plot (plot_title) = "MovingAverage-Part 2/2: Len 8 and 32") self.add_sensor_data (name = "ave len = 8", amplitudi = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 8, trigger_value = 0) self.add_sensor_data (name = "ave len = 32", amplitudi = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 32, trigger_value = 0) self.show_plot ()

Vaihe 7: Kokeilu: Liukuva keskiarvo ja näytteenottotaajuus

Kokeilu: Liukuva keskiarvo ja näytteenottotaajuus
Kokeilu: Liukuva keskiarvo ja näytteenottotaajuus

Tässä kokeessa vertaamme raakasignaalia kohinaan ja kahteen eri kohinan vähentämisvaihtoehtoon.

  1. Keskimääräinen näytteenottotaajuus ja keskikokoinen juokseva keskiarvo
  2. Suuri näytteenottotaajuus ja pitkä käyttökeskiarvo

Suorita se: sim_logging ……. Tulos on yksi kuvaaja. Mielestäni on selvää, että numero 2 vähentää melua paremmin, joten voimme päätellä, että:

Korkea näytteenottotaajuus ja pitkä käyttökeskiarvo ovat hyviä

Mutta sinun on pidettävä mielessä, että se maksaa. #2 vaatii paljon enemmän käsittelyä ja johtaa paljon enemmän tallennettavia tietoja. Kustannukset voivat olla tai eivät ole sen arvoisia. Seuraavassa kokeessa lisäämme liipaisimen, laitteen, joka vähentää tallennettujen tietojen määrää.

Koodi:

def experiment_with_moving_average_and_sample_rate (itse):

tulosta "" "Kokeile liukuvaa keskiarvoa ja näytteenottotaajuutta, dt, juokseva keskiarvo vaihtelee" "" # ---------------------------- -------------------- self.start_plot (plot_title = "Liukuva keskiarvo ja näytteenottotaajuus") self.add_sensor_data (name = "dt =.1 ra = 0 trig = 0 ", amplitudi = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.add_sensor_data (name =" dt =.1 ra = 10 trig = 0 ", amplitudi = 1., kohina_amp =.1, delta_t =.1, max_t = 10., run_ave = 10, trigger_value = 0) self.add_sensor_data (nimi = "dt =.01 ra = 100 trig = 0", amplitudi = 1., noise_amp =.1, delta_t =.01, max_t = 10., run_ave = 100, trigger_value = 0) self.show_plot ()

Vaihe 8: Kokeilu: Kirjaaminen liipaisimella

Kokeilu: Kirjaaminen liipaisimella
Kokeilu: Kirjaaminen liipaisimella

Tässä kokeessa lisätään liipaisin. Ensinnäkin, mitä tarkoitan liipaisimella? Liipaisin on tekniikka, jossa keräämme tietoja, mutta tallennamme ne vasta sen jälkeen, kun jokin muuttuja on muuttunut merkittävästi. Näissä kokeissa laitoin liipaisimen aika (x -akseli) -muuttujalle. Käyttämällä liipaisinta voin ottaa suuren määrän dataa nopeasta näytteenotosta ja pienentää sen kohtuullisempaan tietomäärään. Se on erityisen hyödyllinen korkeilla näytteenottotaajuuksilla ja pitkällä keskiarvolla.

Olen ottanut #2 -viivan viimeisestä kokeesta, joka oli "hyvä" ja lisäsi laukaisimen. Suorita se: sim_logging ……. Tulos on yksi kuvaaja, x riviä.

Mitä tapahtuu? Saamme "hyvän" juonen, jossa on kohtuullinen määrä tietoa (sama kuin #1). Korkeammasta käsittelystä on aiheutunut jonkin verran kustannuksia. Kaiken kaikkiaan tulokset ovat kuitenkin suunnilleen samat kuin alempi näytteenottotaajuus ja vähemmän suodatusta. Voit päätellä:

  • Pitkäkestoinen liipaisun keskiarvo voi vähentää melua kohtuullisella datamäärällä.
  • Ylimääräinen käsittely ei välttämättä anna paljon parempia tuloksia, ja siitä tulee kustannuksia.

Koodi:

# ------------------------------------------------

def experiment_with_trigger (self): print "" "Experiment with Triggering, dt, run keskiarvo ja laukaise kaikki vaihtelevat" "" # ----------------------- ------------------------- self.start_plot (plot_title = "Trigger 1/1-Triggering On") self.add_sensor_data (name = "dt =.1 ra = 10, trig = 0 ", amplitudi = 1., noise_amp =.1, delta_t =.1, max_t = 10., run_ave = 10, trigger_value = 0) self.add_sensor_data (name =" dt =.01 " ra = 100, trig =.1 ", amplitudi = 1., noise_amp =.1, delta_t =.01, max_t = 10., run_ave = 100, trigger_value =.1) self.show_plot ()

=

Vaihe 9: Kokeilu: Kirjaaminen liipaisimella - kovempaa melua

Kokeilu: Kirjaaminen liipaisimella - kovempaa melua
Kokeilu: Kirjaaminen liipaisimella - kovempaa melua

Otetaan sama kokeilu kuin viimeisessä vaiheessa ja vahvistetaan melua. Suorita se: sim_logging ……. Tulos on yksi kuvaaja, 2 riviä.

Nyt ylimääräinen käsittely näyttää enemmän arvoiselta. Tässä voi olla järkevä johtopäätös:

Kohinan vähentämisen käsittelyn määrän ja tyypin valitseminen riippuu signaalista ja kohinasta

Koodi:

def experiment_with_trigger_louder_ise (itse):

print "" "Voimakkaampi kohina kuin edellinen koe" "" self.start_plot (plot_title = "An Experiment with Trigger-Louder Noise") self.add_sensor_data (nimi = "… dt =.1 ra = 10", amplitudi = 1., noise_amp =.5, delta_t =.1, max_t = 10., run_ave = 10, trigger_value = 0) self.add_sensor_data (nimi = "..dt =.01 ra = 100 tv =.1", amplitudi = 1., noise_amp =.5, delta_t =.01, max_t = 10., run_ave = 100, trigger_value =.1) self.show_plot ()

Vaihe 10: Tee omia kokeiluja

Tee omia kokeiluja
Tee omia kokeiluja

Toivon, että näette tässä vaiheessa, että tämän ohjeen tekniikat voivat olla hyödyllisiä tietojen kirjaamisessa, mutta niitä on myös käytettävä harkiten. Niiden kokeileminen voi auttaa tätä prosessia.

Muutamia huomioita kokeista ja asioista, joita saatat tarkastella:

  • Siniaallot eivät ole ainoa mielenkiintoinen signaalityyppi, kokeile muita, muita aaltoja tai ramppeja tai…..
  • Käytin melulle normaalia jakautumista, melua on niin monenlaista; kannattaa harkita muita
  • Juoksevat keskiarvot ovat yksinkertainen, mutta ei ainoa tapa tarkastella melua

Huomautus: kuvien kirjaaminen Wikipediasta.

Vaihe 11: Kirjausohjelmiston tekniikoiden käyttäminen

Kirjausohjelmiston tekniikoiden käyttäminen
Kirjausohjelmiston tekniikoiden käyttäminen

Koodini on objektipohjainen ja juoksevan keskiarvon ja liipaisimen käsittely voidaan vain kopioida Python -ympäristöön ja käyttää sitten. Objektit ovat:

  • DataTrigger osoitteessa data_trigger.py
  • MovingAverage liikkuvassa keskiarvossa

Pääkohteeni LoggingSim in simulate_logging.py pitäisi antaa sinulle hyvän esimerkin sen käytöstä. Jos käytät toista kieltä, voit lukea koodini ja ottaa sen käyttöön omalla kielelläsi.

Tämä koodi voi parantaa projektisi tietojen kirjaamista, kokeile sitä.

Yllä oleva kaavio on russ_henselin Graph Your Solar Power -kaaviosta, joka käyttää samaa juoksevaa keskimääräistä objektia.

Suositeltava: