Kazalo:

Razumevanje mešanja kanalov: 4 koraki (s slikami)
Razumevanje mešanja kanalov: 4 koraki (s slikami)

Video: Razumevanje mešanja kanalov: 4 koraki (s slikami)

Video: Razumevanje mešanja kanalov: 4 koraki (s slikami)
Video: Часть 1 - Трипланетная аудиокнига Э. Э. Смита (глы 1–4) 2024, Julij
Anonim
Image
Image
Metoda mešanja »Brez
Metoda mešanja »Brez

Če ste kdaj vozili podvozje z daljinskim upravljalnikom, obstaja velika verjetnost, da ste uporabili mešanje, čeprav tega niste vedeli. Natančneje, če ste za krmiljenje vozila, ki uporablja drsno krmiljenje ali diferencialno krmiljenje, uporabili eno samo krmilno palico ali gimble, ste uporabili mešanje.

Mešanje je preprosto način, na katerem se podatki iz krmilne palice določijo, koliko energije je treba dobaviti na vsako stran ohišja.

Če odprete krmilno palčko, boste na splošno videli dva potenciometra. Ena za merjenje vašega trenutnega položaja vzdolž osi Y (gor in dol), druga pa za merjenje vašega položaja vzdolž osi X (od strani do strani).

Čeprav nimam formalnega usposabljanja na to temo, sem se moral že prej mešati v kodo, pred kratkim pa sem se želel poglobiti v temo.

Najprej želim opozoriti, da ima večina RC oddajnikov zmožnost mešanja, tako kot mnogi krmilniki motorjev. Ti podatki bodo najbolj uporabni, če se morate sami mešati v kodo. Na primer, če uporabljate Arduino za branje nepomešanih podatkov iz sprejemnika RC, ali berete analogne podatke iz loncev s krmilno palčko ali če berete koordinate iz digitalne krmilne palice v mobilni aplikaciji.

Oglejmo si nekaj različnih pristopov mešanja.

1. korak: Metoda mešanja »Brez

Najprej si poglejmo, kaj se zgodi, če mešanja sploh ne uporabljate. Če podatke samo pošljete z ene osi na eno stran ohišja, drugo os pa na drugo stran, se vaše vozilo ne bo odzvalo tako, kot želite.

Na primer, če pritisnete krmilno palčko do konca naravnost, je os Y pri polnem plinu, os X pa pri 0. Torej bi se vozili v krogu, namesto da bi šli naravnost.

2. korak: Metoda metode »Zavrtite

Metoda Metoda »Zavrtite
Metoda Metoda »Zavrtite

Sodelavec mi je nekoč opozoril, da lahko odbijač za trenutek obrnete za 45 stopinj za mešanico reveža. Če menite, da sta vrednosti obeh potenciometrov v krmilni palici x -y osi na mreži (z obema osi, ki obsegata od -100 do +100), je to zelo smiselno, ker boste na obeh osi dosegli +100 ko pritisnete krmilno palčko navzgor in v desno. Če se torej preslika neposredno na dva kanala ohišja (levo in desno stran vašega robota), bi vaš robot šel naprej.

Prva metoda mešanja, ki sem jo kdaj poskusil, je bila matematično vrtenje koordinat x in y za 45 stopinj glede na osrednjo točko mreže.

To deluje v redu, vendar ne morem naprej s 100% močjo, ker je pri vrtenju celotno gibanje omejeno na krog znotraj mreže, kar pomeni, da nikoli ne morete zares priti v zgornji desni kot.

Posledica tega je tudi, da vogali mreže niso uporabljeni. To ni problem, če uporabljate igralno palico/gimple, ki omejuje vaše gibanje, tako da do teh področij nikoli ne pridete, sicer pa boste želeli, da ta del mreže naredi nekaj, tako da bodo vaši gibi popolnoma sorazmerni.

Če ste vizualni učenec, kot sem jaz, bi si ta koncept morda lažje ogledal z ogledom videoposnetka na začetku tega navodila.

Poglejmo nekaj primerov kode.

OPOMBE O PRIMERIH MOJE KODE: Izpuščam, kako dobite vrednosti joystick_x in joystick_y, saj bi se spremenile glede na vaš projekt. Prav tako bom preslikal/omejil na ± 100, vendar boste verjetno morali preslikati na 1000 - 2000 za PWM ali 0 - 255 za analogni izhod itd. Vedno omejim … za vsak slučaj.

Primer Arduina:

// matematično vrti

dvojni rad = -45*M_PI/180; int leftThrottle = joystick_x * cos (rad) - joystick_y * sin (rad); int rightThrottle = joystick_y * cos (rad) + joystick_x * sin (rad); // omeji leftThrottle = omeji (leftThrottle, -100, 100); rightThrottle = omeji (rightThrottle, -100, 100);

Primer JavaScript:

// matematično rotatevar rad = -45*Math. PI/180; leftThrottle = joystick_x * Math.cos (rad) - joystick_y * Math.sin (rad); rightThrottle = joystick_y * Math.cos (rad) + joystick_x * Math.sin (rad); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // pomožna funkcijavar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

3. korak: Metoda metode »Preprosta

Metoda Metoda »Preprosta
Metoda Metoda »Preprosta

Naslednjič imamo zelo preprosto enačbo, ki sem jo najprej pobral iz enega od videoposnetkov Shawn Hymel's Adventures in Science SparkFun, kjer je po naključju delal zelo podoben projekt kot tisti, ki sem ga delal jaz.

Ta enačba vam omogoča, da greste naprej s polno hitrostjo, vendar podobno kot metoda rotacije ne upošteva vogalnih površin mreže. To je zato, ker je v nekaterih primerih največ 100, v nekaterih pa največ 200. Torej bi uporabili funkcijo omejevanja, da ne bi upoštevali ničesar po 100.

In mimogrede, tega ne imenujem sramotno … lepota je v preprostosti.

Primer Arduina:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // omeji leftThrottle = omeji (leftThrottle, -100, 100); rightThrottle = omeji (rightThrottle, -100, 100);

Primer JavaScript:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // omeji leftChannel = omeji (leftChannel, -100, 100); rightChannel = omeji (rightChannel, -100, 100); // pomožna funkcijavar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

4. korak: Metoda metode »Sorazmerno

Metoda Metoda »Sorazmerna
Metoda Metoda »Sorazmerna

Odločil sem se za preprosto metodo v upanju, da bom iz enačb obeh svetov najbolje izkoristil. Zamisel tukaj je biti v celoti sorazmeren v vseh smereh celo diagonalno, kljub dejstvu, da se premikate na večjo razdaljo, ima enak obseg kot pri navpični premiki, kar je manjša razdalja.

Na koncu dobite lestvico od -200 do +200 v vseh smereh v mojih primerih, kar preslikam na ± 100, ker predstavlja odstotek moči, ki gre na vsak kanal - vendar ga boste želeli preslikati v vse, kar deluje pri vaši uporabi - ohišje za krmilnik motorja. Na primer, če pošiljate signal PWM, ga lahko preslikate na 1000 do 2000 ali če pošiljate analogni signal, ga lahko preslikate na 0-255 in smer nastavite kot logično itd.

Primer Arduina:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // v nekaterih primerih je max 100, v nekaterih primerih 200 // upoštevajmo razliko, tako da je max vedno 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - razlika: rightThrottle + razlika; // Zemljevid od ± 200 do ± 100 ali katerega koli drugega območja, ki ga izločiteThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = omeji (rightThrottle, -100, 100);

Primer JavaScript:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // v nekaterih primerih je max 100, v nekaterih primerih 200, // upoštevajmo razliko, tako da je max vedno 200var diff = Math.abs (Math.abs (joystick_y) - Math.abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle -diff: rightThrottle + diff; // Zemljevid od ± 200 nazaj navzdol do ± 100 ali karkoli že izločiteThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // constrain leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // nekatere pomožne funkcijevar constrain = function (num, min, max) {return Math.min (Math. max (število, min), max); }; var map = funkcija (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, preslikano; inMin = inMin + inMax; število = število + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (število/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); preslikano = outSpan*(p/100) - (outMax/2); vrnjeno preslikano;};

Priporočena: