Inhaltsverzeichnis:

Kanalmischung verstehen - Gunook
Kanalmischung verstehen - Gunook

Video: Kanalmischung verstehen - Gunook

Video: Kanalmischung verstehen - Gunook
Video: Professionelle Audioaufnahmen: So stellst du Mikrofone richtig ein und vermeidest Verzerrungen! 2024, Juli
Anonim
Image
Image
Mischmethode » Keine
Mischmethode » Keine

Wenn Sie jemals ein ferngesteuertes Chassis gefahren haben, besteht eine gute Chance, dass Sie das Mischen verwendet haben, auch wenn Sie es nicht wussten. Insbesondere wenn Sie einen einzelnen Joystick oder Gimble verwendet haben, um ein Fahrzeug zu steuern, das Schleuder- oder Differenziallenkung verwendet, haben Sie Mischen verwendet.

Beim Mischen werden einfach die Daten Ihres Joysticks verwendet, um zu bestimmen, wie viel Strom an jede Seite des Chassis geliefert werden soll.

Wenn Sie einen Joystick öffnen, sehen Sie im Allgemeinen zwei Potentiometer im Inneren. Eine zum Messen Ihrer aktuellen Position entlang der Y-Achse (oben und unten) und die andere, um zu messen, wo Sie sich entlang der X-Achse befinden (von Seite zu Seite).

Obwohl ich keine formale Ausbildung zu diesem Thema habe, musste ich schon früher Code einmischen und wollte vor kurzem etwas tiefer in das Thema eintauchen.

Zuerst möchte ich anmerken, dass die meisten RC-Sender, wie auch viele Motorcontroller, eine Mischfunktion haben. Diese Informationen sind am nützlichsten, wenn Sie das Mischen in Ihrem Code selbst durchführen müssen. Sagen Sie zum Beispiel, ob Sie ein Arduino verwenden, um ungemischte Daten von einem RC-Empfänger zu lesen, oder Sie analoge Daten von den Potis in einem Joystick lesen oder wenn Sie die Koordinaten von einem digitalen Joystick auf einer mobilen App lesen.

Werfen wir einen Blick auf einige verschiedene Mischansätze.

Schritt 1: Mischmethode » Keine

Schauen wir uns zuerst an, was passiert, wenn Sie überhaupt kein Mischen verwenden. Wenn Sie nur die Daten von einer Achse an eine Seite des Chassis und die andere Achse an die andere Seite senden, würde Ihr Fahrzeug nicht so reagieren, wie Sie es möchten.

Wenn Sie beispielsweise den Joystick ganz gerade nach vorne drücken, ist die Y-Achse auf Vollgas und die X-Achse auf 0. Sie würden also im Kreis fahren, anstatt geradeaus zu fahren.

Schritt 2: Methode Methode » Drehen

Methode Methode » Drehen
Methode Methode » Drehen

Ein Kollege hat mich einmal darauf hingewiesen, dass man seinen Sender zur Not um 45 Grad drehen kann für einen Armen-Mix. Wenn Sie sich die Werte der beiden Potentiometer in einem Joystick als die x- und y-Achse auf einem Raster vorstellen (wobei beide Achsen von -100 bis +100 reichen), ist dies sehr sinnvoll, da Sie auf beiden Achsen auf +100 gehen wenn Sie den Joystick nach oben und rechts drücken. Wenn dies also direkt auf Ihre beiden Chassis-Kanäle (die linke und rechte Seite Ihres Roboters) abgebildet wird, würde Ihr Roboter vorwärts gehen.

Die erste Mischmethode, die ich je ausprobiert habe, bestand also darin, die x- und y-Koordinate mathematisch um 45 Grad um den Mittelpunkt des Gitters zu drehen.

Dies funktioniert in Ordnung, aber ich kann nicht mit 100% Leistung vorankommen, da beim Drehen die Gesamtbewegung auf einen Kreis innerhalb des Rasters beschränkt ist, was bedeutet, dass Sie nie wirklich in die rechte obere Ecke gelangen können.

Dies führt auch dazu, dass die Ecken des Gitters nicht genutzt werden. Dies ist kein Problem, wenn Sie einen Joystick / Gimple verwenden, der Ihre Bewegung einschränkt, sodass diese Bereiche sowieso nie erreicht werden, aber ansonsten möchten Sie, dass dieser Teil des Rasters etwas tut, damit sich Ihre Bewegungen vollständig proportional anfühlen.

Wenn Sie ein visueller Lerner wie ich sind, ist dieses Konzept möglicherweise einfacher zu grok, indem Sie das Video am Anfang dieses instructable ansehen.

Sehen wir uns einige Codebeispiele an.

HINWEISE ZU MEINEN CODE-BEISPIELEN: Ich lasse aus, wie Sie die Werte von joystick_x und joystick_y erhalten, da sich dies je nach Projekt ändern würde. Ich werde auch auf ±100 abbilden / beschränken, aber Sie müssen wahrscheinlich 1000 - 2000 für PWM oder 0 - 255 für Analogausgang usw. abbilden. Ich beschränke immer … nur für den Fall.

Arduino-Beispiel:

// mathematisch drehen

Doppelrad = -45*M_PI/180; int leftThrottle = joystick_x * cos(rad) - joystick_y * sin(rad); int rightThrottle = joystick_y * cos(rad) + joystick_x * sin(rad); //einschränken leftThrottle = Constrain(leftThrottle, -100, 100); rightThrottle = einschränken(rightThrottle, -100, 100);

JavaScript-Beispiel:

// mathematisch rotierenvar 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); //Hilfsfunktionsvariable Einschränkung = Funktion(num, min, max){ return Math.min(Math.max(num, min), max); };

Schritt 3: Methode Methode » Einfach

Methode Methode » Einfach
Methode Methode » Einfach

Als nächstes haben wir eine sehr einfache Gleichung, die ich zum ersten Mal aus einem von Shawn Hymels Adventures in Science SparkFun-Videos aufnahm, in dem er zufällig an einem sehr ähnlichen Projekt arbeitete, an dem ich gerade arbeitete.

Mit dieser Gleichung können Sie beim Vorwärtsfahren die volle Geschwindigkeit erreichen, aber ähnlich wie bei der Rotationsmethode werden die Eckbereiche des Rasters ignoriert. Dies liegt daran, dass in einigen Fällen das Maximum 100 und in einigen Fällen das Maximum 200 beträgt. Sie würden also eine Einschränkungsfunktion verwenden, um alles nach 100 zu ignorieren.

Und das nenne ich übrigens nicht abschätzig einfach… in der Einfachheit liegt eine Schönheit.

Arduino-Beispiel:

int leftThrottle = Joystick_y + Joystick_x;

int rightThrottle = Joystick_y - Joystick_x; //einschränken leftThrottle = Constrain(leftThrottle, -100, 100); rightThrottle = einschränken(rightThrottle, -100, 100);

JavaScript-Beispiel:

var leftChannel = Joystick_y + Joystick_x;

var rightChannel = Joystick_y - Joystick_x; // Constrain leftChannel = Constrain (leftChannel, -100, 100); rightChannel = einschränken (rightChannel, -100, 100); //Hilfsfunktionsvariable Einschränkung = Funktion(num, min, max){ return Math.min(Math.max(num, min), max); };

Schritt 4: Methode Methode » Proportional

Methode Methode » Proportional
Methode Methode » Proportional

Ich bin von der einfachen Methode abgesprungen, in der Hoffnung, das Beste aus beiden Welten zu machen. Die Idee hier ist, in alle Richtungen, sogar diagonal, vollständig proportional zu sein, obwohl Sie sich über eine größere Entfernung bewegen, hat dies jedoch die gleiche Reichweite wie bei einer vertikalen Bewegung, die eine kleinere Entfernung ist.

Am Ende haben Sie eine Skala von -200 bis +200 in alle Richtungen in meinen Beispielen. Ich bilde das auf ±100 ab, weil es den Prozentsatz der Leistung darstellt, die zu jedem Kanal geht - Sie möchten es jedoch auf das abbilden, was in Ihrer Verwendung funktioniert. Fall für Ihren Motorcontroller. Wenn Sie beispielsweise ein PWM-Signal senden, können Sie dies auf 1000 bis 2000 abbilden oder wenn Sie ein analoges Signal senden, können Sie es auf 0-255 abbilden und die Richtung als boolesch usw.

Arduino-Beispiel:

int leftThrottle = Joystick_y + Joystick_x;

int rightThrottle = joystick_y - joystick_x; // in einigen Fällen ist das Maximum 100, in einigen Fällen ist es 200 // berücksichtigen wir die Differenz, so dass das Maximum immer 200 beträgtint diff = abs(abs(joystick_y) - abs(joystick_x));leftThrottle = leftThrottle < 0 ? leftThrottle - diff: leftThrottle + diff;rightThrottle = rightThrottle < 0 ? rightThrottle - diff: rightThrottle + diff; // Karte von ±200 bis ± 100 oder einem beliebigen Bereich, den Sie benötigenleftThrottle = map(leftThrottle, 0, 200, -100, 100);rightThrottle = map(rightThrottle, 0, 200, -100, 100); //constrainleftThrottle = Constrain(leftThrottle, -100, 100);rightThrottle = Constrain(rightThrottle, -100, 100);

JavaScript-Beispiel:

var leftThrottle = joystick_y + joystick_x;var rightThrottle = joystick_y - joystick_x;// in einigen Fällen ist das Maximum 100, in einigen Fällen 200, // berücksichtigen wir die Differenz, sodass das Maximum immer 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; // Map von ±200 zurück auf ±100 oder was auch immer Sie brauchenleftThrottle = map(leftThrottle, -200, 200, -100, 100);rightThrottle = map(rightThrottle, -200, 200, -100, 100); //einschränken leftThrottle = Constrain(leftThrottle, -100, 100);rightThrottle = Constrain(rightThrottle, -100, 100); //einige Hilfsfunktionenvar Constraint = function(num, min, max){ return Math.min(Math. max(num, min), max); }; var map = function(num, inMin, inMax, outMin, outMax){ var p, inSpan, outSpan, zugeordnet; inMin = inMin + inMax; Anzahl = Anzahl + inMax; inMax = inMax + inMax; inSpan = Math.abs(inMax-inMin); p = (Anzahl/inSpan)*100; outMin = outMin + outMax; outMax = outMax + outMax; outSpan = Math.abs(outMax - outMin); abgebildet = outSpan*(p/100) – (outMax/2); Rückkehr zugeordnet;};

Empfohlen: