Frage

Ich habe einen Roboter, der eine optische Maus als Positionsspur verwendet. mit der Maus im Allgemeinen, wie der Roboter sich bewegt, ist es in der Lage Änderung in X und Y-Richtung zu verfolgen. Die Maus verfolgt auch, welche Richtung sie sich bewegen - dh negativ oder positiv X X. Diese Werte werden in getrennte X- und Y-Register aufsummiert.

Nun dreht sich der Roboter an Ort und Stelle und bewegt sich nur vorwärts. So ist die Bewegung des Roboters ist ideal in geraden Linien (auch wenn das Maus-Tracking kann, wenn Sie Aufnahme Abweichungen abdrehen) bei bestimmten Winkeln. Eine bestimmte Gruppe von Bewegungen des Roboters wäre wie:
A: Drehen um 45 Grad, bewegen 3 Zoll
B: Drehen um 90 Grad, 10 Zoll bewegen
C: Drehen -110 Grad, bewegen 5 Zoll
D: 10 Grad drehen, bewegen 1 Zoll
Aber jedes Mal, wenn die Maus X und Maus Y-Register geben die tatsächlichen Abstände Sie in jede Richtung bewegt.
Nun, wenn ich nur die Bewegung in Gang gesetzt von A bis D wiederholt werden soll, wie kann ich dies tun, mit den Informationen, die ich bereits gesammelt. Ich weiß, ich kann im Grunde alle fassen die Winkel und Abstände ich in sie schon füttern, aber dies würde als unzutreffend erweisen, wenn es große Fehler in jeder Bewegungsbefehle waren. Wie kann ich die Rohinformationen aus meiner Maus? Ein Freund bot eine Idee, dass ich ständig Sinus und die Maus Werte Kosinus und den endgültigen Vektor berechnen, aber ich bin nicht wirklich sicher, wie dies funktionieren würde.

Das Problem ist, dass die Maus nur relative Messwerte so drehen oder rückwärts bewegt gibt, sind das Löschen Sie möglicherweise Informationen. Also ja, was ich frage mich, wie Sie den Algorithmus implementieren können, so dass es ständig Änderungen nachverfolgen können Sie einen kürzesten Weg zu geben, wenn Sie in Serpentinen bewegt es ursprünglich zu erhalten.

War es hilfreich?

Lösung

Ich denke, der Grund-Algorithmus Sie tun müssen, ist dies:

currentX = currentY = 0;
heading = 0; // radians
while (true)
{
    deltas = SampleMouseDeltas();
    heading += deltas.Heading;
    currentX += Math.Cos(heading) * deltas.Distance;
    currentY += Math.Sin(heading) * deltas.Distance;
}

Sie haben Recht in Ihrer Idee, dass dies nicht exakt ist. Es ist "Dead Reckoning" für einen Grund.

Wenn Sie Ihr deltas.Heading auf dem „X“ auf der Grundlage erhalten kann Koordinate (die Formel (deltax in Zoll sein wird) / (Maus Sensorabstand in Zoll vom Zentrum der Rotation). Auch würde die deltas.Distance kommt aus der „Y“ Sensor, nachdem Sie es von Pixeln Zoll umwandeln.

Dann die Schritte ausführen, können Sie etwas tun könnten, wie:

robot.RotateLeft();
heading = 0;
while (heading < 45 degrees)
    heading += SampleMouseDeltas.Heading;
robot.StopRotateLeft();

... etc ...

Andere Tipps

Nicht eine Antwort auf Ihre Frage, aber vielleicht ein warnende ... Ich habe genau diese Art von Roboter als Schulprojekt ein Jahr zurück. Es war ein völliger Fehlschlag, obwohl ich ziemlich viel gelernt während es zu tun. Wie bei der Maus für die Verfolgung mit, wie weit Sie gefahren haben: Es funktionierte nicht gut für uns alle, oder eine der anderen Gruppen. Wahrscheinlich, weil die Kamera in der Maus war unscharf aufgrund der Tatsache, dass wir die Maus ein paar Millimeter über dem Boden zu haben brauchten. Im darauffolgenden Jahr keine Gruppe das gleiche Projekt zu tun verwendet, um dieses methid. Sie setzen stattdessen Markierungen auf den weels und verwendet einen einfachen ir-Sensor zu berechnen, wie viele Umdrehungen die Räder gestellt.

Ich weiß, dass ich etwas bin necroing dieses Themas, aber wenn man genau Winkel Tracking will, zwei optische Mäuse wären ideal. Grundsätzlich, wenn Sie die Bewegung in der gleichen Richtung aufgehoben, würden Sie mit der Bewegung gelassen werden, dass die Mäuse relativ zu ihnen gemacht. Von dort würde es nur einige einfache mathematische sein, genau zu bestimmen, wie weit die ‚Bot gedreht hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top