Obsah:

Rpibot - O výučbe robotiky: 9 krokov
Rpibot - O výučbe robotiky: 9 krokov

Video: Rpibot - O výučbe robotiky: 9 krokov

Video: Rpibot - O výučbe robotiky: 9 krokov
Video: Принцесса из "Римских каникул"#Одри Хепберн #История жизни#Audrey Hepburn# 2024, Júl
Anonim
Rpibot - O výučbe robotiky
Rpibot - O výučbe robotiky

Som vstavaný softvérový inžinier v nemeckej automobilovej spoločnosti. Tento projekt som zahájil ako vzdelávaciu platformu pre vstavané systémy. Projekt bol predčasne zrušený, ale páčil sa mi natoľko, že som pokračoval vo svojom voľnom čase. Toto je výsledok…

Mal som nasledujúce požiadavky:

  • Jednoduchý hardvér (dôraz je kladený na softvér)
  • Lacný hardvér (asi 100 €)
  • Rozbaliteľné (niektoré možnosti sú už súčasťou popisu)
  • Napájacie napätie pre všetky komponenty z jedného 5V zdroja (powerbank)

Okrem učenia skutočne neexistoval žiadny cieľ. Platformu je možné použiť na učenie, sledovanie, robotické súťaže, …

Nie je to návod pre začiatočníkov. Potrebujete základné znalosti o:

  • Programovanie (Python)
  • Základná elektronika (na prepojenie modulov správnym napätím)
  • Základná teória riadenia (PID)

Nakoniec budete pravdepodobne čeliť problémom ako ja. S určitou zvedavosťou a vytrvalosťou prejdete projektom a vyriešite výzvy. Môj kód je čo najjednoduchší a kritické riadky kódu sú komentované, aby poskytli rady.

Kompletný zdrojový kód a súbory sú k dispozícii tu:

Zásoby:

Mechanika

  • 1x preglejková doska (veľkosť A4, hrúbka 4 mm)
  • 3x M4 x 80 Skrutka a matica
  • 2x Prevodové motory so sekundárnym výstupným hriadeľom pre snímač. Kolesá.
  • 1x voľné koleso

1x upevnenie kamery na otáčanie a nakláňanie (voliteľné)

Elektronika

  • 1x Raspberry Pi Zero so záhlavím a kamerou
  • 1x servo ovládanie PCA 9685
  • 2x koliesko optického snímača a obvod
  • 1 x prepojovací kábel
  • 1x USB powerbanka
  • 1x dvojmotorový ovládač DRV8833
  • 2x mikro servo SG90 pre natáčanie a nakláňanie kamery (voliteľné)
  • 1x MPU9250 IMU (voliteľné)
  • 1x ultrazvukový snímač vzdialenosti HC-SR04 (voliteľné)
  • 1x dierovaná doska a spájkovací drôt, záhlavia, …

Krok 1: Zostavte podvozok

Postavte podvozok
Postavte podvozok
Postavte podvozok
Postavte podvozok
Postavte podvozok
Postavte podvozok

Nie som dobrý mechanický konštruktér. Cieľom projektov tiež nie je tráviť príliš veľa času v podvozku. V každom prípade som definoval nasledujúce požiadavky:

  • Lacné materiály
  • Rýchla montáž a demontáž
  • Rozbaliteľné (napr. Priestor pre pridané senzory)
  • Ľahké materiály na úsporu energie pre elektroniku

Ľahký a lacný podvozok môže byť vyrobený z preglejky. Obrába sa ľahko pomocou pražcovej píly a ručnej vŕtačky. Môžete prilepiť malé drevené diely a vytvoriť tak držiaky pre senzory a motory.

Myslite na výmenu chybných komponentov alebo na elektrické ladenie. Aby boli hlavné časti vymeniteľné, mali by byť upevnené skrutkami. Horúca lepiaca pištoľ môže byť jednoduchá, ale pravdepodobne nie je najlepším spôsobom, ako postaviť podvozok … Potreboval som veľa času na premyslenie jednoduchého konceptu na ľahkú demontáž dielov. 3D tlač je dobrou alternatívou, ale môže byť dosť drahá alebo časovo náročná.

Voľnobežné koleso je konečne veľmi ľahké a ľahko sa montuje. Alternatívy boli všetky ťažké alebo plné trenia (vyskúšal som ich niekoľko predtým, ako som našiel konečný). Po namontovaní hlavných kolies som musel iba vyrezať drevenú podložku, aby sa vyrovnal voľný chvost.

Vlastnosti kolesa (pre softvérové výpočty)

Obvod: 21, 5 cm Impulzy: 20 impulzov/otáčka. Rozlíšenie: 1, 075 cm (nakoniec 1 impulz má asi 1 cm, čo je jednoduché pre softvérové výpočty)

Krok 2: Elektronika a zapojenie

Elektronika a elektroinštalácia
Elektronika a elektroinštalácia
Elektronika a elektroinštalácia
Elektronika a elektroinštalácia
Elektronika a elektroinštalácia
Elektronika a elektroinštalácia

Projekt používa rôzne moduly, ako je znázornené na diagrame.

Hlavným ovládačom je Raspberry Pi Zero. Číta senzory a riadi motory signálom PWM. K vzdialenému počítaču je pripojený pomocou wifi.

DRV8833 je dvojmotorový H-mostík. Poskytuje dostatočný prúd motorom (čo Raspberry Pi nedokáže, pretože výstupy môžu dodávať iba niekoľko mA).

Optický kodér poskytuje signál štvorcového tvaru zakaždým, keď svetlo prechádza kolieskami kodéra. HW prerušenia Raspberry Pi použijeme na získanie informácií zakaždým, keď sa signál prepína.

Pca9695 je riadiaca doska serva. Komunikuje prostredníctvom sériovej zbernice I2C. Táto doska poskytuje signály PWM a napájacie napätie, ktoré riadia servo pre otáčanie a nakláňanie vačky.

MPU9265 je 3-osové zrýchlenie, 3-osová rýchlosť uhlového otáčania a 3-osý snímač magnetického toku. Budeme ho používať hlavne na získanie smeru kompasu.

Jednotlivé moduly sú navzájom prepojené prepojovacím káblom. Nepájivá doska slúži ako dispečer a poskytuje napájacie napätie (5 V a 3,3 V) a uzemnenie. Všetky pripojenia sú popísané v tabuľke pripojení (pozri prílohu). Pripojenie 5V na 3,3V vstup pravdepodobne zničí váš čip. Pred dodaním dbajte na to, aby ste dvakrát skontrolovali všetky zapojenia (tu je potrebné zvážiť predovšetkým kodér). Pred pripojením všetkých dosiek by ste mali zmerať hlavné napájacie napätie na expedičnej doske multimetrom. Moduly boli upevnené nylonovými skrutkami do šasi. Tiež tu som bol rád, že ich môžem opraviť, ale aj odstrániť v prípade poruchy.

Jediné spájkovanie boli nakoniec motory a doska a záhlavie. Aby som bol úprimný, páči sa mi prepojovacie vodiče, ale môžu viesť k uvoľnenému spojeniu. V niektorých situáciách vám môžu niektoré analýzy softvéru pomôcť pri analýze pripojení.

Krok 3: Softvérová infraštruktúra

Softvérová infraštruktúra
Softvérová infraštruktúra
Softvérová infraštruktúra
Softvérová infraštruktúra

Po dosiahnutí mechaniky nastavíme softvérovú infraštruktúru tak, aby mala pohodlné vývojové podmienky.

Git

Toto je bezplatný a otvorený zdrojový systém na správu verzií. Používa sa na správu veľkých projektov ako Linux, ale dá sa ľahko použiť aj na malé projekty (pozri Github a Bitbucket).

Zmeny projektu je možné sledovať lokálne a tiež ich odoslať na vzdialený server na zdieľanie softvéru s komunitou.

Hlavné používané príkazy sú:

git clone https://github.com/makerobotics/RPIbot.git [Získať zdrojový kód a konfiguráciu git]

git pull origin master [získajte najnovšie informácie zo vzdialeného úložiska]

git status [získať stav lokálneho úložiska. Sú zmenené nejaké súbory?] Git log [získať zoznam potvrdení] git add. [pridať všetky zmenené súbory do fázy, ktorá sa má zvážiť pri nasledujúcom potvrdení] git commit -m "komentovať pre potvrdenie" [odoslať zmeny do lokálneho úložiska] git push origin master [poslať všetky potvrdenia do vzdialeného úložiska]

Prihlasovanie

Python poskytuje niektoré vstavané funkcie protokolovania. Štruktúra softvéru by mala definovať už celý rámec protokolovania pred začatím ďalšieho vývoja.

Záznamník je možné nakonfigurovať tak, aby sa do terminálu alebo do súboru denníka prihlásil v definovanom formáte. V našom prípade je záznamník nakonfigurovaný triedou webového servera, ale mohli by sme to urobiť aj sami. Tu nastavíme iba úroveň protokolovania na DEBUG:

logger = logging.getLogger (_ name_)

logger.setLevel (logging. DEBUG)

Meranie a vykresľovanie

Na analýzu signálov v čase je najlepšie ich vykresliť do grafu. Pretože Raspberry Pi má iba konzolový terminál, údaje budeme sledovať v csv súbore oddelenom bodkočiarkou a vykresliť ich zo vzdialeného počítača.

Traťový súbor oddelený bodkočiarkou je generovaný naším hlavným kódom pythonu a musí mať nasledujúce hlavičky:

timestamp; yawCorr; encoderR; I_L; odoDistance; ax; encoderL; I_R; yaw; eSpeedR; eSpeedL; pwmL; speedL; CycleTimeControl; wz; pwmR; speedR; Iyaw; hdg; m_y; m_x; eYaw; cycleTimeSense

1603466959.65;0;0;25;0.0;-0.02685546875;0;25;0;25;25;52;0.0;23;0.221252441406;16;0.0;0;252.069366413;-5.19555664062;-16.0563964844;0;6; 1603466959.71;0;0;50;0.0;0.29150390625;0;50;0;25;25;55;0.0;57;-8.53729248047;53;0.0;0;253.562118111;-5.04602050781;-17.1031494141;0;6; 1603466959.76;0;-1;75;0.0;-0.188232421875;1;75;2;25;25;57;0;52;-24.1851806641;55;0;0;251.433794171;-5.64416503906;-16.8040771484;2;7;

Prvý stĺpec obsahuje časovú pečiatku. Nasledujúce stĺpce sú bezplatné. Vyvolá sa skript vykresľovania so zoznamom stĺpcov, ktoré sa majú vykresliť:

vzdialené@pc: ~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR

Skript vykreslenia je k dispozícii v priečinku s nástrojmi:

Plotr používa mathplotlib v Pythone. Musíte ho skopírovať do počítača.

Pre väčšie pohodlie je skript python nazývaný skriptom bash (plot.sh), ktorý sa používa na kopírovanie súboru stopy Raspberry Pi do vzdialeného počítača a vyvolanie plotra s výberom signálu. Skript bash „plot.sh“sa pýta ak sa má súbor skopírovať. Toto mi bolo pohodlnejšie namiesto toho, aby som zakaždým ručne kopíroval. „sshpass“sa používa na skopírovanie súboru z Raspberry Pi do vzdialeného počítača prostredníctvom scp. Je schopný skopírovať súbor bez zadania hesla (odovzdáva sa ako parameter).

Nakoniec sa otvorí okno so schémou, ako je to znázornené na obrázku.

Vzdialená komunikácia

Rozhranie vývoja pre Raspberry Pi je SSH. Súbory je možné upravovať priamo na cieľovom mieste alebo ich skopírovať pomocou programu scp.

Na ovládanie robota je na serveri Pi spustený webový server, ktorý poskytuje ovládanie prostredníctvom webových zásuviek. Toto rozhranie je popísané v nasledujúcom kroku.

Nastavte Raspberry Pi

V priečinku „doc“zdrojového kódu (setup_rpi.txt) je súbor popisujúci nastavenie Raspberry Pi. Nie je veľa vysvetlení, ale veľa užitočných príkazov a odkazov.

Krok 4: Používateľské rozhranie

Používateľské rozhranie
Používateľské rozhranie

Na hostovanie používateľského rozhrania používame ľahký webový server Tornado. Jedná sa o modul Python, ktorý nazývame pri spustení softvéru na ovládanie robota.

Softvérová architektúra

Užívateľské rozhranie je tvorené nasledujúcimi súbormi: gui.html [Popis ovládacích prvkov a rozloženia webovej stránky] gui.js [Obsahuje kód JavaScript na spracovanie ovládacích prvkov a otvorenie pripojenia websocket k nášmu robotu] gui.css [Obsahuje štýly ovládacie prvky html. Tu sú definované polohy ovládacích prvkov]

Websocket komunikácia

Užívateľské rozhranie nie je najlepšie, ale robí svoju prácu. Tu som sa zameral na technológie, ktoré boli pre mňa nové, ako napríklad Websockets.

Webová stránka komunikuje s webovým serverom robotov pomocou serverov Websockets. Jedná sa o obojsmerný komunikačný kanál, ktorý zostane otvorený už pri nadviazaní spojenia. Posielame príkazy robota cez Websocket na Raspberry Pi a získavame informácie (rýchlosť, poloha, stream z kamery) späť na zobrazenie.

Rozloženie rozhrania

Používateľské rozhranie má manuálne zadávanie príkazov. Toto sa používalo na začiatku na odosielanie príkazov robotovi. Začiarkavacie políčko zapína a vypína stream kamery. Dva posuvníky ovládajú posúvanie a nakláňanie kamery. Pohyb robotov ovláda pravá horná časť používateľského rozhrania. Môžete ovládať rýchlosť a cieľovú vzdialenosť. Základné informácie o telemetrii sú zobrazené na výkrese robota.

Krok 5: Programovanie platformy robota

Programovanie platformy robota
Programovanie platformy robota
Programovanie platformy robota
Programovanie platformy robota
Programovanie platformy robota
Programovanie platformy robota

Táto časť bola hlavným cieľom projektu. Keď som predstavil nový podvozok s jednosmernými motormi, upravil som veľa softvéru. Python som použil ako programovací jazyk z rôznych dôvodov:

  • Je to hlavný jazyk Raspberry Pi
  • Je to jazyk na vysokej úrovni s mnohými vstavanými funkciami a rozšíreniami
  • Je objektovo orientovaný, ale môže byť použitý aj na sekvenčné programovanie
  • Nie je potrebná žiadna kompilácia ani reťazec nástrojov. Upravte kód a spustite ho.

Hlavná architektúra softvéru

Softvér je objektovo orientovaný, rozdelený na niekoľko objektov. Mojou myšlienkou bolo rozdeliť kód na 3 funkčné bloky:

Rozmyslite si, že premýšľate

Sense.py

Snímanie a spracovanie hlavného senzora. Údaje sú uložené v slovníku, ktorý sa má použiť v nasledujúcej fáze.

Control.py

Po určitej abstrakcii je podtrieda ovládania ovládaná motormi a servami. Hlavným predmetom riadenia je ovládanie príkazov na vysokej úrovni a tiež riadiacich algoritmov (PID) motora.

rpibot.py

Tento hlavný cieľ je správa webového servera Tornado a vytváranie inštancií tried zmyslu a ovládania v oddelených vláknach.

Každý modul je možné spustiť samostatne alebo ako súčasť celého projektu. Môžete iba snímať a vytlačiť informácie o snímačoch, aby ste skontrolovali, či sú snímače správne pripojené a či poskytujú správne informácie.

Ovládanie PID

Prvou úlohou je zistiť, čo chceme ovládať. Začal som tým, že som sa pokúsil ovládať polohu, ktorá bola veľmi zložitá a veľmi nepomáhala.

Nakoniec chceme ovládať každú rýchlosť kolesa a tiež smer robota. Aby sme to urobili, musíme kaskádovať dve logiky riadenia.

Na zvýšenie zložitosti krok za krokom by mal byť robot riadený:

otvorená slučka (s konštantným výkonom)

pwm = K

potom pridajte algoritmus uzavretej slučky

pwm = Kp.speedError+Ki. Integrácia (speedError)

a nakoniec pridajte ovládanie smeru ako posledný krok.

Na ovládanie rýchlosti som použil ovládač „PI“a „P“iba na vybočenie. Parametre som ručne nastavoval experimentovaním. Tu by sa dali použiť zrejme oveľa lepšie parametre. Mojím cieľom bola iba rovná čiara a takmer som to dosiahol. V softvéri som vytvoril rozhranie na zápis niektorých premenných podľa používateľského rozhrania. Nastavenie parametra Kp na 1,0 vyžaduje nasledujúci príkaz v používateľskom rozhraní:

SET; Kp; 1,0

Parameter P by som mohol nastaviť dostatočne nízko, aby som predišiel prestreleniu. Zostávajúca chyba je opravená parametrom I (integrovaná chyba)

Bolo pre mňa ťažké zistiť, ako kaskádovať oba ovládacie prvky. Riešenie je jednoduché, ale predtým som vyskúšal mnoho ďalších spôsobov … Nakoniec som zmenil cieľ rýchlosti kolies tak, aby sa otáčali jedným alebo druhým smerom. Priama zmena výstupu regulátora rýchlosti bola chybou, pretože sa regulátor rýchlosti pokúšal odstrániť túto poruchu.

Použitý ovládací diagram je priložený. Zobrazuje iba ľavú stranu ovládania robota.

Krok 6: Kalibrácie senzora

Kalibrácie senzorov
Kalibrácie senzorov
Kalibrácie senzorov
Kalibrácie senzorov
Kalibrácie senzorov
Kalibrácie senzorov

Prvá vec, ktorú je potrebné zvážiť, je, že celá IMU musí správne fungovať. Objednal som si 3 diely a poslal som ich späť, kým som nemal plne funkčný senzor. Pri každom predchádzajúcom senzore niektoré časti senzora nefungovali správne alebo vôbec. Pred montážou do robota som použil niekoľko ukážkových skriptov na otestovanie základov.

Signály senzora IMU je potrebné pred použitím kalibrovať. Niektoré signály snímačov závisia od montážneho uhla a polohy.

Kalibrácia rýchlosti zrýchlenia a rotácie

Najľahšia kalibrácia je pre pozdĺžne zrýchlenie (A_x). V pokojovom stave by malo byť okolo 0 m/s². Ak snímač otočíte správne, môžete zmerať gravitáciu (okolo 9, 8 m/s²). Ak chcete kalibrovať a_x, stačí ho správne namontovať a potom definovať ofset, aby ste dosiahli 0 m/s² v pokoji. Teraz je A_x kalibrovaný. Offsety pre rýchlosti otáčania môžete získať podobným spôsobom v kľude.

Kalibrácia magnetometra pre kompas

Pre snímače magnetického poľa je potrebná komplexnejšia kalibrácia. Na získanie magnetického poľa v horizontálnej rovine použijeme m_x a m_y. Ak máme m_x a m_y, poskytne nám to príležitosť vypočítať smer kompasu.

Pre náš jednoduchý účel budeme kalibrovať iba odchýlku tvrdého železa. To sa musí vykonať, pretože snímač je v konečnej polohe, pretože závisí od porúch magnetického poľa.

Zaznamenávame m_x a m_y, zatiaľ čo robota otáčame okolo osi z. Nakreslíme m_x vs m_y do grafu XY. Výsledkom je elipsa, ako je znázornené na obrázku. Elipsa musí byť vycentrovaná na pôvod. Tu uvažujeme maximálne a minimálne hodnoty m_x a m_y, aby sme získali posuny v oboch smeroch. Nakoniec skontrolujeme kalibráciu a uvidíme, že elipsa je teraz v strede.

Kalibrácia mäkkého železa by znamenala, že zmeníme obrázok z elipsy na kruh. To sa dá dosiahnuť pripočítaním faktora ku každej hodnote snímača.

Teraz je možné kódovať testovaciu rutinu na opätovnú kalibráciu alebo aspoň na kontrolu, či sú senzory stále kalibrované.

Nadpis kompasu

Údaje magnetometra sa teraz použijú na výpočet kurzu kompasu. Na to musíme previesť signály m_x a m_y na uhol. Python priamo poskytuje funkciu math.atan2, ktorá má tento cieľ. Kompletný výpočet je definovaný v súbore mpu9250_i2c.py ("calcHeading (mx, my, mz)").

Krok 7: Alternatívne návrhy

Alternatívne prevedenie
Alternatívne prevedenie
Alternatívne prevedenie
Alternatívne prevedenie
Alternatívne prevedenie
Alternatívne prevedenie

Projekt trval veľa času, pretože dizajn bol úplne otvorený. Pre každý komponent som urobil implementáciu prototypu a zažil som limity systému.

Najkomplexnejšou témou bol kodér kolies. Pred nájdením aktuálne používaného optického kodéra som testoval 3 rôzne možnosti. Myslím si, že aj prerušené riešenia sú v takom projekte veľmi zaujímavé. Týka sa to častí, kde som sa najviac naučil.

Servo s nepretržitým otáčaním pripojené k pca 9695

Aby som sa vyhol dodatočnému H-mostíku pre jednosmerný motor, najskôr som začal s kontinuálnymi rotačnými servami. Poháňal ich už prítomný servopohon pca 9695. Všetky mechaniky pohonu a zodpovedajúca elektronika boli oveľa jednoduchšie. Tento dizajn mal dve nevýhody:

  • Slabý rozsah ovládania serva.
  • Chýbajúce umiestnenie držiaka kodéra

Serva sa začnú pohybovať s 50% pwm a majú plnú rýchlosť asi 55%. Toto je veľmi zlý rozsah ovládania.

Bez držania kodéra bolo veľmi ťažké nájsť kodér pripravený na použitie. Testoval som 3 rôzne snímače odrazivosti, ktoré boli namontované na podvozku. Na vonkajšiu stranu kolesa som nalepil čierne koliesko kodéra, ktoré bolo vyrobené čiernobielymi časťami. Použil som senzory QTR-1RC, ktoré potrebujú veľa spracovania signálu, aby získali správny signál. Raspberry Pi nebolo schopné vykonávať tento druh spracovania v reálnom čase. Preto som sa rozhodol pridať do robota NodeMCU D1 mini ako ovládač v reálnom čase. Na dodanie spracovaných údajov zo senzora bol k malinovému Pi pripojený sériovým UART. NodeMCU tiež spravoval snímač HC-SR04. Mechanika bola náročná a nie veľmi robustná, sériová linka dostávala hluk z linky I2C a motorov, takže som nakoniec postavil druhú verziu podvozku s jednoduchými prevodovými jednosmernými motormi poháňanými H-most. Tieto motory majú sekundárny výstupný hriadeľ na umiestnenie optického snímača.

Krok 8: Spracovanie obrazu

Spracovanie obrazu
Spracovanie obrazu
Spracovanie obrazu
Spracovanie obrazu
Spracovanie obrazu
Spracovanie obrazu
Spracovanie obrazu
Spracovanie obrazu

Na zlepšenie autonómneho riadenia môžeme vykonať určité spracovanie obrazu.

Knižnica opencv je na to odkazom. Python ho môže použiť na rýchlu implementáciu detekcie prekážok.

Zachytíme obrázok a použijeme niektoré úlohy spracovania obrázku:

Prvé testy boli vykonané s transformáciami Cannyho a Sobela. Canny môže byť dobrým kandidátom, ale nie je dostatočne rozumný. Sobel je príliš citlivý (deteguje sa príliš veľa predmetov).

Nakoniec som vytvoril svoj vlastný filter na zmiešanie všetkých horizontálnych a vertikálnych prechodov (detekcia nábytku):

  • Transformujte farebný obrázok na obrázok s úrovňou sivej
  • Rozmazaním obrazu odstránite malý šum
  • Prahová hodnota obrázka na čiernobiely obrázok
  • Teraz zisťujeme horizontálne a vertikálne gradienty, aby sme zistili objekty ako steny a nábytok
  • Filtrujeme iba veľké zostávajúce obrysy (pozri farebné obrysy na obrázku)

Teraz môžeme tieto nové informácie použiť na detekciu prekážok …

Krok 9: Ďalšie kroky…

Ďalšie kroky…
Ďalšie kroky…
Ďalšie kroky…
Ďalšie kroky…

Teraz máme jednoduchú platformu robota so senzormi, akčnými členmi a kamerou. Mojím cieľom je pohybovať sa autonómne a vrátiť sa na stanicu bez pridania ďalších senzorov. Na to budem potrebovať nasledujúce kroky:

  • Fúzia senzorov stáčania a signálov magnetického smeru
  • Spracovanie obrazu z kamery (na to je k dispozícii iba nízky procesor)
  • Detekcia kolízií (ultrazvuková vzdialenosť a kamera)
  • Budova mapy alebo orientácia

Teraz choďte a vytvorte si vlastné výzvy alebo ciele …

Odporúča: