Paula
mini-drone proti trudomyslnosti
Paula je loňský model malé drony do dlaně. Je to hračka na doma za necelých 3kkč od DJI a Intelu. Oficiální jméno zní Ryze Tello. Standardní použití je řízení pres WiFi z mobilního telefonu, ale výrobce podporuje i oficiální SDK. Tento blog je pro podobně praštěné, na které již to „domácí vězení” trošku padá a potřebují rozptýlit. Blog update: 10/6/2023 — Tello go, go, go!
Obsah
- 210202 - Základní info
- 210203 - Google Play 2.8
- 210204 - command "command"
- 210205 - H.264 video
- 210206 - Takeoff!
- 210207 - Selfie
- 210208 - cv2.Stitcher_create
- 230613 - Tello go, go, go!
Blog / Paula
2. únor 2021 — Základní info
Na Tello dronu jsem narazil před pár dny,
kdy mi na YouTube vyskočilo 3 hodinové video
Drone Programming With Python Course (2021).
Jednak mne zaujalo, že je někdo schopen v tomto prostoru vysvětlit základy létání s dronou,
programování v Pythonu, OpenCV a pod. + i ta malá drona vypadala zajímavě.
Autor videa sice píše, že s DJI a Intel nemá nic společného, ale za mne jim reklamu rozhodně
dělá. Mne zviklal, že jsem si dronu objednal a dnes by měla dorazit (možná je to i motivace
začít sepisovat poznámky, než budu realitou nemile překvapen). Evidentně se nemohu dočkat/dospat,
protože bylo 3:45, když jsem prvně koukl na hodiny.
Co je na té droně tak zajímavého? No připomíná mi to kombinaci staré Parrot ARDrone2 (Heidi)
s SDK a možností řízení přes WiFi a o něco novější mini-drony Parrot Rolling Spider (Jessica).
Reklama slibuje 13 minut letu, streaming HD videa a snadné ovldádání. Je fakt, že Tello SDK 1.3 (pdf)
má pouhých 8 stránek a projdete to za pár minut.
Řízení
Drona se ovládá pomocí UDP paketů, kde na první pohled vidím tři kanály pro tři porty:
- 8889 — posílání příkazů
- 8890 — příjem stavů
- 11111 — příjem videa
Defaultní IP adresa je 192.168.10.1 a předpokládám, že drona má DHCP s nastavitelným zabezpečením.
Příkazy jsou textové, jako takeoff, land, streamon, streamoff, tj. vlet, přistání,
zapnutí a vypnutí posílání videa. Dále emergency vypne všechny motory, up 20-500 vzlétne
nahoru 20cm až 5m, podobně down, left, right, forward, back … a to už jsme
na čtvrté stránce dokumentace SDK. Zbývá otočení ccw 1-3600 (conterclockwise/proti směru hodinových ručiček),
tj. až 10 otáček, podobně cw ve směru hodinových ručiček. S flip a go x y z speed
už máte všechny jednoduché stavební bloky „pro děti” (ano, těm je tato hračka primárně určena).
Drsněji vypadá curve x1 y1 z1 x2 y2 z2 speed což by měl být oblouk. Rychlost se pak nastavuje
pomocí speed 10-100 v cm/s, tj. do 1m/s. No a kdyby někomu nestačily tyto základní příkazy
tak ještě existuje rc a b c d, který nastavuje podobně jako u ARDrone2 RC kanály left/right,
forward/backward, up/down, yaw, vše s hodnotami -100 až 100.
Čtení stavu
Průběžně se můžete dotazovat na stav jednotlivých parametrů jako: speed?, battery?,
height?, temp? (teplota), attitude? (IMU data pitch, roll, yaw), baro?
(barometer v metrech?), acceleration? (ve všech osách x, y, z), tof? (time of flight,
předpokládám sonar dolu), wifi? (SRN … seriové číslo?). A to je všechno.
Konečně se lze zeptat na Tello State, což by měl být string a jako příklad uvádí:
"pitch:%d;roll:%d;yaw:%d;vgx:%d;vgy%d;vgz:%d;templ:%d;temph:%d;tof:%d;h:%d;bat:%d;baro:%.2f; time:%d;agx:%.2f;agy:%.2f;agz:%.2f;\r\n"
… hmm, to vypadá spíše jako print příkaz do Pythonu nebo C … tj. asi se lze zeptat na vše najednou??
To by asi byl i můj případ ale otázka, jak často se člověk může ptát?
Závěr
O videu se v SDK PDFku nic nepraví, tak doufám, že to bude nějaký standardní video stream nebo JPEG obrázky.
Stejně tak očekávám ještě nějaký „druhý protokol”, binární, pro interní účely. No možná to byly vyhozené
peníze, ale to se člověk nedozví, dokud to nezkusí (ano, nebo dokud nebude více sledovat internet, ale
to už mne pomalu přestává bavit). Tak uvidíme — držte mi palce.
p.s. pokud dronu máte a už s ní máte i nějaké zkušenosti, tak napište … díky!
3. únor 2021 — Google Play 2.8
Včera jsem si ještě před vyzvednutím balíčku nainstaloval
Google
Play aplikaci Tello. Co mne ale „trošku” vyděsilo bylo její hodnocení:
Možná jsem měl zrovna smůlu, ale vzhledem k tomu, že nejčastější hodnocení byla
pouze jedna hvězdička, to bylo asi očekávané.
Tello drones are garbage. Ordered 1 new for my son for christmas and came
with a dud battery. Returned and replaced with a 2nd and it worked for 1 day,
tho never stable and always floated to the side banging into objects. Then day
2 the back propellers began going haywire, outspinning the front making the
piece junk flip over every takeoff. Returned a 2nd time for full refund, no
replacements. We're done. Our worst experience ever on Amazon was this
garbage. … no hned jsem se těšil více (ironie).
Dronu a extra ochrannou klec jsem si včera večer vyzvedl. Pro referenci jsem kupoval:
- RYZE Tello Boost Combo (4 190 Kč)
- RYZE Tello ochranná klec (299 Kč)
První, co mne překvapilo, jak je to hrozně malinké. Balíček je jak malá
svačinka. Těch by se opravdu bez problému vešlo 10 do komínkui i na
Kloubáka K2.
Druhé pozorování bylo, že jsem udělal dobře a koupil combo. V praxi to
znamená dvě baterky navíc a malá nabíječka. V opačném případě by totiž člověk
chvíli lítal a pak musel dronu použít jako nabíječku a za hodinu by mohl udělat
další mini-pokus. Baterky se nabíjí postupně s tím, že u každé svítí, zda je
nabitá (zelená), právě se nabíjí (blikající zelená) nebo je ve frontě na
nabíjení (žlutá). Předpokládám, že jsou ještě nějaké chybové stavy, ale ty snad
hned tak neuvidím.
Baterky jsem nechal nabíjet přes noc, tj. teď mám „tři dávky”,
jenom to bude muset počkat (pes, snídaně, práce,
Robotour webinář, SubT středeční call
…), takže report z prvního pokusu o navázání komunikace až zítra.
p.s. ještě jsem se dozvěděl, že EDU verze podporuje SDK 2.x a swarm dronů,
což základní (moje) verze nepodporuje, ale tím se nechám znervózňovat až zítra
…
p.s.2 přiložený český manuál říká „revidovaná verze 1.2 z roku 2018”, takže
tyto mini-drony žádná novinka nejsou
4. únor 2021 — command "command"
… aby k tomu nedošlo, prozradím vám konec celé detektivky:
první úspěšný pohovor |
(Cimrman)
No nechtěla se se mnou mrcha bavit. Stáhl jsem si příklad
Tello3.py
odkazovaný z SDK a ani to nefungovalo. Aplikace na Android byla také taková
„zvláštní”. Obraz z kamery byl rozbitý, ale když jsem si uložil obrázek, tak
pak v galerii vypadal OK. Když jsem ale přepnul na nahrávání videa, tak
aplikace po chvíli napsala Overheet, shutting down?!
A rozuzlení? No ono je to vlastně v tom SDK v úvodu napsané: Remark2: Send
“command” command to Tello via UDP PORT 8889 to initiate Tello’s SDK mode,
before sending all other commands, prostě je nejprve třeba poslat
příkaz/commnad "command", aby se zapnul SDK mód.
A vlastně mi už funguje i první pokus v OSGARovi:
python -m osgar.logger tello-210203_225017.log k name bytes | count | freq Hz - - - - - - - - - - - - - - - - - - - - - - - 0 sys 916 | 6 | 0.6Hz 1 tello.cmd 9 | 1 | 0.1Hz 2 udp_cmd.raw 0 | 0 | 0.0Hz 3 udp_status.raw 13343 | 101 | 9.9Hz 4 udp_video.raw 0 | 0 | 0.0Hz Total time 0:00:10.163582
… tj. po odeslání command už chodí stavové data na 10Hz.
Data pak vypadají takto:
0:00:00.110007 3 b'pitch:0;roll:0;yaw:-2;vgx:0;vgy:0;vgz:0;templ:92;temph:94;tof :10;h:0;bat:27;baro:358.34;time:0;agx:-2.00;agy:6.00;agz:-999.00;\r\n' 0:00:00.213012 3 b'pitch:0;roll:0;yaw:-2;vgx:0;vgy:0;vgz:0;templ:92;temph:94;tof :10;h:0;bat:27;baro:358.35;time:0;agx:-3.00;agy:7.00;agz:-998.00;\r\n' 0:00:00.314018 3 b'pitch:0;roll:0;yaw:-2;vgx:0;vgy:0;vgz:0;templ:92;temph:94;tof :10;h:0;bat:27;baro:358.39;time:0;agx:-4.00;agy:4.00;agz:-1000.00;\r\n' …
… tj. baterky jsou asi skoro vybité (27%). Na večer experimentování z jedné baterky OK.
Tak první krůček snad učiněn.
5. únor 2021 — H.264 video
Včera jsem se kousek posunul i s nahráváním videa, ale bohužel skoro o zanedbatelný
kousek:
python -m osgar.logger tello-210204_154413.log k name bytes | count | freq Hz - - - - - - - - - - - - - - - - - - - - - - - - - 0 sys 918 | 6 | 0.6Hz 1 tello.cmd 30 | 3 | 0.3Hz 2 udp_cmd.raw 12 | 3 | 0.3Hz 3 udp_status.raw 13737 | 101 | 10.0Hz 4 udp_video.raw 2494746 | 1801 | 178.6Hz Total time 0:00:10.085510
Tj. vidíte tam zhruba 2.5MB video UDP paketů. Přidal jsem i jednoduchou sekvenci:
python -m osgar.logger tello-210204_154413.log –stream tello.cmd 0:00:00.017842 1 b'command' 0:00:02.009850 1 b'streamon' 0:00:05.010625 1 b'streamoff'
tj. v čase 0 zapni SDK protokol mód, v čase 2s spusť nahrávání a v čase 5s ho zase vypni.
Datově cca 1MB/s myslím zní celkem rozumně.
Listen to the data stream with the port number 11111 through UDP. The data stream is
encoded with the format of h264. Because size of encoded data of one frame image in this
stream is larger than the maximum load for a single udp transmission, every segment of one
frame encoded picture’data are divided into different blocks, with the unit size of 1460bytes.
And the last block of a image data is smaller than 1460 bytes.
… toto zní celkem rozumně. Jeden frame může být (typicky je) veliký a tak se rozdělí na několik
o velikosti 1460 bajtů
So by detecting the size of the block, it can be determined whether the data block is
the end of the data of the current single image. Splicing the last block in sequence with the
data blocks previously listened to, you can get the complete encoded data of a single image.
… toto ale už je divočina! Pokud vám přijde kratší paket, tak je to konec frame?! A co výpadky?
python -m osgar.logger tello-210204_154413.log –format "{timestamp} {len(data)}" –stream udp_video.raw | head -n 25 0:00:00.036130 1460 0:00:00.036936 1460 0:00:00.037336 1460 0:00:00.038663 1460 0:00:00.038781 1460 0:00:00.039000 1460 0:00:00.039154 1460 0:00:00.041383 1460 0:00:00.041505 1460 0:00:00.041573 1460 0:00:00.041779 1460 0:00:00.041900 552 0:00:00.070896 1460 0:00:00.071040 1460 0:00:00.071232 1460 0:00:00.071323 1460 0:00:00.073455 1460 0:00:00.073628 1460 0:00:00.073719 1460 0:00:00.073964 1460 0:00:00.075897 1460 0:00:00.076018 1460 0:00:00.076285 1460 0:00:00.076400 729 0:00:00.105331 1460
Takto to vypadá skoro rozumně, časově jsou si ty bloky blízko a pak začíná nový, ale dekódovat to jako H.264
frame se mi zatím nedaří. Parrot u každého paketu měl jeho index a délku, tak možná něco podobného je i zde??
Z nostalgie bych se po letech mohl podívat zase dovnitř, viz starý článek
H.264 pro vidění dravce.
6. únor 2021 — Takeoff!
První vzlet je vždycky drama, obzvláště pokud se jedná o start autonomní mise. A ani Paula
nezklamala.
Sekvence byla poměrně minimalistická:
self.tasks = [ [2, b'streamon'], [3, b'takeoff'], [5, b'land'], [8, b'streamoff'] ]
tj. zapni nahrávání videa, odstartuj a po dvou sekundách zase raději přistaň a následně
vypni nahrávání videa. A jak to dopadlo?
Program skončil, ale drona stále visela ve vzduchu (necelý metr nad zemí).
Byl jsem rád, že jsem použil ochrannou klec, ale stejně, jak jí sundat dolů?!
Nenapadlo mne nic lepšího, než ten jediný program, co jsem dosud měl, pustit znova:
Home, sweet home! Předpokládám, že u vzletu drona neakceptuje další příkazy
nebo se něco porouchalo. Mám pocit, že podobné chování měla i Jessica
— což bylo extrémně nepříjemné, pokud se na startu vymkla kontrole, prostě neakceptovala
ani příkaz přistaň.
python -m osgar.logger tello-210205_190125.log –stream tello.cmd udp_cmd.raw 0:00:00.032778 1 b'command' 0:00:00.046018 2 b'ok' 0:00:02.086795 1 b'streamon' 0:00:02.137147 2 b'ok' 0:00:03.002316 1 b'takeoff' 0:00:05.000937 1 b'land' 0:00:08.001190 1 b'streamoff' 0:00:08.003700 2 b'ok'
… no nevypadá to, že by "takeoff" byl potvrzený!
A v druhém pokusu, začínaje ve vzduchu, na "takeoff" odpověděla "error":
python -m osgar.logger tello-210205_190142.log –stream tello.cmd udp_cmd.raw 0:00:00.032203 1 b'command' 0:00:00.076145 2 b'ok' 0:00:02.065302 1 b'streamon' 0:00:02.115965 2 b'ok' 0:00:03.024324 1 b'takeoff' 0:00:03.036509 2 b'error' 0:00:05.026166 1 b'land' 0:00:08.023093 1 b'streamoff' 0:00:08.034631 2 b'ok' 0:00:09.106121 2 b'ok'
… a to potvrzení přistání vypadá také jako až po jeho skončení. Byla by pěkná nějaká
stavová proměnná, nebo holt na ten start musím počkat o něco déle.
7. únor 2021 — Selfie
Další cíl dosažen a vypadá takto:
To řešení je brutální, ale šlo o „prokopnutí cesty” a stačí náznak světla na konci tunelu.
Prostě video jsem nahrával už předevčírem, ale nebyl jsem schopen ho dekókovat. Potvrdil jsem
si, že je to H264 kodek, dokonce upravený starší kód vylámal počty makrobloků, tj. zjistil
jsem, že výsledný obrázek je menší než u ARDrone2 … ano, marketingový klam 720p … jen to není
16:9, ale 4:3, tj. rozlišení je 960x720. Ale pokusy dekódovat I-frame (jestli to nepletu) selhal.
Když už jsem propadl malomyslnosti, tak jsem koukal dále na to 3h video.
Říkal jsem si, že on to také musí nějak řešit?! Pro řízení drony používá DJITelloPy
a tam je čtení
videa řešeno přes cv2.VideoCapture() a jako parametr dostává address_schema = 'udp://@{ip}:{port}'.
Prostě pustí pomocné vlákno a to přímo čte UDP pakety a OpenCV to i rovnou dekóduje do numpy obrázků.
Pěkné! Ale funguje to? Jako první jsem zkusil jsem
take-picture.py
Napůl mne vlastně potěšila záplava hlášek:
(osgar) md@md-ThinkPad-P50:~/git/DJITelloPy/examples$ python take-picture.py [INFO] tello.py - 104 - Tello instance was initialized. Host: '192.168.10.1'. Port: '8889'. [INFO] tello.py - 418 - Send command: 'command' [INFO] tello.py - 443 - Response command: 'ok' [INFO] tello.py - 418 - Send command: 'streamon' [INFO] tello.py - 443 - Response streamon: 'ok' [h264 @ 0x153f740] non-existing PPS 0 referenced [h264 @ 0x153f740] non-existing PPS 0 referenced [h264 @ 0x153f740] decode_slice_header error [h264 @ 0x153f740] no frame! [h264 @ 0x153f740] non-existing PPS 0 referenced [h264 @ 0x153f740] non-existing PPS 0 referenced [h264 @ 0x153f740] decode_slice_header error [h264 @ 0x153f740] no frame! [h264 @ 0x153f740] non-existing PPS 0 referenced [h264 @ 0x153f740] non-existing PPS 0 referenced [h264 @ 0x153f740] decode_slice_header error [h264 @ 0x153f740] no frame! [h264 @ 0x153f740] non-existing PPS 0 referenced [h264 @ 0x153f740] non-existing PPS 0 referenced [h264 @ 0x153f740] decode_slice_header error [h264 @ 0x153f740] no frame! [h264 @ 0x153f740] non-existing PPS 0 referenced …
… ale drona vzlétla, opravdu jeden snímek udělala a přistála. Dveře do „tajemné komnaty”
jsou tímto pootevřeny.
V druhém pokusu, kdy jsem zkoušel příklad nahrávání videa, už to bylo divočejší, protože
drona se zamotala do věšáku — ochranná klec byla dobrá investice. Ono to trošku vypadá jak
míč, tak jsem to zkusil vzít do ruky a po vzoru starých ARDrone2 to otočit vzhůru nohama
a motory se zastavily. To se také může někdy hodit.
Problém je tedy množství nevalidních snímků v úvodu nahrávání videa a zatím
nevím, jak ty nástroje přesvědčit, aby to ignorovaly. Alternativa byla vytvořit
fiktivní Tello dronu, předstírat, že vysílá UDP pakety s daným časováním a výsledek
vypadá takto
(po spojení obou kousků pomocí ffmpeg -i "concat:video1.avi|video2.avi" -c copy video.avi).
8. únor 2021 — cv2.Stitcher_create
Přemýšlel jsem, co by nejlépe vystihlo dnešní pokusy s dronou (neděle 7/2 … je to takové posunuté)
a je to pokus o poskládání panoramatu z videa drony. Nejprve jsem trošku ladil kód, abych droně
posílal další příkazy až když předešlé vykoná (hlavně takeoff) a když toto začalo celkem rozumně
fungovat, tak jsem chtěl udělat panoramatický snímek, resp. video 360 stupňů dokola. Asi rovnou
naznačím co je další cíl — udělat dva panoramatické snímky nad sebou. Drona má totiž senzor
na měření vzdálenosti od země a tak bych mohl udělat panoramatické stereo.
Příkaz pro dronu:
command streamon takeoff cw 360 land streamoff
cw 360 je „otoč se o 360 stupňů po směru hodinových ručiček”. Samozřejmě jsem tam měl překlep,
což je ve vzduchu vždy „komické”:
0:00:01.069556 SEND b'streamon' 0:00:01.119955 — b'streamon' b'ok' 0:00:02.004058 SEND b'takeoff' 0:00:03.263466 Battery: 78 -> 77 0:00:07.193178 Battery: 77 -> 76 0:00:08.315170 — b'takeoff' b'ok' 0:00:09.183728 Battery: 76 -> 75 0:00:10.010189 SEND b'cv 360' 0:00:10.050536 — b'cv 360' b'unknown command: cv'
… ale pak to správně přistálo, takže OK.
No a teď to skládání obrázků. Je to na dva řádky (!):
stitcher = cv2.Stitcher_create() status, result_img = stitcher.stitch(images)
Drsné, nemyslíte? Uplně se mi nechce sdílet panoramatický snímek pracovno-ložnice, ale …
První pokus je jen pár snímků „obrazu” (takové to černé je ochranný kryt drony).
Druhý pokus skončil Killed (pravděpodobně na nedostatek paměti) a tak místo všech
obrázků z 360 stupňové otočky jsem tomu podhodil jenom každý pátý snímek. A dopadlo to
takto:
13. červen 2023 — Tello go, go, go!
Na robotickém víkendu jsme zase po letech vytáhli různé „kostlivce ze skříně”. Sám jich pár mám a nakonec padl los na mini-dronu Tello
(to, že jsem ji pojmenoval Paula, jsem už za ty dva roky zapomněl). Nepamatoval jsem si nic, tak mne potešilo, že jsem našel tématicky pojmenovou
větev v gitu feature/tello a poslední commit Date: Thu Feb 11 14:08:03 2021 +0100 … to už tak veselé nebylo.
Dobrá zpráva byla, že stačilo jen pustit nahrávání
python -m osgar.record config/tello.json –note "test na zahrade"
a drona vzlétla, cca v metru se otočila o 360 stupňů, pak vystoupala ještě cca 1 metr, znova provedla scan 360 stupňů a přistála. Pohoda.
Celý „program” byl schován v seznamu příkazů:
self.tasks = [ [1, b'streamon'], [2, b'takeoff'], [10, b'cw 360'], [11, b'up 30'], [12, b'cw 360'], [20, b'land'], [22, b'streamoff'] ]
… a odkazy na dokumentaci jsem si naštěstí napsal do tohoto článku. Koukám do gitu a nebyl to tedy 1m, ale pouze 30cm a ještě připomenu, že streamon pouští
kameru, resp. streamování, a streamoff kameru vypíná.
První, co jsem si do kódu doplnil byl seznam existujících příkazů:
class TelloCmd(Enum): COMMAND = b'command' # entry SDK mode TAKEOFF = b'takeoff' # Tello auto takeoff LAND = b'land' # Tello auto land STREAMON = b'streamon' # Set video stream on STREAMOFF = b'streamoff' # Set video stream off EMERGENCY = b'emergency' # Stop all motors immediately UP = b'up' # Tello fly up with distance x cm, x: 20-500 DOWN = b'down' # Tello fly down with distance x cm, x: 20-500 LEFT = b'left' # Tello fly left with distance x cm, x: 20-500 RIGHT = b'right' # Tello fly right with distance x cm, x: 20-500 FORWARD = b'forward' # Tello fly forward with distance x cm, x: 20-500 BACK = b'back' # Tello fly back with distance x cm, x: 20-500 CW = b'cw' # Tello rotate x degree clockwise, x: 1-3600 CCW = b'ccw' # Tello rotate x degree counter-clockwise, x: 1-3600 FLIP = b'flip' # Tello fly flip x, l (left), r (right), f (forward), b (back) GO = b'GO' # go x y z speed - Tello fly to x y z in speed (cm/s) (x: 20-500, y: 20-500, z: 20-500, speed: 10-100) CURVE = b'curve' # curve x1 y1 z1 x2 y2 z2 speed - Tello fly a curve defined by the current and two given coordinates # with speed (cm/s) If the arc radius is not within the range of 0.5-10 meters, it responses false # x1, x2: 20-500, y1, y2: 20-500, z1, z2: 20-500, speed: 10-60 # x/y/z can’t be between -20 – 20 at the same time . SPEED = b'speed' # set speed to x cm/s, x: 10-100 RC = b'rc' # rc a b c d - Send RC control via four channels. # a: left/right (-100~100), b: forward/backward (-100~100), # c: up/down (-100~100), d: yaw (-100~100)
a v rámci experimentování jsem se dostal k testu go:
self.tasks = [ [1, b'streamon'], [2, b'takeoff'], [11, b'up 300'], [12, b'cw 360'], [12, b'go 200 0 300 50'], [12, b'go 200 200 300 50'], [12, b'go 0 0 300 50'], [12, b'go 0 0 100 50'], [20, b'land'], [22, b'streamoff'] ]
kontrolní otázka — co si myslíte, že tento kód udělá? No můžu vám řící, co jsem chtěl aby udělal: drona vystoupá do 3m,
zatočí se, aby se neřeklo, a pak poletí dopředu 2m, pak vlevo 2m, pak se vrátí, klesne na 1m nad zemí a přistane. No úplně takto
se to fakt nechovalo. go je relativní (!!!), takže s každým příkazem si nastoupal další 3 metry. Skončil cca ve 12m a tam se drona
zasekla a já už jenom čekal, kdy jí dojdou baterky a spadne. Fouknul ale větřík a dostal jsem tyto výstupy:
… 0:04:58.926733 Battery: 11 -> 10 0:05:00.051663 — b'go 0 0 300 50' b'error Big wind' 0:05:00.051663 SEND b'go 0 0 100 50' 0:05:00.918411 Battery: 10 -> 9 0:05:03.160410 — b'go 0 0 100 50' b'error Auto land'
a pak už byl v seznamu příkaz na přistání, tak šla celkem elegantně k zemi. S tímto zážitkem bych testování skončil, ale OndraL
trval na opravě, takže ještě správná verze kódu:
self.tasks = [ [1, b'streamon'], [2, b'takeoff'], [11, b'up 300'], [12, b'cw 360'], [12, b'go 200 0 0 50'], [12, b'go 0 200 0 50'], [12, b'go -200 -200 0 50'], [12, b'go 0 0 100 50'], [12, b'go 0 0 -200 50'], [20, b'land'], [22, b'streamoff'] ]
Mimochodem v SDK dokumentaci jsou nesmysly (přepsal jsem je i do popisu, ale asi to v nějakém dalším commitu opravím), protože go akceptuje i nulu
a záporné hodnoty (všechna čísla jsou v centimetrech, nebo ve stupních + rychlost v cm/s).
Ještě rekonstrukce „z černé OSGARovi skříňky” (logy) ukázala, proč se drona na cca 12m výšky zasekla:
Proste někde okolo 9m nad zemí přestal senzor fungovat a začal vracet 65m, přesněji 6553cm, což modří už vědí,
že interně nejspíše počítá v milimetrech a toto je max uint16, tj. 65535.
Čas na googlení "tello max altitude": https://dronies.org/tello-drone/ (April 28, 2022)
The altitude limit for the tello drone is 30 meters (100 feet). Upon the drone’s initial release, Ryze had set the altitude limit to only 10 meters, but after a firmware update, a new setting was added. The new feature grants the user to set the altitude limit from 2 up to 30 meters.
Zajímavé, možná bych si měl dronu flashnout?! Asi bude i lepší si o tom něco přečíst … v poslední sekci, jestli se Tello může koupat píšou:
Tello lacks GPS and compass, therefore it uses a belly camera facing downwards and a sophisticated algorithm to locate itself and find its course, allowing distance measurement and RTH emergency maneuver into third-party apps, like Tello FPV. Unfortunately, Optical Flow fails when flying above a patterned or moving body like grass or water, and the drone crashes. Despite this, some people had managed to fly over water bodies. The trick is choosing a flight path carefully by finding calm, shallow water or islands, rocks, dams, and every fixed reference (not floating objects) you can find. Any fixed object is enough for the belly camera to recognize its location.
… tak už chápu, proč se relativně dobře visela na místě — má tam ještě jednu kameru směrem dolu.
p.s. čtu ten článek od začátku Tello drone is mainly aimed at the younger audience. ha ha ha
p.s.2 vypadá to, že je k dispozici ještě binární protokol, kdyby mne ty ASCII znaky přestaly bavit, viz
tello.py hack 30m alt limit …
odkazovaný z této diskuse
na tellopilots.com.
p.s.3 ještě nějaký „důkazový materiál”
python -m osgar.tools.play_udp_video /home/md/git/osgar/tello-230610_134957.log
drona ve 12m |