Pavouk Hiwonder

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od peterple » 16 bře 2024, 16:19

Kirrow: Kód je úplne chybne. 47 dní neurobí nič a potom 300ms robí to čo má robiť raz za 500ms. To nebola žiadna optimalizácia ale oprava chybného kódu s kompletným vysvetlením ako sa veci majú.

Gilhadovi sa ospravedlňujem. Zjavne patrí k tej druhej polovici internetu ktorá to robí správne. Nečítal som jeho príspevok, nevedel som že citoval predošlé časti kódu (je na to tag, ak by bol použitý asi by mi to došlo). Len som videl chybne relizovaný test tak som ho posúdil že patrí do prvej polovice.

Programovanie je o paternoch. Nie je dobré naučiť sa chybný a ospravedlňovať to že v tomto prípade ten pavúk nebude zapnutý 47 dní. Žiadna optimalizácia to nie je. Ten kód je dlhý rovnako či sa použije správny, alebo nesprávny test. Je to len o tom ako to robiť dobre alebo zle. Pretože ak sa to raz človek naučí zlý patern, tak to potom bez problémov použije aj v situácii keď to už problém spôsobí (hodiny, riadenie polievania, a pod.)

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od gilhad » 16 bře 2024, 17:27

Gilhad by to SAMOZŘEJMĚ napsal jinak, protože má za sebou jiný programátorský vývoj, jiné zvyky, zlozvyky, zkušenosti, četl jiné programy (a v mnoha jiných jazycích) a tak vůbec.

Navíc, když to četl, přišlo mu to takové nějak nevzhledné, upocené, nepřehledné ...
Takže ano, sice o pavoukovi a jeho systému nic nevím, ale nějak jinak by to bylo určitě. Těžko říct jak.

Rozhodně bych s těma millis zacházel jako v těch odkazech. Ono to sice prvních 45+ dní po spuštění nevadí a dost pochybuju, že letos ten pavouk bude bez restartu (nahrání programu taky znamená restart ) běžet tak dlouho v jednom kuse. Ale na druhou stranu ten správný postup není ani složitější, ani náročnější na zdroje, nesprávný postup nepřináší žádné zajímavé výhody, takže je lepší si zvyknout to dělat správně rovnou.

Rozhodně bych ten program zformoval - správná odsazení jsou základ, dobré komentáře tomu taky výrazně pomůžou. Ano, programoval jsem dlouhá léta v Pythonu a přišlo mi to pohodlné, protože i předtím jsem odsazoval správně (můj první, nebo druhý, větší program v Pascalu, ještě kdysi v minulém miléniu, byl PrittyPrinter, což byl kompilítor z Pascalu do Pascalu (postavený na LL1 gramatice s vyjímkou pro IF A THEN IF B THEN C ELSE D - ke kterému z těch IFů patří to ELSE? K tomu poslednímu, ale v LL1 gramatice toé nejde správně popsat.), který dělal správná odsazení kódu a případně i komentářů. A používal jsem ho pořád.

Ale ono skutečně zvedne přehlednost, když ty řádky jasně ukazují, co je do šeho zanořené a co naopak zanořené není, aniž by šlověk musel pokaždé číst celý řádek. (Srovnej s tvojí ukázkou -

Kód: Vybrat vše

void loop() 
{
if (pocitadlo >= 5)        //   když je počet kroků  5 běž na kontrolu PIR senzoru
    {
      PIR();               
    }
    sonar();                    // hlavní vyhodnocování pohybu
}
Jak je na tom PIR vůči if? Jasně JE vnořený a tudíž JE odsazený.
Jak je na tom sonar vůči if? Jasně NENÍ vnořený a tudíž JE odsazený.
A tak dál každou chvilku všude.

Popisy, že case 1 je step 1 asi nejsou tak moc přínosné, naopak by se tam hodily popisy co ty jednotlivé případy/kroky znamenají.

Kód: Vybrat vše

          timer = millis() + 300;                   // původně 300
Ostatně pro takováto magická čísla bych použil na začátku nějaké to

Kód: Vybrat vše

#define TIMEOUT  300 // cekani pred dalsi kontrolou
#define BLIZKO 350 // vzdalenosti
#define STREDNE 500
#define DALEKO 1000
Taky tíhnu k tomu mít to jednojazyčně, pokud to dává smysl

Kód: Vybrat vše

runActionGroup(RYCHLE,0);
static bool lastActionIsGoBack = false;        //Statická proměnná - zaznamenat, zda je poslední akce zpět
Nijak moc jsem to nezkoumal (a teď na to nemám ani čas, ani necítím potřebu), takže nevím, jak je to rozdělené do menších částí - já se snažím mít rozumně malé samosttné celky a taky se snažím, abych viděl na jedné obrazovce celou relevantní část - což mi dělají jednak různé pomocné funkce, jednak foldování. (ve VIMu mám nastavené foldování na {{{ a }}}, občas to sem vyhřezne)

A vůbec, jako v té příručce k BBC Pascalu na tom doprovodném obrázku, kde se někdo ptá místního staříka, kudy odsud na nádraží a střík odpovídá, kdybych šel na nádraží, nezačínal bych tady ...

Například dokončení něčeho bych asi řešil přez callbacky, kdy bych do hlavního ovladače dal volání uživatelské funkce kdykoli se něco stane a pak měl ty funkce zvlášť bokem.

Možná bych řešil víc věcí paralelně, možná bych využíval volného času, kdy se na něco čeká, ke měření jiných věcí, plánování a tak podobně. (Obecně procesory stráví většinu doby čekáním na něco a reorganizací činností lze tato doba využít - viz stará gamesky, ktré běhaly na Spekterech a podobných, která by se na Arduinu dala emulovat v reálném čase, a přitom ty gamesky četly vstup od hráče, hýbali postavičkou, hýbaly nezávisle spoustou věcí na obrazovce, detekovaly střety a do toho hrály nepřerušovanou hudbu)

Ta tvoje poslední ukázka byla jenom zlomek toho, co se tam děje a co by se tam dít mohlo.

Tohle jsou hodně zmatené neutříděné poznámky o tom, co bych já dělal jinak (a místy i proč), nikoli kritika toho, co děláš ty - pokud ti to překladač sežere, pavouk dělá co chceš a máš z toho radost, tak to asi děláš správně :)

(A teď ještě docela vážně přemýšlím nad tím, že bych do ROMky svého nového počítače dal FORTH jako základní nástroj, nebo aspoň něco FORTHu dost podobného, a že bych si něco jako FORTH i implementoval na Arduino pro ty případy, kdy chci něco testovat a rád bych tahal za jednotlivé piny podle toho, co uvidím před sebou ... možná je to slepá cesta ale nejspíš to zkusím)

Ale je občas dobré i vidět, jak to dělají jiní (já teď opisuju z 6502.org a jen zírám, co lidi dovedou (něco jsem potřeboval, řešil jsem to 9 integrovanými obvody a 16 odpory a někdo tam z rukávu vysypal řešení se 3 integráči a bez odporů - s tím, že se to ještě navíc ovládá snáz - a navíc jsem se z toho naučil několik zajímavých triků, jen jsem to musel pěknou dobu dešifrovat do detailů - a tak to tam mám pořád :) )

luger
Příspěvky: 146
Registrován: 30 dub 2023, 11:06
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od luger » 17 bře 2024, 10:09

Díky gilhad za názor. Jak jsem psal dříve, to je originál firemní program a protože jsem nechápal jak funguje tak jsem sem dal dotaz. Doplnil jsem poznámky a některé drobnosti. Už jsem přišel na to jak se dají "překopat" předprogramované akce serv pro pohyb, tanec, otáčení apod... a vytvářet nové. Je to velmi jednoduché jen to ukládání je trochu kostrbaté - každá akce se musí nahrát jak do PC tak do servocontroleru.
Nainstaloval jsem ESP32 CAM - funguje :D . Ještě tam musím dodělat silnější přísvit, v šeru je obraz mizerný.

luger
Příspěvky: 146
Registrován: 30 dub 2023, 11:06
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od luger » 25 bře 2024, 09:40

Umístění web kamery ESP32 Cam . Je na kloubu s možností pohybu nahoru a dolů. Zapíná se zvláštním vypínačem ale postupem času to předělám na ovládání programem. Přísvit ledkou se už ovládá programem. Je to ta krabička pod "kukadlama".

Obrázek
Přílohy
IMG_20240325_085627_928.jpg

luger
Příspěvky: 146
Registrován: 30 dub 2023, 11:06
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od luger » 25 bře 2024, 16:10

Zjistil jsem jeden drobný, ale podstatný nedostatek programu „vyhýbej se překážkám“ který navrhli vývojáři Hiwonder. Jejich program počítá pouze s celistvou velkou průběžnou plochou která stojí přímo před pavoučkem. Jenže když bude překážka jen úzký špalek těsně mimo kužel rozsahu ultrasenzoru (cca 30°) tak do něj nabourá. Pavouk je docela velký a rozpětí noh je až půl metru ! takže se nějakou nožkou zachytí o překážku. Naštěstí je dost silný a tak se snaží překážku obejít silou (prostě se točí dokola okolo toho špalku). Vypadá to srandovně.

Takže mě napadlo toto:
Ultrazvukový senzor bude kmitat cik-cak doleva a doprava přibližně o 15°a načítat hodnoty vzdálenosti. Tím se mi rozšíří skenovaný obzor. Nesmí to být moc velký úhel, protože to může zachytit zvedající se přední nožky.

Pokusím se to nějak navrhnout, ale problém je v tom že samotný senzor pracuje na I2C a taky servo nějak nepodporuje knihovnu VarSpeedServo.

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od gilhad » 25 bře 2024, 22:03

Tak konec konců ty víš (nebo můžeš vědět), co ty nohy dělají.
Takže můžeš
- zastavit po dobu měření
- měřit jen když jsou nohy dole
- měřit furt a pokud se ti tam periodicky objevuje a mizí něco v téhle konkrétní vzdálenosti, tak to ignorovat jako "asi nohy"

luger
Příspěvky: 146
Registrován: 30 dub 2023, 11:06
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od luger » 26 bře 2024, 09:28

Tak jsem na tom trochu pracoval, ale zjistil jsem že to nebude tak jednoduché. Používáte někdo knihovnu VarSpeedServo ?

Měla by podporovat tyto příkazy:

příklad:
myServo.attach (5); - přiřazení pinu 5

myServo.attach (5,min,max); pin 5, min a max hodnota v mikrosekundách
min = 544 max = 2400

myServo.write (úhel)
myServo.write (úhel, rychlost) 0-plná rychlost rozsah 1-255

myServo.write (úhel, rychlost, wait)
wait je logická hodnota, která, pokud je pravdivá (true); způsobí zablokování volání funkce, dokud není přesun dokončen:

např.:
myServo.write (úhel, rychlost, true)

myServo.writeMicroseconds (); nastavuje šířku pulsu serva v mikrosekundách
myServo.read (); získá poslední zapsanou šířku pulsu serva jako úhel mezi 0 a 180.
myServo.readMicroseconds (); získá poslední zapsanou šířku pulsu serva v mikrosekundách

myServo.attached (); vrací hodnotu „true“, pokud je připojeno servo.
myServo.detach (); zastaví vysílání pulsů do serva
myServo.slowmove (úhel, rychlost); stejné jako write (úhel, rychlost)
myServo.stop (); zastaví servo v aktuální poloze

myServo.sequencePlay (č.sekvence, úhel konečná pozice); smyčka: úhel 0 - konečná poz.
myServo.sequencePlay (č. sekv., úhel kon. pozice, loop, start pozice); jestliže je loop true tak běží smyčka od start. do konečné pozice
myServo.sequenceStop (); zastaví smyčku
myServo.wait (); počká na dokončení
myServo.isMoving (); vrátí „true“, pokud se servo stále pohybuje


Jenže ono to nějak nefunguje. Asi se mi to ovlivňuje nějakou další knihovnou. Knihovnu "Servo.h" tam nemám.
Používám především příkazy .write .wait .stop ale dělá si to co chce.

luger
Příspěvky: 146
Registrován: 30 dub 2023, 11:06
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od luger » 27 bře 2024, 12:10

Až teď jsem si uvědomil že se vlastně toto fórum ani okrajově nevěnuje robotice. Ohledně pomoci při programování , hardweru, softweru atd. jste nejlepší (a moc si toho vážím), ale já hledám někoho kdo se věnuje robotice. Gilhad už projevil velmi mírný náznak :D že se do toho pustí :D . Gilhad odpovídá - bojím se pavouků :lol:
Já odpovídám - pavouk má 8 noh (hrůza :D ), hexapod má jen 6 noh (to už je lepší), a co tak jít na 4 nohy?

Uživatelský avatar
kiRRow
Příspěvky: 1170
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Pavouk Hiwonder

Příspěvek od kiRRow » 27 bře 2024, 16:08

To je častý problém knihoven, že se bijou navzájem o nějaký časovač, nebo podobně. Musíš ty knihovny trošku prozkoumat a uvidíš, jestli se nějak ovlivňují - nebo ty knihovny zkoušet každou zvlášť a pak dohromady. Buď pak musíš najít takovou kombinaci knihoven, co se bít nebude, nebo si to napsat sám.

Jedinou nevýhodu to má v tom, že to trvá. To že to neumíš a nevíš jak na to jako nevýhodu nepočítám.
Já osobně se používání knihoven pokud možno vyhýbám. Používám je když mám 100% jistotu, že jsou spolu kompatibilní, nebo když chci fakt něco rychle odzkoušet.

Pablo74
Příspěvky: 48
Registrován: 03 lis 2019, 17:00
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od Pablo74 » 27 bře 2024, 17:05

Musím říct, že se mi líbí přístup autora vlákna - lugera - že má snahu porozumět problematice a jde dál a dělá pokroky. Zřejmě je ještě z generace, která se nevzdá hned na začátku po prvním neúspěchu.

V případě takovýchto rozsáhlejších programů, kde se má - ideálně - provádět více činností najednou, je dobrý prvně pochopit a pak spěšně použít pseudomultitasking. Výborný článek od P. Stehlíka v češtině i s knihovnou se najde tady: Tasker - "multitasking" na Arduinu

Autor článku a knihovny není jen tak někdo, je to ten Stehlík. Když mrknete na Youtube na jeho přednášky, uvidíte :-)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 47 hostů