czech english

Čtyřtulky

až na dno (fandorama průzkum)

Nová generace létacích strojů od Parrotu ARDrone3 (Jessica, Katarina) už nemá tak „roboticky přátelské” API jako starší ARDrone2 (Heidi). Hardware je ale lepší. Co s tím? Rozhodl jsem se po dvou letech s Heidi jít o úroveň níž a prozkoumat jak se to vlastně celé řídí a případně si to naprogramovat sám … Blog update: 6/5 — Lekce 7 + Fandorama Terminátor

Motivace

Ono tech motivací je více. Je pravda, že hlavní spouštěč byla nutnost vrátit Katarinu a co teď budu dělat?! Její API je pro robotiky mizerné a přeci jenom rozbíjet 14kkč hračku se mi úplně nechce. Na druhou stranu na Heidi se už skoro rok práší, tak proč jí nevyužít ke studiu? ARDrone2 je také řádově lépe zdokumentovaná než nová generace.
Druhá motivace pochází od kolegy ze školy. Postavil si vlastní čtyřtulku a snaží se do ní flashnout náhodný firmware. Mně z toho vstávají vlasy hrůzou — já bych tomu nejprve chtěl rozumět.
Konečně existuje několik projektů jako ardupilot-mpng nebo paparazzi a toto by byla cesta, jak se s nimi více seznámit.
Vlastně jsem měl ještě jednu motivaci, že ve škole mám projít nějakým předmětem „Řídící a kontrolní systémy” a že by to šlo možná použít, ale těžko řící.

Fandorama

Toto je další „průzkumný” fandorama projekt. Zase jsem spíše zvědavý, jestli to ještě někoho zajímá než přepnu do angličtiny. Můj cíl je do Robotem rovně (16. května 2015) odstartovat, levitovat 10 sekund a přistát. Vám to možná přijde triviální a mne zatím neřešitelné … no když tak napiště .


Blog

14. dubna 2015 — Paparazzi

Ono to možná bude ještě jinak než jsem si před 24 hodinami představoval. Včera jsem si znovu zkompiloval Hello World a pustil na Heidi. Jako návod jsem použil 2 roky starý blog z RoboOrienteering 2013, jen nástroj pro Ubuntu jsem instaloval podle Raspberry Pi Kernel Compilation, konkrétně pouze řádek:
sudo apt-get install gcc-arm-linux-gnueabi make ncurses-dev
a Céčko pak zkompiloval pomocí
arm-linux-gnueabi-gcc -o arm-hello hello.c
Toto fungovalo dobře jako před dvěma lety, ale tehdy jsem si narazil při kompilaci driveru pro sonar přes I2C. Třeba specifický kernel nebude nutný?? Uvidíme.
Pak jsem koukal do zdrojáků Paparazzi a našel hned na několik zajímavostí. První byla, že už je nějaká podpora i pro Bebopa, viz sw/airborne/boards/bebop. Toho teď nemám, tak o kousek vedle je sw/airborne/boards/ardrone. Konkrétně mne zaujal soubor navdata.c a mám-li být ještě konkrétnější, tak
navdata.fd = open("/dev/ttyO1", O_RDWR | O_NOCTTY); //O_NONBLOCK doesn't work
případně ještě o pár řádek níže je nastavení komunikační rychlosti na B460800. Jestli tak rychle komunikuje tak potěš .
Tím se ale vracím k prvnímu odstavci. Ono to nebude tak hluboké, jak jsem si představoval, protože o řízení se bude starat další deska, se kterou se baví po UARTu. Pokud nic jiného, tak programátor by měl k dispozici stejná data, jako ARDrone2 posílá po UDP v debug režimu, ale lokálně, přímo na droně.
Místo prvního testu na roztočení jednotlivých motorů to teď vidím jako zkompilovat si samostatně navdata.c a ověřit teorii. Moc by mne zajímalo, jestli to má Bebop/ARDrone3 stejně, ale to až někdy časem …
p.s. pěkné čtení na wiki/Bebop a starší wiki/AR_Drone_2
p.p.s.s. ono s těma motorama asi bude taky sranda (viz AR_Drone_2/Motor_driver). A co mám výpis devices, tak opravdu vidím /dev/ttyO0, /dev/ttyO1, /dev/ttyO2 a /dev/ttyO3.

17. dubna 2015 — Paparazzi cont.

… abych to zas tak nepřechválil. Včera jsem si cvičně zkusil celý projekt zbuildovat, resp. stáhnout potřebné knihovny a nástroje. No nebyl to dobrý nápad dělat to na tom malinkém disku — teď je plný a nemůžu dělat nic (ani testovat obyčejné Python skripy), tj. snad jen malý odklad experimentů.

29. dubna 2015 — VirtualBox a FTP

Žádná sláva. Starý notebook stávkuje — pro změnu velikosti partition je třeba, aby byla bezchybná, ale nefunguje to ani po puštění chkdsk po bootu. Odkládám zatím k ledu.
Říkal jsem si, že stejně budu potřebovat mít nabroušené nástroje po ruce a tak jsem se vydal cestou přes Virtual Box. Nainstaloval jsem si do toho ubuntu-14.04.2-desktop-i386.iso, které jsem stahoval kvůli těm změnám na starém disku a na první pohled vše běželo. Je to v malém okně, „copy & paste” nefunguje i když jsem ho povolil a doinstaloval nějaké balíčky, ale na druhou stranu prošel příkaz na stažení potřebných knihoven a kompletní kompilaci paparazzi kódu.
Kdybych si to sem před čtrnácti dny nenapsal, tak bych dnes pochyboval, jestli se mi to nezdálo … nefunguje mi FTP na dronu. Včera jsem se zkoušel ve škole připojit na Isabelle a pak na Heidi. Vypadá to, že spojení je úspěšně navázáno, ale po pár sekundách se přeruší a kopírovaný soubor je vždy prázdný (0 bajtů). Na druhou stranu telnet funguje jak z Virtual Boxu i přímo z Win7, tak nevím.
Nové zkompilovaný „Hello World” ani paparazzi image pro dronu jsem tedy zatím nevyzkoušel. Asi to zkusím nějak obejít přes ten telnet nebo USB disk, ale přijde mi to na hlavu. Firewall? Nevím.
p.s. nerozumím tomu, ale když jsem dal ftp://192.168.1.1/ do Mozzila prohlížeče (na Win7), tak tam to fungovalo. FileZilla nefunguje. Gitbash vyhodil nejprve varování na Firewall, ale pak funguje i upload.
Ve Virtual Boxu jsou problémy:
ale když rychlo-procházím web, tak problémy jsou možná očekávané …
Momentálně snad funguje tedy o něco delší cesta přes sdílený disk a
sudo mount -t vboxsf virtualbox /mnt/
… je čas posunout se dál.

30. dubna 2015 — test_navdata.c (onboard)

Je tedy ještě 29/4 večer, ale než to dopíšu, tak bude to datum platit . Nejprve dobrá zpráva — prokopaný obchvat z rána funguje a není to ani tak hrozné. Ve virtual boxu vše zkompiluji a z Win7 to pak uploadnu přes sdílenou část disku. Editaci i telnet pak můžu mít na obou „strojích” s tím, že na Win7 je to pohodlnější.
Trošku horší je to s kódem. Je to hack splácaný z paparazzi navdata.c, ale je to experiment, který nejspíše po víkendu už zahodím. Potřebuji jen otevřít /dev/ttyO1, nastavit rychlost a přečíst pár bajtů. Nakonec jsem to dal do gitu Heidi (diff), kdyby si to někdo chtěl zkusit také. Nesestřelil jsem ale hlavní řídicí program tak nasbírané vzorky asi budou nesmysl.
Ano, je to guláš. Koukám, jak se packet zpracovává v Paparazzi a je to fixní velikost (60 bajtů) s úvodním bajtem 0x3A a kontrolním součtem na konci. A já nalogoval zhruba třetinu paketů. Je čas zabijáků:
killall -9 program.elf.respawner.sh; killall -9 program.elf
(z originálu electrical_raw.c:73)
zabiják pomohl (diff), protože teď výskyty 0x3A v logu vypadají daleko pravidelněji
0
60
120
180
240
300
360
420
480
540
600
…
OK, tak parse_navdata.py už vyzobává jednotlivé prvky navdata_measure_t struktury. Stále mi nesedí kontrolní součet, ale to příště …

1. květen 2015 — test_battery.c (onboard)

Zdroják pro test_battery.c snad zatím ani na git dávat nebudu. Je to smíchané hlavně z electrical_raw.c a jelikož se pro komunikaci používá I2C, tak ještě i2c_smbus.h. První pokus nefungoval, ale to bylo z důvodu, že jsem přehlédl, že electrical_setup() nestačí a je třeba ještě volat electrical_init(). „Můj” kód tedy nakonec vypadal takto:
int main()
{
  electrical_init();
  fprintf( stderr, "Battery %d\n", (int)electrical_periodic() );
  return 0;
}
kde funkci electrical_periodic() jsem si upravil, aby vracela electrical.vsupply — hodnotu v desetinách voltů.
# cd /data/video/
# ./battery
killall: program.elf.respawner.sh: no process killed
Battery 126
Další krok jsou asi už ty motory …

2. květen 2015 — Motory

Studuji zdrojový kód actuators_ardrone2_raw.c. Komunikace s řídící jednotkou pro motory je tentokrát přes /dev/ttyO0 a rychlost komunikace 115200baud. Dále se používá GPIO port /dev/gpio. Moc mi nebyl jasný význam těch pinů, ale přes AR_Drone_2/Motor_driver jsem se dostal na Perquin blog o hackování první generace ARDrone a tam píše Whenever the motor controller detects a problem, it will stop running and toggles the IRQ pin. … a to je právě jediný vstupní pin.
Zase jsem kód splácal z několika Paparazzi zdrojáků a main vypadal takto:
int main()
{
  int i;
  actuators_ardrone_init();
  actuators_ardrone_set_leds(MOT_LEDGREEN, MOT_LEDGREEN, MOT_LEDGREEN, MOT_LEDGREEN);
  for( i = 0; i < 100; i++ )
  {
    actuators_ardrone_set_pwm( 0, 0, 0, 0 );
    usleep( 5000 );
  }
  return 0;
}
Jinak Heidi mám přivázanou silným gumicukem k dětskému stolečku a přiznám se, že je to celkem adrenalinová zábava . Tedy ten kód výše ještě ne, ale pak jsem změnil 0 na 1 (rozlišení je 0..511) a celkem jsem se lekl . Že jsem se nejprve spletl v řádu a volal usleep(5) snad skoro nestojí za zmínku. Správně to má běžet na 200Hz, tj. 5ms, tj. 5000us.
Finální kód zatočí 0.5 sekundy s každým motorem na minimální PWM. Pokud si to chcete sami zkusit (a nebojíte se), tak zde je binárka:
  • spin_motors, 14571 bajtů, md5=56bcfb99d1d339520216ba0293434410
případně z předešlých testů (které doporučuji zkoušet jako prvé):
  • navdata, 9104 bajtů, md5=5a7f544ac08a4b06dd4960e2782730d0
  • battery, 14009 bajtů, md5=dba8e6f805c3d0df35f6dd200af20440
Nějak mi to video v prohlížeči zlobí, tak tady je přímý odkaz: http://youtu.be/jzH--A20fYU

4. květen 2015 — yavta a /dev/video 1+2

Tento snímek asi nikoho moc nenadchne:
/dev/video2
/dev/video2
… ale mne jo . Návod, co jsem našel na ar-drone-2-camera-access, totiž funguje! Přední kamera je /dev/video1 a spodní kamera je /dev/video2. V obou případech používá standard V4L2 (Video for Linux, verze 2) a jednotlivé snímky lze získat např. pomocí yavta Yet Another V4L2 Test Application, který už přímo na ARDrone2 je … tak už víte, jak jsem získal ten obrázek?
# yavta -c5 –skip 4 -F -f UYVY -s 320x240 /dev/video2
Device /dev/video2 opened.
Device `OMAP3 ISP CCDC output' on `media' is a video capture device.
Video format set: UYVY (59565955) 320x240 buffer size 153600
Video format: UYVY (59565955) 320x240 buffer size 153600
8 buffers requested.
length: 153600 offset: 0
Buffer 0 mapped at address 0x401b2000.
length: 153600 offset: 155648
Buffer 1 mapped at address 0x401d8000.
length: 153600 offset: 311296
Buffer 2 mapped at address 0x401fe000.
length: 153600 offset: 466944
Buffer 3 mapped at address 0x40224000.
length: 153600 offset: 622592
Buffer 4 mapped at address 0x4024a000.
length: 153600 offset: 778240
Buffer 5 mapped at address 0x40270000.
length: 153600 offset: 933888
Buffer 6 mapped at address 0x40296000.
length: 153600 offset: 1089536
Buffer 7 mapped at address 0x402bc000.
0 (0) [-] 4294967295 153600 bytes 118.334289 118.334289 120.034 fps
1 (1) [-] 4294967295 153600 bytes 118.350494 118.350524 61.709 fps
2 (2) [-] 4294967295 153600 bytes 118.366668 118.366699 61.828 fps
3 (3) [-] 4294967295 153600 bytes 118.382873 118.382873 61.709 fps
4 (4) [-] 4294967295 153600 bytes 118.399047 118.399078 61.828 fps
Captured 5 frames in 0.073120 seconds (68.380634 fps, 10503265.325693 B/s).
8 buffers released.

5. květen 2015 — NAVDATA_PWM_TAG

Toto je asi předposlední příspěvek (viz fandorama status). Čeká mne zásadní krok a to propojit všechny díly skládačky nějakým regulátorem. Jelikož vůbec netuším jak moc to bude těžké, tak jsem hledal chvíli na webu. Nejprve jsem si chtěl přečíst článek o konstrukci drony na root.cz, ale zaujala mne spíše diskuse, konkrétně příspěvek Vladimíra ze Silicon Hill na Strahově. Doporučuje AR.Drone 2.0 jako alternativu a já s ním mohu jedině souhlasit .
API u druhé generace je asi nepřekonatelné (a raději se budu opakovat, že u ARDrone3 je pro robotiky naprosto nepoužitelné). Tušil jsem, že Heidi posílala i otáčky motorů, ale ve skutečnosti to bylo PWM (viz dnešní diff). Po testu z víkendu vím, že i pro hodnotu 1 se motory celkem svižně točí, ale jak moc to musím „osolit”, abych odstartoval netuším. Vy už ano? ACK, přesně tak, stačí se podívat do rok a více starých logů. Všechno tam je . Věřím, že teď bych dohledal i detaily, proč Heidi tak divoce startovala před dvěma lety na Robotem Rovně.
PWM (0, 0, 0, 0, …
PWM (70, 70, 70, 70, …
PWM (72, 72, 72, 72, …
PWM (70, 72, 86, 84, …
… toto je start při poletování nad krabicí (navdata_140522_133703.log.gz) .. to to utíká. Vypsané řádky se několikrát opakují, je to jen ukázka, že regulátor od Parrotu začíná na PWM=70/512. Jen poznámka, že si nejsem jist tím devátým bitem, tj. jestli to není děleno 256. Další čtveřice dat je sat_motorX, saturace? Není to ten devátý bit??

6. květen 2015 — Lekce 7 + Fandorama Terminátor

A je konec. Škoda. Nenašel se ani jeden stoupenec, kterého by tento průzkum alespoň trošku zajímal. Sigh. Tak poslední odstavec ještě o dění ze včerejška …
Lítal jsem s Isabelle ve škole, hlavně pro uklidnění . Zatím postaru, tj. vzdálené ovládání přes WiFi z Pythonu, ale i tak o překvapení nebyla nouze. Můj cíl byla navigace nad značkou přistávací plochy, kterou bych pak rád přepsal do drony samotné, viz anglický popis nebo přímo lesson7.py.
Při prvním startu Isabelle vylítla do dvou metrů, ale takeoff sekvence ještě neskončila! Tak jsem rychle mačkal ukončovací tlačítko. Můžu si teď studovat PWM, data ze sonaru a z kamery, jestli bych tuto situaci dokázal ošetřit lépe. Mimochodem viděl jsem v datech už saturaci jednoho z motorů:
PWM (213, 221, 216, 255, 255, 255, 255, 255, …
PWM (214, 226, 219, 255, 255, 255, 255, 178, …
…
PWM (70, 80, 74, 83, 255, 255, 255, 178 …
No nejsem si stále moc jist, co tím autoři myslí.
Co se navigace na přistávací plochu týče, tak asi největší problém je jí vůbec vidět. Pokud drona odstartuje šikmo (3/5 případů … je fakt, že jsem testoval na chodbě, kde trošku vane od vstupních dveří), tak není vidět nic. Po prvních testech jsem přešel na regulaci výšky podle úspěšnosti detekce: když nic nevidí, tak stoupá až do 2m, když naopak přistávací plochu spolehlivě vidí, tak snižuje výšku na 1m. Asi nejzábavnější byl test video_rec_150505_181533.bin, kdy jsem ještě korigoval na náklon místo na rychlost drony:
V druhé fázi jsem korigoval rychlost, aby byla na středu nulová. Teď bych to celé předělal, vzal v úvahu aktuální pozici a náklon, spočítal absolutní pozici přistávací plochy a navigoval se na souřadnici, což by mělo pomoci v okamžicích, kdy přistávací plochu vůbec nevidí (i když zmizela jenom z důvodu náklonu drony). Dále na seznamu je ještě otáčení, ale to beru jako takovou perličku až bude fungovat alespoň posun v XY.
bye.
p.s. pokud někdo na tyto stránky přijde později a zajímaly by ho nějaké detaily, tak prosím použijte kontaktní formulář nebo přímo mail … díky m.