PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Ideefrei" Hindernisserkennung



Spongebob85
31.10.2007, 21:33
Moin!
Ich bin jetzt endlich soweit. Ich habe meinen GP2D12 angeschlossen und mein Programm im Moment so, das mein Roboter Anhält, wenn er ein Hinderniss erkennt.
Das Problem ist das ich einen Servo habe, auf dem der GP2D12 montiert ist. Der Dreht sich immer hin und her, so das der die Umgebung vorm Roboter abtastet. Jetzt fhlt mir aber gänzlich die Idee, wie ich das mache, das mein Roboter nach links ausweicht, wenn rechts ein Hinderniss ist und andersrum.
Dadurch das der Servo immer hin und her dreht, hat der Roboter ja relativ selten einen aktuellen Wert für jeden Punkt. Hab mir schon gedacht, vielleicht immer in ein Array die Werte zu schreiben, so das der schon mal die Werte "nebeneinander" auslesen und verarbeiten kann. Hab sowas mit C aber noch nie gemacht. Was für Tipps könnt ihr mir geben? Wie würdet ihr das angehen, oder hat vielleicht sogar jemand schon mal so ein Problem gehabt?

MfG Jan

CsT
31.10.2007, 22:02
Genau so etwas habe ich schon programmiert. Ich habe einen GP2D12 auf einem Schrittmotor montiert.
Je nach Schrittmotorstellung schreibe ich dann den Entfernungswert in ein Array. Man muss es natürlich so organisieren, dass man immer weiß, in welcher Stelle des Arrays welcher Abstandswert (Winkel) abgespeichert wurde.
Nach einer Richtungsänderung vom Schrittmotor (+-36° bei mir) werte ich dann das gesamte Array aus, d.h. ich schaue wo die geringste und wo die höchste Entfernung gemessen wurde. Dann noch ein paar Berechnungen, ob ich ausweichen muss oder nicht .. und wenn ich ausweichen muss, dann zum Wert mit dem größten Abstand.

Wenn du genauere fragen zur Realisierung hast, kannst du gerne fragen.

Viele Grüße
CsT

Spongebob85
02.11.2007, 00:42
Moin!
Ich hab jetzt endlich mal angefangen, die Idee mit dem Array umzusetzen.
Die Funktion mit dem Array sieht jetzt so aus:


int GP2D12(void)
{
uint8_t i, memoposi=0;
uint16_t memo=65535; //zum merken des kleinsten Wertes; 65535=maxwert bei 16-Bit
uint16_t IR_Wert[51]; //Array für Messwerte 0-50

if (changechannel) //Wenn changechannel 1 ist, kann der ADC für meinen GP2D12 ausgelesen werden
{
IR_Wert[posi]=ADC;
}
for (i=0; i<=50; i++)
{
if (IR_Wert[i]<memo)
{
memo = IR_Wert[i];
memoposi = i; //Zum merken der Servoposition, bei der der kleinste wert liegt
}
}
return (memoposi);
}

Jetzt hab ich genauere fragen. Wie gebe ich jetzt am besten dem Roboter (ausgeschlachteter Fernsteuerpanzer) mit welche ketten er wie bewegen soll, damit er zu dem wert mit dem größten abstand fährt?

MfG Jan

CsT
02.11.2007, 14:55
Odometrie heißt das Zauberwort. Hast du eine Funktion, die genaue Kurven (nach Angabe vom Winkel) abfahren kann? Sind Radencoder oder sonstiges am Roboter verbaut? Mit was für Motoren steuerst du deinen Robo?

Viele Grüße CsT

Spongebob85
02.11.2007, 16:26
Jetzt hast mich ja auf dem richtigen Bein erwischt 8-[
Ich hab von dem ganzen noch nie was gehört, so eine Funktion habe ich nicht und ich steuere meinen Robo mit den alten dingern die da von anfang an drin waren. Normale billige Getriebemotoren. Radencoder sind bestimmt wieder extrem teuer, oder? Ich werde mich mal erkundigen...

MfG Jan

recycle
02.11.2007, 21:04
Jetzt hast mich ja auf dem richtigen Bein erwischt
Ich hab von dem ganzen noch nie was gehört, so eine Funktion habe ich nicht und ich steuere meinen Robo mit den alten dingern die da von anfang an drin waren.


Du könntest auch erst mal mit was einfachem anfangen, z.B.:
- Der Sensor dreht sich und scannt ob ihm ein Hindernis im Weg ist
- wenn eins da ist, überprüft er in welcher Richtung es ist und dreht solange in die entgegengesetze Richtung ab, bis es nicht mehr im Weg ist

Dafür brauchst du erst mal keine Radencoder, kannst also erst mal mit dem was du hast herumexperimentieren.

Letzendlich fährt der Roboter dabei zwar bestenfalls nur planlos durch die Gegend, ich glaube aber für den Anfang gibt es auch dabei schon genug Tücken an denen man sich austoben und rumoptimieren kann.

Spongebob85
03.11.2007, 15:27
Das mit dem planlos rumdrehen werde ich wohl denke ich auch ERSTMAL so machen.

Hab jetzt mal ein bisschen rumgekuckt. Ich dachte "Radencoder" kommt von Raden sowie mehrzahl von radius. Aber das ist ein Radencoder, sowie Rad und encodieren und das ist ja nicht anderes als ein einfacher Incrementalgeber... Das problem was ich dann nur noch hab ist, das ich nicht weiß wo ich sowas anbringen soll. Die Motoren sind auf so knappen raum das da gar nichts mehr passt und von aussen könnte man die Scheibe mit den schwarzen streifen höchstens irgendwie aufkleben oder so. Mal sehen, darum werde ich mich kümmern, wenn ich das erstmal ohne gelöst hab. Brauch dann ja auch wieder 2 Eingänge die einen externen Takt einlesen können, damit ich mein Prog dann wieder dafür umschreiben kann.

Danke euch auf jeden fall erstmal für die guten Tipps!

MfG Jan