Určení kratší dráhy při otáčení robota na daný azimut
Určení kratší dráhy při otáčení robota na daný azimut
Ahoj a dobrý rok 2025.
Řeším pro svého robota otáčení z azimutu, kde právě stojí, na azimut nově zadaný. Chci, aby točil vpravo nebo vlevo podle toho, kde ho čeká kratší dráha. Zjistil jsem, že to není vůbec jednoduché, možností kombinací je značné množství, hlavně kolem azimutu 0. Mám kód v Pythonu, který vyhovuje možná v 99% případů, občas ho ale načapám, jak točí na druhou stranu. Zdroják zatím nepřipojuju, nejde mi o opravu kódu, ale o nějakou jinou myšlenku. Už jsem zkoušel "rozvinout" kružnici azimutů do přímky a tam nějak kombinovat nebo posouvat obě možné dráhy, aby to bylo přehlednější, ale nic nového jsem nevymyslel.
Nemáte, prosím, někdo zkušenosti s tímto problémem? Nešlo by to nějak jednodušeji?
Díky za radu či jiný pohled na věc.
Jirka
Řeším pro svého robota otáčení z azimutu, kde právě stojí, na azimut nově zadaný. Chci, aby točil vpravo nebo vlevo podle toho, kde ho čeká kratší dráha. Zjistil jsem, že to není vůbec jednoduché, možností kombinací je značné množství, hlavně kolem azimutu 0. Mám kód v Pythonu, který vyhovuje možná v 99% případů, občas ho ale načapám, jak točí na druhou stranu. Zdroják zatím nepřipojuju, nejde mi o opravu kódu, ale o nějakou jinou myšlenku. Už jsem zkoušel "rozvinout" kružnici azimutů do přímky a tam nějak kombinovat nebo posouvat obě možné dráhy, aby to bylo přehlednější, ale nic nového jsem nevymyslel.
Nemáte, prosím, někdo zkušenosti s tímto problémem? Nešlo by to nějak jednodušeji?
Díky za radu či jiný pohled na věc.
Jirka
Re: Určení kratší dráhy při otáčení robota na daný azimut
A proste a pak resit jestli je vysledek 0-180 nebo 180-360 nestaci? Mozna s nejakym osetrenim, abych se zbavil zapornych cisel, treba
Kód: Vybrat vše
(cilovy - soucasny) modulo 360
Kód: Vybrat vše
(cilovy - soucasny + 720) modulo 360
Re: Určení kratší dráhy při otáčení robota na daný azimut
Kód: Vybrat vše
if (start - cíl) % 360 > 180
zvyšuj úhel
else
snižuj úhel
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Re: Určení kratší dráhy při otáčení robota na daný azimut
Pokud chceme neotrele reseni, co treba MonteCarlo? Nastrilim hromadu vzorku s otocenim o nahodny uhel (-180 az 180) a vezmu smer toho, co se trefi nejbliz cilovemu azimutu 

Re: Určení kratší dráhy při otáčení robota na daný azimut
Monte Carlo je už dávno out, kdo jde s dobou použije AI. Vstupy budou výchozí a cílový azimut, feedback bude podle doby otáčení. Výhoda je v tom, že pokud z nějakého důvodu bude točení na jednu stranu jednodušší, robot se to naučí zohlednit ;-)
Re: Určení kratší dráhy při otáčení robota na daný azimut
Nojo, ja jsem ze stare skoly
Jinak jsem zapatral v archivu, tohle je kod (resp. jeho relevantni cast pro rizeni smeru), ktery pred spoustou let vyhral Roboorienteering:
https://github.com/krezac/robot-irena-o ... tor.py#L35
Pokud by se v tom nekdo touzil hrabat, tak to repo obsahuje ruzne kousky z ruznych soutezi, jen jsem pred lety odzalohoval adresar z pocitace na github. Popravde ani nevim, jestli je to vubec spustitelne

Jinak jsem zapatral v archivu, tohle je kod (resp. jeho relevantni cast pro rizeni smeru), ktery pred spoustou let vyhral Roboorienteering:
https://github.com/krezac/robot-irena-o ... tor.py#L35
Pokud by se v tom nekdo touzil hrabat, tak to repo obsahuje ruzne kousky z ruznych soutezi, jen jsem pred lety odzalohoval adresar z pocitace na github. Popravde ani nevim, jestli je to vubec spustitelne

Re: Určení kratší dráhy při otáčení robota na daný azimut
Tak jsem kouknul jak jsem to v rychlosti napsal pro toho malého robůtka, co jsem ukazoval na Vánočním robodoupěti (návrat po zapamatované cestě).
Kód: Vybrat vše
// vypocet zmeny natoceni robota (v da pozadovana zmena)
da = cilovyAzimut - aktualniAzimut;
if (da > 180) da -= 360;
if (da < -180) da += 360;
Re: Určení kratší dráhy při otáčení robota na daný azimut
Ahoj. Děkuji všem za účast v diskuzi, netušil jsem, jakou lavinu příspěvků to vyvolá. Místo mých dvou desítek řádků kódu jsem použil kód DavidaO, a nestačil se divit, jak mohou být věci jednoduché, když se to umí. S operátorem "modulo" jsem se při programování setkal jen u kontrol IČO, rodných čísel apod, kde princip fungování chápu, v nejkrásnějším programátorském snu by mě ale nenapadlo, jak s ním lze elegantně vyřešit můj problém s pohybem robota.
Mohl by mi, prosím, někdo z pánů odborníků alespoň naznačit, co má zbytek po celočíselném dělení společného s kružnicemi a azimuty? Pakliže tedy můžete naznačovat...
Díky a mějte se!
Jirka
P.S.
Moudrost mě pronásleduje, ale já jsem rychlejší.
Mohl by mi, prosím, někdo z pánů odborníků alespoň naznačit, co má zbytek po celočíselném dělení společného s kružnicemi a azimuty? Pakliže tedy můžete naznačovat...

Díky a mějte se!
Jirka
P.S.
Moudrost mě pronásleduje, ale já jsem rychlejší.
Re: Určení kratší dráhy při otáčení robota na daný azimut
Modulo - vzhledem k periodicke vlastnosti azimutu s periodou 360 (azimut 10 je stejny jako azimut 370, nebo -10 je stejny jako 350), tak se hodi operace, co me vrati do zakladniho rozsahu - max jedna (resp. plus minus pul) otacka. A to je prave zbytek po celociselnem deleni.
Napr. muj azimut je 270 (zapad) a vypocet rika "otoc se o 180". Vysledek je 450, ale to je neprakticke, takze ho operaci modulo 360 vratim do zakladniho rozsahu, tedy na hodnotu 90 (vychod).
Je to takhle jasnejsi?
Napr. muj azimut je 270 (zapad) a vypocet rika "otoc se o 180". Vysledek je 450, ale to je neprakticke, takze ho operaci modulo 360 vratim do zakladniho rozsahu, tedy na hodnotu 90 (vychod).
Je to takhle jasnejsi?
Re: Určení kratší dráhy při otáčení robota na daný azimut
Naprosto, díky.