Liste der Anhänge anzeigen (Anzahl: 1)
Asuro Simulieren
Hier gibt es einen Robotersimulator in Java, der einen Asuro simuliert.
Man kann den Code für den Asuro im Simulator in Java schreiben. Der Code für den Roboter findet sich im File "AsuroProgramm.java".
Das sieht dann Beispielsweise so aus:
Code:
/*******************************************************************************************
*
* Beispielprogramm für Asuro Simulator
*
*
* Blinken und im Kreis fahren
*
*
* Bedienhinweis:
* Zum Ausführen des Programms muss das File in "AsuroProgramm.java" umbenannt
* werden. Danach muss das Programm compiliert werden. Das geht in der Kommandozeile
* mit "javac AsuroProgramm.java" oder durch anklicken des Batch-Files "makeprog.bat"
* Gestartet wird der Simulator dann durch anklicken von "start.bat".
*
* robo.fr, May 2010
*
*******************************************************************************************/
private void blinken(int k)
{
int n;
for(n=0;n<k;n++)
{
asuro.MSleep(500);
asuro.StatusLED(LedColor.GREEN);
asuro.MSleep(500);
asuro.StatusLED(LedColor.OFF);
}
}
public void asuroMain()
{
blinken(2);
asuro.SerPrint("Asuro Simulator ready !!");
while(true)
{
// Motoren einstellen: linker Motor etwas schneller
asuro.MotorSpeed(100,100);
asuro.MotorDir(AsuroMotor.FWD,AsuroMotor.FWD);
// so lange fahren, bis Hindernis kommt
while(asuro.PollSwitch()==0);
asuro.PrintInt(asuro.PollSwitch());
asuro.StatusLED(LedColor.RED);
// zurückfahen
asuro.MotorDir(AsuroMotor.RWD,AsuroMotor.RWD);
asuro.MSleep(500);
asuro.StatusLED(LedColor.OFF);
// drehen
asuro.MotorDir(AsuroMotor.FWD,AsuroMotor.RWD);
asuro.MSleep(500);
// Motoren ausschalten
asuro.MotorDir(AsuroMotor.BREAK,AsuroMotor.BREAK);
blinken(1);
}
}
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo robo.fr,
tolles Programm, dass Du da geschrieben hast, insbesondere weil man die Spielarena beliebig gestalten kann!
Hab etwas damit rumgespielt, und den Code um eine Kollisionserkennung erweitert, sodass der Robi nicht durch eine Wand fahren kann, selbst wenn er das will. Dazu wird der Roboter in ein seperates Bitmap gezeichnet und die Pixel mit den Pixeln des hintergrundbildes verglichen. Bei einer Kollision bleibt der Roboter einfach stehen, ansonsten wird seine Position auf den neu berechneten Wert gesetzt.
Damit die Bewegungen nicht mehr so zackig sind, haben beider Rädes der Roboters jetzt jeweils eine eigene tatsächliche Geschwindigkeit. Diese passt sich bei jedem Bewegungsschritt der Soll-Geschwindigkeit aus MotorSpeed() stück für stück an, sodass der Eindruck von Trägheit entsteht. Der Anpassungsfaktor (Robot.accel_fact) kann frei eingestellt werden.
Cool wäre es, wenn man auch die Helligkeitssensoren simulieren könnte, damit auch Linienverfolgung möglich wäre.
MfG Mark
Edit: die Helligkeitssensoren funktionieren jetzt auch, es wird die durchschnittliche Helligkeit der Pixel eines 3x3 Blocks des Hintergrundbildes berechnet. Wände zur Kollisionserkennung müssen Rot sein, ansonsten werden sie nicht als solche erkannt.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Mark,
Deine Erweiterungen finde ich sehr gut. Ich habe die einzelnen Methoden von Dir kommentiert und mit Kommentaren versehen. Deinen Nickname habe ich in die Beschreibungen eingetragen.
Für eine Erweiterung des Simulators wäre es meiner Meinung nach sehr toll, wenn man mehrere Roboter oder Gegenständer simulieren könnte. Dann wäre es möglich simulierte Roboterwettkämpfe zu machen.
Man könnte vielleicht so etwas wie diesen Wettkampf simulieren:
http://www.youtube.com/watch?v=oscbdxMhX_4
Was hältst Du davon?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
auch Abrutschen an der Wand u.ä. simulieren,
Jetzt weiß ich, warum Dir das Abrutschen so wichtig ist: In der Simualtion läuft der Roboter ziemlich oft in Deadlocks ( er bleibt hängen ). Das liegt meines Erachtens unter anderem auch an einem Fehler in der Methode "Kollision". Dort hast Du geschrieben, dass sich der Roboter immer drehen kann, da er ja Rund ist. Das stimmt aber scheinbar nicht ganz, da es bei einer Zeichung der runden Scheibe "Rundungsfehler" geben kann.
Im Anhang mal eine etwas abgewandelte Version der Methode.
Liste der Anhänge anzeigen (Anzahl: 2)
So, hat zwar etwas länger gedauert als versprochen, aber eine kommentierte Vorab-Version ist jetzt endlich fertig. Hab das Projekt mit Eclipse geschrieben, wahrscheinlich lässt es sich aber auch mit NetBeans bauen. Im Zip-File ist die Phys2D Engine enthalten (src060408).
Die Klasse Environment enthält ein World-Objekt aus Phys2D und hat zusätzlich eine Liste mit allen Robotern. Bei jedem Simulationsschritt werden wird von jedem Roboter die Methode doStep() aufgerufen, die den Roboter entsprechend weiter bewegt. Alle sichtbaren Objekte (also auch Roboter) haben das Interface Showable implementiert, das eine Methode zum Zeichnen des Objekts enthält.
Um nicht nur Zweirad-Roboter simulieren zu können, hat jeder Roboter deshalb eine allgemeine doStep()-Methode, die die Geschwindigkeit des Roboters regelt, ohne dass die Umgebung wissen muss, wie. Von Robot abgeleitet ist die Klasse TwoWheelRobot, die die Basis für Roboter mit Differentialantrieb darstellt. Der Asuro ist so ein TwoWheelRobot. Das Programm für den Asuro muss von Asuro abgeleitet werden und ein Runnable implementieren. Dadurch entfällt im Programm das ständige "asuro.IrgendeineFunktion".
Im Moment ist ein sehr einfaches Sumo-Programm implementiert, die nach Objekten sucht und diese über die schwarze Markierung hinausschiebt. Dazu hat der Asuro eine Erweiterung in Form eines Sharp-Distanzsensors mit 80 cm Reichweite bekommen.
Die Simulator-Klasse erstellt eine neue Umwelt und kann beliebig viele Roboter bzw Physik-Objekte hinzufügen.
MfG Mark
Liste der Anhänge anzeigen (Anzahl: 2)
Habe ich jetzt gemacht (nicht JNI sondern via Sockets). D.h. es geht jetzt auch mit einem C-Programm AsuroSumoClient.exe (VisualStudio).
Dazu habe ich das JAVA Projekt etwas umgestellt (auf Packages verteilt). Auch hauptsächlich deswegen weil ich zwischen dem HardwareRoboter und seiner Software trennen musste (damit letztere auch in C programmiert werden kann).
Simulator.java habe ich nach Simulation1.java umgenannt -> (wie gehabt) zwei lokale Clients.
Simulation2.java -> ein lokaler Client und ein remote Client.
Simulation3.java -> zwei remote Clients.
Startet man Simulation2 oder Simulation3 muss man natürlich noch die remote Clients starten. Am besten vorher. Die warten dann auf den Start der Simulation.
Einen Client gibt es für JAVA -> AsuroSumoClient.java
Und einen zweiten Client gibt es für C -> AsuroSumoClient.exe
Der remote Client wird jeweils in blau angezeigt.
edit: Es heißt AsuroSumoClient und der blaue Asuro war nicht zu sehen.
Liste der Anhänge anzeigen (Anzahl: 1)
Jup, sieht gut aus.
Ich steuere meinen Roboter auf dem Bildschirm mit dem Board, welches ich an der Seriellen Schnittstelle angeschlossen habe.
Der Screenroboter fährt mit den Anweisungen, welche vom Atmegaboard kommen. Das Board wertet die laufenden Daten aus, die vom Screenroboter über die Schnittstelle gesendet werden. Ich programmiere in GFA32 (ist jetzt Freeware).
Nebenbei mein Board :
Ich mache es mit einer Ex-Platine, wo 3 Atmega drauf sind mit 16mhz, 2x Atmega32 und 1x Atmega8, dazu habe ich vorn quer ein Steckbrett gesetzt.
Darauf sind zur zeit 2x PCF8574, 1x 27c256, 2x 8ter Leuchtdiodenbänke, 1x Irdiode ,1x Tsop.
Die Platine selber hat noch 1xFBas-Buchse , 1x Stecker für PC-Tastatur, 1x LCD-Display, 1x Seriell(Max), 1x SD-Karte.
Mit diesem Ding kann man unendliche weiten des Atmegas und den Sensoren entdecken.
Alle Anschlüsse sind Steckbar , also keine Festverdrahtung der Sensoren.