Turinys:

Kanalų maišymo supratimas: 4 žingsniai (su paveikslėliais)
Kanalų maišymo supratimas: 4 žingsniai (su paveikslėliais)

Video: Kanalų maišymo supratimas: 4 žingsniai (su paveikslėliais)

Video: Kanalų maišymo supratimas: 4 žingsniai (su paveikslėliais)
Video: Orijaus kelionės. 4 sezonas, 51 laida. Karlovi Varai, 1 dalis - populiariausias Čekijos kurortas 2024, Liepa
Anonim
Image
Image
Maišymo metodas »Nėra
Maišymo metodas »Nėra

Jei kada nors vairavote nuotolinio valdymo važiuoklę, yra didelė tikimybė, kad naudojote maišymą, net jei to nežinojote. Tiksliau, jei transporto priemonei, naudojančiai slydimo vairavimą arba diferencialinį vairavimą, valdyti naudojote vieną vairasvirtę ar trinkelę, naudojote maišymą.

Maišymas yra tiesiog tai, kaip jūsų kreiptuko duomenys naudojami norint nustatyti, kiek energijos reikia tiekti į kiekvieną važiuoklės pusę.

Jei atidarysite vairasvirtę, paprastai pamatysite du potenciometrus. Vienas iš jų matuoja jūsų dabartinę padėtį išilgai Y ašies (aukštyn ir žemyn), o kitas - jūsų buvimo vietą išilgai X ašies (iš vienos pusės į kitą).

Nors neturiu jokio oficialaus mokymo šia tema, anksčiau turėjau maišyti kodą ir neseniai norėjau šiek tiek pasinerti į temą.

Pirmiausia noriu pažymėti, kad dauguma RC siųstuvų turi maišymo galimybę, kaip ir daugelis variklių valdiklių. Ši informacija bus labai naudinga, jei turėsite maišyti savo kodą patys. Tarkime, pavyzdžiui, jei naudojate „Arduino“skaityti nesumaišytus duomenis iš RC imtuvo, arba skaitote analoginius duomenis iš puodų vairasvirtėje, arba skaitote koordinates iš skaitmeninės vairasvirtės programoje mobiliesiems.

Pažvelkime į keletą skirtingų maišymo būdų.

1 žingsnis: Maišymo metodas »Nėra

Pirmiausia pažiūrėkime, kas atsitiks, jei nenaudosite maišymo. Jei tik siunčiate duomenis iš vienos ašies į vieną važiuoklės pusę, o kitą ašį į kitą pusę, jūsų automobilis nereaguos taip, kaip norite.

Pavyzdžiui, jei stumiate vairasvirtę iki galo tiesiai, Y ašis yra visu greičiu, o X ašis - 0. Taigi važiuotumėte ratais, o ne važiuotumėte tiesiai.

2 žingsnis: metodo metodas »Pasukti

Metodas Metodas »Pasukti
Metodas Metodas »Pasukti

Kartą vienas bendradarbis man atkreipė dėmesį, kad, žiupsneliu, galite pasukti siųstuvą 45 laipsnių kampu, kad gautumėte vargšo mišinį. Jei manote, kad dviejų vairasvirtėje esančių potenciometrų vertės yra x x y ašis tinklelyje (kai abi ašys yra nuo -100 iki +100), tai yra labai prasminga, nes jūs ketinate pasiekti +100 abiejose ašyse stumdami vairasvirtę aukštyn ir į dešinę. Taigi, jei tai bus nukreipta tiesiai į du jūsų važiuoklės kanalus (kairę ir dešinę jūsų roboto puses), jūsų robotas eis į priekį.

Taigi pirmasis maišymo metodas, kurį aš kada nors bandžiau, buvo matematiškai pasukti x ir y koordinates 45 laipsniais apie tinklelio centrinį tašką.

Tai veikia gerai, tačiau negaliu eiti į priekį su 100% galia, nes kai sukasi, bendras judėjimas yra apribotas apskritimu tinklelyje, o tai reiškia, kad niekada negali patekti į tą viršutinį dešinįjį kampą.

Dėl to taip pat nebus naudojami tinklelio kampai. Tai nėra problema, jei naudojate vairasvirtę/rankenėlę, kuri riboja jūsų judėjimą, kad tos zonos niekada nepasiektų, tačiau priešingu atveju norėsite, kad ta tinklelio dalis kažką padarytų, kad jūsų judesiai būtų visiškai proporcingi.

Jei esate vizualiai besimokantis kaip aš, šią sąvoką būtų lengviau suprasti žiūrint vaizdo įrašą šios instrukcijos pradžioje.

Pažvelkime į keletą kodo pavyzdžių.

PASTABOS APIE MANO KODO PAVYZDŽIUS: Aš nenurodau, kaip jūs gaunate joystick_x ir joystick_y reikšmes, nes jos keisis priklausomai nuo jūsų projekto. Taip pat aš būsiu kartografavimas/apribojimas iki ± 100, bet jums greičiausiai reikės susieti su 1000–2000 PWM arba 0–255 analoginei išvestiai ir pan. Aš visada apriboju … tik tuo atveju.

„Arduino“pavyzdys:

// matematiškai pasukti

dvigubas rad = -45*M_PI/180; int leftThrottle = vairasvirtė_x * cos (rad) - vairasvirtė_y * sin (rad); int rightThrottle = vairasvirtė_y * cos (rad) + vairasvirtė_x * sin (rad); // apriboti leftThrottle = apriboti (leftThrottle, -100, 100); dešinysis droselis = apriboti (dešinysis droselis, -100, 100);

„JavaScript“pavyzdys:

// matematiškai rotatevar rad = -45*Math. PI/180; leftThrottle = vairasvirtė_x * Math.cos (rad) - vairasvirtė_y * Math.sin (rad); rightThrottle = vairasvirtė_y * Math.cos (rad) + vairasvirtė_x * Math.sin (rad); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // pagalbinis funkcinis apribojimas = funkcija (num, min, max) {return Math.min (Math.max (num, min), max); };

3 žingsnis: metodo metodas »Paprasta

Metodas Metodas »Paprasta
Metodas Metodas »Paprasta

Toliau turime labai paprastą lygtį, kurią pirmą kartą paėmiau iš vieno Shawno Hymelio nuotykių „Science SparkFun“vaizdo įrašuose, kur jis atsitiko dirbdamas labai panašų projektą kaip ir aš.

Ši lygtis leidžia pasiekti maksimalų greitį einant į priekį, tačiau panašiai kaip pasukimo metodas, neatsižvelgiama į kampines tinklelio sritis. Taip yra todėl, kad kai kuriais atvejais didžiausias yra 100, o kai kuriais atvejais - 200. Taigi, norėdami nepaisyti nieko po 100, naudosite apribojimo funkciją.

Ir, beje, aš to nevadinu niekinančiu paprastu dalyku … paprastume slypi grožis.

„Arduino“pavyzdys:

int leftThrottle = vairasvirtė_y + vairasvirtė_x;

int rightThrottle = vairasvirtė_y - vairasvirtė_x; // apriboti leftThrottle = apriboti (leftThrottle, -100, 100); dešinysis droselis = apriboti (dešinysis droselis, -100, 100);

„JavaScript“pavyzdys:

var leftChannel = vairasvirtė_y + vairasvirtė_x;

var rightChannel = vairasvirtė_y - vairasvirtė_x; // apriboti leftChannel = apriboti (leftChannel, -100, 100); rightChannel = apriboti (rightChannel, -100, 100); // pagalbininkas functionvaržas constrain = funkcija (num, min, max) {return Math.min (Math.max (num, min), max); };

4 žingsnis: metodo metodas »Proporcingas

Metodas Metodas »Proporcingas
Metodas Metodas »Proporcingas

Aš atsisakiau paprasto metodo, tikėdamasis padaryti geriausią abiejų pasaulių lygtį. Idėja yra būti visiškai proporcinga visomis kryptimis, net įstrižai, nepaisant to, kad judate didesnį atstumą, jo diapazonas yra toks pat kaip judant vertikaliai, o tai yra mažesnis atstumas.

Galų gale mano pavyzdžių skalė yra nuo -200 iki +200 visomis kryptimis. Aš priskiriu tai ± 100, nes tai reiškia kiekvienam kanalui tenkančios galios procentą, tačiau norėsite susieti jį su tuo, kas jums naudinga - jūsų variklio valdiklio dėklas. Pavyzdžiui, jei siunčiate PWM signalą, galite jį susieti su 1000–2000 arba, jei siunčiate analoginį signalą, galite susieti jį su 0–255 ir nustatyti kryptį kaip loginę ir pan.

„Arduino“pavyzdys:

int leftThrottle = vairasvirtė_y + vairasvirtė_x;

int rightThrottle = vairasvirtė_y - vairasvirtė_x; // kai kuriais atvejais maksimumas yra 100, kai kuriais atvejais - 200 // įskaičiuokime skirtumą, todėl maksimumas visada yra 200int dif = abs (abs (joystick_y) - abs (vairasvirtė_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightDroselis <0? rightThrottle - diff: rightThrottle + diff; // Žemėlapis nuo ± 200 iki ± 100 arba bet koks diapazonas, į kurį nukreipiate // constrainleftThrottle = apriboti (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

„JavaScript“pavyzdys:

var leftThrottle = vairasvirtė_y + vairasvirtė_x; var dešinėThrottle = vairasvirtė_y - vairasvirtė_x; // kai kuriais atvejais maksimumas yra 100, kai kuriais atvejais - 200, // įskaičiuokime skirtumą, todėl maksimumas visada yra 200var diff = Math.abs (Math.abs (vairasvirtė_y) - Math.abs (vairasvirtė_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightDroselis <0? rightThrottle -diff: rightThrottle + diff; // Žemėlapis nuo ± 200 atgal iki ± 100 arba bet koks adatas Throttle = žemėlapis (leftThrottle, -200, 200, -100, 100); rightThrottle = žemėlapis (rightThrottle, -200, 200, -100, 100); // apriboti leftThrottle = apriboti (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100); // kai kurios pagalbinės funkcijosvaržyti = funkcija (num, min, max) {return Math.min (Mat. maks (num, min), max); }; var map = funkcija (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, susieta; inMin = inMin + inMax; num = num + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (num/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); susieta = outSpan*(p/100) - (outMax/2); grąžinimas suplanuotas;};

Rekomenduojamas: