Obsah:

Rpibot - O učení robotiky: 9 kroků
Rpibot - O učení robotiky: 9 kroků

Video: Rpibot - O učení robotiky: 9 kroků

Video: Rpibot - O učení robotiky: 9 kroků
Video: LinuxDays 2015 - Řízení stejnosměrných a bezkartáčových motorů - Pavel Píša a Martin Prudek 2024, Červenec
Anonim
Rpibot - O učení robotiky
Rpibot - O učení robotiky

Jsem softwarový inženýr v německé automobilové společnosti. Tento projekt jsem zahájil jako učební platformu pro vestavěné systémy. Projekt byl zrušen brzy, ale užil jsem si to natolik, že jsem pokračoval ve svém volném čase. Toto je výsledek…

Měl jsem následující požadavky:

  • Jednoduchý hardware (důraz je kladen na software)
  • Levný hardware (asi 100 €)
  • Rozbalitelné (některé možnosti jsou již součástí popisu)
  • Napájecí napětí pro všechny komponenty z jednoho 5V zdroje (powerbank)

Kromě učení ve skutečnosti nešlo o žádný cíl. Platformu lze použít pro učení, sledování, robotické soutěže,…

Není to návod pro začátečníky. Potřebujete základní znalosti o:

  • Programování (Python)
  • Základní elektronika (pro spojení modulů správným napětím)
  • Základní teorie řízení (PID)

Nakonec budete pravděpodobně čelit problémům jako já. S trochou zvědavosti a vytrvalosti projdete projektem a vyřešíte výzvy. Můj kód je co nejjednodušší a kritické řádky kódu jsou komentovány, aby poskytly rady.

Kompletní zdrojový kód a soubory jsou k dispozici zde:

Zásoby:

Mechanika

  • 1x překližková deska (velikost A4, tloušťka 4 mm)
  • 3x šroub M4 x 80 a matice
  • 2x Převodové motory se sekundárním výstupním hřídelem pro kodér. Kola.
  • 1x volné kolo

1x Pan a tilt montáž kamery (volitelně)

Elektronika

  • 1x Raspberry Pi Zero se záhlavím a kamerou
  • 1x servo ovládání PCA 9685
  • 2x Optické enkodérové kolo a obvod
  • 1 x propojovací kabel
  • 1x USB powerbanka
  • 1x DRV8833 dvoumotorový ovladač
  • 2x mikro servo SG90 pro otáčení a naklánění kamery (volitelně)
  • 1x MPU9250 IMU (volitelně)
  • 1x ultrazvukový snímač vzdálenosti HC-SR04 (volitelně)
  • 1x perforovaná deska a pájecí drát, záhlaví,…

Krok 1: Sestavte podvozek

Postavte podvozek
Postavte podvozek
Postavte podvozek
Postavte podvozek
Postavte podvozek
Postavte podvozek

Nejsem dobrý konstruktér mechaniků. Také cílem projektů není trávit příliš mnoho času v podvozku. Každopádně jsem definoval následující požadavky:

  • Levné materiály
  • Rychlá montáž i demontáž
  • Rozšiřitelný (např. Prostor pro přidané senzory)
  • Lehké materiály pro úsporu energie pro elektroniku

Snadný a levný podvozek může být vyroben z překližky. Obrábění je snadné pomocí pražcové pily a ruční vrtačky. Malé dřevěné díly můžete lepit a vytvořit tak držáky pro senzory a motory.

Přemýšlejte o výměně vadných součástí nebo elektrickém ladění. Hlavní části by měly být upevněny šrouby, aby byly vyměnitelné. Horká lepicí pistole může být jednoduchá, ale pravděpodobně není nejlepší způsob, jak postavit podvozek … Potřeboval jsem spoustu času na přemýšlení o jednoduchém konceptu, jak snadno rozložit díly. 3D tisk je dobrou alternativou, ale může být docela drahý nebo časově náročný.

Volné kolo je konečně velmi lehké a snadno se montuje. Všechny alternativy byly těžké nebo plné tření (několik jsem jich vyzkoušel, než jsem našel konečnou). Po namontování hlavních kol jsem musel pouze vyřezat dřevěnou vložku, aby se vyrovnal volný konec ocasu.

Vlastnosti kola (pro softwarové výpočty)

Obvod: 21, 5 cm Pulzy: 20 pulzů/ot. Rozlišení: 1, 075 cm (konečně 1 puls je asi 1 cm, což je snadné pro softwarové výpočty)

Krok 2: Elektronika a zapojení

Elektronika a elektroinstalace
Elektronika a elektroinstalace
Elektronika a elektroinstalace
Elektronika a elektroinstalace
Elektronika a elektroinstalace
Elektronika a elektroinstalace

Projekt využívá různé moduly, jak je znázorněno na schématu.

Hlavním ovladačem je Raspberry Pi Zero. Čte senzory a ovládá motory signálem PWM. Ke vzdálenému počítači je připojen pomocí wifi.

DRV8833 je dvoumotorový H-můstek. Poskytuje dostatečný proud motorům (což Raspberry Pi neumí, protože výstupy mohou dodávat pouze několik mA).

Optický kodér poskytuje signál čtvercového tvaru pokaždé, když světlo prochází kolečky kodéru. Použijeme HW přerušení Raspberry Pi, abychom získali informace pokaždé, když se signál přepíná.

Pca9695 je řídicí deska serva. Komunikuje prostřednictvím sériové sběrnice I2C. Tato deska poskytuje signály PWM a napájecí napětí, které ovládají serva pro otáčení a naklánění vačky.

MPU9265 je 3osé zrychlení, 3osá rychlost úhlové rotace a 3osý snímač magnetického toku. Použijeme to hlavně k získání směru kompasu.

Jednotlivé moduly jsou propojeny propojovacím kabelem. Nepájivá deska funguje jako dispečer a poskytuje napájecí napětí (5 V a 3,3 V) a uzemnění. Všechna připojení jsou popsána v tabulce připojení (viz příloha). Připojení 5V na vstup 3,3V pravděpodobně zničí váš čip. Před dodávkou buďte opatrní a dvakrát zkontrolujte veškerou kabeláž (zde je třeba zvážit zejména kodér). Před připojením všech desek byste měli změřit hlavní napájecí napětí na expediční desce multimetrem. Moduly byly upevněny nylonovými šrouby do podvozku. Také zde jsem byl rád, že je lze opravit, ale také odstranit v případě poruchy.

Jediné pájení nakonec byly motory a prkénko a záhlaví. Abych byl upřímný, líbí se mi propojovací vodiče, ale mohou vést k uvolnění spojení. V některých situacích vám při monitorování připojení mohou pomoci některá monitorování softwaru.

Krok 3: Softwarová infrastruktura

Softwarová infrastruktura
Softwarová infrastruktura
Softwarová infrastruktura
Softwarová infrastruktura

Po dosažení mechaniky nastavíme softwarovou infrastrukturu tak, aby měla pohodlné podmínky pro vývoj.

Git

Jedná se o bezplatný a otevřený systém pro správu verzí. Používá se ke správě velkých projektů jako Linux, ale lze jej také snadno použít pro malý projekt (viz Github a Bitbucket).

Změny projektu lze sledovat lokálně a také je lze odeslat na vzdálený server, aby bylo možné sdílet software s komunitou.

Hlavní používané příkazy jsou:

git clone https://github.com/makerobotics/RPIbot.git [Získejte zdrojový kód a konfiguraci git]

git pull origin master [získejte nejnovější ze vzdáleného úložiště]

git status [získejte stav lokálního úložiště. Jsou změněny nějaké soubory?] Git log [získat seznam potvrzení] git add. [přidat všechny změněné soubory do fáze, která má být zvážena pro další potvrzení] git commit -m "komentář pro potvrzení" [odevzdat změny do místního úložiště] git push origin master [poslat všechny potvrzení do vzdáleného úložiště]

Protokolování

Python poskytuje některé vestavěné funkce protokolování. Softwarová struktura by měla před zahájením dalšího vývoje definovat již veškerý rámec protokolování.

Záznamník lze nakonfigurovat tak, aby se v terminálu nebo v souboru protokolu zaznamenával v definovaném formátu. V našem případě je záznamník konfigurován třídou webového serveru, ale můžeme to také udělat sami. Zde nastavíme pouze úroveň protokolování na DEBUG:

logger = logging.getLogger (_ name_)

logger.setLevel (logging. DEBUG)

Měření a vykreslování

Chcete -li analyzovat signály v průběhu času, je nejlepší je vykreslit do grafu. Protože Raspberry Pi má pouze konzolový terminál, budeme data sledovat v csv souboru odděleném středníkem a vykreslit je ze vzdáleného počítače.

Soubor trasování oddělený středníkem je generován naším hlavním kódem pythonu a musí mít následující záhlaví:

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;

První sloupec obsahuje časové razítko. Následující sloupce jsou zdarma. Volá se skript vykreslování se seznamem sloupců, které se mají vykreslit:

vzdálený@pc: ~/python rpibot_plotter -f trace.csv -p speedL, speedR, pwmL, pwmR

Skript vykreslení je k dispozici ve složce nástrojů:

Plotr používá v Pythonu mathplotlib. Musíte jej zkopírovat do počítače.

Pro větší pohodlí je skript pythonu volán skriptem bash (plot.sh), který se používá ke zkopírování trasovacího souboru Raspberry Pi do vzdáleného počítače a vyvolání plotru s výběrem signálu. Skript bash „plot.sh“se ptá pokud má být soubor zkopírován. Bylo to pro mě pohodlnější, než pokaždé ručně kopírovat. „sshpass“slouží ke zkopírování souboru z Raspberry Pi do vzdáleného počítače pomocí scp. Je schopen zkopírovat soubor bez zadání hesla (předává se jako parametr).

Nakonec se otevře okno s grafem, jak je znázorněno na obrázku.

Vzdálená komunikace

Rozhraní pro vývoj Raspberry Pi je SSH. Soubory lze upravovat přímo v cíli nebo je lze kopírovat pomocí programu scp.

Pro ovládání robota běží na Pi webový server, který poskytuje ovládání pomocí Websocketů. Toto rozhraní je popsáno v dalším kroku.

Nastavte Raspberry Pi

Ve složce "doc" zdrojového kódu (setup_rpi.txt) je soubor popisující nastavení Raspberry Pi. Není mnoho vysvětlení, ale mnoho užitečných příkazů a odkazů.

Krok 4: Uživatelské rozhraní

Uživatelské rozhraní
Uživatelské rozhraní

K hostování uživatelského rozhraní používáme lehký webový server Tornado. Jedná se o modul Pythonu, který nazýváme při spuštění softwaru pro řízení robotů.

Softwarová architektura

Uživatelské rozhraní je vytvořeno pomocí následujících souborů: gui.html [Popis ovládacích prvků a rozvržení webové stránky] gui.js [Obsahuje kód javascriptu pro ovládání a otevření připojení websocketu k našemu robotu] gui.css [Obsahuje styly ovládací prvky html. Zde jsou definovány polohy ovládacích prvků]

Websocket komunikace

Uživatelské rozhraní není nejlepší, ale dělá svou práci. Zde jsem se zaměřil na technologie, které pro mě byly nové, jako jsou Websockety.

Web komunikuje s webovým serverem robotů pomocí Websockets. Toto je obousměrný komunikační kanál, který zůstane otevřený po zahájení připojení. Posíláme příkazy robota přes Websocket na Raspberry Pi a získáváme informace (rychlost, poloha, stream kamery) zpět pro zobrazení.

Rozložení rozhraní

Uživatelské rozhraní má ruční zadávání příkazů. To bylo použito na začátku k odesílání příkazů robotu. Zaškrtávací políčko zapíná a vypíná stream kamery. Dva posuvníky ovládají otáčení a naklánění kamery. Pohyb robotů ovládá pravá horní část uživatelského rozhraní. Můžete ovládat rychlost a cílovou vzdálenost. Základní informace o telemetrii jsou zobrazeny ve výkresu robota.

Krok 5: Programování platformy robota

Programování platformy robota
Programování platformy robota
Programování platformy robota
Programování platformy robota
Programování platformy robota
Programování platformy robota

Tato část byla hlavním cílem projektu. Když jsem představil nový podvozek se stejnosměrnými motory, přeformuloval jsem spoustu softwaru. Python jsem použil jako programovací jazyk z různých důvodů:

  • Je to hlavní jazyk Raspberry Pi
  • Je to jazyk na vysoké úrovni s mnoha vestavěnými funkcemi a rozšířeními
  • Je objektově orientovaný, ale může být také použit pro sekvenční programování
  • Není nutná žádná kompilace ani řetěz nástrojů. Upravte kód a spusťte jej.

Hlavní softwarová architektura

Software je objektově orientovaný, rozdělen do několika objektů. Moje myšlenka byla rozdělit kód na 3 funkční bloky:

Sense Think Actuate

Sense.py

Pořízení a zpracování hlavního senzoru. Data jsou uložena ve slovníku, který bude použit v následující fázi.

Control.py

Podtřída ovládání ovládá motory a serva po určité abstrakci. Hlavní řídicí objekt ovládá příkazy na vysoké úrovni a také řídicí algoritmy (PID) pro motor.

rpibot.py

Tento hlavní objekt je správa webového serveru Tornado a vytváření instancí tříd sense a control v samostatných vláknech.

Každý modul lze spustit samostatně nebo jako součást celého projektu. Můžete pouze snímat a vytisknout informace o senzorech, abyste zkontrolovali, zda jsou senzory správně připojeny a dodávají správné informace.

Ovládání PID

Prvním úkolem je zjistit, co chceme ovládat. Začal jsem tím, že jsem se pokusil ovládnout pozici, která byla velmi složitá a moc nepomáhala.

Nakonec chceme ovládat každou rychlost kola a také směr robota. K tomu musíme kaskádovat dvě řídicí logiky.

Pro zvýšení složitosti krok za krokem by měl být robot řízen:

otevřená smyčka (s konstantním výkonem)

pwm = K

pak přidejte algoritmus zavřené smyčky

pwm = Kp.speedError+Ki. Integration (speedError)

a nakonec přidejte ovládání směru jako poslední krok.

Pro regulaci rychlosti jsem použil ovladač „PI“a „P“pouze pro zatáčení. Parametry jsem ručně nastavoval experimentováním. Tady by se asi daly použít mnohem lepší parametry. Mým cílem byla jen přímka a málem jsem to pochopil. V softwaru jsem vytvořil rozhraní pro zápis některých proměnných uživatelským rozhraním. Nastavení parametru Kp na 1.0 vyžaduje následující příkaz v uživatelském rozhraní:

SET; Kp; 1,0

Mohl jsem nastavit parametr P dostatečně nízko, abych se vyhnul jakémukoli přestřelení. Zbývající chyba je opravena parametrem I (integrovaná chyba)

Bylo pro mě těžké zjistit, jak kaskádovat oba ovládací prvky. Řešení je jednoduché, ale předtím jsem zkoušel mnoho dalších způsobů … Nakonec jsem změnil rychlostní cíl kol tak, aby se otáčel jedním nebo druhým směrem. Přímá změna výstupu ovládání rychlosti byla chybou, protože se regulátor rychlosti pokoušel odstranit tuto poruchu.

Použitý ovládací diagram je přiložen. Zobrazuje pouze levou stranu ovládání robota.

Krok 6: Kalibrace senzoru

Kalibrace senzoru
Kalibrace senzoru
Kalibrace senzoru
Kalibrace senzoru
Kalibrace senzoru
Kalibrace senzoru

Nejprve je třeba vzít v úvahu, že celá IMU musí správně fungovat. Objednal jsem 3 díly a poslal je zpět, dokud jsem neměl plně funkční senzor. U každého předchozího senzoru některé části senzoru nefungovaly správně nebo vůbec. Před montáží do robota jsem použil několik ukázkových skriptů k otestování základů.

Signály snímače IMU je třeba před použitím kalibrovat. Některé signály ze snímačů závisí na montážním úhlu a poloze.

Kalibrace zrychlení a rychlosti otáčení

Nejjednodušší kalibrace je pro podélné zrychlení (A_x). V klidu by se mělo pohybovat kolem 0 m/s². Pokud snímač otočíte správně, můžete měřit gravitaci (kolem 9, 8 m/s²). Chcete -li kalibrovat a_x, stačí jej správně namontovat a poté definovat ofset, aby se při zastavení dosáhlo 0 m/s². Nyní je A_x kalibrován. Offsety pro rychlosti otáčení můžete získat podobným způsobem v klidu.

Kalibrace magnetometru pro kompas

Pro senzory magnetického pole je nutná složitější kalibrace. K získání magnetického pole v horizontální úrovni použijeme m_x a m_y. M_x a m_y nám poskytne příležitost vypočítat směr kompasu.

Pro náš jednoduchý účel budeme kalibrovat pouze odchylku tvrdého železa. To je nutné provést, protože snímač je v konečné poloze, což závisí na poruchách magnetického pole.

Při otáčení robota kolem osy z zaznamenáváme m_x a m_y. Vyneseme m_x vs m_y do grafu XY. Výsledkem je elipsa, jak je znázorněno na obrázku. Elipsa musí být vycentrována na počátek. Zde uvažujeme maximální a minimální hodnoty m_x a m_y, abychom získali posuny v obou směrech. Nakonec zkontrolujeme kalibraci a uvidíme, že elipsa je nyní vystředěna.

Kalibrace měkkého železa by znamenala, že změníme obrázek z elipsy na kruh. Toho lze dosáhnout přidáním faktoru ke každé hodnotě senzoru.

Nyní lze kódovat testovací rutinu pro rekalibraci nebo alespoň pro kontrolu, zda jsou senzory stále kalibrovány.

Směr kompasu

Data magnetometru budou nyní použita k výpočtu kurzu kompasu. K tomu musíme převést signály m_x a m_y na úhel. Python přímo poskytuje funkci math.atan2, která má tento cíl. Kompletní výpočet je definován v souboru mpu9250_i2c.py ("calcHeading (mx, my, mz)").

Krok 7: Alternativní návrhy

Alternativní designy
Alternativní designy
Alternativní designy
Alternativní designy
Alternativní designy
Alternativní designy

Projekt trval hodně času, protože design byl zcela otevřený. Pro každou komponentu jsem vytvořil implementaci prototypu a zažil limity systému.

Nejsložitějším tématem byl kodér kol. Než jsem našel aktuálně používaný optický kodér, vyzkoušel jsem 3 různé možnosti. Myslím si, že zrušená řešení jsou v takovém projektu také velmi zajímavá. Týká se částí, kde jsem se nejvíce naučil.

Servo s nepřetržitým otáčením připojeno k pca 9695

Abych se vyhnul dodatečnému H-můstku pro stejnosměrný motor, nejprve jsem začal servy s plynulým otáčením. Ty byly poháněny již přítomným servopohonem pca 9695. Veškerá mechanika pohonu a odpovídající elektronika byly mnohem jednodušší. Tento design měl dvě nevýhody:

  • Špatný rozsah ovládání serv.
  • Chybějící poloha kodéru

Serva se začínají pohybovat s 50% pwm a mají plnou rychlost asi 55%. Toto je velmi špatný rozsah ovládání.

Bez držení kodéru bylo velmi obtížné najít kodér připravený k provozu. Testoval jsem 3 různé snímače odrazivosti, které byly namontovány na podvozku. Na vnější stranu kola jsem nalepil samostatně vyrobené enkodérové kolo s černými a bílými částmi. Použil jsem senzory QTR-1RC, které potřebují hodně zpracování signálu, aby získali správný signál. Raspberry Pi nebyl schopen provádět tento druh zpracování v reálném čase. Rozhodl jsem se tedy přidat robota NodeMCU D1 mini jako ovladač v reálném čase. To bylo připojeno k Raspberry Pi sériovým UART, aby doručilo zpracovaná data ze senzorů. NodeMCU také spravoval senzor HC-SR04. Mechanika byla obtížná a ne příliš robustní, sériová linka dostávala hluk z linky I2C a motorů, takže jsem nakonec postavil druhou verzi podvozku s jednoduchými převodovými stejnosměrnými motory poháněnými H-můstek. Tyto motory mají sekundární výstupní hřídel pro umístění optického kodéru.

Krok 8: Zpracování obrazu

Zpracování obrazu
Zpracování obrazu
Zpracování obrazu
Zpracování obrazu
Zpracování obrazu
Zpracování obrazu
Zpracování obrazu
Zpracování obrazu

Abychom vylepšili autonomní řízení, můžeme provést určité zpracování obrazu.

Knihovna opencv je pro to referencí. Python ho může použít k rychlé implementaci detekce překážek.

Zachytíme obrázek a použijeme některé úlohy zpracování obrázku:

První testy byly provedeny s transformacemi Cannyho a Sobela. Canny může být dobrým kandidátem, ale není dost rozumný. Sobel je příliš rozumný (detekováno příliš mnoho objektů).

Nakonec jsem vytvořil vlastní filtr pro smíchání všech horizontálních a vertikálních přechodů (detekovat nábytek):

  • Transformujte barevný obrázek na obraz s úrovní šedi
  • Rozmazáním obrazu odstraníte malý šum
  • Prahujte obrázek na černobílý obrázek
  • Nyní zjišťujeme horizontální a vertikální přechody, abychom detekovali objekty jako stěny a nábytek
  • Filtrujeme pouze velké zbývající kontury (viz barevné kontury na obrázku)

Nyní můžeme tyto nové informace použít k detekci překážek …

Krok 9: Další kroky…

Další kroky…
Další kroky…
Další kroky…
Další kroky…

Nyní máme jednoduchou robotickou platformu se senzory, akčními členy a kamerou. Mým cílem je pohybovat se autonomně a vrátit se zpět na stanici bez přidání dalších senzorů. K tomu budu potřebovat následující kroky:

  • Senzorová fúze signálů zatáčení a magnetického směru
  • Zpracování obrazu z kamery (k dispozici je pouze nízký procesor)
  • Detekce kolizí (ultrazvuková vzdálenost a kamera)
  • Budova mapy nebo orientace

Nyní jděte a vytvořte si vlastní výzvy nebo cíle…

Doporučuje: