CortexPilot
CortexPilot vznikl v dobách, kdy slovo projekt ještě nebylo "vobnošený" (abych citoval klasika).
Jedná se o IMU jednotku a autopilota postaveného na procesoru třídy Cortex M3.
Celá věc se má tak, že v době vzniku (asi 5 let zpět) byl čas, něco peněz i patřičné nadšení.
Jenomže životní události typu rekonstrukce domu a změny zaměstnání mě zbavily času a peněz. :-(
Zbylo pouze nadšení, které jak známo nestačí a okolní svět mi mezitím poněkud utekl.
Nicméně nevzdal jsem to. Původní řešení (koncepční, nerealizované) jsem poněkud zmodernizoval
a přes zimu 2013/2014 jsem projekt dovedl do úspěšného konce a hned vyzkoušel na populárních robotických soutěžích :-)
Proti všem předpokladům se jako řídící jednotka osvědčil poměrně dobře.
Pod pseudonymem "ND Team", coby mozek robota Robíka, se umístil takto:
- Robotem Rovně 2014 - 5. místo
- Roboorienteering 2014 - 1. místo
zde video z produkce pořadatele - Robotour 2014 - 7. místo
- Jako mozek robota Speedyho na Robotem Rovně 2015 - 3. místo
- Opět v Robíkovi na Roboorienteeringu 2015 - 2. místo
- Robotour 2015 - 5. místo
Koncepce
Ze zdrojů dostupných online jsem vyrozuměl, že provozovat kompas (magnetomer) bez kompenzace náklonu nemá smysl.
Součástí řídící desky je proto devítiosá AHRS jednotka MPU6050 + HMC5883L.
Jak bylo očekáváno, moje aktuální znalosti matematiky nestačily na vlastní implementaci fůze senzorů,
kterou bych stihl dodělat v rozumném čase.
Použil jsem proto volně dostupnou implementaci pana Madgwicka.
Podařilo se mi dosáhnout 120 Hz refresh polohy - limitující je rychlost zvoleného magnetometru.
Inspiroval jsem se lidským mozkem, kde malý mozek řídí low-level funkce (orientace, rovnováha)
a velký mozek zpracovává signály ze složitých senzorů (video) a plánuje chování celého systému.
Tato jednotka tedy funguje jako malý mozek a zajišťuje následující funkce:
- orientace robota v prostoru (pitch, roll, yaw - odolnost proti převrácení,
zřícení ze svahu a zaujímání nevhodých póz vůbec)
- GPS
- 6x servo nebo PWM výstup
- 6x RC vstup
- řízení reguátoru motorů
- měření napětí a proudu z napájecích baterií (pohon a řídící elektronika)
- zpracování dat ze sonarů
- USB komunikace
- Bluetooth komunikace
- logování na uSD kartu
- RTC a další bižuterie
Technický popis
- Čtyřvrstvá deska
- Rozměry 73x42 mm, výška max. 15 mm
- Mikrokontrolér LPC1765
- Mini USB-B konektor - USB 2.0 device
- Slot pro uSD kartu připojený přes SPI
- 4 stavové LED na desce
- 3-osý akcelerometr + 3-osé gyro MPU6050
- 3-osý magnetometr HMC5883L
- Barometrický senzor MS5611
- Driver CAN sběrnice MCP2551
- Napájení +9..+30V nebo +5V
- Zvláštní rozvod napájení +5V pro serva
- Logické úrovně LVTTL (3.3V)
- Pro serva konvertor úrovní na TTL (5V)
- Maximum pinů vyvedeno na konektory
Firmware
Firmware zatím pouze heslovitě - později doplním detaily.
- Motory nemají enkodéry, což znemožňuje regulaci stroje na konstantní rychlost - ano, do kopce zpomaluje... Nicméně pohony jsou tak silné a dopomala, že se to téměř neprojevuje.
- Základní řízení je řešeno jízdou vpřed dle zadaného azimutu. Na azimut je robot regulován standardním PID regulátorem.
- Vyhýbání překážkám na nejnižší úrovni řeší sonary pomocí Virtual Force Field algoritmu. Výsledný vektor je ve formě azimutu předán řídícímu subsystému.
- Pro navigační výpočty (jízda podle waypoint listu) používám poctivý letecký Great circle algoritmus, protože jednodušší výpočty mi nevyhovovaly přesností.
- Pro funkce velkého mozku byla zvolena platforma Odroid-U3
(bohužel už se nevyrábí, protože Samsung přestal produkovat čipy, ale existuje výkonnější náhrada).
Propojení s CortexPilotem je realizováno přes USB (virtuální COM port). K systému je připojena pouze webkamera namontovaná na jednoduché pan/tilt motáži (řízené z CortexPilotu). Na Odroidu běží LUbuntu linux a pro zpracování videa se využívá knihovna OpenCV verze 2.4.
Ve spolupráci s kolegou Tomem se mi podařilo vcelku úspěšně realizovat segmentaci obrazu, i když jsou to v podstatě pouze upravené tutorialy z manuálu k OpenCV a vytvořit algoritmus, jehož výstupem je opět cílový azimut pro nižší úrovně řídícího systému. - Pro implementaci rozhodování robota jsem použil úplně primitivní subsumpční architekturu, která se zatím ukazuje naprosto dostačující.
-
Základními režimy činnosti jsou jízda rovně / udržuj azimut a jízda podle waypoint listu.
Tato činnost může být přerušena vyhýbáním se překážce a signálem z videa o riziku opuštění sledované cesty.