Оглавление:

Понимание микширования каналов: 4 шага (с изображениями)
Понимание микширования каналов: 4 шага (с изображениями)

Видео: Понимание микширования каналов: 4 шага (с изображениями)

Видео: Понимание микширования каналов: 4 шага (с изображениями)
Видео: Добавляем текстуру, объем и контраст в два клика. Channel Mixer 2024, Июль
Anonim
Image
Image
Метод смешивания »Нет
Метод смешивания »Нет

Если вы когда-либо управляли шасси с дистанционным управлением, велика вероятность, что вы использовали микширование, даже если вы этого не знали. В частности, если вы использовали один джойстик или шарнир для управления автомобилем, который использует противоскользящее рулевое управление или дифференциальное рулевое управление, вы использовали микширование.

Микширование - это просто то, как данные с вашего джойстика используются для определения, сколько мощности должно подаваться на каждую сторону шасси.

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

Хотя у меня нет формального обучения этому предмету, мне приходилось заниматься микшированием кода раньше, и недавно я захотел немного углубиться в предмет.

Во-первых, я хочу отметить, что большинство RC-передатчиков имеют возможность микширования, как и многие контроллеры двигателей. Эта информация будет наиболее полезной, если вам придется самостоятельно выполнять микширование в своем коде. Скажем, например, если вы используете Arduino для чтения несмешанных данных с RC-приемника, или вы читаете аналоговые данные с горшков в джойстике, или если вы читаете координаты с цифрового джойстика в мобильном приложении.

Давайте посмотрим на несколько различных подходов к микшированию.

Шаг 1. Метод смешивания »Нет

Сначала давайте посмотрим, что произойдет, если вы вообще не используете микширование. Если вы просто отправите данные с одной оси на одну сторону шасси, а с другой оси на другую сторону, ваш автомобиль не будет реагировать так, как вы этого хотите.

Например, если вы нажмете джойстик до упора прямо, ось Y будет на полном газу, а ось X - на 0. Таким образом, вы будете двигаться по кругу, а не по прямой.

Шаг 2. Метод Метод »Повернуть

Метод Метод »Повернуть
Метод Метод »Повернуть

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

Итак, первый метод смешивания, который я когда-либо пробовал, состоял в том, чтобы математически повернуть координаты x и y на 45 градусов относительно центральной точки сетки.

Это работает нормально, однако я не могу двигаться вперед со 100% мощностью, потому что, когда вы вращаетесь, общее движение ограничивается кругом внутри сетки, что означает, что вы никогда не сможете попасть в этот верхний правый угол.

Это также приводит к тому, что углы сетки не используются. Это не проблема, если вы используете джойстик / манипулятор, который ограничивает ваше движение, поэтому эти области никогда не будут доступны, но в противном случае вы захотите, чтобы эта часть сетки что-то делала, чтобы ваши движения казались полностью пропорциональными.

Если вы такой же визуальный ученик, как я, эту концепцию будет легче понять, посмотрев видео в начале этого руководства.

Давайте посмотрим на несколько примеров кода.

ЗАМЕЧАНИЯ О ПРИМЕРАХ МОЕГО КОДА: Я опускаю, как вы получаете значения joystick_x и joystick_y, поскольку они будут меняться в зависимости от вашего проекта. Также я буду отображать / ограничивать до ± 100, но вам может потребоваться сопоставить 1000–2000 для ШИМ или 0–255 для аналогового выхода и т. Д. Я всегда ограничиваю… на всякий случай.

Пример Arduino:

// математически повернуть

двойной рад = -45 * M_PI / 180; int leftThrottle = joystick_x * cos (rad) - joystick_y * sin (рад); int rightThrottle = joystick_y * cos (рад) + joystick_x * sin (рад); // ограничение leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = ограничить (rightThrottle, -100, 100);

Пример JavaScript:

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

Шаг 3. Метод Метод »Простой

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

Далее у нас есть очень простое уравнение, которое я впервые взял из одного из видеороликов SparkFun Шона Хаймела «Приключения в науке», где он работал над проектом, очень похожим на тот, над которым работал я.

Это уравнение позволяет вам набрать полную скорость при движении вперед, но, как и метод поворота, не учитывает угловые области сетки. Это связано с тем, что в некоторых случаях максимальное значение равно 100, а в некоторых случаях - 200. Таким образом, вы должны использовать функцию ограничения, чтобы игнорировать все, что после 100.

И, кстати, я не называю это простым уничижительным… в простоте есть красота.

Пример Arduino:

int leftThrottle = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // ограничение leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = ограничить (rightThrottle, -100, 100);

Пример JavaScript:

var leftChannel = joystick_y + joystick_x;

var rightChannel = joystick_y - joystick_x; // ограничение leftChannel = constrain (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 = joystick_y + joystick_x;

int rightThrottle = joystick_y - joystick_x; // в некоторых случаях максимальное значение равно 100, в некоторых случаях - 200 // учитываем разницу, поэтому максимальное значение всегда равно 200 int diff = abs (abs (joystick_y) - abs (joystick_x)); leftThrottle = leftThrottle <0? leftThrottle - diff: leftThrottle + diff; rightThrottle = rightThrottle <0? rightThrottle - diff: rightThrottle + diff; // Сопоставление от ± 200 до ± 100 или любого другого диапазона, который вы укажете.ftThrottle = map (leftThrottle, 0, 200, -100, 100); rightThrottle = map (rightThrottle, 0, 200, -100, 100); // constrainleftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (rightThrottle, -100, 100);

Пример JavaScript:

var leftThrottle = joystick_y + joystick_x; var rightThrottle = joystick_y - joystick_x; // в некоторых случаях максимальное значение равно 100, в некоторых случаях - 200, // учитываем разницу, поэтому максимальное значение всегда равно 200 var 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 или что угодно. NeedThrottle = map (leftThrottle, -200, 200, -100, 100); rightThrottle = map (rightThrottle, -200, 200, -100, 100); // ограничение leftThrottle = constrain (leftThrottle, -100, 100); rightThrottle = constrain (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, mapped; inMin = inMin + inMax; число = число + inMax; inMax = inMax + inMax; inSpan = Math.abs (inMax-inMin); p = (число / дюйм) * 100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs (outMax - outMin); mapped = outSpan * (p / 100) - (outMax / 2); return mapped;};

Рекомендуемые: