Sisällysluettelo:

Kanavan sekoittamisen ymmärtäminen: 4 vaihetta (kuvien kanssa)
Kanavan sekoittamisen ymmärtäminen: 4 vaihetta (kuvien kanssa)

Video: Kanavan sekoittamisen ymmärtäminen: 4 vaihetta (kuvien kanssa)

Video: Kanavan sekoittamisen ymmärtäminen: 4 vaihetta (kuvien kanssa)
Video: Lonely (short version) 2024, Heinäkuu
Anonim
Image
Image
Sekoitusmenetelmä »Ei mitään
Sekoitusmenetelmä »Ei mitään

Jos olet koskaan ajanut kauko -ohjaimen kotelolla, olet todennäköisesti käyttänyt sekoitusta, vaikka et tiennyt sitä. Erityisesti, jos olet käyttänyt yhtä ohjaussauvaa tai gimbleä ohjaamaan ajoneuvoa, joka käyttää luistinohjausta tai tasauspyörästön ohjausta, olet käyttänyt sekoitusta.

Sekoittaminen on yksinkertaisesti tapa, jolla ohjaussauvan tietoja käytetään määrittämään, kuinka paljon virtaa tulee syöttää rungon kummallekin puolelle.

Jos avaat ohjaussauvan, näet yleensä kaksi potentiometriä sisällä. Toinen mittaa nykyisen sijaintisi Y -akselia pitkin (ylös ja alas) ja toinen mittaa missä olet X -akselia pitkin (sivulta toiselle).

Vaikka minulla ei ole muodollista koulutusta aiheesta, olen joutunut sekoittamaan koodia aikaisemmin ja äskettäin halusin sukeltaa hieman syvemmälle aiheeseen.

Ensinnäkin haluan huomata, että useimmilla RC -lähettimillä on sekoitusmahdollisuus, kuten monilla moottorinohjaimilla. Näistä tiedoista on eniten hyötyä, jos joudut itse sekoittamaan koodisi. Sano esimerkiksi, jos käytät Arduinoa lukematta sekoittamatonta dataa RC -vastaanottimesta tai luet analogista dataa ruukuista ohjaussauvassa tai jos luet koordinaatit digitaalisesta ohjaussauvasta mobiilisovelluksessa.

Katsotaanpa joitain erilaisia sekoitusmenetelmiä.

Vaihe 1: Sekoitusmenetelmä »Ei mitään

Katsotaan ensin, mitä tapahtuu, jos et käytä sekoitusta lainkaan. Jos lähetät tiedot yhdeltä akselilta rungon toiselle puolelle ja toiselta akselilta toiselle puolelle, ajoneuvosi ei vastaa haluamallasi tavalla.

Jos esimerkiksi työnnät ohjaussauvan kokonaan eteenpäin, Y -akseli on täydellä kaasulla ja X -akseli on 0. Joten ajaisit ympyröissä sen sijaan, että menisit suoraan.

Vaihe 2: Menetelmä »Kierrä

Menetelmä Menetelmä »Kierrä
Menetelmä Menetelmä »Kierrä

Eräs työkaveri huomautti minulle kerran, että voit nipistyksellä kääntää lähetintäsi 45 astetta köyhän miehen sekoituksen vuoksi. Jos luulet ohjaussauvan kahden potentiometrin arvot olevan x x y -akseli ruudukossa (molemmat akselit ulottuvat -100 … +100), tämä on järkevää, koska aiot +100 molemmilla akseleilla kun työnnät ohjaussauvaa ylös ja oikealle. Joten jos tämä kartoitetaan suoraan kahteen runkokanavaasi (robotin vasen ja oikea puoli), se saa robotin menemään eteenpäin.

Joten ensimmäinen sekoitusmenetelmä, jota olen koskaan kokeillut, oli kiertää matemaattisesti x- ja y -koordinaatteja 45 astetta ruudukon keskipisteen ympäri.

Tämä toimii ok, mutta en voi mennä eteenpäin 100% teholla, koska kun pyörität, koko liike rajoittuu ympyrään ruudukon sisällä, mikä tarkoittaa, ettet voi koskaan päästä oikeaan yläkulmaan.

Tämä johtaa myös siihen, että ruudukon kulmia ei käytetä. Tämä ei ole ongelma, jos käytät ohjaussauvaa/kierteistöä, joka rajoittaa liikkumistasi, joten näille alueille ei koskaan päästä, mutta muuten haluat, että ruudukon osa tekee jotain niin, että liikkeet tuntuvat täysin suhteellisilta.

Jos olet visuaalinen oppija kuten minä, tämä käsite saattaa olla helpompi grokata katsomalla tämän ohjeen alussa olevan videon.

Katsotaanpa joitain koodiesimerkkejä.

HUOMAUTUKSIA KOODESIMERKKEISTÄ: Jätän kertomatta, miten saat joystick_x- ja joystick_y -arvot, koska ne muuttuisivat projektistasi riippuen. Lisäksi aion kartoittaa/rajoittaa arvoon ± 100, mutta saatat joutua luultavasti kartoittamaan 1000 - 2000 PWM: lle tai 0 - 255 analogiselle ulostulolle jne. Olen aina rajoitettu … joka tapauksessa.

Esimerkki Arduinosta:

// kiertää matemaattisesti

kaksinkertainen 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); // rajoittaa leftThrottle = rajoittaa (leftThrottle, -100, 100); rightThrottle = rajoittaa (rightThrottle, -100, 100);

Esimerkki JavaScriptistä:

// matemaattisesti 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); // avustajafunktio varmennerajoitus = funktio (numero, min, maks.) {palauta matemaattinen min (matemaattinen max (luku, min), maks); };

Vaihe 3: Menetelmä »Yksinkertainen

Menetelmä Menetelmä »Yksinkertainen
Menetelmä Menetelmä »Yksinkertainen

Seuraavaksi meillä on hyvin yksinkertainen yhtälö, jonka otin ensin yhdestä Shawn Hymelin Adventures in Science SparkFun -videosta, jossa hän sattui työskentelemään hyvin samankaltaisen projektin kanssa kuin minä.

Tämän yhtälön avulla voit saavuttaa täyden nopeuden eteenpäin mennessään, mutta aivan kuten kiertomenetelmä, se jättää huomiotta ruudukon kulma -alueet. Tämä johtuu siitä, että joissakin tapauksissa enimmäismäärä on 100 ja joissakin tapauksissa enintään 200. Joten käyttäisit pakotusfunktiota sivuuttaaksesi kaikki 100: n jälkeen.

Ja muuten en kutsu tätä yksinkertaiseksi halventavasti … yksinkertaisuudessa on kauneutta.

Esimerkki Arduinosta:

int leftThrottle = joystick_y + joystick_x;

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

Esimerkki JavaScriptistä:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // rajoita leftChannel = rajoita (leftChannel, -100, 100); rightChannel = rajoittaa (rightChannel, -100, 100); // auttajafunktio varmennerajoitus = funktio (lukumäärä, min, maks.) {palauta matematiikka.min (matemaattinen max (luku, min), maksimi); };

Vaihe 4: Menetelmä »Suhteellinen

Menetelmä Menetelmä »Suhteellinen
Menetelmä Menetelmä »Suhteellinen

Pääsin eroon yksinkertaisesta menetelmästä toivoen tekeväni parhaan hyödyn molempien maailmojen yhtälöstä. Ajatuksena on olla täysin verrannollinen kaikkiin suuntiin jopa vinosti huolimatta siitä, että vaikka liikut pidemmän matkan, sillä on sama alue kuin silloin, kun liikut pystysuunnassa, mikä on pienempi matka.

Päädyt asteikolla -200 - +200 kaikkiin suuntiin esimerkeissäni. Kartoitan sen arvoon ± 100, koska se edustaa kullekin kanavalle menevän tehon prosenttiosuutta - kuitenkin haluat yhdistää sen mihin tahansa käyttötarkoitukseesi - moottorinohjaimen kotelo. Jos esimerkiksi lähetät PWM-signaalia, voit kartoittaa sen arvoon 1000-2000 tai jos lähetät analogista signaalia, voit määrittää sen arvoksi 0-255 ja asettaa suunnan totuusarvoksi jne.

Esimerkki Arduinosta:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // joissakin tapauksissa max on 100, joissakin tapauksissa 200 // otetaan huomioon ero, joten max on aina 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Kartta ± 200 -± 100 tai mikä tahansa alue, jonka neulatThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = rajoittaa (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

Esimerkki JavaScriptistä:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // joissakin tapauksissa max on 100, joissakin tapauksissa 200, // otetaan huomioon ero, joten max on aina 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; // Kartta ± 200: sta taaksepäin ± 100: een tai mihin tahansa neulaan -100, 100); // rajoittaa leftThrottle = rajoittaa (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // jotkut aputoiminnotvar constrain = function (num, min, max) {return Math.min (Math max (numero, min), max); }; var map = toiminto (numero, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, mapped; inMin = inMin + inMax; num = numero + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (lukumäärä/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); kartoitettu = outSpan*(p/100) - (outMax/2); paluu kartoitettu;};

Suositeltava: