Բովանդակություն:

Հասկանալով ալիքների խառնումը. 4 քայլ (նկարներով)
Հասկանալով ալիքների խառնումը. 4 քայլ (նկարներով)

Video: Հասկանալով ալիքների խառնումը. 4 քայլ (նկարներով)

Video: Հասկանալով ալիքների խառնումը. 4 քայլ (նկարներով)
Video: Zero to Hero ControlNet Tutorial: Stable Diffusion Web UI Extension | Complete Feature Guide 2024, Հուլիսի
Anonim
Image
Image
Խառնման եղանակ »Չկա
Խառնման եղանակ »Չկա

Եթե երբևէ վարել եք հեռակառավարման շասսի, ապա մեծ հավանականություն կա, որ օգտագործել եք խառնուրդ, նույնիսկ եթե դա չգիտեիք: Մասնավորապես, եթե դուք օգտագործել եք մեկ ջոյստիկ կամ շարժունակություն ՝ սահող ղեկ կամ դիֆերենցիալ ղեկ օգտագործող փոխադրամիջոցը կառավարելու համար, ապա օգտագործել եք խառնուրդ:

Խառնումը պարզապես այն է, թե ինչպես են ձեր ջոյսթիկի տվյալները օգտագործվում որոշելու համար, թե որքան էներգիա պետք է մատակարարվի շասսիի յուրաքանչյուր կողմին:

Եթե դուք բացում եք ջոյսթիք, ապա սովորաբար ներսում կտեսնեք երկու պոտենցիոմետր: Մեկը ՝ Y առանցքի երկայնքով (վեր և վար) ձեր ընթացիկ դիրքը չափելու համար, իսկ մյուսը ՝ ձեր առանցքի երկայնքով X առանցքի երկայնքով (կողք կողքի):

Թեև ես այս թեմայով ոչ մի պաշտոնական ուսուցում չունեմ, բայց նախկինում ստիպված էի կոդի մեջ խառնել, և վերջերս ես ուզում էի մի փոքր ավելի խորանալ թեմայի մեջ:

Նախ ուզում եմ նշել, որ RC հաղորդիչներից շատերն ունեն խառնման ունակություն, ինչպես շատ շարժիչային կարգավորիչներ: Այս տեղեկատվությունը ամենաօգտակարը կլինի, եթե դուք ինքներդ պետք է խառնեք ձեր կոդը: Ասեք, օրինակ, եթե դուք օգտագործում եք Arduino- ն RC ընդունիչից չխառնված տվյալներ կարդալու համար, կամ ջոյսթիկի կաթսաներից անալոգային տվյալներ եք կարդում, կամ բջջային հավելվածում թվային ջոյսթիկից կոորդինատներն եք կարդում:

Եկեք նայենք մի քանի տարբեր խառնուրդային մոտեցումների:

Քայլ 1. Խառնման եղանակ »Ոչ մեկը

Նախ եկեք նայենք, թե ինչ է տեղի ունենում, եթե ընդհանրապես խառնուրդ չեք օգտագործում: Եթե դուք ուղղակի տվյալները մեկ առանցքից ուղարկում եք շասսիի մի կողմը, իսկ մյուս առանցքը ՝ մյուս կողմը, ձեր մեքենան չի արձագանքի այնպես, ինչպես ցանկանում եք:

Օրինակ, եթե ջոյսթիկը ամբողջ ճանապարհով առաջ եք մղում, Y առանցքը ամբողջ շնչափողում է, իսկ X առանցքը 0 -ի վրա: Այսպիսով, դուք կշարժվեիք շրջանաձև ՝ ուղիղ գնալու փոխարեն:

Քայլ 2: Մեթոդ մեթոդ »Պտտել

Մեթոդ մեթոդ »Պտտել
Մեթոդ մեթոդ »Պտտել

Մի աշխատակցուհի մի անգամ ինձ մատնանշեց, որ մի պտղունց կարող ես հաղորդիչդ 45 աստիճանով պտտել աղքատ մարդու խառնուրդի համար: Եթե դուք մտածում եք, որ ջոյսթիկի երկու պոտենցիոմետրերի արժեքները ցանցում x կամ y առանցք են (երկու առանցքները `-100 -ից +100), դա շատ իմաստալից է, քանի որ երկու առանցքի վրա պատրաստվում եք հասնել +100 -ի: երբ ջոյսթիկը սեղմում ես վերև և աջ: Այսպիսով, եթե սա ուղղակիորեն քարտեզագրվի ձեր երկու շասսի ալիքներին (ձեր ռոբոտի ձախ և աջ կողմերը), դա կդրդի ձեր ռոբոտին առաջ գնալ:

Այսպիսով, երբևէ փորձած խառնման առաջին մեթոդը մաթեմատիկորեն պտտելն էր x և y կոորդինատները 45 աստիճան ցանցի կենտրոնական կետի շուրջ:

Սա լավ է աշխատում, սակայն ես չեմ կարող 100% հզորությամբ առաջ գնալ, քանի որ երբ պտտվում եք, ընդհանուր շարժումը սահմանափակվում է ցանցի շրջանակով, ինչը նշանակում է, որ դուք երբեք իսկապես չեք կարող մտնել այդ վերին աջ անկյունը:

Սա նաև հանգեցնում է ցանցի անկյունների չօգտագործմանը: Սա խնդիր չէ, եթե դուք օգտագործում եք ջոյսթիք/ակ, որը սահմանափակում է ձեր շարժումը, այնպես որ այդ տարածքներն այդպես էլ չեն հասնում, այլապես կցանկանաք, որ ցանցի այդ հատվածը ինչ -որ բան անի, որպեսզի ձեր շարժումները լիովին համաչափ զգան:

Եթե դուք ինքս ինձ պես տեսողական սովորող եք, ապա այս հայեցակարգին գուցե ավելի հեշտ լինի ծանոթանալ ՝ դիտելով տեսանյութը այս ուսանելիի սկզբում:

Դիտարկենք կոդի մի քանի օրինակ:

Ո NOTՇԱԴՐՈԹՅՈՆՆԵՐԻ ՄԱՍԻՆ ՕՐԻՆԱԿՆԵՐԻ ՄԱՍԻՆ. Ես բաց եմ թողնում, թե ինչպես եք ստանում joystick_x և joystick_y արժեքները, քանի որ դրանք կփոխվեին `կախված ձեր նախագծից: Նաև ես քարտեզագրելու/սահմանափակելու եմ 100 ֆունտ ստեռլինգ, բայց, ամենայն հավանականությամբ, ձեզ հարկավոր կլինի քարտեզագրել 1000 - 2000 ՝ PWM- ի համար կամ 0 - 255 ՝ անալոգային ելքի համար և այլն: Ես միշտ սահմանափակում եմ … ամեն դեպքում:

Arduino Օրինակ.

// մաթեմատիկորեն պտտել

կրկնակի ռադ = -45*M_PI/180; int leftThrottle = joystick_x * cos (rad) - joystick_y * sin (rad); int rightThrottle = joystick_y * cos (rad) + joystick_x * sin (rad); // սահմանափակել leftThrottle = սահմանափակել (leftThrottle, -100, 100); rightThrottle = սահմանափակում (rightThrottle, -100, 100);

JavaScript Օրինակ.

// մաթեմատիկորեն պտտվող ռադ = -45*Մաթ. PI/180; leftThrottle = joystick_x * Math.cos (rad) - joystick_y * Math.sin (rad); rightThis // helper functionvar constrain = գործառույթ (համար, րոպե, առավելագույն) {վերադարձ Math.min (Math.max (num, min), max); };

Քայլ 3. Մեթոդ մեթոդ »Պարզ

Մեթոդ մեթոդ »Պարզ
Մեթոդ մեթոդ »Պարզ

Հաջորդը մենք ունենք շատ պարզ հավասարում, որն ես առաջին անգամ վերցրեցի Շոն Հեյմելի Adventures in Science SparkFun տեսանյութերից մեկում, որտեղ նա պատահաբար շատ նման նախագիծ էր աշխատում, որի վրա ես աշխատում էի:

Այս հավասարումը թույլ է տալիս առաջ շարժվել լիարժեք արագությամբ, բայց շատ նման է պտտման եղանակին, այն անտեսում է ցանցի անկյունային հատվածները: Դա պայմանավորված է նրանով, որ որոշ դեպքերում առավելագույնը 100 է, իսկ որոշ դեպքերում ՝ առավելագույնը 200: Այսպիսով, դուք կկիրառեք սահմանափակման գործառույթ ՝ 100 -ից հետո որևէ բան անտեսելու համար:

Եվ, ի դեպ, ես այս պարզը նվաստացուցիչ չեմ անվանում … պարզության մեջ գեղեցկություն կա:

Arduino Օրինակ

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // սահմանափակել leftThrottle = սահմանափակել (leftThrottle, -100, 100); rightThrottle = սահմանափակում (rightThrottle, -100, 100);

JavaScript Օրինակ.

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // սահմանափակել leftChannel = սահմանափակել (leftChannel, -100, 100); rightChannel = սահմանափակում (rightChannel, -100, 100); // helper functionvar constrain = գործառույթ (համար, րոպե, առավելագույն) {վերադարձ Math.min (Math.max (num, min), max); };

Քայլ 4. Մեթոդ մեթոդ »Համաչափ

Մեթոդ մեթոդ »Համաչափ
Մեթոդ մեթոդ »Համաչափ

Ես դուրս եկա պարզ մեթոդից ՝ հույս ունենալով լավագույնը դարձնել երկու աշխարհների հավասարումը: Այստեղ գաղափարն այն է, որ բոլոր ուղղություններով լիովին համամասնական լինի նույնիսկ անկյունագծով, չնայած այն բանին, որ չնայած ավելի մեծ հեռավորության վրա եք շարժվում, այն ունի նույն տիրույթը, ինչ ուղղահայաց շարժվելիս, որն ավելի փոքր հեռավորություն է:

Իմ օրինակներում դուք ավարտում եք -200 -ից +200 սանդղակով բոլոր ուղղություններով: Ես դա պատկերում եմ 100 ֆունտ ստերլինգ, քանի որ այն ներկայացնում է յուրաքանչյուր ալիքին տրվող էներգիայի տոկոսը, պատյան ձեր շարժիչի վերահսկիչի համար: Օրինակ, եթե դուք ուղարկում եք PWM ազդանշան, կարող եք այն քարտեզագրել 1000-ից 2000-ի, կամ եթե անալոգային ազդանշան եք ուղարկում, կարող եք քարտեզագրել 0-255-ի վրա և ուղղությունը սահմանել որպես բուլյան և այլն:

Arduino Օրինակ

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // որոշ դեպքերում առավելագույնը 100 է, որոշ դեպքերում `200 // եկեք հաշվի առնենք տարբերությունը, այնպես որ առավելագույնը միշտ 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = ձախThtottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Քարտեզ ± 200 -ից մինչև 100 ± կամ ինչպիսի միջակայք է ձեզ հարկավոր // constrainleftThrottle = սահմանափակել (leftThrottle, -100, 100); rightThrottle = սահմանափակել (rightThrottle, -100, 100);

JavaScript Օրինակ

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // որոշ դեպքերում առավելագույնը 100 է, որոշ դեպքերում `200, // հաշվի առնենք տարբերությունը, այնպես որ առավելագույնը միշտ 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; // Քարտեզ 200 ֆունտից մինչև 100 ֆունտ ստեռլինգ կամ այն, ինչ ձեզ հարկավոր է -100, 100); // սահմանափակել leftThrottle = սահմանափակել (leftThrottle, -100, 100); rightThrottle = սահմանափակել (rightThrottle, -100, 100); // որոշ օգնական գործառույթներ varrain = գործառույթ (համար, րոպե, առավելագույն) {վերադարձնել Math.min (մաթ. առավելագույն (համար, րոպե), առավելագույն); }; var քարտեզ = գործառույթ (num, inMin, inMax, outMin, outMax) {var p, inSpan, outSpan, քարտեզագրված; 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); քարտեզագրված = outSpan*(p/100) - (outMax/2); վերադարձը քարտեզագրված է;};

Խորհուրդ ենք տալիս: