Č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ě .
- Detaily tohoto projektu: https://fandorama.cz/projekty/921778164/low-level-drone/
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é …
- http://superuser.com/questions/29136/how-can-i-make-ftp-work-smoothly-in-virtualbox
- http://stackoverflow.com/questions/27990086/is-it-possible-to-get-ftp-to-work-in-virtualbox-using-nat-networking-or-get-php
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 |
… 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.