PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Roboter an einem Auto entlang fahren lassen



ga69jot
05.11.2013, 12:31
Hallo Community,

ich würde gerne wissen, welche Methoden es gibt, um einen Roboter entlang eines Autos, von der Fahrertür zum Kofferraum fahren zu lassen.

Wichtig hierbei sind mir wirklich die Möglichkeiten, dies zu realiseren.

Würde mich freuen, wenn ihr mir helfen könnt.

HannoHupmann
05.11.2013, 14:19
Vielleicht mit magnetischen Rädern? Kommt halt darauf an wie schwer der Roboter werden darf und wie viel Last er transportieren muss.

Vielleicht kannst du deine Aufgabenstellung oder Idee warum der Roboter das machen muss genauer erklären, dann wird es uns leichter fallen dir Lösungen anzubieten.

ga69jot
05.11.2013, 15:46
Es ist nicht direkt ein Roboter, sondern ein Rollstuhl mit Treppensteigfunktion...
Ich dachte immer an Lösungen mit Sensoren, aber mir fehlen ein wenig die Ideen.

Geistesblitz
05.11.2013, 15:54
Also soll der Rollstuhl entlang der Fahrzeugflanke geführt werden?

Mal überlegen, vielleicht ginge ja eine weiche Rolle an einem gefederten Ausleger, der an einem Winkelsensor angeschlossen ist. Je nachdem, wie der Ausleger eingdrückt wird, könnte der Rollstuhl dann seine Route korrigieren. Vielleicht würde es aber auch noch einfacher gehen mit einem Utraschallsensor, der einfach den Abstand zur Fahrzeugseite misst und dieser Wert wird dann in einer Lenkregelung verwendet. Der Rollstuhl würde dann in einem relativ konstanten Abstand zur Fahrzeugseite bleiben und sollte dann auch um Ecken fahren können.

ga69jot
05.11.2013, 16:03
Er soll von der Fahrertür zum Kofferraum fahren...

Geistesblitz
05.11.2013, 20:21
Das klingt eher, als wären da die Fähigkeiten des Fahrers gefragt, aber ich denke, dass er das automatisch tun soll...
Bitte, lass dir nicht jedes Detail aus der Nase ziehen, sondern schreib mal ein paar mehr Sätze, was alles gefordert wird und was du dir genauer vorstellst, sonst wird dir kaum einer Helfen können, der kein Hellseher ist.

ranke
05.11.2013, 20:21
Er soll von der Fahrertür zum Kofferraum fahren...

Das ist ja nicht besonders weit, wenn man ihn einigermaßen parallel zum Fahrzeug ausrichtet braucht man eigentlich nur 2 Meter nach hinten fahren. Soll er hinten neben dem Auto ankommen oder noch eine 90° Kurve machen, dass er direkt hinter dem Auto steht? Wie genau muss er denn nach dem Manöver zum Fahrzeug ausgerichtet sein? Erzähl doch bitte etwas ausführlicher, damit man nicht alles raten muß!

edit
@ Geistesblitz: zwei Geister, ein Blitz! :-)

ga69jot
06.11.2013, 11:10
Sorry, dass ich das nicht konkret beschrieben habe. Also es geht darum, dass das Fahrwerk des Rollstuhles ohne jeglichen Fahrer, ohne jeglichen Einfluss automatisch von der Fahrertür zum Kofferraum fährt. Am Kofferraum angelangt sollte sich das Fahrwerk mit dem Heck zum Fahrzeug befinden, also eine 90 Grad Drehung hinter sich bringen. Das Fahrwerk wird sich zu Beginn auch mit dem Heck zur Fahrertür befinden. Muss also auch erst eine 90 Grad Drehung vollbringen, um parallel zum Fahrzeug zu stehen. Und ja alles soll automatisch funktionieren.

Danke für eure Bemühungen :)

Geistesblitz
06.11.2013, 11:34
Ok, jetzt kann ich mir schon eher etwas drunter vorstellen. Ich denk mal, dass die Ultraschall-Abstandssensoren hierfür gut geeignet sein dürften, es lässt sich auch recht gut damit arbeiten. Nur würde ich dann eventuell auch hinten noch einen installieren, damit der Rollstuhl auch dann nicht gegen das Auto stößt, wenn er sich umgedreht hat. Das Drehen sollte ja einfach sein, indem er seine Räder gegenläufig dreht, nur sollte er dann wahrscheinlich auch wisen, wann er sich genug gedreht hat. Ich weiß allerdings noch nicht, wie man das machen könnte, dass der Rollstuhl bemerkt, wann er mittig hinter dem Auto steht. An irgendwas müsste er sich da orientieren können. Was macht der Rollstuhl eigentlich, nachdem er da hingefahren ist? Der bleibt doch sicher nicht einfach hinter dem Auto stehen und macht dann nichts mehr, oder?

ga69jot
06.11.2013, 11:53
Der Rollstuhl wird dann mit der Treppensteigfunktion in den Kofferraum gelangen, aber darüber mache ich mir noch keine Gedanken. Ich suche eher nach mehreren Methoden diesen von der Tür zum Kofferraum fahren zu lassen. Ich hatte schon Ideen wie zum Beispiel eine Linie durch Licht vom Auto auf den Boden zu projezieren, damit der dann verfolgt werden kann. Außerdem dachte ich an Methoden mit passiven Markern, die man am Auto installiert...Je mehr Ideen desto besser...

ranke
06.11.2013, 18:37
Ich könnte mir vorstellen, dass man mit Odometrie und zusätzlicher Sensorik zur Abstandsmessung ganz gut hinkommt. Zur Abstandsmessung könnte neben dem Ultraschall auch Optik gehen, z.B ein Sharpsensor (http://www.rn-wissen.de/index.php/Sensorarten#Sharp_Infrarotsensoren).
Zum Beispiel so: Rollstuhl ist an der rechten Seite mit 2 Abstandssensoren ausgerüstet, die beide nach rechts messen (einer vorn, der andere hinten am Rollstuhl). Damit kann er den seitlichen Abstand und die Parallelität zum Fahrzeug messen. Zusätzlich zwei Radsensoren die den Drehwinkel der Räder messen.
Szenario:
1. Der Rollstuhl dreht auf der Stelle etwa 90° (über Radsensoren gemessen) damit er in Fahrtrichtung parallel zum Auto steht. Die genaue parallele Ausrichtung zum Auto geht über die Abstandssensoren
2. Der Rollstuhl fährt nach hinten, gesteuert über die Abstandssensoren und korrigiert gleichzeitig den Abstand zum Auto, falls nötig. Beim Erreichen des Fahrzeughecks haben die Abstandssensoren nacheinender einen Sprung in die Ferne. Ab dann wird über den Raddrehwinkel weiter nach hinten gefahren.
3. Drehung um 90°, gesteuert über Raddrehwinkel.
4. Fahren hinter das Auto. Strecke kann über Radsensor gefahren werden (Autos sind alle ziemlich gleich breit). Abstandssensoren eventuell noch für die Plausibilität und den genauen Abstand zum Fahrzeugheck verwenden.
5. Drehung um 90°, damit er in den Kofferraum klettern kann (Radsensoren), fertig.

ga69jot
07.11.2013, 11:54
Vielen Dank für die coole Antwort. Ist recht interessant.

Gibt es auch irgendwelche Möglichkeiten, dieses Szenario mit Kameras oder Laserscanner oder mit passiven markern oder ähnliches zu machen?

White_Fox
09.11.2013, 13:27
Gibt es auch irgendwelche Möglichkeiten, dieses Szenario mit Kameras oder Laserscanner oder mit passiven markern oder ähnliches zu machen?
Mit Sicherheit würde das irgendwie gehen.
Allerdings sind das Sachen, über die man Doktorarbeiten schreiben könnte. Mit anderen Worten: Kameras sind abartig aufwendig.
Laserscanner würde es bestimmt als fertige Module geben die man auslesen kann, wären aber auch sehr teuer. Und was anderes als Ultraschallsensoren liefern die im Prinzip auch nicht.

Mit passiven Markern würde mir auch nicht allzuviel einfallen außer Barcodes vllt. Die wären an dieser Stelle aber nur bedingt geeignet, und eine Entfernungsmessung oder Richtungsmessung kannst du damit nicht vornehmen.

Mxt
09.11.2013, 13:45
Hier mal ein Beispiel für ein Gerät, mit dem z.B. die Lage von Kartons in Verpackungsanlagen, oder das Profil von einlaufenden Baumstämmen im Sägewerk vermessen wird:
Leuze LPS 36 (http://leuze.de/de/deutschland/produkte/messende_sensoren/3d_sensoren_1/lichtschnittsensoren_1/lps_5/selector.php?supplier_aid=50111325&grp_id=A1-2-3-1&lang=deu#{%22tab%22:%220%22})
Vom Messprinzip her wird da eine Laserlinie auf die Oberfläche projeziert und diese mit einer Kamera gefilmt. Der Rechner im Sensor errechnet daraus ein Profil. Das Ding hat ein robustes outdoor geeignetes Metallgehäuse. Man muss dafür aber schon knapp 1500 Euro hinlegen.

Manf
09.11.2013, 18:28
Zur Abstandsmessung könnte neben dem Ultraschall auch Optik gehen, z.B ein Sharpsensor (http://www.rn-wissen.de/index.php/Sensorarten#Sharp_Infrarotsensoren).

Da steckt sehr viel drin und man erkennt die Leistungsfähigkeit der sogenannten Sharpsensoren vielleicht nicht gleich, wenn man nicht mit ihnen vertraut ist. Ich bin mir nicht ganz sicher, ob diese Sensoren das Auto wirklich unter allen Umständen erkennen (ich habe es noch nicht mit einem sauberen Auto versucht), aber es spricht viel dafür. Sie sind unter Abstandsmessern extrem preiswert und für diesen Abstandsbereich grundsätzlich sehr gut geeignet.

ga69jot
11.11.2013, 11:00
Vielen dank für die vielen antworten :) also geht das wohl mit ultraschallsensoren am leichtesten...

was meint ihr zu der Idee, Licht vom auto auf den Boden projezieren zu lassen und diesen dann folgen?

Geistesblitz
11.11.2013, 15:54
Ich fänd eigentlich gut, wenn das Ganze ohne Veränderungen am Auto auskommen würde, das macht es günstiger und man ist flexibler, da man nicht auf das angepasste Auto angewiesen ist. Wenn das Auto sowieso schon angepasst ist, ist das aber auch wieder etwas anderes, denn dann bestehen die Probleme ja ohnehin schon.

Das mit dem Licht auf den Boden pojezieren lassen kann ich mir irgendwie nicht so richtig vorstellen, wie soll sich der Rollstuhl denn daran orientieren können?

ga69jot
11.11.2013, 17:29
Ich habe paar Videos gesehen, wo ein Roboter einer weißen Linie folgt, die auf dem Boden geklebt ist oder wie auch immer. So nach dem Prinzip dachte ich mir :)

ga69jot
14.11.2013, 09:40
Ich hätte noch eine Frage, könnte man auch mit WLan sozusagen einen Roboter steuern? Ich meine Handyortung etc geht ja auch nach diesem Prinzip?

HeXPloreR
14.11.2013, 09:45
Hallo,

Du musst aber schon unterscheiden ob Du Dich im cm-Bereich (das wäre Deine Anforderung) oder im mehrer Meter- bis km-Bereich aufhältst.

ga69jot
14.11.2013, 10:05
sind ja bloß wenige meter, die ich hinterlegen will...

HeXPloreR
14.11.2013, 12:56
sind ja bloß wenige meter, die ich hinterlegen will...

Ja, eben...und das ist dann etwas übertrieben und sogar ungeeignet für Dich, weil es ist doch etwas ungenau in einem Raster von 5m (oder sogar noch größer) zu fahren. So lang ist vermutlich grade mal das Fahrzeug, die Auflösung der Sensorik sollte daher weit darunter liegen - nicht weit drüber. Vom Prinzip her ist Handyortung lange nicht so genau. Ebenso wie GPS hier wohl raus fällt.

Wenn der Rollstuhl also autonom nach hinten fahren soll, dann tendieren ich persönlich auch dazu, alle Anforderungen am Rollstuhl umzusetzen ohne weitere Änderungen am Fahrzeug zu machen. Nur wenn schon Änderungen am Fahrzeug bestehen würde ich versuchen die zu integrieren oder zu erweitern.

ga69jot
15.11.2013, 11:06
Wie weiß denn der Rollstuhl, dass er genau mittig am Heck angekommen ist? Könnte man das vielleicht mit einem IR-Laser im Kofferraum oder am Heck des Autos hinkriegen?

HeXPloreR
16.11.2013, 11:53
Muss er denn "ganz genau mittig" stehen? Reicht möglicherweise eine Toleranz von ca 10cm auch aus? Dann kann man das Stück vom Weg, so wie schon angesprochen wurde, "blind" nur nach Wegmesseung fahren. Kann mir vorstellen das es da maximal um 2Meter geht - eher weniger.

Weil Du immer wieder darauf zurück kommst: Möchtest Du unbedingt mit einem Lasersystem arbeiten und Modifikation am Fahrzeug? Es ist sovieles Möglich - die Frage ist eher ob es für Dich durchführbar und finanziell Möglich ist. Da wird Deine Motivation nicht beurteilen könne, stehen wir nun da und wissen nix...
Dann solltest Du Deine Fragestellung überdenken, denn dann fragt man nicht was es so gibt, sondern man sagt was man womit machen möchte ;)

...achso, ja und natürlich ist es möglich eine Fernsteuerung dafür zu bauen...aber das war ja sogarnicht Deine Frage:)

Viele Grüße

ga69jot
18.11.2013, 13:13
Eine Modifikation wird es sehr wahrscheinlich schon geben, da der Rollstuhl ja auch wiederum automatisch in den Kofferraum gelangen wird, über eine Rampe was sich ausfährt oder wie auch immer, darüber hab ich noch keine gedanken gemacht :)

Ich bin eigentlich nur auf der Suche nach ein Paar Ideen wie man das ganze machen kann...Modifikation am Auto ist wie gesagt möglich :)

Geistesblitz
18.11.2013, 18:09
Wird dann wohl auch ein größeres Auto sein, wenn der Rollstuhl da aufrecht reinpasst. Hab auch schon behindertengerechte Kleinbusse gesehen, die wie eine Art Rollstuhl-Aufzug im Heck hatten, da ließen sich die Leute komplett mit Rollstuhl hoch und runter heben. Vorteil wäre ja, dass man nicht so viel Platz braucht wie mit einer Rampe (ich denke da an enge Parkplätze). Müsste man nur gucken, wie man das am günstigsten machen könnte, zB. könnte ja irgendwas den Rollstuhl von hinten greifen und dann ins Auto heben, das würde das System kompakter gestalten, als wenn man eine Plattform hat, auf die der Rollstuhl rauffährt. Soll sich der Rollstuhl auch selbst ein wenig zusammenklappen können, damit er besser ins Auto passt?

ga69jot
28.01.2014, 03:47
Hallo Community,

Vorerst möchte ich mich entschuldigen dass ich nach so langer zeit melde.

Der Rollstuhl an sich wird über die Treppensteigfunktion in den Kofferraum gelangen.

Ich hätte eine frage zu der Methode mit dem ultraschallsensor.

Und zwar, es wurde ja gesagt, dass das am besten mit dem Sensor funktioniert...ich möchte dies am Rollstuhlmodell versuchen.

Ich habe nun eine ultraschallsensor und einen arduino und zwei servomotoren.

Um das ganze Szenario zu programmieren, brauche ich da einen pid Regler oder könnte ich dies ohne den Regler mit if-Befehlen machen?

White_Fox
30.01.2014, 21:30
Ich sehe nicht, wo du da soviel Mathematik verbauen solltest.

Dein größeres Problem wird der eine Sensor sein, da der Rollstuhl seine Entfernung zum Auto nicht vernünftig bestimmen kann.

ga69jot
30.01.2014, 22:54
Also, ich habe das alles durchdacht, natürlich brauche ich 2 Sensoren damit das alles regelrecht funktioniert.
Den Regler brauche ich für die Abstandsregelung dachte ich mir.

Also kann ich das alles ohne Regler nur mit if und while schleifen lösen?

Geistesblitz
30.01.2014, 23:56
Was meinst du denn damit? Bestimmt kann man das irgendwie lösen, allerdings ist die Frage dann, wie gut das funktioniert. Läuft dann letztendlich auf einen Schaltregler hinaus, der je nachdem, was die Sensoren ausgeben, den Rollstuhl anders fahren lässt, was wahrscheinlich ein wenig ruckeln könnte, allerdings sollte es nicht instabil werden, sonst hängt die Kiste recht schnell im Kotflügel. Ich wär eigentlich eher für einen quasikontinuierlichen Regler.

ga69jot
31.01.2014, 00:04
was meinst du denn mit einem quasistationären regler?

Geistesblitz
31.01.2014, 00:24
Wo hab ich das denn bitte geschrieben?
Ich schrieb quasikontinuierlicher Regler, also ein Regler, der mit kontinuierlichen Werten arbeitet, nicht mit diskreten. Bei einer If-Verzweigung wird das Programm ja gucken, ob irgendwelche Werte über- oder unterschritten werden, wobei ein kontinuierlicher Regler direkt mit den Zahlenwerten vom Sensor arbeitet und daraus die neuen Stellgrößen für die Antriebe berechnet. Ich denk mal, du wirst nicht drum herum kommen, dir wenigstens ein paar Grundlagen zur Regelungstechnik anzulesen. Wenn du bei deinen if- und while-Schleifen bleiben willst, empfehle ich die Stichwörter Zweipunkt. bzw. Dreipunktregler.

ga69jot
31.01.2014, 00:40
Sorry habe mich verschrieben :)

Die Seite für regelungstechnik habe ich schon gelesen :)
Ich weiß nur nicht, wie ich das mit dem arduino programmieren soll.
Vorallem habe ich ja zwei Sensoren, die messen und geben mir eine Entfernung in cm an. Dann gebe ich noch einen sollwert für die Entfernung an, und die Stellgrösse wird verändert (die Signale für servo-Motoren).

Ich komm aber nicht dahinter, wie die Stellgrössen je nach Entfernung gesetzt werden?! Wie programmiere ich das?

Geistesblitz
31.01.2014, 13:27
Wie sind denn die Sensoren angeordnet? Man könnte mittels der Differenz der Werte die Schrägstellung des Rollstuhls bestimmen und mitels Mittelwert ca. den Abstand. Man kann dann eine mittlere Geschwindigkeit für die Motoren vorgeben und je nachdem, wie groß jetzt die Werte für Schrägstellung und Abstand sind, wird bei einem Motor die Geschwindigkeit erhöht und bei dem anderen reduziert, damit der Rollstuhl beim fahren eine Kurve fährt. Wie sehr die Geschwindigkeitsänderung der Motoren aussieht kann man dann von den gemessenen Werten abhängig machen. Nehmen wir jetzt mal an, der Rollstuhl fährt an der linken Seite des Autos nach hinten, das Auto wäre also auf der linken Seite des Roboters. Nun lässt sich ja sagen, je mehr er nach links fährt (also Richtung Auto), soll sich das linke Rad schneller drehen und das rechte Rad langsamer. Für den Fall, dass er zu sehr nach rechts fährt, wärs dann umgekehrt. Mit dem Abstand wärs dann ähnlich, man legt einen Sollabstand fest und je mehr er davon in eine Richtung abweicht, desto mehr lenkt er die andere Richtung.
Um es mal in Form einer Formel darzustellen:
Motor_links = v_soll + a*Schrägungswinkel - b*(Istabstand-Sollabstand)
Motor_rechts = v_soll - a*Schrägungswinkel + b*(Istabstand-Sollabstand)
Wobei du jetzt nun noch herausfinden musst, wie du auf den Schrägungswinkel und den Istabstand kommst, sowie welche Werte am günstigsten für a und b sind. Das musst du wohl selber herausfinden, da braucht man dann die Daten vom Roboter, zB. wie die Sensoren angebracht sind, was sie für Werte liefern, Achsabstand der Räder usw. Am besten wäre es natürlich, wenn man das ganze schonmal in einem Programm simulieren könnte, bevor man anfängt, einen Prototypen nach dem anderen gegen ein Auto fahren zu lassen. Wenn man ganz genau gehen möchte, müsste man nämlich auch noch die Dynamik mit berücksichtigen, aber ich befürchte, dass du damit gerade überfordert wärst.

Nun möchte ich aber auch, dass du diese Gedanken dazu selber zuende führst. Ich hab eigentlich den Grundsatz, in Foren wie hier nur zu helfen, aber niemandem die eigentliche Arbeit abzunehmen.

ga69jot
31.01.2014, 15:06
Vielen Dank für die Antwort.

Erstmal, ich habe schon viele Gedanken darüber gemacht. Und genau das, was du beschrieben hast, habe ich schon versucht in ein Code zu schreiben.
Ich habe einen kleinen Rollstuhl, im maßstab 1:5 zum Original. Die Sensoren kommen auf die linke Seite vom Rollstuhl, einmal ganz vorne und einmal ganz hinten.
Für meinen Arduino habe ich schon 2 Sketches geschrieben. Einmal um den Rollstuhl parallel zu halten und einmal um Kurven fahren zu können.

Ich werde die Tage mal die beiden Sketches ausprobieren, inwieweit Sinn und Zweck erfüllt werden.
Bin mir leider nicht sicher ob meine Sketches funktionieren werden, auf Papier sieht alles gut aus :)

ga69jot
01.02.2014, 19:42
Hallo Community,

ich habe vorhin beide meiner Sketche am Rollstuhlmodell versucht.

Beim ersten Sketch versucht mein Rollstuhl sich parallel zur Wand zu halten, wenn parallel dann stoppt er.
Beim zweiten Sketch fährt er Kurven je nach Abstand.

Jetzt habe ich beide Sketches vereinigt, aber ich hab da ein Programmierproblem. Er versucht da auch nur parallel zu halten, Kurven fährt er nicht...

Geistesblitz
02.02.2014, 02:36
Wärst du dann auch so nett, uns den Code zu zeigen? Oder zumindest die Formeln, mit denen du die Stellgrößen berechnest, würden mich interessieren, ich bin leider nicht gut im Hellsehen ;)

ga69jot
03.02.2014, 00:14
Mit Sicherheit. Der erste Code versucht das Ding parallel zu halten.
#include <Servo.h>

Servo servoRechts;
Servo servoLinks;
long Toleranzwert = 1;

const int TRIG_PIN1 = 12;
const int ECHO_PIN1 = 13;
const int ECHO_PIN2 = 8;
const int TRIG_PIN2 = 9;

void setup() {
// initialize serial communication:
Serial.begin(9600);

pinMode(TRIG_PIN1,OUTPUT);
pinMode(ECHO_PIN1,INPUT);
pinMode(TRIG_PIN2, OUTPUT);
pinMode(ECHO_PIN2, INPUT);
servoRechts.attach(7);
servoLinks.attach(6);

}
void loop()
{
long duration1, distanceCm1;
long duration2, distanceCm2;
long Differenz;

// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
digitalWrite(TRIG_PIN1, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, HIGH);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, LOW);
duration1 = pulseIn(ECHO_PIN1,HIGH);

digitalWrite(TRIG_PIN2, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN2, HIGH);
delayMicroseconds(2);
digitalWrite(TRIG_PIN2, LOW);
duration2 = pulseIn(ECHO_PIN2,HIGH);

// convert the time into a distance
distanceCm1 = duration1 / 29.1 / 2 ;

// convert the time into a distance
distanceCm2 = duration2 / 29.1 / 2 ;


if (distanceCm1 <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distanceCm1);
Serial.print("cm");
Serial.println();
}

if (distanceCm2 <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distanceCm2);
Serial.print("cm");
Serial.println();
}


delay(500);

Differenz = abs(distanceCm2 - distanceCm1);
if(Differenz > Toleranzwert){
if(distanceCm2 > distanceCm1){
servoLinks.write(92);
servoRechts.write(90);
}
else{
servoRechts.write(89);
servoLinks.write(91);
}
Differenz = abs(distanceCm2 - distanceCm1);
}
else if (Differenz <= Toleranzwert){
servoRechts.write(90);
servoLinks.write(91);
Differenz = abs(distanceCm2 - distanceCm1);

}
}



Der zweite Code ist fürs Kurven fahren.

#include <Servo.h>

Servo servoRechts;
Servo servoLinks;
float Toleranzwert = 1;

const int TRIG_PIN1 = 12;
const int ECHO_PIN1 = 13;
const int ECHO_PIN2 = 8;
const int TRIG_PIN2 = 9;

void setup() {
// initialize serial communication:
Serial.begin(9600);

pinMode(TRIG_PIN1,OUTPUT);
pinMode(ECHO_PIN1,INPUT);
pinMode(TRIG_PIN2, OUTPUT);
pinMode(ECHO_PIN2, INPUT);
servoRechts.attach(7);
servoLinks.attach(6);

}
void loop()
{
long duration1, distanceCm1;
long duration2, distanceCm2;
long Differenz;

// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
digitalWrite(TRIG_PIN1, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, HIGH);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, LOW);
duration1 = pulseIn(ECHO_PIN1,HIGH);

digitalWrite(TRIG_PIN2, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN2, HIGH);
delayMicroseconds(2);
digitalWrite(TRIG_PIN2, LOW);
duration2 = pulseIn(ECHO_PIN2,HIGH);

// convert the time into a distance
distanceCm1 = duration1 / 29.1 / 2 ;

// convert the time into a distance
distanceCm2 = duration2 / 29.1 / 2 ;


if (distanceCm1 <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distanceCm1);
Serial.print("cm");
Serial.println();
}

if (distanceCm2 <= 0){
Serial.println("Out of range");
}
else {
Serial.print(distanceCm2);
Serial.print("cm");
Serial.println();
}


delay(100);

if( ( distanceCm1 + distanceCm2 ) / 2 > 52) {
servoRechts.write(87);
servoLinks.write(100);
}
else if( ( distanceCm1 + distanceCm2 ) / 2 < 48) {
servoRechts.write(80);
servoLinks.write(94);
}
else {
servoRechts.write(80);
servoLinks.write(100);
}
}


Mir fehlt nur noch die Kombination. Ich hatte nicht viel Zeit und hab das parallel fahren einfach mal in die if-Schleifen kopiert und geguggt, was passiert...
Bei servoLinks.write(91) stoppt das linke Rad und bei servoRechts.write(90) stoppt das rechte Rad. Ein wert höher als 91 beim Linken dreht diesen nach vorne und ein Wert kleiner 90 dreht das rechte Rad vorwärts.

Geistesblitz
03.02.2014, 15:02
Das ist eine Info, die schon wesentlich früher gekommen sein müsste: Die Motoren können nur Vorwärts oder Stoppen, nix dazwischen und auch nicht rückwärts? Dann muss man es wirklich so angehen, wie du es begonnen hast. Mein Vorschlag würde in dem Fall folgendermaßen aussehen:

Wenn der Roboter zu nah am Auto steht oder zu weit nach links zeigt -> Rechtsdrehung
Wenn der Roboter zu weit vom Auto weg steht oder zu weit nach rechts zeigt -> Linksdrehung
Wenn der Roboter im richtigen Abstand zum Auto ist und auch parallel steht -> Geradeausfahrt

Dabei würde ich aber auch einen gewissen Toleranzbereich einplanen, zB. wenn die Differenz zwischen den Sensorwerten innerhalb gewisser Grenzen liegt, zählt es so, als wenn der Roboter parallel stünde. Ähnlich dann auch mit dem Mittelwert für die Abstandserkennung. Das macht das Ganze ein bisschen robuster, sonst würde der Bot die ganze Zeit nur hin und herzucken und dabei langsamer vorrankommen.

ga69jot
03.02.2014, 15:15
Doch doch, die Motoren können sich in beide Richtungen drehen :)
Also wenn man am Linken Motor einen Wert kleiner als 91 eingibt dann dreht er sich rückwärts und beim rechten Motor größer 90 dann rückwärts...

Der Sketch zum parallel halten funktioniert, er bleibt stehen wenn er parallel ist. Beim Kurven fahren geht es auch, also wenn er zu nah an der Wand ist fährt er nach rechts und wenn zu weit dann nach links...

Jetzt muss ich die beiden kombinieren, aber ich weiß nicht so recht wie ich das machen soll...

Toleranzwert für parallel stehen habe ich mit 1 bzw. 2cm versucht und für den Mittelwert habe ich ja einen Wert zwischen 48 und 52 cm ausgesucht...

Wie gesagt, einzeln funktionieren die beiden Sketches ja so wie ich es haben möchte aber wie kombiniere ich die nun?

EDIT:

Der Motor kann auch beschleunigt werden, zum Beispiel bei 90 stoppt er, zwischen 90 und 100 wird er beschleunigt und ab 100 ist auf v_max. Und in die andere Richtung dann 90-80 beschleunigen und kleiner 80 v_max.

Geistesblitz
03.02.2014, 18:14
Ok, dann sag doch mal, was die Motoren genau machen, wenn man ihnen verschiedene Werte füttert. Gehe ich richtig in der Annahme, dass 0 bzw. 180 jeweils die Maximalgeschwindigkeiten sind?

Hast du dir meinen Vorschlag angesehen? Das führt ja quasi beide Probleme zusammen, kannst ja mal versuchen umzusetzen. Die Schlüsselstelle ist dabei die Oder-Verknüpfung in den If-Verzweigungen, die eben beide Fälle berücksichtigen.

ga69jot
03.02.2014, 18:49
Wenn man dem Motor 0-89 eingibt, dann dreht er sich gegen den uhrzeigersinn bei 90 stoppt er und über 90 bis 180 dreht er im Uhrzeigersinn.
Die Motoren sind bei mir entgegengesetzt angebracht, deswegen muss ich einen im uhrzeigersinn und einen gegen den uhrzeigersinn drehen, damit beide räder vorwärts drehen. Und wie vorhin gesagt ist ab 100 bzw. 80 die maximal Geschwindigkeiten erreicht.

Ich habe mir deinen Vorschlag schon angesehen. Mein Problem ist, dass wenn er zu nah ist und nach rechts dreht um sich zu entfernen, verliert er die parallelität zur wand und dreht sich irgendwann im kreis.

Geistesblitz
03.02.2014, 19:30
Dann kann man ja immernoch sagen, dass wenn zB. der Roboter links von der Solllinie steht und sich über einen bestimmten Winkel nach rechts gelenkt hat, dass er dann einfach geradeaus fahren soll. Analog für die den Fall auf der anderen Seite. So dürfte er keine unsinnigen Kreise fahren. Sobald dann der Abstand über die gegenüberliegenden Toleranzgrenzen hinausgeht, lenkt er dann wieder gegen und ist im Toleranzbereich. Was du dabei vielleicht aber noch beachten solltest, dass die Sensorwerte konsistent bleiben. Wenn der Roboter zB. ein stück gedreht ist, misst er eigentlich nicht wirklich den Abstand zum Auto, sondern unter einem Winkel, wodurch der gemessene Wert größer wird. Das könnte ab einem bestimmten Winkel vielleicht zum Problem werden.

ga69jot
03.02.2014, 19:43
Das habe ich mir auch gedacht, wie kann ich das in meinem Code umsetzen?