Tartalomjegyzék:

Kísérletek a speciális adatnaplózásban (Python használatával): 11 lépés
Kísérletek a speciális adatnaplózásban (Python használatával): 11 lépés

Videó: Kísérletek a speciális adatnaplózásban (Python használatával): 11 lépés

Videó: Kísérletek a speciális adatnaplózásban (Python használatával): 11 lépés
Videó: Hacked Jacuzzi, JDK 18, Kotlin 1.7.0, ECMAScript 2022 and new Amazon products [MJC News #10] 2024, November
Anonim
Kísérletek a speciális adatnaplózásban (Python használatával)
Kísérletek a speciális adatnaplózásban (Python használatával)

Sok adatnaplózási utasítás létezik, így amikor saját naplózási projektet akartam készíteni, körülnéztem egy csomó helyen. Néhányan jók voltak, mások nem annyira, ezért úgy döntöttem, hogy veszek néhány jobb ötletet, és elkészítem saját alkalmazásomat. Ennek eredményeként a projekt mind fejlettebb, mind bonyolultabb volt, mint amire először számítottam. Ennek egyik része az érzékelők adatainak feldolgozásával kapcsolatos kísérletsorozat lett. Ez az oktatóanyag lehetővé teszi ugyanazon vagy hasonló kísérletek kipróbálását.

(Az összes kódot megtekintheti és letöltheti a következőről: Kód a GitHub -on Csak 2 kattintással beléphet a megtekintésbe, esetleg egy másik ablakban)

Az adatnaplózás általában a következőket foglalja magában:

  • Adatgyűjtés: Olvassa el az adatokat egy érzékelőből. Gyakran ez csak egy analóg -digitális konverter (ADC) olvasása egy olyan eszközön, mint egy Arduino.
  • Adatfeldolgozás: ADC érték olvasásakor a konverterek kimenetét általában a megfelelő egységekre kell méretezni. Szükség lehet némi kiigazításra is az értékek kalibrálásához, hogy kijavítsák az érzékelő hibáit.
  • Szűrés: Az adatok általában némi zajt tartalmaznak, ez szűrhető, így az adatokban lévő jelet keresi, nem a zajt.
  • Adattárolás: Az adatok mentésre kerülnek, esetleg egy szöveges fájlba, esetleg a felhőbe. Az adatoknak akkor is fenn kell maradniuk, ha az áramellátás leáll. Könnyű túl sok adatot menteni, van egy kis trükkünk az adattároló hely csökkentésére.
  • Adatmegjelenítés: Az adatok megtekintésének módszerei, valójában nem az adatnaplózás, de ha nem valamilyen formában jeleníti meg az adatokat, akkor miért gyűjti azokat?
  • Távoli hozzáférés: Nem szükséges, de jó.

A legtöbb utasítás tartalmaz néhányat, de nem mindegyiket, vagy nagyon egyszerű módon. Ez az utasítás a gyakran kihagyott naplózási problémák közül kettővel foglalkozik, és bónuszként lehetőséget ad arra, hogy felhőszolgáltatás nélkül ábrázolja adatait. Használhatja az egészet, vagy kihúzhat darabokat, és remixelheti őket egy saját projektbe.

1. lépés: Eszközök és anyagok

Eszközök és anyagok
Eszközök és anyagok

Ez a példa a Python -ban található, így futni fog, és az összetevők szinte minden operációs rendszeren használhatók, beleértve a Mac -et, a PC -t, a Linuxot és a Raspberry Pi -t.

Tehát ennek az utasításnak a használatához mindössze egy futó Python 3.6 környezetre van szüksége, és töltse le a mellékelt kódot. Az általam beállított kód futtatása után módosíthatja azt saját kísérleteihez. A Pythonhoz hasonlóan szükség lehet néhány csomag/modul hozzáadására, hogy minden működjön. A Spyder környezetem nagyjából az összes szükséges alkatrészt tartalmazza (lásd: Grafikonok kezelhető nézetei Python képernyőkaparással). Amikor először futtatja a figyelést, keresse meg a hibaüzeneteket, és értesíteni fogják a környezet hiányzó részeiről.

A következő két lépés megmutatja, hogyan hozhat létre és futtathat saját kísérletet, de valószínűleg jobb, ha megvárja, amíg futtatja a mellékelt kísérleteket, mielőtt kipróbálná sajátját.

A kód megértéséhez némi tapasztalattal kell rendelkeznie az objektumorientált Python használatában, elmagyarázva, hogy ez nem tartozik ezen utasítás hatálya alá, de a Google minden szükséges segítséget megad.

Jegyezze meg a kódot: (Kód a GitHub -on Csak 2 kattintással lehet belépni a megtekintésbe, talán egy másik ablakban). A kód korábbi verziója itt található az alábbi linkeken.

2. lépés: Kísérlet készítése

Kísérlet építése
Kísérlet építése

A kísérlet felépítésének három programozási lépése (és sora) van. Minden kísérlet a Simulate_logging.py fájl LoggingSim objektumának függvénye. Nézzük az 1. kísérletet (csak az első grafikont), amelyet a következő lépésben futtatunk:

def kísérlet_minta_rátákkal (saját):

print "" "Kísérlet mintavételi gyakoriságokkal A különböző mintavételi gyakoriságok vizsgálata a delta T megváltoztatásával" "" self.start_plot (plot_title = "Mintaértékek - 1/3. rész: Delta T = 1,0") self.add_sensor_data (név = "dt = 1. ", amplitúdó = 1., zaj_amp =.0, delta_t = 1., max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot ()

Minden kísérlet saját függvényként van írva, így van egy sor, amely meghatározza a függvényt (def kísérlet…..)

A következő, megjegyzés nélküli sor (start_plot (…)) létrehozza az objektumot a kísérlethez, és nevet ad neki.

A következő, megjegyzés nélküli sor (add_sensor_data (…) több sorra van osztva. Szimulálja az érzékelőt, amely potenciálisan zajjal és bizonyos feldolgozással jelzést mér. A függvény argumentumai a következők:

  • név: az adatok azonosítására szolgáló név a végső grafikonra
  • amplitúdó: mekkora a jel, ebben az utasításban mindig az 1. amplitúdót fogjuk használni.
  • noise_amp: mekkora a zaj, 0. nem zaj, itt kezdjük.
  • delta_t: a mérések közötti idő, szabályozza a mintavételi sebességet.
  • max_t: a maximális adatgyűjtési idő, ebben az utasításban mindig 10 -et fogunk használni.
  • run_ave: feldolgozás futó átlag használatával, 0 azt jelenti, hogy nincs feldolgozás.
  • trigger_value: feldolgozás triggerrel, 0 azt jelenti, hogy nincs feldolgozás

az utolsó, megjegyzés nélküli sor (self.show_plot ……) megjeleníti a grafikont.

Annak érdekében, hogy egy kicsit bonyolultabbá tegyük a dolgokat, a grafikonon több sor vagy több grafikon is szerepelhet egy kísérletben, ennek egyértelműnek kell lennie a következő kísérletekből.

3. lépés: Kísérlet futtatása

Ez a kód egy kísérlet futtatásához. A Pythonban szokásos módon a fájl végére kerül.

sim_logging = LoggingSim ()

sim_logging.experiment_with_sample_rates ()

Ez csak 2 sor:

  • Naplózási szimulátor létrehozása (LoggingSim ())
  • Futtassa (sim_logging.experiment_with_sample_rates ())

A letöltött kódban van még néhány sor és megjegyzés, könnyen lehet kitalálni.

4. lépés: Kísérlet: mintavételi arány

Kísérlet: Mintavételi arány
Kísérlet: Mintavételi arány
Kísérlet: Mintavételi arány
Kísérlet: Mintavételi arány
Kísérlet: Mintavételi arány
Kísérlet: Mintavételi arány

Az itt beállított szimulátor mindig szép, sima amplitúdójú szinuszhullámot ad ki. Ehhez a kísérlethez a delta_t által beállított mintavételi gyakorisággal, a minták közötti időkülönbséggel fogunk bajlódni. Nem lesz zaj vagy más feldolgozás. A kód 3 mintavételi gyakoriságot használ (delta_t = 1,0, 0,1 és 0,01.) Mivel a grafikonok egymásra esnek, a kísérlet 3 különböző grafikon előállítására van beállítva. A kapott grafikonok az ehhez a lépéshez tartozó képek.

def kísérlet_minta_rátákkal (saját):

print "" "Kísérlet mintavételi gyakorisággal A különböző mintavételi gyakoriságok vizsgálata a delta T megváltoztatásával" "" self.start_plot (plot_title = "Experiment Sample Rates 1/3: Delta T = 1.0") self.add_sensor_data (name = "dt = 1". ", amplitúdó = 1., zaj_amp =.0, delta_t = 1., max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot () # ------------- ----------------------------------- self.start_plot (plot_title = "Kísérlet mintavételezési gyakorisága 2/3: Delta T = 0,1 ") self.add_sensor_data (név =" dt = 1. ", amplitúdó = 1., zaj_amp =.0, delta_t = 0.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot () # ------------------------------------------------ maga.start_plot (plot_title = "Experiment Sample Rates 3/3: Delta T = 0,01") self.add_sensor_data (név = "dt = 1.", amplitúdó = 1., zaj_amp =.0, delta_t = 0.01, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot ()

Futtatásához használja a következő sort: sim_logging.experiment_with_sample_rates ()

Lehetséges következtetések:

  • A túl alacsony mintavételi arány nagyon rossz.
  • A magas árak gyakran jobbak.

(Python 3.6 kód a GitHub -on, link az alábbi utasításokban, 2.7)

5. lépés: Kísérlet: Zaj megjelenítése

Kísérlet: Zaj megjelenítése
Kísérlet: Zaj megjelenítése

Ebben a kísérletben ugyanazt a jelet tartjuk, közepes mintavételi gyakoriságot használunk, és különböző zajok vannak (zaj_amp =.0,.1, 1.0.) Futtassa a következővel: sim_logging.experiment_showing_noise (). A kimenet egy grafikon, 3 sorral.

Lehetséges következtetés:

A zaj megnehezíti a jel látását, ha lehet, csökkentse

A kód:

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

def experiment_showing_noise (self): print "" "Kísérlet, amely zajt mutat Különböző zajmennyiségek nézése a zaj amplitúdójának megváltoztatásával." "" self.start_plot (plot_title = "Experiment Showing Noise") self.add_sensor_data (name = "noise = 0.0") ", amplitúdó = 1., zaj_amp =.0, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.add_sensor_data (név =" zaj = 0,1 ", amplitúdó = 1., zaj_amp =. 1, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.add_sensor_data (név = "zaj = 1.0", amplitúdó = 1., zaj_amp = 1., delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot ()

6. lépés: Kísérlet: Csökkentse a zajt mozgó átlaggal

Kísérlet: Csökkentse a zajt mozgó átlaggal
Kísérlet: Csökkentse a zajt mozgó átlaggal
Kísérlet: Csökkentse a zajt mozgó átlaggal
Kísérlet: Csökkentse a zajt mozgó átlaggal

Egy mozgó átlag (például 8 -as hosszúsággal) elvégzi az utolsó 8 mérést és átlagolja azokat. Ha a zaj véletlenszerű, akkor reméljük, hogy 0 körüli lesz. Futtassa a kísérletet a következővel: sim_logging.experiment_showing_noise (). Egy grafikon kiadása.

Lehetséges következtetések:

  • A mozgó átlag kiküszöböli a zaj nagy részét
  • Minél hosszabb a mozgóátlag, annál nagyobb a zajcsökkentés
  • A hosszabb mozgóátlag csökkentheti és torzíthatja a jelet

A kód:

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

def experiment_with_moving_average (self): print "" "Kísérlet a MovingAverage-rel A különböző MovingAverage-ek megtekintése a hossz megváltoztatásával. Mindegyiknek ugyanaz a hangja." "" # ------------------ ------------------------------ self.start_plot (plot_title = "MovingAverage-Part 1/2: No Moving Average") self.add_sensor_data (név = "ave len = 0", amplitúdó = 1., zaj_amp =.1, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.show_plot () self.start_plot (plot_title) = "MovingAverage-2/2. Rész: Len 8 és 32") self.add_sensor_data (név = "ave len = 8", amplitúdó = 1., zaj_amp =.1, delta_t =.1, max_t = 10., run_ave = 8, trigger_érték = 0) self.add_sensor_data (név = "ave len = 32", amplitúdó = 1., zaj_amp =.1, delta_t =.1, max_t = 10., run_ave = 32, trigger_value = 0) self.show_plot ()

7. lépés: Kísérlet: Mozgó átlag és mintavételi arány

Kísérlet: Mozgó átlag és mintavételi arány
Kísérlet: Mozgó átlag és mintavételi arány

Ebben a kísérletben összehasonlítjuk a nyers jelet a zajjal és 2 különböző variációval a zaj csökkentésére.

  1. Közepes mintavételi arány és közepes futóátlag
  2. Magas mintavételi arány és hosszú futási átlag

Futtassa a következővel: sim_logging …… A kimenet egy grafikon. Azt hiszem, egyértelmű, hogy a #2 jobb munkát végez a zaj csökkentésében, így arra a következtetésre juthatunk, hogy:

Jó a magas mintavételi arány és a hosszú futási átlag

De szem előtt kell tartani, hogy ennek ára van. #2 sokkal több feldolgozást igényel, és sokkal több adatot kell menteni. A költség megéri vagy nem éri meg. A következő kísérletben egy triggert, egy eszközt adunk hozzá, amely csökkenti a tárolt adatok mennyiségét.

A kód:

def kísérlet_mozgó_átlag_ és_minta_ráta (saját):

print "" "kísérlet a mozgó átlaggal és a mintavételi gyakorisággal, dt, a futási átlag változó" "" # ---------------------------- -------------------- self.start_plot (plot_title = "Mozgó átlag és mintavételi arány") self.add_sensor_data (név = "dt =.1 ra = 0 trig = 0 ", amplitúdó = 1., zaj_amp =.1, delta_t =.1, max_t = 10., run_ave = 0, trigger_value = 0) self.add_sensor_data (név =" dt =.1 ra = 10 trig = 0 ", amplitúdó = 1., zaj_amp =.1, delta_t =.1, max_t = 10., run_ave = 10, trigger_value = 0) self.add_sensor_data (név = "dt =.01 ra = 100 trig = 0", amplitúdó = 1., zaj_amp =.1, delta_t =.01, max_t = 10., run_ave = 100, trigger_value = 0) self.show_plot ()

8. lépés: Kísérlet: Naplózás a triggerrel

Kísérlet: Naplózás a triggerrel
Kísérlet: Naplózás a triggerrel

Ebben a kísérletben egy triggert adunk hozzá. Először is, mit értek trigger alatt? A trigger olyan technika, amelyben adatokat gyűjtünk, de csak akkor mentjük el, ha valamilyen változó jelentős mértékben megváltozott. Ezekben a kísérletekben az idő (x tengely) változóra tettem egy trigger -t. A trigger használatával nagy mennyiségű adatot tudok levenni a gyors mintavételből, és ésszerűbb adatmennyiségre redukálhatom. Különösen hasznos a magas mintavételi arányok és a hosszú futási átlag mellett.

Az utolsó kísérlet #2 sorát vettem, ami "jó" volt, és egy kiváltó okot. Futtassa a következővel: sim_logging ……. A kimenet egy grafikon, x sor.

Mi történik? "Jó" ábrát kapunk ésszerű adatmennyiséggel (ugyanaz, mint az #1). A magasabb feldolgozás némi költséggel járt. Összességében azonban az eredmények nagyjából megegyeznek az alacsonyabb mintavételi gyakorisággal, kevesebb szűréssel. Következtethet:

  • Hosszú futási átlag aktiválással jó zajcsökkentést eredményezhet ésszerű adatmennyiség mellett.
  • Az extra feldolgozás nem biztos, hogy sokkal jobb eredményeket hoz, és költségekkel jár.

A kód:

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

def experiment_with_trigger (self): print "" "Experiment with Triggering, dt, run átlag és kiváltó minden változtatható" "" # ----------------------- ------------------------- self.start_plot (plot_title = "Trigger 1/1-Triggering On") self.add_sensor_data (név = "dt =.1 ra = 10, trig = 0 ", amplitúdó = 1., zaj_amp =.1, delta_t =.1, max_t = 10., run_ave = 10, trigger_value = 0) self.add_sensor_data (név =" dt =.01 ra = 100, trig =.1 ", amplitúdó = 1., zaj_amp =.1, delta_t =.01, max_t = 10., run_ave = 100, trigger_value =.1) self.show_plot ()

=

9. lépés: Kísérlet: Naplózás a triggerrel - hangosabb zaj

Kísérlet: Naplózás triggerrel - hangosabb zaj
Kísérlet: Naplózás triggerrel - hangosabb zaj

Végezzük el ugyanazt a kísérletet, mint az utolsó lépést, és erősítsük meg a zajt. Futtassa a következővel: sim_logging …… A kimenet egy grafikon, 2 sor.

Most az extra feldolgozás érdemesnek tűnik. Ésszerű következtetés lehet itt:

A zaj csökkentése érdekében a feldolgozás mennyiségének és típusának kiválasztása a jel és a zaj függvénye

A kód:

def experiment_with_trigger_louder_ioise (self):

print "" "Hangosabb zaj, mint az előző kísérlet" "" self.start_plot (plot_title = "An Experiment with Trigger-Louder Noise") self.add_sensor_data (név = "… dt =.1 ra = 10", amplitúdó = 1., zaj_amp =.5, delta_t =.1, max_t = 10., run_ave = 10, trigger_value = 0) self.add_sensor_data (név = "..dt =.01 ra = 100 tv =.1", amplitúdó = 1., zaj_amp =.5, delta_t =.01, max_t = 10., run_ave = 100, trigger_value =.1) self.show_plot ()

10. lépés: Készítse el saját kísérleteit

Végezzen saját kísérleteket
Végezzen saját kísérleteket

Ezen a ponton remélem, hogy látja, hogy az ebben az utasításban szereplő technikák hasznosak lehetnek az adatnaplózásban, de ezeket is meg kell fontolni. A velük való kísérletezés segíthet ebben a folyamatban.

Néhány megjegyzés a kísérletekhez és a dolgokhoz, amelyeket megvizsgálhat:

  • A szinuszhullámok nem az egyetlen érdekes jel típus, próbálkozz másokkal, más hullámokkal vagy rámpákkal vagy…..
  • Normál eloszlást használtam a zajhoz, sokféle zaj létezik; figyelembe kell vennie másokat
  • A futó átlagok egyszerű, de nem az egyetlen módszer a zaj vizsgálatára

Megjegyzés: képek naplózása a Wikipédiából.

11. lépés: A naplózó szoftver technikáinak használata

A naplózó szoftver technikáinak használata
A naplózó szoftver technikáinak használata

A kódom objektumorientált, és a futó átlag feldolgozása és a trigger csak másolható a Python környezetébe, majd használható. A tárgyak a következők:

  • DataTrigger a data_trigger.py mappában
  • MovingAverage: move_average.py

A fő objektumom, a LoggingSim a simulate_logging.py fájlban jó példát adhat a használatára. Ha másik nyelvet használ, elolvashatja a kódomat, és a saját nyelvén implementálhatja.

Ez a kód javíthatja a projekt adatgyűjtését, próbálja ki.

A fenti grafikon a russ_hensel Graph Your Solar Power című grafikonjából származik, amely ugyanazt a futó átlagos objektumot használja.

Ajánlott: