Съдържание:

Разбиране на смесването на канали: 4 стъпки (със снимки)
Разбиране на смесването на канали: 4 стъпки (със снимки)

Видео: Разбиране на смесването на канали: 4 стъпки (със снимки)

Видео: Разбиране на смесването на канали: 4 стъпки (със снимки)
Видео: Свършвам бързо! Как да правя секс по-дълго? 2024, Ноември
Anonim
Image
Image
Метод на смесване »Няма
Метод на смесване »Няма

Ако някога сте карали шаси с дистанционно управление, има голям шанс да сте използвали смесване, дори и да не сте го знаели. По -конкретно, ако сте използвали един джойстик или гимбъл за управление на превозно средство, което използва плъзгащо се управление или диференциално управление, сте използвали смесване.

Смесването е просто начинът, по който данните от вашия джойстик се използват, за да се определи колко енергия трябва да бъде подадена към всяка страна на шасито.

Ако отворите джойстик, обикновено ще видите два потенциометра вътре. Единият за измерване на текущото ви положение по оста Y (нагоре и надолу), а другият за измерване къде се намирате по оста X (отстрани на страна).

Въпреки че нямам официално обучение по темата, преди това ми се налагаше да смесвам код и наскоро исках да се потопя малко по -дълбоко в темата.

Първо искам да отбележа, че повечето RC предаватели имат възможност за смесване, както и много контролери на двигатели. Тази информация ще бъде най -полезна, ако трябва да направите смесването сами във вашия код. Кажете например, ако използвате Arduino за четене на несмесени данни от RC приемник, или четете аналогови данни от саксиите в джойстик, или ако четете координатите от цифров джойстик в мобилно приложение.

Нека да разгледаме някои различни подходи за смесване.

Стъпка 1: Метод на смесване »Няма

Първо нека да разгледаме какво се случва, ако изобщо не използвате смесване. Ако просто изпратите данните от една ос към едната страна на шасито, а другата ос към другата страна, вашият автомобил няма да реагира така, както искате.

Например, ако натиснете джойстика докрай напред, оста Y е на пълен газ, а оста X е на 0. Така че ще карате в кръг, вместо да ходите направо.

Стъпка 2: Метод на метода »Завъртете

Метод Метод »Завъртане
Метод Метод »Завъртане

Един колега веднъж ми посочи, че за малко можете да завъртите предавателя на 45 градуса за смесване на беден човек. Ако мислите, че стойностите от двата потенциометра в джойстика са оси х и у на решетка (и двете оси се простират от -100 до +100), това има много смисъл, защото ще отидете до +100 по двете оси докато бутате джойстика нагоре и надясно. Така че, ако това се свърже директно с двата ви канала на шасито (лявата и дясната страна на вашия робот), това ще накара вашия робот да върви напред.

Така че първият метод за смесване, който някога съм опитвал, е математически да завъртя координатите x и y на 45 градуса около централната точка на решетката.

Това работи добре, но не мога да продължа напред със 100% мощност, защото когато се въртите, цялостното движение е ограничено до кръг в мрежата, което означава, че никога не можете да влезете в горния десен ъгъл.

Това също води до това, че ъглите на решетката не се използват. Това не е проблем, ако използвате джойстик/gimple, който ограничава движението ви, така че тези области никога не се достигат, но в противен случай ще искате тази част от мрежата да направи нещо, така че движенията ви да се чувстват напълно пропорционални.

Ако сте визуален обучаващ се като мен, тази концепция може да бъде по -лесна за разглеждане, като гледате видеоклипа в началото на тази инструкция.

Нека разгледаме някои примери за код.

ЗАБЕЛЕЖКИ ЗА ПРИМЕРИТЕ НА МОЙ КОД: Изпускам как получавате стойностите на 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 = джойстик_y * cos (rad) + джойстик_x * sin (rad); // ограничаване leftThrottle = ограничение (leftThrottle, -100, 100); rightThrottle = ограничение (rightThrottle, -100, 100);

Пример за JavaScript:

// математически 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 = ограничение (leftThrottle, -100, 100); rightThrottle = ограничение (rightThrottle, -100, 100); // помощна функцияvar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Стъпка 3: Метод на метода »Прост

Метод Метод »Прост
Метод Метод »Прост

След това имаме много просто уравнение, което за първи път взех от едно от видеоклиповете на Шон Хаймел в Приключенията в науката SparkFun, където той случайно работи по много подобен проект на този, по който работех.

Това уравнение ви позволява да стигнете до пълна скорост, когато вървите напред, но подобно на метода на завъртане, той пренебрегва ъгловите области на решетката. Това е така, защото в някои случаи максимумът е 100, а в някои максимумът е 200. Така че бихте използвали функция за ограничаване, за да пренебрегнете нищо след 100.

И между другото не наричам това просто унизително … има красота в простотата.

Пример за Arduino:

int leftThrottle = джойстик_y + джойстик_x;

int rightThrottle = joystick_y - джойстик_x; // ограничаване leftThrottle = ограничение (leftThrottle, -100, 100); rightThrottle = ограничение (rightThrottle, -100, 100);

Пример за JavaScript:

var leftChannel = джойстик_y + джойстик_x;

var rightChannel = joystick_y - joystick_x; // ограничаване leftChannel = ограничение (leftChannel, -100, 100); rightChannel = ограничение (rightChannel, -100, 100); // помощна функцияvar constrain = function (num, min, max) {return Math.min (Math.max (num, min), max); };

Стъпка 4: Метод на метода »Пропорционален

Метод Метод »Пропорционален
Метод Метод »Пропорционален

Изисках прост метод с надеждата да направя най-доброто от уравнението на двата свята. Идеята тук е да бъдете напълно пропорционални във всички посоки, дори диагонално, въпреки факта, че въпреки че се движите на по -голямо разстояние, той има същия обхват, както когато се движите вертикално, което е по -малко разстояние.

В крайна сметка получавате скала от -200 до +200 във всички посоки в моите примери, аз я картографирам до ± 100, защото представлява процента на мощност, отиваща към всеки канал - обаче ще искате да го съпоставите с всичко, което работи във вашата употреба - калъф за вашия контролер на двигателя. Например, ако изпращате ШИМ сигнал, можете да го съпоставите с 1000 до 2000 или ако изпращате аналогов сигнал, можете да го съпоставите с 0-255 и да зададете посоката като булева и т.н.

Пример за Arduino:

int leftThrottle = джойстик_y + джойстик_x;

int rightThrottle = joystick_y - joystick_x; // в някои случаи максимумът е 100, в някои случаи е 200 // нека вземем предвид разликата, така че максимумът винаги е 200int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Карта от ± 200 до ± 100 или какъвто и да е диапазон, от който излизатеThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 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 или каквото и да излезетеThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // ограничаване leftThrottle = ограничение (leftThrottle, -100, 100); rightThrottle = ограничение (rightThrottle, -100, 100); // някои помощни функцииvar constrain = function (num, min, max) {return Math.min (Math. макс (брой, мин), макс); }; var map = function (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); mapped = outSpan*(p/100) - (outMax/2); връщане картографирано;};

Препоръчано: