<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cb2sn43</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cb2sn43"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Cb2sn43"/>
		<updated>2026-04-11T14:57:21Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18543</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18543"/>
				<updated>2011-08-20T12:13:08Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
&lt;br /&gt;
- Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse.&lt;br /&gt;
 &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen :-), dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
&lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
&lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben :-)     &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Besonderheiten:'''&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die &amp;quot;kbhit()&amp;quot; Funktion gut gefällt. Compiler Download siehe  http://edn.embarcadero.com/article/20633 &lt;br /&gt;
&lt;br /&gt;
- Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und endet, wenn das Hindernis umfahren wurde. Von da an wieder mit &amp;quot;ENTER – Taste&amp;quot; weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''http://www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h    (Default Werte und Gewichts-Matrix)&lt;br /&gt;
&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 12:27, 20. Aug 2011 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Source-Codes:&lt;br /&gt;
&lt;br /&gt;
http://www.ps-robotics.de/roboter_1000px/astar.zip&lt;br /&gt;
&lt;br /&gt;
http://www.ps-robotics.de/roboter_1000px/bug2.zip&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18542</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18542"/>
				<updated>2011-08-20T10:56:14Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
&lt;br /&gt;
- Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse.&lt;br /&gt;
 &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen :-), dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
&lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
&lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben :-)     &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Besonderheiten:'''&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die &amp;quot;kbhit()&amp;quot; Funktion gut gefällt. Compiler Download siehe  http://edn.embarcadero.com/article/20633 &lt;br /&gt;
&lt;br /&gt;
- Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &amp;quot;ENTER – Taste&amp;quot; weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''http://www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h    (Default Werte und Gewichts-Matrix)&lt;br /&gt;
&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 12:27, 20. Aug 2011 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Source-Codes:&lt;br /&gt;
&lt;br /&gt;
http://www.ps-robotics.de/roboter_1000px/astar.zip&lt;br /&gt;
&lt;br /&gt;
http://www.ps-robotics.de/roboter_1000px/bug2.zip&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18541</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18541"/>
				<updated>2011-08-20T10:54:41Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
&lt;br /&gt;
- Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse.&lt;br /&gt;
 &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen :-), dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
&lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
&lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben :-)     &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Besonderheiten:'''&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die &amp;quot;kbhit()&amp;quot; Funktion gut gefällt. Compiler Download siehe  http://edn.embarcadero.com/article/20633 &lt;br /&gt;
&lt;br /&gt;
- Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &amp;quot;ENTER – Taste&amp;quot; weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''http://www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h    (Default Werte und Gewichts-Matrix)&lt;br /&gt;
&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 12:27, 20. Aug 2011 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;br /&gt;
&lt;br /&gt;
Source-Codes:&lt;br /&gt;
http://www.ps-robotics.de/roboter_1000px/astar.zip&lt;br /&gt;
http://www.ps-robotics.de/roboter_1000px/bug2.zip&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18540</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18540"/>
				<updated>2011-08-20T10:41:30Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
&lt;br /&gt;
- Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse.&lt;br /&gt;
 &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen :-), dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
&lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
&lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben :-)     &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Besonderheiten:'''&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die &amp;quot;kbhit()&amp;quot; Funktion gut gefällt. Compiler Download siehe  http://edn.embarcadero.com/article/20633 &lt;br /&gt;
&lt;br /&gt;
- Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &amp;quot;ENTER – Taste&amp;quot; weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''http://www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h    (Default Werte und Gewichts-Matrix)&lt;br /&gt;
&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 12:27, 20. Aug 2011 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;br /&gt;
&lt;br /&gt;
Source-Codes:&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18539</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18539"/>
				<updated>2011-08-20T10:28:05Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
&lt;br /&gt;
- Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse.&lt;br /&gt;
 &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen :-), dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
&lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
&lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben :-)     &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Besonderheiten:'''&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die &amp;quot;kbhit()&amp;quot; Funktion gut gefällt. Compiler Download siehe  http://edn.embarcadero.com/article/20633 &lt;br /&gt;
&lt;br /&gt;
- Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &amp;quot;ENTER – Taste&amp;quot; weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''http://www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h    (Default Werte und Gewichts-Matrix)&lt;br /&gt;
&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 12:27, 20. Aug 2011 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18538</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18538"/>
				<updated>2011-08-20T10:27:43Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
&lt;br /&gt;
- Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse.&lt;br /&gt;
 &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen :-), dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
&lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
&lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben :-)     &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Besonderheiten:'''&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die &amp;quot;kbhit()&amp;quot; Funktion gut gefällt. Compiler Download siehe  http://edn.embarcadero.com/article/20633 &lt;br /&gt;
&lt;br /&gt;
- Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &amp;quot;ENTER – Taste&amp;quot; weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''http://www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h    (Default Werte und Gewichts-Matrix)&lt;br /&gt;
&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 12:27, 20. Aug 2011 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18537</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18537"/>
				<updated>2011-08-20T10:24:44Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
&lt;br /&gt;
- Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse.&lt;br /&gt;
 &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen :-), dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
&lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
&lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben :-)     &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ein paar Besonderheiten:'''&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die &amp;quot;kbhit()&amp;quot; Funktion gut gefällt. Compiler Download siehe  http://edn.embarcadero.com/article/20633 &lt;br /&gt;
- Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &amp;quot;ENTER – Taste&amp;quot; weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''http://www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h    (Default Werte und Gewichts-Matrix)&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18536</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18536"/>
				<updated>2011-08-20T10:19:33Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
&lt;br /&gt;
- Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
&lt;br /&gt;
- Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse.&lt;br /&gt;
 &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen , dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben       &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein paar Besonderheiten:&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die kbhit () Funktion gut gefällt.    http://edn.embarcadero.com/article/20633  Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &lt;br /&gt;
ENTER – Taste weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h   (Default Werte und Gewichts-Matrix)&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18535</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18535"/>
				<updated>2011-08-20T10:18:42Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
- Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
- Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
- Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse.&lt;br /&gt;
 &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen , dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben       &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein paar Besonderheiten:&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die kbhit () Funktion gut gefällt.    http://edn.embarcadero.com/article/20633  Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &lt;br /&gt;
ENTER – Taste weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h   (Default Werte und Gewichts-Matrix)&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18534</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18534"/>
				<updated>2011-08-20T10:16:06Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
-	Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
-	Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
-	Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen , dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben       &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein paar Besonderheiten:&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die kbhit () Funktion gut gefällt.    http://edn.embarcadero.com/article/20633  Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &lt;br /&gt;
ENTER – Taste weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h   (Default Werte und Gewichts-Matrix)&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18533</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18533"/>
				<updated>2011-08-20T10:06:34Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: Odometrie DBUG2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Blidschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
-	Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
-	Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
-	Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen , dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben       &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein paar Besonderheiten:&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die kbhit () Funktion gut gefällt.    http://edn.embarcadero.com/article/20633  Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &lt;br /&gt;
ENTER – Taste weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h   (Default Werte und Gewichts-Matrix)&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:    peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
&lt;br /&gt;
Peter Schneider&lt;br /&gt;
&lt;br /&gt;
http://www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18532</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18532"/>
				<updated>2011-08-20T10:04:06Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Blidschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
-	Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
-	Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
-	Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT          1&lt;br /&gt;
   #define        RIGHT         2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Nun der Abfragetrick'''&lt;br /&gt;
&lt;br /&gt;
Sensor-Abfrage:&lt;br /&gt;
&lt;br /&gt;
   Links:      0&lt;br /&gt;
   Mitte:      1&lt;br /&gt;
   Rechts:     0&lt;br /&gt;
   Move_dir:   3&lt;br /&gt;
   Last_move:  3      entspricht Integerwert   1033&lt;br /&gt;
&lt;br /&gt;
   // Datenbank Query vorbereiten Einzelabfragen in eine fünfstellige Zahl &lt;br /&gt;
      umwandeln &lt;br /&gt;
   db_query = sensor_links * 10000 + sensor_mitte * 1000 + sensor_rechts &lt;br /&gt;
   * 100 + move_dir * 10 + last_dir;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Gleiches vorgehen mit den Werten im ARRAY:'''&lt;br /&gt;
&lt;br /&gt;
Der Vergleich erfolgt dann in dem eigentlichen DBUG Algorithmus, wo das ARRAY komplett nach dem „db_query“ durchsucht wird. Zu diesem Zweck werden die ersten fünf Stellen aus dem ARRAY ausgelesen und mit selber Logik in einen Interger-Wert umgewandet.   &lt;br /&gt;
&lt;br /&gt;
    temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * 100  &lt;br /&gt;
    + gewicht[i][3] * 10 + gewicht[i][4];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Somit wird aus (siehe erste Zeile im ARRAY)  0,1,0,3,3   der Integerwert 1033&lt;br /&gt;
Diesen kann man klasse mit den Sensorwert „db_query“ vergleichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Im Programm sieht das dann wie folgt aus:'''&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; 25; i++)   // gewichtsmatrix auswerten&lt;br /&gt;
   {     &lt;br /&gt;
       temp_db = gewicht[i][0] * 10000 + gewicht[i][1] * 1000 + gewicht[i][2] * &lt;br /&gt;
       100  + gewicht[i][3] * 10 + gewicht[i][4];       &lt;br /&gt;
           &lt;br /&gt;
        if ( db_query == temp_db )&lt;br /&gt;
        {    &lt;br /&gt;
            X  = X + (gewicht[i][5] - 5);  // Die 5 wieder abziehen so das X / Y&lt;br /&gt;
    …&lt;br /&gt;
&lt;br /&gt;
Dem aufmerksamen Leser ist schon vorher aufgefallen , dass die X -und Y-Werte nicht negativ sind. Das ist Absicht, da bei der späteren Implementierung auf dem Microcontroller auf Integer verzichtet werden soll und die Speicher sparende Variable uint8_t  genutzt werden soll. Die Variable uint8_t  hat den Wertebereich  0 – 255,  eine Intergervariable (int) hat im Gegenzug einen Wertebereich von  -32768 bis 32767 und benötigt somit mehr Speicher. &lt;br /&gt;
Bei einem PC ist das relativ egal, aber nutzt man einen ATtiny oder ATmega8 kommt man schon mal schnell an das Ende der Kapazität. &lt;br /&gt;
Unschöne Sache, dabei kann man sich toll den Bootloader auf dem Microcontroller überschreiben       &lt;br /&gt;
Also, soll ein Wert der eigentlich zwischen „-1“ und „1“ liegt für einen Schritt vorwärts oder rückwärts nicht negativ werden, dann addiert man halt  +5 dazu und zieht sie später wieder ab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ein paar Besonderheiten:&lt;br /&gt;
&lt;br /&gt;
- Ich habe als Compiler mal den Borland C++ Compiler genutzt, da mir z.B. die kbhit () Funktion gut gefällt.    http://edn.embarcadero.com/article/20633  Normaler Weise nehme ich den gcc auf meiner Linuxkiste &lt;br /&gt;
&lt;br /&gt;
- Das Programm bitte in einer DOS-Box ausführen, von ausreichender Größe !!!&lt;br /&gt;
Breite 120, Höhe 50&lt;br /&gt;
&lt;br /&gt;
- Das Programm aufrufen und die ENTER – Taste solange drücken bis das Hindernis erreicht ist, ab dann über  nimmt der BUG2 Algorithmus die Steuerung und Endet, wenn das Hindernis umgangen wurde. Von da an wieder mit &lt;br /&gt;
ENTER – Taste weiter, bis Ziel erreicht&lt;br /&gt;
&lt;br /&gt;
- Zum Source-Code gehören die folgenden Dateien und können auch unter '''www.ps-robotics.de'''  im Download Bereich heruntergeladen werden. Dort finden sich auch Source-Codes zum A-Star Algorithmus:&lt;br /&gt;
&lt;br /&gt;
o bug2Defaults.h   (Default Werte und Gewichts-Matrix)&lt;br /&gt;
o bug2Libaray.h     (File mit dem BUG2 Algorithmus)&lt;br /&gt;
o odometrie.cpp     (Testprogramm Source-Code)&lt;br /&gt;
o help_routines.h   (Funktionen für die Darstellung auf dem Monitor)&lt;br /&gt;
o Odometrie.exe     (bereits compilierte Version)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Die nächsten Schritte:'''&lt;br /&gt;
&lt;br /&gt;
- Implementierung des Algorithmus auf meinen Roboter  (on going)&lt;br /&gt;
&lt;br /&gt;
- Installation von IR-Baken für die Navigation in geschlossenen Räumen &lt;br /&gt;
&lt;br /&gt;
- Schreiben von Teil II  Navigation &lt;br /&gt;
&lt;br /&gt;
- Bisher wurden die Antworten auf die Sensorwerte in der Gewichte-Matrix von Hand eingetragen. Wie wäre das, wenn das Programm diese Werte selbst ermittelt bzw. im Lerning Mode die Werte gezeigt bekommt. Wir sind dann schell bei „Neuronalen Netzen“ angekommen. Das ist aber noch Zukunftsmusik :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die von mir geschriebenen Source-Codes deklariere ich hiermit als Freeware und kann von jedem genutzt und nach belieben verändert werden. Über Feedback und Verbesserungs-vorschläge würde ich mich freuen.  &lt;br /&gt;
Es ist bestimmt nicht die eleganteste Version von Software, wie man diesen Algorithmus programmieren kann, aber bitte bedenken, ich mach das nur als Hobby und wie gesagt, der jüngste bin ich auch nicht mehr :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bei Fragen oder Anregungen:  peter.schneider@ps-robotics.de&lt;br /&gt;
&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
Peter Schneider&lt;br /&gt;
www.ps-robotics.de &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nützliche Links:&lt;br /&gt;
http://ls12-www.cs.tu-dortmund.de/raptor/06_Navigation_Bahnplanung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www12.cs.fau.de/edu/robertino/ausarbeitung.pdf&lt;br /&gt;
&lt;br /&gt;
http://www.ke.tu-darmstadt.de/lehre/archiv/ss06/se-spiele/slides/PathFinding-Awerbuch.pdf&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18531</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18531"/>
				<updated>2011-08-20T09:55:10Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Blidschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
-	Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
-	Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
-	Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren :-) :-) :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, wo stehen wir auf dem Monitor, wo wollen wir hin ist jetzt klar, aber wie fragen wir denn das ARRAY mit den Vorgaben ab, wie sich der Roboter verhalten soll, wenn er auf ein Ziel trifft. &lt;br /&gt;
Hier hilft uns die Mathematik weiter, wenn man nicht unbedingt Variablen vom Type String vergleichen will.   &lt;br /&gt;
Schauen wir uns noch mal das ARRAY mit den Vorgabe Werten im Detail an:&lt;br /&gt;
&lt;br /&gt;
   int  gewicht [25][10] =    // 1=LEFT, 2=RIGHT, 3=FWD,   4=BWD&lt;br /&gt;
   { &lt;br /&gt;
      {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
      {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das ARRAY ist vom Typ Integer, also RAM sparende Programmierung. Die Bewegungsrichtungen wurden durch Zahlen ersetzt, muss nicht unbedingt sein, da wir die Bewegungsrichtungen im „BugDefault.h“  File den gleichen numerischen Werten zugewiesen haben.&lt;br /&gt;
&lt;br /&gt;
   /*  ********** Globale Variablen *********** */&lt;br /&gt;
   #define        NULL          0&lt;br /&gt;
   #define        FWD           3&lt;br /&gt;
   #define        BWD           4&lt;br /&gt;
   #define        LEFT           1&lt;br /&gt;
   #define        RIGHT        2&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18530</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18530"/>
				<updated>2011-08-20T09:52:05Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
  // ********************** Gewichtsmartix ***********************************&lt;br /&gt;
  // in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
  // einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
  // Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
  //&lt;br /&gt;
  int  gewicht [25][10] =     // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
  {      &lt;br /&gt;
     {0,1,0,3,3,5,6,2,3},&lt;br /&gt;
     {0,0,0,2,3,6,5,3,2},&lt;br /&gt;
     {0,0,0,3,2,5,4,1,3},&lt;br /&gt;
     {0,0,0,3,1,5,4,1,3},&lt;br /&gt;
     {0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
Abfrage der Sensoren im Computer Testprogramm:&lt;br /&gt;
&lt;br /&gt;
Da sich beim Testprogramm der Roboter ja nicht wirklich dreht muss das durch eine modifizierte Abfragetechnik der Sensoren erfolgen. Es wird durch die Variable „move_dir“ simuliert in welche Richtung sich der Roboter drehen würde und welche Werte in der DOS-Box abgefragt werden müssen. &lt;br /&gt;
Gut zu Wissen, dass die Computer Y-Achse von oben nach unten läuft und nicht wie im Kartesischenkoordinatensystem von unten nach oben!  &lt;br /&gt;
&lt;br /&gt;
'''Definition:'''  &lt;br /&gt;
Der Roboter kann sich  NICHT  Diagonal auf dem X, Y Feld bewegen  &lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die gezeigte DOS-BOX mal näher an. Die folgende Zeichnung ist ergänzt um die X -und Y-Achsenwerte, zur besseren Nachvollziehbarkeit des Sourcecodes.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Blidschirm.jpg]]&lt;br /&gt;
Was heißt das nun für die Abfrage der Sensoren ?&lt;br /&gt;
&lt;br /&gt;
Zwei Beispiele zu verdeutlichen:&lt;br /&gt;
 &lt;br /&gt;
Roboter bewegt sich in Richtung der X-Achse &lt;br /&gt;
-	Abfrage sensor_mitte    	Y,	X + 1 &lt;br /&gt;
-	Abfrage sensor_links     	Y-1,  	X&lt;br /&gt;
-	Abfrage rechter Sensor 	Y+1 , 	X&lt;br /&gt;
&lt;br /&gt;
'''Klar ?'''&lt;br /&gt;
OK, mal in Worten. Schaut man vom Roboter in Richtung X-Achse, dann ist das Feld vor mir als derzeitige Position X  plus  ein Kästchen weiter von Interesse &lt;br /&gt;
Das linke Kästchen wäre dann, Y-1  und  das rechte Y+1&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm2.jpg]]&lt;br /&gt;
Nun die Abfrage der Sensoren, wenn sich der Roboter in Richtung Y-Achse bewegt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm3.jpg]]&lt;br /&gt;
BITTE BEACHTEN:&lt;br /&gt;
Diese Abfragen gelten nur für unser kleines Testprogramm auf dem PC. In der Realität dreht sich ja der Roboter mit den Sensoren&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18529</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18529"/>
				<updated>2011-08-20T09:46:25Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''JETZT geht’s ans Eingemachte:'''&lt;br /&gt;
&lt;br /&gt;
Vorstellungskraft ist gefragt und logisches Denken&lt;br /&gt;
&lt;br /&gt;
Für das folgende Beispiel, siehe DOS-Box (auch hier gilt Drehung per Default nach rechts) würden die drei Sensoren in folgender Reihenfolge angesprochen: &lt;br /&gt;
Bewegung von „S“ dem Startpunkt nach dem Zielpunkt  „Z“&lt;br /&gt;
&lt;br /&gt;
[[Bild:BUG2_Bildschirm4.jpg]]&lt;br /&gt;
&lt;br /&gt;
Am einfachsten mit dem Finger den Weg des Roboters folgen auf der gedachten Line zwischen Startpunkt und Zeil (m-Linie) und sich die angesprochenen Sensoren und die Richtungsänderungen aufschreiben.&lt;br /&gt;
&lt;br /&gt;
Hier ein Beispiel, wie so eine Tabelle aussehen kann&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tabelle.jpg]]&lt;br /&gt;
&lt;br /&gt;
Eine solche Matrix kann man z.B. durch ein zweidimensionales Feld (Array) erzeugen. &lt;br /&gt;
Im Source-Code ist das die Gewichte-Matrix und ist im File „bug2Defaults.h“ zu finden.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
// ********************** Gewichtsmartix ***********************************&lt;br /&gt;
&lt;br /&gt;
// in dieser Matrix wird die Reaktion auf Zustaende der Sensoren gespeichert&lt;br /&gt;
&lt;br /&gt;
// einfach gesagt, was soll der Roboter tun wenn Zustand x an den Sensoren anliegt&lt;br /&gt;
&lt;br /&gt;
// Vorraussetzung, dass Hindernis wird  IMMER  recht herum umfahren !!!&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
int  gewicht [25][10] =             // 1=LEFT, 2=RIGHT, 3=FWD, 4=BWD&lt;br /&gt;
{          &lt;br /&gt;
{0,1,0,3,3,5,6,2,3},&lt;br /&gt;
{0,0,0,2,3,6,5,3,2},&lt;br /&gt;
{0,0,0,3,2,5,4,1,3},&lt;br /&gt;
{0,0,0,3,1,5,4,1,3},&lt;br /&gt;
{0,0,0,1,3,4,5,4,1},&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Bildschirm4.jpg&amp;diff=18528</id>
		<title>Datei:BUG2 Bildschirm4.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Bildschirm4.jpg&amp;diff=18528"/>
				<updated>2011-08-20T09:44:16Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Robotersensoren.jpg&amp;diff=18527</id>
		<title>Datei:Robotersensoren.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Robotersensoren.jpg&amp;diff=18527"/>
				<updated>2011-08-20T09:33:22Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18526</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18526"/>
				<updated>2011-08-20T09:32:30Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:robotersensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18525</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18525"/>
				<updated>2011-08-20T09:28:27Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]Kompassmodul &lt;br /&gt;
CMPS03 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]Entfernungsmesser GP2D120 (Analog)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter+sensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2 Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. &lt;br /&gt;
Im Computer- Testprogramm ist das die Variable '''„move_dir“'''. &lt;br /&gt;
Eine weitere wichtige Variable ist '''„last_dir“'''. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Bug2_Probleme.jpg&amp;diff=18524</id>
		<title>Datei:Bug2 Probleme.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Bug2_Probleme.jpg&amp;diff=18524"/>
				<updated>2011-08-20T09:28:02Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18523</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18523"/>
				<updated>2011-08-20T09:22:50Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;br /&gt;
&lt;br /&gt;
Der Roboter fährt um das Ziel herum bis er wieder auf die m-Linie trifft. Von dort aus weiter zum Ziel. &lt;br /&gt;
&lt;br /&gt;
Das wäre der BUG2 Algorithmus. &lt;br /&gt;
&lt;br /&gt;
Der Vorgängeralgorithmus BUG1 wurde so entworfen, dass er erst mal das ganze Hindernis umrundet, sich den Punkt merkt, wo er wieder auf die m-Linie trifft und von dort dann bei der zweiten Umrundung von dort weiter in Richtung ziel fährt. &lt;br /&gt;
Die gefahrene Strecke ist somit größer als beim BUG2 Algorithmus. &lt;br /&gt;
In den Ausarbeitungen (siehe Literaturliste) wird dann noch auf die Vor –und Nachteile der einzelnen Algorithmen eingegangen.&lt;br /&gt;
Interessiert uns ja nicht, da wir den BUG2 Algorithmus gewählt haben :-):-):-)&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns nun mal die genannten Vorraussetzungen im Einzelnen an:&lt;br /&gt;
&lt;br /&gt;
Richtungsvorgabe (m-Linie). Hier hatten wir einen Kompass gewählt. Glück gehabt, gibt es anschlussfertig zu kaufen.  &lt;br /&gt;
&lt;br /&gt;
[[Bild:kompass.jpg]]&lt;br /&gt;
&lt;br /&gt;
Entfernungsmesser z.B.  Infrarotmesser. Wichtig ist für meine Implementierung, dass der Entfernungsmesser analog ist, also die Entfernung misst und in Volt ausgibt.&lt;br /&gt;
&lt;br /&gt;
[[Bild:ir-sensor.jpg]]&lt;br /&gt;
&lt;br /&gt;
Schauen wir uns die IR-Entfernungsmessung etwas genauer an. Im Bild wird die Funktionsweise deutlich. Ein Erkennen und anschließende Abtastung des Hindernis ist für den Roboter somit möglich. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter+sensoren.jpg]]&lt;br /&gt;
&lt;br /&gt;
In der Zeichnung des Roboters wird klar, dass man ständig die drei Sensoren abfragen muss, ob und wie weit das Hindernis entfernt ist. Ebenfalls müssen zwei weitere Parameter gespeichert, bzw. ausgewertet werden, bei der Veränderung der Richtung des Roboters. Die Richtung in die sich der Roboter auf Grund der Ergebnisse, die die IR-Sensoren liefern bei der Abtastung nach Hindernissen, bewegt. Ebenfalls benötigen wir die Information was die letzte gespeicherte Richtung war bevor ich eine neue Richtung einschlage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARUM:  Bewege ich mich vom Ziel weg, ist es wichtig zu wissen&lt;br /&gt;
-	wo her ich komme&lt;br /&gt;
-	wohin gehe ich. &lt;br /&gt;
&lt;br /&gt;
Ich denke das folgende Bild sollte das Problem erklären. &lt;br /&gt;
&lt;br /&gt;
1) Der Roboter „sieht“ den Weg vor sich frei, kein Sensor signalisiert ein Hindernis. &lt;br /&gt;
&lt;br /&gt;
2) Es ist klar, dass sich der Roboter drehen muss. Das kann man intelligent, wenn man weiß, dass die letzte Drehung in Richtung links war und nun nach links weiter muss, obwohl unsere Definition sagt, fahre per Default rechts herum. &lt;br /&gt;
&lt;br /&gt;
3) Oder halt ohne die letzte Drehrichtung zu kennen auf den Defaultwert zurück zu fallen und nach rechts drehen. Damit landet man aber in einer Endlosschleife … &lt;br /&gt;
&lt;br /&gt;
4) Endlosschleifen umgehen kann man auch, in dem man sich den Punkt merkt, an dem man die m-Line verlassen hat, um das Hindernis zu umfahren (manchmal auch HitPoint genannt). Also merken wir uns die Position beim Verlassen der m-Line. Im Computer-Testprogramm ganz einfach:  HitPoint = X-Achsenwert (siehe Programm)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bug2_Probleme.jpg]]&lt;br /&gt;
&lt;br /&gt;
Nun muss man sich klar werden, welche Sensoren auf dem in blau eingezeichneten Weg an welchen Ecken angesprochen werden. &lt;br /&gt;
Dazu ist es wichtig zu wissen aus welcher Richtung ich eigentlich komme. Im Computer- Testprogramm ist das die Variable „move_dir“. &lt;br /&gt;
Eine weitere wichtige Variable ist „last_dir“. Diese Variable speichert den letzten Richtungswechsel. &lt;br /&gt;
&lt;br /&gt;
Somit müssen folgende Variablen ausgewertet werden, beim Umfahren eines Hindernisses:&lt;br /&gt;
&lt;br /&gt;
'''Sensor_links,   Sensor_mitte,   Sensor_rechts,   move_dir   und   last_dir'''&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Kompass.jpg&amp;diff=18522</id>
		<title>Datei:Kompass.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Kompass.jpg&amp;diff=18522"/>
				<updated>2011-08-20T09:22:31Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Ir-sensor.jpg&amp;diff=18521</id>
		<title>Datei:Ir-sensor.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Ir-sensor.jpg&amp;diff=18521"/>
				<updated>2011-08-20T09:22:18Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Bug2.jpg&amp;diff=18520</id>
		<title>Datei:Bug2.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Bug2.jpg&amp;diff=18520"/>
				<updated>2011-08-20T09:10:50Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18519</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18519"/>
				<updated>2011-08-20T09:09:20Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
&lt;br /&gt;
[[Bild:Labyrinth.jpg]]&lt;br /&gt;
&lt;br /&gt;
Woher wissen die Kids das heute so einfach, war vielleicht doch eine PISA-Frage ?!?&lt;br /&gt;
&lt;br /&gt;
'''Der BUG2 Algorithmus,''' &lt;br /&gt;
oder die Suche nach dem nicht immer optimalen Weg zum Zielpunkt. &lt;br /&gt;
&lt;br /&gt;
Wie komme ich eigentlich von Punkt A nach Punkt B ohne eine Karte. Treffer und versenkt !&lt;br /&gt;
Hier wir es nämlich richtig schwierig, da wir uns auf dem Feld der Navigation tummeln müssen.&lt;br /&gt;
Im Klartext, ich habe wieder das Problem, dass ohne ein GPS eigentlich nix richtig funktioniert. &lt;br /&gt;
&lt;br /&gt;
ODER DOCH ?! &lt;br /&gt;
&lt;br /&gt;
Es gab auch mal eine Zeit vor GPS und da hat man so ein komisches Ding mit Zahlen und einem immer nach Norden zeigender Nadel benutzt.      Richtig, einen Kompass…&lt;br /&gt;
Einen elektronischen Kompass für den Robby gibt es schon und auch gleich mit I²C Schnittstelle zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
So frisch ans Werk, was haben wir denn nun… Einen Kompass und einen Kompass ???&lt;br /&gt;
Ich kann also den Roboter genau in der Testumgebung (Wohnzimmer) in Richtung 180° fahren lassen, was dann Süden wäre.&lt;br /&gt;
Toll, aber irgendwie auch ernüchternd, denn der Kompass weist nur die Richtung aber, verflixt noch mal wann soll der Roboter den aufhören zu fahren und zurück melden, Ziel erreicht.&lt;br /&gt;
Die einfache Lösung, solange fahren bis er gegen das Ziel fährt … schlecht, wenn das z.B: eine Mingvase wäre, oder man doch die Katze über den Haufen fährt  … da ist man dann schnell wieder bei dem Punkt Platzverweis!&lt;br /&gt;
Was kann denn nun weiterhelfen. Hier kommen wieder die IR-Baken zum Einsatz. Wie bei der Navigation von Schiffen benötigen wir vermessene Fixpunkte (In der Seefahrt, markante Punkte an der Küstenlinie wie Leuchttürme oder Kirchtürme). Solche Punkte sind z.B. in Seekarten eingetragen.   &lt;br /&gt;
Die Umsetzung dieses Themas kommt in dem Teil zwei, wo wir uns mit der Navigation näher beschäftigen wollen. Jetzt zurück (ach ich liebe diese Abschweifungen) zum Problem der Realisierung eines BUG2 Algorithmus auf dem PC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Allgemeine Beschreibung des BUG 2 Algorithmus'''&lt;br /&gt;
&lt;br /&gt;
nach Vladimir Lumelsky &amp;amp; Alexander Stepanov: Algorithmica 1987&lt;br /&gt;
&lt;br /&gt;
Vorraussetzungen:&lt;br /&gt;
&lt;br /&gt;
1. Die Richtung (hier oft auch m-Line genannt) zum Ziel muss bekannt sein, z.B. durch einen Kompass&lt;br /&gt;
&lt;br /&gt;
2. Es sind entsprechende Sensoren am Roboter vorhanden, die ein Hindernis durch Berührung oder auf Entfernung durch z.B. Infrarotsensoren erkennen können &lt;br /&gt;
&lt;br /&gt;
3. Die Erkennung mittels IR Sensoren muss linear sein  z.B.  10 – 80 cm  entspricht einer Spannung von z.B. 1 – 5 Volt am Ausgangsport, sonst wird’s etwas holperig, aber nicht unlösbar &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Grundsätzliches Vorgehen beim BUG 2 Algorithmus:''&lt;br /&gt;
&lt;br /&gt;
–  Bewege dich gerade auf einer Linie Richtung Ziel &lt;br /&gt;
&lt;br /&gt;
–  Folge immer der Wand des Hindernisses (z.B. rechts herum) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Algorithmus-Beschreibung:''&lt;br /&gt;
&lt;br /&gt;
1) Folge der m-Line in Richtung des Ziels. Bewege dich gerade auf einer Linie Richtung Ziel&lt;br /&gt;
&lt;br /&gt;
2) Wenn ein Hindernis im Weg ist, umfahre das Hindernis ( Folge der Wand ) bis Du wieder auf die m-Line triffst, welcher näher zum Ziel ist, sonst Abbruch &lt;br /&gt;
&lt;br /&gt;
3) Verlasse das Hindernis und folge der m-Line weiter in Richtung Ziel  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prinzipelle Vorgehensweise als Zeichnung:&lt;br /&gt;
[[Bild:Bug2.jpg]]&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Roboter-Sensoren.jpg&amp;diff=18518</id>
		<title>Datei:Roboter-Sensoren.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Roboter-Sensoren.jpg&amp;diff=18518"/>
				<updated>2011-08-20T09:02:40Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Labyrinth.jpg&amp;diff=18517</id>
		<title>Datei:Labyrinth.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Labyrinth.jpg&amp;diff=18517"/>
				<updated>2011-08-20T09:02:14Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Probleme.jpg&amp;diff=18516</id>
		<title>Datei:BUG2 Probleme.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Probleme.jpg&amp;diff=18516"/>
				<updated>2011-08-20T09:01:53Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Bildschirm3.jpg&amp;diff=18515</id>
		<title>Datei:BUG2 Bildschirm3.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Bildschirm3.jpg&amp;diff=18515"/>
				<updated>2011-08-20T09:01:30Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Bildschirm2.jpg&amp;diff=18514</id>
		<title>Datei:BUG2 Bildschirm2.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Bildschirm2.jpg&amp;diff=18514"/>
				<updated>2011-08-20T09:01:06Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Bildschirm.jpg&amp;diff=18513</id>
		<title>Datei:BUG2 Bildschirm.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:BUG2_Bildschirm.jpg&amp;diff=18513"/>
				<updated>2011-08-20T09:00:26Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:BUG2.jpg&amp;diff=18512</id>
		<title>Datei:BUG2.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:BUG2.jpg&amp;diff=18512"/>
				<updated>2011-08-20T08:59:40Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Bild1.JPG&amp;diff=18511</id>
		<title>Datei:Bild1.JPG</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Bild1.JPG&amp;diff=18511"/>
				<updated>2011-08-20T08:55:04Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18510</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18510"/>
				<updated>2011-08-20T08:52:48Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                      &lt;br /&gt;
&lt;br /&gt;
Wo ist mein Startpunkt?&lt;br /&gt;
&lt;br /&gt;
Wo ist mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
[[Bild:Beispiel.jpg]]&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18509</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18509"/>
				<updated>2011-08-20T08:50:21Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                       Wo ist mein Startpunkt?&lt;br /&gt;
                       Wo mein Ziel?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der Roboter hat nun mal nur Bumper und IR-Sensoren. GPS in der Wohnung geht auch nicht.&lt;br /&gt;
Also, entweder muss ein anderer Algorithmus her, oder die Möglichkeit, die Position des Roboters, des Ziels und der Hindernisse genau zu lokalisieren.&lt;br /&gt;
Es gibt solche Möglichkeiten z.B. IR Baken, oder eine Kamera an der Decke, die die Position der Hindernisse und des Roboters bestimmt. Klar, nur wie bekomme ich z.B. die Daten in den Roboter, der ja eigentlich autonom arbeiten soll.&lt;br /&gt;
Also wieder das Internet befragt, bzw. hatte ich in einigen der Ausarbeitungen etwas von Algorithmen gelesen, die ohne Knoten auskommen, dann aber nur die Hindernisse umfahren und keinen optimalen Weg suchen von Start zum Ziel.&lt;br /&gt;
Also fahren wir mal um ein Hindernis herum war das neue Ziel der Programmierung. Erst mal wieder auf dem PC verwirklichen, soweit war ich dann schon mal in den Überlegungen. Doch wie sollte es weitergehen. &lt;br /&gt;
Schließlich wurde ich fündig und der einfachste der Algorithmen mit dem hübschen Namen BUG2  (Bug  engl. Kakerlake oder auch Fehler) hatte es mir angetan. Es gibt weitaus bessere Algorithmen, die aber auch wesentlich komplexer sind.&lt;br /&gt;
So als Abfallprodukt, beim lesen der Ausarbeitung gelernt: Wie kommt man eigentlich aus einem Labyrinth heraus? Ganz einfach z.B. die rechte Hand immer an der Wand des Labyrinth vorbeiführen, somit ständiger Kontakt mit der rechten Wand herrscht. Dauert halt lange, aber man kommt aus dem Labyrinth heraus.&lt;br /&gt;
&lt;br /&gt;
Die Frage meiner Tochter (13 Jahre) gestellt, wie kommt man aus einem Labyrinth heraus. „Mann, Papa“ weiß doch jeder, rechte Hand an der Wand halten. &lt;br /&gt;
[[Bild:Beispiel.jpg]]&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18508</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18508"/>
				<updated>2011-08-20T08:48:26Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:ASTAR.jpg]]&lt;br /&gt;
&lt;br /&gt;
Knoten, da war doch noch was: &lt;br /&gt;
Der Algorithmus funktioniert nur, wenn der Weg von Startpunkt zu Zielpunkt in Knoten, oder auch Felder genannt, eingeteilt ist. Diese Knoten können Rechtecke sein oder auch Dreiecke, ist eigentlich egal. &lt;br /&gt;
&lt;br /&gt;
:-)   O D E R doch nicht   :-)&lt;br /&gt;
&lt;br /&gt;
Jetzt kommt nämlich der Teil mit dem Roboter und dem PC. Also auf einem PC war das ganz einfach zu programmieren (Naja, einfach…), eine zweidimensionale Matrix mit Feldern gefüllt „#“ als Hindernis und seitliche Begrenzungen / Ränder die den Wirkungsbereich eingrenzen.&lt;br /&gt;
&lt;br /&gt;
Jetzt muss ich einmal sagen, dass meine „Life“ Testumgebung, auch verächtlich von meiner Freundin Wohnzimmer genannt, nun mal nicht in Felder eingeteilt ist. Ein Versuch der von meiner Freundin, unter Androhung eines Platzverweises, sabotiert wurde. &lt;br /&gt;
&lt;br /&gt;
[[Bild:roboter4.jpg]]  Was nun, wie erkenne ich den die Hindernisse?&lt;br /&gt;
                       Wo ist mein Startpunkt?&lt;br /&gt;
                       Wo mein Ziel?&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Roboter4.jpg&amp;diff=18507</id>
		<title>Datei:Roboter4.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Roboter4.jpg&amp;diff=18507"/>
				<updated>2011-08-20T08:48:09Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:ASTAR.jpg&amp;diff=18506</id>
		<title>Datei:ASTAR.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:ASTAR.jpg&amp;diff=18506"/>
				<updated>2011-08-20T08:39:50Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18498</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18498"/>
				<updated>2011-08-19T07:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[['''''Rest des Beitrages folgt am Wochenende (20/21 Aug 2011)  bitte etwas Geduld ...''''']]&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18494</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18494"/>
				<updated>2011-08-18T12:12:15Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: Benutzer Diskussion:Cb2sn43 wurde nach Odometrie oder die Kunst einen Weg für den Roboter zu finden verschoben&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:Cb2sn43&amp;diff=18495</id>
		<title>Benutzer Diskussion:Cb2sn43</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Benutzer_Diskussion:Cb2sn43&amp;diff=18495"/>
				<updated>2011-08-18T12:12:15Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: Benutzer Diskussion:Cb2sn43 wurde nach Odometrie oder die Kunst einen Weg für den Roboter zu finden verschoben: Falscher Titel gewählt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Odometrie oder die Kunst einen Weg für den Roboter zu finden]]&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18493</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18493"/>
				<updated>2011-08-18T11:53:54Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
&lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18492</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18492"/>
				<updated>2011-08-18T11:53:00Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] &lt;br /&gt;
Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18491</id>
		<title>Odometrie oder die Kunst einen Weg für den Roboter zu finden</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Odometrie_oder_die_Kunst_einen_Weg_f%C3%BCr_den_Roboter_zu_finden&amp;diff=18491"/>
				<updated>2011-08-18T11:51:29Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Odometrie oder die Kunst einen Weg für den Roboter zu finden:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition Odometrie laut Wikipedia:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Odometrie oder auch Hodometrie (von griech. hodós, „Weg“ und métron, „Maß“ - also: „Wegmessung“) ist die Wissenschaft von der Positionsbestimmung eines mobilen Systems anhand der Daten seines Vortriebsystems. Durch Räder angetriebene Systeme benutzen hierzu die Anzahl der Radumdrehungen, während laufende Systeme (z. B. Roboter) die Anzahl ihrer Schritte verwenden. Ein Gerät, das die Odometrie zur Positionsbestimmung verwendet, ist ein Odometer. Die Odometrie ist im Zusammenspiel mit der Koppelnavigation ein grundlegendes Navigationsverfahren für bodengebundene Fahrzeuge aller Art (Kfz, Roboter), allerdings wird es auf Grund seiner Fehlereigenschaften selten als alleiniges Verfahren eingesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schnell und einfach erklärt, aber was nun?&lt;br /&gt;
Klar, schaut man doch mal schnell unter Google nach, wer da mal was programmiert hat. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aha ja, doch soviel :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, ein Filter muss her:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Ich mag nun mal klassisches C++   --&amp;gt;  Immer noch nichts richtiges&lt;br /&gt;
- Hmm, Implementierung, Programmierung, „Pathfinding“&lt;br /&gt;
&lt;br /&gt;
Die Liste könnte man nun recht lange ausführen. &lt;br /&gt;
&lt;br /&gt;
Richtig gute Erklärungen findet man z.B. an Universitäten: &lt;br /&gt;
Ausarbeitungen, Diplomarbeiten und allg. Studienunterlagen. Am Ende dieses Berichtes werde ich einige gute Ausarbeitungen auflisten, die ich selbst als sehr hilfreich empfunden habe.&lt;br /&gt;
&lt;br /&gt;
Nun, die Verzweiflung war groß, also selbst ist der Mann, kann doch nicht schwer sein ein Programm zu schreiben bei dem ein Weg um Hindernisse gefunden wird. &lt;br /&gt;
&lt;br /&gt;
Mittlerweile war mir klar, ich probier das mal zuerst am PC mit einem DOS- Fenster als Testumgebung aus, bevor ich den Roboter einmal zu oft gegen die Wand fahre :-)&lt;br /&gt;
&lt;br /&gt;
[[Bild:Bild1.jpg]] Gemein wie ich mir das so vorstellte, war das Ziel „Z“ schön hinter den Hindernissen versteckt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hoppla, doch ein paar viele   '''IF – IF ELSE - etc…'''   Abfragen, um ein „X“ von Startpunkt „S“, um ein paar Hindernisse herum zu manövrieren. Geschweige denn, dass der Algorithmus, oder besser die Abfragen noch funktionieren wenn man mal das Hindernis in der Lage verändert. &lt;br /&gt;
 &lt;br /&gt;
'''ALLGEMEINE  ERNÜCHTERUNG FOLGTE:'''&lt;br /&gt;
&lt;br /&gt;
Also zurück ins Netz und Google. Ahhhhh, überall Hinweise die auf Pathfinding mit einem „A-Star“ Algorithmus hindeuten. &lt;br /&gt;
&lt;br /&gt;
Häääh. Hey, ich bin 45 Jahre alt, arbeite hauptberuflich in einer Bank als Controller und meine C++ Kenntnisse und Syntax sind aus dem Jahr 1994, als ich meine Diplomarbeit geschrieben habe und nun soll ich verstehen was die Studenten von heute so programmieren. &lt;br /&gt;
Übersetzer bitte …&lt;br /&gt;
Also vergessen wir mal schnell die fertigen Programme (Source-Code) aus dem Internet. &lt;br /&gt;
&lt;br /&gt;
Okay, man nehme sich die Algorithmusbeschreibung und programmiert das ganze mal in seinem eigenen Stil. &lt;br /&gt;
Das hat dann auch geklappt und den Sourcecode habe ich an den Artikel angehängt&lt;br /&gt;
U N D  in meiner alten, schönen Syntax programmiert, so wie halt vor 20 Jahren  hä, hä, hä ...&lt;br /&gt;
&lt;br /&gt;
Ach ja, ob ich die Algorithmusbeschreibung richtig umgesetzt habe weiß ich nicht, aber mein PC Beispielprogramm hat einen Lösungsweg berechnet. Ist doch schon mal was und eine einfache C-Sourcecode Lösung lässt sich einfacher auf einen Mikrocontroller transferieren.  &lt;br /&gt;
&lt;br /&gt;
Gut: Wir haben jetzt eine Lösung, und sieht doch richtig hübsch aus, wie der PC den Weg zum Ziel findet. Berechnet wurden 450 Knoten.&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Datei:Bild1.jpg&amp;diff=18490</id>
		<title>Datei:Bild1.jpg</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Datei:Bild1.jpg&amp;diff=18490"/>
				<updated>2011-08-18T11:35:43Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13214</id>
		<title>Wlan</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13214"/>
				<updated>2008-02-23T22:00:37Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Datenaustausch zwischen Roboter und PC via WLAN''' &lt;br /&gt;
&lt;br /&gt;
Ein Erfahrungsbericht:&lt;br /&gt;
&lt;br /&gt;
Im folgenden Bericht möchte ich auf die Möglichkeit eingehen, wie man Daten zwischen PC und Roboter via WLAN austauschen kann. &lt;br /&gt;
Meine Wahl fiel auf das Embedded WLAN Modul der Firma Avisaro. Das Modul kann, je nach Auslieferungszustand via CAN Bus, I2C Bus, SPI oder auch über RS232 Schnittstelle mit dem Roboter kommunizieren. &lt;br /&gt;
Ich habe mich für die Modulversion mit I2C Bus entschieden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Eingesetzte Software / Hardware''&lt;br /&gt;
&lt;br /&gt;
- Roboter RP6 der Firma  AREXX              ( www.arexx.com )&lt;br /&gt;
&lt;br /&gt;
- Borland C++  Compiler auf dem PC          ( www.borland.com )&lt;br /&gt;
&lt;br /&gt;
- PC OS ist Windows XP Home&lt;br /&gt;
&lt;br /&gt;
- Emulations- Software der Firma HWgroup    ( www.hw-group.com )   &lt;br /&gt;
&lt;br /&gt;
- WLAN Adapter der Firma Avisaro            ( www.avisaro.de )&lt;br /&gt;
&lt;br /&gt;
- Einfacher WLAN Router von D-Link &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Beschreibung der Komponenten:''&lt;br /&gt;
&lt;br /&gt;
1)	Das WLAN Modul der Firma Avisaro wird über den I2C Bus auf Seiten des Roboters angesprochen, dabei war es mir wichtig, die vorhandenen Routinen zu nutzen, die mit dem RP6 Roboter mit geliefert werden. Das WLAN Modul ist per default als Slave konfiguriert mit der I2C Adresse 73. Somit müssen die I2C Master Routinen auf dem Roboter benutzt werden. Die Frequenz der I2C Busses habe ich auf 100KHz gelassen. Das WLAN Modul kann auch, via Clock-Stretching, mit höherer Frequenz angesprochen werden &lt;br /&gt;
&lt;br /&gt;
2)	Die Software HW VSP3 „virtual serial port“ der Firma HW-Group wird auf der PC Seite eingesetzt, um die Kommunikation zur PC WLAN Karte zu vereinfachen.  &lt;br /&gt;
&lt;br /&gt;
3)	Es ist Möglich eine Peer zu Peer Verbindung zwischen PC und WLAN Modul aufzubauen. Ich habe aber die Lösung via WLAN Router gewählt. Das WLAN Modul ist Standardmäßig auf die IP Adresse 192.168.0.73 konfiguriert. Auf die Konfiguration des WLAN Moduls via Weboberfläche möchte ich hier nicht eingehen und verweise hiermit auf die mitgelieferte Dokumentation. &lt;br /&gt;
&lt;br /&gt;
Wichtig sind nur folgende Parameter:  &lt;br /&gt;
 	&lt;br /&gt;
-	Netzwerksetup als TCP Server&lt;br /&gt;
&lt;br /&gt;
-	I2C-Bus No ACK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Funktionsbeschreibung:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''PC Seite:''&lt;br /&gt;
&lt;br /&gt;
''Serielle Schnittstelle / Emulations-Software''&lt;br /&gt;
&lt;br /&gt;
Das PC Programm schreibt / liest Daten von und zu einer seriellen Schnittstelle und nicht direkt auf den PC WLAN Adapter.&lt;br /&gt;
Die serielle Schnittstelle wird durch die HW VSP3 Software emuliert und übernimmt Schreiben und Lesen der Daten auf den PC WLAN Adapter. Somit vereinfacht sich die Kommunikation von und zum WLAN Adapter wesentlich, da sich die Kommunikation auf Lesen und Schreiben zur serielle Schnittstelle beschränkt. Hier zu gibt es jede Menge Beispiele im Netz, oder auf der MSDN Webseite bei Microsoft, wie eine serielle Schnittstelle unter Windows XP angesprochen wird.&lt;br /&gt;
Ist das WLAN Modul auf dem Roboter im Netzwerk mit seiner IP Nummer erkannt worden, dann kann via der Emulationssoftware ein COM Port zugewiesen werden  z.B. COM3.&lt;br /&gt;
 &lt;br /&gt;
Die Standardmäßige Einstellung der seriellen Schnittstelle ist, 9600 Baud, 8 Datenbits, 1 Stopbit, No Parity. Es ist an dieser Stelle sehr hilfreich sich das Logfile der Emulations Software anzusehen, da die Parameter der seriellen Schnittestelle herausgeschrieben werden und man sofort erkennt, ob das Modul erfolgreich connected wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Programm auf dem PC''&lt;br /&gt;
Zur Erstellung der PC seitigen Software habe ich Borland C++ benutzt. Die Routinen im Sourcecode sind wie bereits beschrieben von MSDN kopiert und angepasst worden.&lt;br /&gt;
Ich möchte hier nicht so tief auf die Beschreibung des Codes eingehen, dass kann man im angehängten SourceCode viel besser sehen. Das Programm besteht eigentlich nur aus einer lesenden Routine, die Daten aus der seriellen Schnittstelle ausliest und auf dem Bildschirm in einer DOS-Box darstellt. Senden von Daten an den Roboter ist auch möglich und als Funktion hinterlegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Netzwerk:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN-Netz wurde von mir mit den Standardparametern aufgesetzt. Ich habe nur die IP Adresse, die SSID und den Kanal angepasst. WEP / WAP  Verschlüsselung ist möglich und kann via Webpage auf dem WLAN Modul eingestellt werden (siehe Dokumentation)   &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roboter Seite:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN Modul:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN Modul wird über den I2C Bus angesprochen, die I2C Adresse habe ich behalten, da die Adresse 73 von keinem anderen I2C Device genutzt wird. &lt;br /&gt;
Wichtig war für mich die fertigen Routinen, die mit den RP6 Libraries geliefert werden, zu benutzen. Dadurch musste ich keine extra Funktionen entwickeln die den Lese / Schreibzugriff auf den I2C Bus ausführen. Allerdings ist zu beachten, dass bei schreibenden Zugriffen auf das WLAN Modul die I2C Adresse um ein Bit verschoben werden muss. Das Bit 0 muss mit einer Null gefüllt werden ( Adr&amp;lt;&amp;lt;1 )&lt;br /&gt;
&lt;br /&gt;
Schwieriger ist der lesenden Zugriff auf das Modul, dazu muss die Adresse ebenfalls um ein Bit verschoben werden und das Bit 0 auf EINS gesetzt werden ( Adr&amp;lt;&amp;lt;1 | 1 ).&lt;br /&gt;
Wichtig:  &lt;br /&gt;
Im Normalfall adressiert man, als ersten Schritt, ein I2C Device und das zu lesende Register von dem man die Daten abholen möchte. Anschließend greift man lesend auf das zuvor adressierte Register des I2C Devices zu.  &lt;br /&gt;
Will man lesend auf das WLAN Modul zugreifen, so habe ich festgestellt, dass man direkt lesend auf die I2C Adresse zugreifen kann, ohne das Device vorher, durch einen Schreibzugriff , zu adressieren. Die ersten zwei Byte, der abgeholten Daten, sind die Länge / Size der auf dem WLAN Modul bereitgestellten Daten. Somit kann man einfach feststellen wie viele Daten aus dem Device ausgelesen werden müssen. Alle Daten müssen aus dem Device abgeholt werden. Siehe auch SourceCode Beispiele. &lt;br /&gt;
Die verwendeten Software-Routinen werden mit dem RP6 Roboter mitgeliefert. Ebenso der verwendete AVR Compiler und dessen Libraries. &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den PC:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;commctrl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 //  ********  Globale Variablen  ********  &lt;br /&gt;
 char          *gszPort;          &lt;br /&gt;
 HANDLE        hCom = NULL;&lt;br /&gt;
 DCB           dcb;&lt;br /&gt;
 COMMTIMEOUTS  ct;&lt;br /&gt;
 bool          CommFlag;&lt;br /&gt;
 bool          ReadOnly;&lt;br /&gt;
 char          string[100];&lt;br /&gt;
 BYTE          data_in[100], data_out, buff[100];&lt;br /&gt;
 int           k, m;&lt;br /&gt;
 DWORD         n;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // ************* COM Port initialisieren ************** &lt;br /&gt;
 int setup_Com_Port ()&lt;br /&gt;
 {&lt;br /&gt;
    gszPort = string;  &lt;br /&gt;
    hCom = CreateFile(gszPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);&lt;br /&gt;
    if (hCom == INVALID_HANDLE_VALUE)&lt;br /&gt;
    {&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error Initialise Port&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    dcb.DCBlength = sizeof(DCB);&lt;br /&gt;
    GetCommState(hCom, &amp;amp;dcb);&lt;br /&gt;
    if (!BuildCommDCB(&amp;quot;baud=9600 parity=N data=8 stop=1&amp;quot;, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error kann Portparameter nicht setzen e.g. 9600 Boud&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
    }&lt;br /&gt;
    if(!SetCommState(hCom, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Cannot set comm state  BCD.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    ct.ReadIntervalTimeout 	   = MAXDWORD;&lt;br /&gt;
    ct.ReadTotalTimeoutConstant    = 0;&lt;br /&gt;
    ct.ReadTotalTimeoutMultiplier  = 1;&lt;br /&gt;
    ct.WriteTotalTimeoutConstant   = 250;&lt;br /&gt;
    ct.WriteTotalTimeoutMultiplier = 1;&lt;br /&gt;
    if(!SetCommTimeouts(hCom, &amp;amp;ct))&lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n \a Cannot set comm timeouts.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
         return 0;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die serielle Schnittstelle'''&lt;br /&gt;
&lt;br /&gt;
 /* *********** Senden der Daten an Serielle Schnittstelle ***** */			&lt;br /&gt;
 void sende_cmd_start (BYTE cmd[10], int howmuch)	// Datenbytes und Anzahl wieviele  Bytes   gesendet werden sollen &lt;br /&gt;
 {		    &lt;br /&gt;
        DWORD  n;    		&lt;br /&gt;
        WriteFile(hCom, &amp;amp;cmd, howmuch, &amp;amp;n, NULL);             &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Von der serielle Schnittstelle Daten auslesen''' &lt;br /&gt;
&lt;br /&gt;
 /* **** Endlos Schleife des Hauptprogramms **** */&lt;br /&gt;
 if (hCom != NULL)&lt;br /&gt;
 {&lt;br /&gt;
  while(CommFlag) 			    // Bearbeiten solange das COM Port offen ist&lt;br /&gt;
  {     &lt;br /&gt;
     ReadFile(hCom, &amp;amp;cmd, 9, &amp;amp;n, NULL); // Daten aus der Schnittstelle auslesen, hier 9 Bytes&lt;br /&gt;
     if(n) 			// Wenn Daten ausgelesen wurden, sichern im Feld  data_in&lt;br /&gt;
     {				// Daten gesichert für weitere Verarbeitung&lt;br /&gt;
         data_in[0] = cmd[0];&lt;br /&gt;
         data_in[1] = cmd[1];  &lt;br /&gt;
         data_in[2] = cmd[2];  &lt;br /&gt;
         data_in[3] = cmd[3];  &lt;br /&gt;
         data_in[4] = cmd[4];  &lt;br /&gt;
         data_in[5] = cmd[5]; &lt;br /&gt;
         data_in[6] = cmd[6];&lt;br /&gt;
         data_in[7] = cmd[7];    &lt;br /&gt;
         data_in[8] = cmd[8];              &lt;br /&gt;
     }        &lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beim verlassen des Programms serielle Schnittstelle schließen'''&lt;br /&gt;
&lt;br /&gt;
 /*   ************ Port schliessen ******* */&lt;br /&gt;
   Sleep (5);&lt;br /&gt;
   CloseHandle(hCom);&lt;br /&gt;
   hCom = NULL;&lt;br /&gt;
   gotoxy (2,32);&lt;br /&gt;
   printf (&amp;quot;\n  Port %s geschlossen &amp;quot;, string);&lt;br /&gt;
   printf (&amp;quot;\n\n Programm beendet &amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den RP6 Roboter:'''&lt;br /&gt;
&lt;br /&gt;
''Auszug aus dem Hauptprogramm:''&lt;br /&gt;
&lt;br /&gt;
 // ISR Handler initialisieren&lt;br /&gt;
 I2CTWI_initMaster(100);      // Initialize the TWI Module for Master operation with 100kHz  SCL Frequency&lt;br /&gt;
 I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);   // Register the event hand	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // *********************** Main loop ************************************&lt;br /&gt;
 while(true)&lt;br /&gt;
 {		&lt;br /&gt;
   behaviourController();        	// Aufruf der Haupt-Controll-Funktion&lt;br /&gt;
   task_RP6System();             	// Abfrage des ADC, ACS, IRCOMM usw...&lt;br /&gt;
   if (getStopwatch1() &amp;gt; 200)&lt;br /&gt;
   {&lt;br /&gt;
       task_commandProcessor();   	// Abfrage ob ein Commando gesendet wurde&lt;br /&gt;
       setStopwatch1(0); &lt;br /&gt;
   }  &lt;br /&gt;
   task_I2CTWI();                // Call I2C Management routine&lt;br /&gt;
 }  &lt;br /&gt;
 return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Lesen von Daten von der WLAN Karte bereitgestellt über den I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
 // **** Comandos von PC über WLAN Karte einlesen&lt;br /&gt;
 void task_commandProcessor(void)&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t    	size;&lt;br /&gt;
   uint8_t    	messageBuf [100]; &lt;br /&gt;
   size = 0; &lt;br /&gt;
   if(!I2CTWI_isBusy())&lt;br /&gt;
   {    &lt;br /&gt;
      I2CTWI_readBytes (73&amp;lt;&amp;lt;1 | 1, &amp;amp;messageBuf[0],  38); 	// Daten von WLAN Karte einlesen. Hier werden  einfach mal 38 Byte eingelesen&lt;br /&gt;
      size = messageBuf[0]&amp;lt;&amp;lt;8 | messageBuf[1];  // Ermitteln wie viel tatsächlich Byte gesendet                        wurden&lt;br /&gt;
   }         					// Diese Funktion muss noch optimiert werden&lt;br /&gt;
 }&lt;br /&gt;
 //  In dem Feld messageBuf [2]  bis  messageBuf[size]  befinden sich die Daten von PC gesendet &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die WLAN Karte über den  I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
 // Mit folgender Routine können eine belibige Anzahl, hier 9 Byte, an die WLAN Karte gesendet werden &lt;br /&gt;
 // Daten im Feld „buffer“ zur WLAN Karte senden via  I2C  Bus  &lt;br /&gt;
 if (!I2CTWI_isBusy ())   // Daten über I2C an WLAN senden &lt;br /&gt;
    I2CTWI_transmitBytes (73&amp;lt;&amp;lt;1, &amp;amp;buffer[0], 9); &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Author:&lt;br /&gt;
Peter Schneider&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 19:37, 22. Feb 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13211</id>
		<title>Wlan</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13211"/>
				<updated>2008-02-23T15:12:57Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Datenaustausch zwischen Roboter und PC via WLAN''' &lt;br /&gt;
&lt;br /&gt;
Ein Erfahrungsbericht:&lt;br /&gt;
&lt;br /&gt;
Im folgenden Bericht möchte ich auf die Möglichkeit eingehen, wie man Daten zwischen PC und Roboter via WLAN austauschen kann. &lt;br /&gt;
Meine Wahl fiel auf das Embedded WLAN Modul der Firma Avisaro. Das Modul kann, je nach Auslieferungszustand via CAN Bus, I2C Bus, SPI oder auch über RS232 Schnittstelle mit dem Roboter kommunizieren. &lt;br /&gt;
Ich habe mich für die Modulversion mit I2C Bus entschieden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Eingesetzte Software / Hardware''&lt;br /&gt;
&lt;br /&gt;
- Roboter RP6 der Firma  AREXX              ( www.arexx.com )&lt;br /&gt;
&lt;br /&gt;
- Borland C++  Compiler auf dem PC          ( www.borland.com )&lt;br /&gt;
&lt;br /&gt;
- PC OS ist Windows XP Home&lt;br /&gt;
&lt;br /&gt;
- Emulations- Software der Firma HWgroup    ( www.hw-group.com )   &lt;br /&gt;
&lt;br /&gt;
- WLAN Adapter der Firma Avisaro            ( www.avisaro.de )&lt;br /&gt;
&lt;br /&gt;
- Einfacher WLAN Router von D-Link &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Beschreibung der Komponenten:''&lt;br /&gt;
&lt;br /&gt;
1)	Das WLAN Modul der Firma Avisaro wird über den I2C Bus auf Seiten des Roboters angesprochen, dabei war es mir wichtig, die vorhandenen Routinen zu nutzen, die mit dem RP6 Roboter mit geliefert werden. Das WLAN Modul ist per default als Slave konfiguriert mit der I2C Adresse 73. Somit müssen die I2C Master Routinen auf dem Roboter benutzt werden. Die Frequenz der I2C Busses habe ich auf 100KHz gelassen. Das WLAN Modul kann auch, via Clock-Stretching, mit höherer Frequenz angesprochen werden &lt;br /&gt;
&lt;br /&gt;
2)	Die Software HW VSP3 „virtual serial port“ der Firma HW-Group wird auf der PC Seite eingesetzt, um die Kommunikation zur PC WLAN Karte zu vereinfachen.  &lt;br /&gt;
&lt;br /&gt;
3)	Es ist Möglich eine Peer zu Peer Verbindung zwischen PC und WLAN Modul aufzubauen. Ich habe aber die Lösung via WLAN Router gewählt. Das WLAN Modul ist Standardmäßig auf die IP Adresse 192.168.0.70 konfiguriert. Auf die Konfiguration des WLAN Moduls via Weboberfläche möchte ich hier nicht eingehen und verweise hiermit auf die mitgelieferte Dokumentation. &lt;br /&gt;
&lt;br /&gt;
Wichtig sind nur folgende Parameter:  &lt;br /&gt;
 	&lt;br /&gt;
-	Netzwerksetup als TCP Server&lt;br /&gt;
&lt;br /&gt;
-	I2C-Bus No ACK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Funktionsbeschreibung:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''PC Seite:''&lt;br /&gt;
&lt;br /&gt;
''Serielle Schnittstelle / Emulations-Software''&lt;br /&gt;
&lt;br /&gt;
Das PC Programm schreibt / liest Daten von und zu einer seriellen Schnittstelle und nicht direkt auf den PC WLAN Adapter.&lt;br /&gt;
Die serielle Schnittstelle wird durch die HW VSP3 Software emuliert und übernimmt Schreiben und Lesen der Daten auf den PC WLAN Adapter. Somit vereinfacht sich die Kommunikation von und zum WLAN Adapter wesentlich, da sich die Kommunikation auf Lesen und Schreiben zur serielle Schnittstelle beschränkt. Hier zu gibt es jede Menge Beispiele im Netz, oder auf der MSDN Webseite bei Microsoft, wie eine serielle Schnittstelle unter Windows XP angesprochen wird.&lt;br /&gt;
Ist das WLAN Modul auf dem Roboter im Netzwerk mit seiner IP Nummer erkannt worden, dann kann via der Emulationssoftware ein COM Port zugewiesen werden  z.B. COM3.&lt;br /&gt;
 &lt;br /&gt;
Die Standardmäßige Einstellung der seriellen Schnittstelle ist, 9600 Baud, 8 Datenbits, 1 Stopbit, No Parity. Es ist an dieser Stelle sehr hilfreich sich das Logfile der Emulations Software anzusehen, da die Parameter der seriellen Schnittestelle herausgeschrieben werden und man sofort erkennt, ob das Modul erfolgreich connected wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Programm auf dem PC''&lt;br /&gt;
Zur Erstellung der PC seitigen Software habe ich Borland C++ benutzt. Die Routinen im Sourcecode sind wie bereits beschrieben von MSDN kopiert und angepasst worden.&lt;br /&gt;
Ich möchte hier nicht so tief auf die Beschreibung des Codes eingehen, dass kann man im angehängten SourceCode viel besser sehen. Das Programm besteht eigentlich nur aus einer lesenden Routine, die Daten aus der seriellen Schnittstelle ausliest und auf dem Bildschirm in einer DOS-Box darstellt. Senden von Daten an den Roboter ist auch möglich und als Funktion hinterlegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Netzwerk:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN-Netz wurde von mir mit den Standardparametern aufgesetzt. Ich habe nur die IP Adresse, die SSID und den Kanal angepasst. WEP / WAP  Verschlüsselung ist möglich und kann via Webpage auf dem WLAN Modul auf dem Roboter eingestellt werden (siehe Dokumentation)   &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roboter Seite:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN Modul:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN Modul wird über den I2C Bus angesprochen, die I2C Adresse habe ich behalten, da die Adresse 73 von keinem anderen I2C Device genutzt wird. &lt;br /&gt;
Wichtig war für mich die fertigen Routinen, die mit den RP6 Libraries geliefert werden, zu benutzen. Dadurch musste ich keine extra Funktionen entwickeln die den Lese / Schreibzugriff auf den I2C Bus ausführen. Allerdings ist zu beachten, dass bei schreibenden Zugriffen auf das WLAN Modul die I2C Adresse um ein Bit verschoben werden muss. Das Bit 0 muss mit einer Null gefüllt werden ( Adr&amp;lt;&amp;lt;1 )&lt;br /&gt;
&lt;br /&gt;
Schwieriger ist der lesenden Zugriff auf das Modul, dazu muss die Adresse ebenfalls um ein Bit verschoben werden und das Bit 0 auf EINS gesetzt werden ( Adr&amp;lt;&amp;lt;1 | 1 ).&lt;br /&gt;
Wichtig:  &lt;br /&gt;
Im Normalfall adressiert man, als ersten Schritt, ein I2C Device und das zu lesende Register von dem man die Daten abholen möchte. Anschließend greift man lesend auf das zuvor adressierte Register des I2C Devices zu.  &lt;br /&gt;
Will man lesend auf das WLAN Modul zugreifen, so habe ich festgestellt, dass man direkt lesend auf die I2C Adresse zugreifen kann, ohne das Device vorher, durch einen Schreibzugriff , zu adressieren. Die ersten zwei Byte, der abgeholten Daten, sind die Länge / Size der auf dem WLAN Modul bereitgestellten Daten. Somit kann man einfach feststellen wie viele Daten aus dem Device ausgelesen werden müssen. Alle Daten müssen aus dem Device abgeholt werden. Siehe auch SourceCode Beispiele. &lt;br /&gt;
Die verwendeten Software-Routinen werden mit dem RP6 Roboter mitgeliefert. Ebenso der verwendete AVR Compiler und dessen Libraries. &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den PC:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;commctrl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 //  ********  Globale Variablen  ********  &lt;br /&gt;
 char          *gszPort;          &lt;br /&gt;
 HANDLE        hCom = NULL;&lt;br /&gt;
 DCB           dcb;&lt;br /&gt;
 COMMTIMEOUTS  ct;&lt;br /&gt;
 bool          CommFlag;&lt;br /&gt;
 bool          ReadOnly;&lt;br /&gt;
 char          string[100];&lt;br /&gt;
 BYTE          data_in[100], data_out, buff[100];&lt;br /&gt;
 int           k, m;&lt;br /&gt;
 DWORD         n;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // ************* COM Port initialisieren ************** &lt;br /&gt;
 int setup_Com_Port ()&lt;br /&gt;
 {&lt;br /&gt;
    gszPort = string;  &lt;br /&gt;
    hCom = CreateFile(gszPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);&lt;br /&gt;
    if (hCom == INVALID_HANDLE_VALUE)&lt;br /&gt;
    {&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error Initialise Port&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    dcb.DCBlength = sizeof(DCB);&lt;br /&gt;
    GetCommState(hCom, &amp;amp;dcb);&lt;br /&gt;
    if (!BuildCommDCB(&amp;quot;baud=9600 parity=N data=8 stop=1&amp;quot;, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error kann Portparameter nicht setzen e.g. 9600 Boud&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
    }&lt;br /&gt;
    if(!SetCommState(hCom, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Cannot set comm state  BCD.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    ct.ReadIntervalTimeout 	   = MAXDWORD;&lt;br /&gt;
    ct.ReadTotalTimeoutConstant    = 0;&lt;br /&gt;
    ct.ReadTotalTimeoutMultiplier  = 1;&lt;br /&gt;
    ct.WriteTotalTimeoutConstant   = 250;&lt;br /&gt;
    ct.WriteTotalTimeoutMultiplier = 1;&lt;br /&gt;
    if(!SetCommTimeouts(hCom, &amp;amp;ct))&lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n \a Cannot set comm timeouts.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
         return 0;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die serielle Schnittstelle'''&lt;br /&gt;
&lt;br /&gt;
 /* *********** Senden der Daten an Serielle Schnittstelle ***** */			&lt;br /&gt;
 void sende_cmd_start (BYTE cmd[10], int howmuch)	// Datenbytes und Anzahl wieviele  Bytes   gesendet werden sollen &lt;br /&gt;
 {		    &lt;br /&gt;
        DWORD  n;    		&lt;br /&gt;
        WriteFile(hCom, &amp;amp;cmd, howmuch, &amp;amp;n, NULL);             &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Von der serielle Schnittstelle Daten auslesen''' &lt;br /&gt;
&lt;br /&gt;
 /* **** Endlos Schleife des Hauptprogramms **** */&lt;br /&gt;
 if (hCom != NULL)&lt;br /&gt;
 {&lt;br /&gt;
  while(CommFlag) 			    // Bearbeiten solange das COM Port offen ist&lt;br /&gt;
  {     &lt;br /&gt;
     ReadFile(hCom, &amp;amp;cmd, 9, &amp;amp;n, NULL); // Daten aus der Schnittstelle auslesen, hier 9 Bytes&lt;br /&gt;
     if(n) 			// Wenn Daten ausgelesen wurden, sichern im Feld  data_in&lt;br /&gt;
     {				// Daten gesichert für weitere Verarbeitung&lt;br /&gt;
         data_in[0] = cmd[0];&lt;br /&gt;
         data_in[1] = cmd[1];  &lt;br /&gt;
         data_in[2] = cmd[2];  &lt;br /&gt;
         data_in[3] = cmd[3];  &lt;br /&gt;
         data_in[4] = cmd[4];  &lt;br /&gt;
         data_in[5] = cmd[5]; &lt;br /&gt;
         data_in[6] = cmd[6];&lt;br /&gt;
         data_in[7] = cmd[7];    &lt;br /&gt;
         data_in[8] = cmd[8];              &lt;br /&gt;
     }        &lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beim verlassen des Programms serielle Schnittstelle schließen'''&lt;br /&gt;
&lt;br /&gt;
 /*   ************ Port schliessen ******* */&lt;br /&gt;
   Sleep (5);&lt;br /&gt;
   CloseHandle(hCom);&lt;br /&gt;
   hCom = NULL;&lt;br /&gt;
   gotoxy (2,32);&lt;br /&gt;
   printf (&amp;quot;\n  Port %s geschlossen &amp;quot;, string);&lt;br /&gt;
   printf (&amp;quot;\n\n Programm beendet &amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den RP6 Roboter:'''&lt;br /&gt;
&lt;br /&gt;
''Auszug aus dem Hauptprogramm:''&lt;br /&gt;
&lt;br /&gt;
 // ISR Handler initialisieren&lt;br /&gt;
 I2CTWI_initMaster(100);      // Initialize the TWI Module for Master operation with 100kHz  SCL Frequency&lt;br /&gt;
 I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);   // Register the event hand	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 // *********************** Main loop ************************************&lt;br /&gt;
 while(true)&lt;br /&gt;
 {		&lt;br /&gt;
   behaviourController();        	// Aufruf der Haupt-Controll-Funktion&lt;br /&gt;
   task_RP6System();             	// Abfrage des ADC, ACS, IRCOMM usw...&lt;br /&gt;
   if (getStopwatch1() &amp;gt; 200)&lt;br /&gt;
   {&lt;br /&gt;
       task_commandProcessor();   	// Abfrage ob ein Commando gesendet wurde&lt;br /&gt;
       setStopwatch1(0); &lt;br /&gt;
   }  &lt;br /&gt;
   task_I2CTWI();                // Call I2C Management routine&lt;br /&gt;
 }  &lt;br /&gt;
 return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Lesen von Daten von der WLAN Karte bereitgestellt über den I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
 // **** Comandos von PC über WLAN Karte einlesen&lt;br /&gt;
 void task_commandProcessor(void)&lt;br /&gt;
 {&lt;br /&gt;
   uint16_t    	size;&lt;br /&gt;
   uint8_t    	messageBuf [100]; &lt;br /&gt;
   size = 0; &lt;br /&gt;
   if(!I2CTWI_isBusy())&lt;br /&gt;
   {    &lt;br /&gt;
      I2CTWI_readBytes (73&amp;lt;&amp;lt;1 | 1, &amp;amp;messageBuf[0],  38); 	// Daten von WLAN Karte einlesen. Hier werden  einfach mal 38 Byte eingelesen&lt;br /&gt;
      size = messageBuf[0]&amp;lt;&amp;lt;8 | messageBuf[1];  // Ermitteln wie viel tatsächlich Byte gesendet                        wurden&lt;br /&gt;
   }         					// Diese Funktion muss noch optimiert werden&lt;br /&gt;
 }&lt;br /&gt;
 //  In dem Feld messageBuf [2]  bis  messageBuf[size]  befinden sich die Daten von PC gesendet &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die WLAN Karte über den  I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
 // Mit folgender Routine können eine belibige Anzahl, hier 9 Byte, an die WLAN Karte gesendet werden &lt;br /&gt;
 // Daten im Feld „buffer“ zur WLAN Karte senden via  I2C  Bus  &lt;br /&gt;
 if (!I2CTWI_isBusy ())   // Daten über I2C an WLAN senden &lt;br /&gt;
    I2CTWI_transmitBytes (73&amp;lt;&amp;lt;1, &amp;amp;buffer[0], 9); &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Author:&lt;br /&gt;
Peter Schneider&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 19:37, 22. Feb 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13210</id>
		<title>Wlan</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13210"/>
				<updated>2008-02-23T14:50:57Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Datenaustausch zwischen Roboter und PC via WLAN''' &lt;br /&gt;
&lt;br /&gt;
Ein Erfahrungsbericht:&lt;br /&gt;
&lt;br /&gt;
Im folgenden Bericht möchte ich auf die Möglichkeit eingehen, wie man Daten zwischen PC und Roboter via WLAN austauschen kann. &lt;br /&gt;
Meine Wahl fiel auf das Embedded WLAN Modul der Firma Avisaro. Das Modul kann, je nach Auslieferungszustand via CAN Bus, I2C Bus, SPI oder auch über RS232 Schnittstelle mit dem Roboter kommunizieren. &lt;br /&gt;
Ich habe mich für die Modulversion mit I2C Bus entschieden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Eingesetzte Software / Hardware''&lt;br /&gt;
&lt;br /&gt;
- Roboter RP6 der Firma  AREXX              ( www.arexx.com )&lt;br /&gt;
&lt;br /&gt;
- Borland C++  Compiler auf dem PC          ( www.borland.com )&lt;br /&gt;
&lt;br /&gt;
- PC OS ist Windows XP Home&lt;br /&gt;
&lt;br /&gt;
- Emulations- Software der Firma HWgroup    ( www.hw-group.com )   &lt;br /&gt;
&lt;br /&gt;
- WLAN Adapter der Firma Avisaro            ( www.avisaro.de )&lt;br /&gt;
&lt;br /&gt;
- Einfacher WLAN Router von D-Link &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Beschreibung der Komponenten:''&lt;br /&gt;
&lt;br /&gt;
1)	Das WLAN Modul der Firma Avisaro wird über den I2C Bus auf Seiten des Roboters angesprochen, dabei war es mir wichtig, die vorhandenen Routinen zu nutzen, die mit dem RP6 Roboter mit geliefert werden. Das WLAN Modul ist per default als Slave konfiguriert mit der I2C Adresse 73. Somit müssen die I2C Master Routinen auf dem Roboter benutzt werden. Die Frequenz der I2C Busses habe ich auf 100KHz gelassen. Das WLAN Modul kann auch, via Clock-Stretching, mit höherer Frequenz angesprochen werden &lt;br /&gt;
&lt;br /&gt;
2)	Die Software HW VSP3 „virtual serial port“ der Firma HW-Group wird auf der PC Seite eingesetzt, um die Kommunikation zur PC WLAN Karte zu vereinfachen.  &lt;br /&gt;
&lt;br /&gt;
3)	Es ist Möglich eine Peer zu Peer Verbindung zwischen PC und WLAN Modul aufzubauen. Ich habe aber die Lösung via WLAN Router gewählt. Das WLAN Modul ist Standardmäßig auf die IP Adresse 192.168.0.70 konfiguriert. Auf die Konfiguration des WLAN Moduls via Weboberfläche möchte ich hier nicht eingehen und verweise hiermit auf die mitgelieferte Dokumentation. &lt;br /&gt;
&lt;br /&gt;
Wichtig sind nur folgende Parameter:  &lt;br /&gt;
 	&lt;br /&gt;
-	Netzwerksetup als TCP Server&lt;br /&gt;
&lt;br /&gt;
-	I2C-Bus No ACK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Funktionsbeschreibung:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''PC Seite:''&lt;br /&gt;
&lt;br /&gt;
''Serielle Schnittstelle / Emulations-Software''&lt;br /&gt;
&lt;br /&gt;
Das PC Programm schreibt / liest Daten von und zu einer seriellen Schnittstelle und nicht direkt auf den PC WLAN Adapter.&lt;br /&gt;
Die serielle Schnittstelle wird durch die HW VSP3 Software emuliert und übernimmt Schreiben und Lesen der Daten auf den PC WLAN Adapter. Somit vereinfacht sich die Kommunikation von und zum WLAN Adapter wesentlich, da sich die Kommunikation auf Lesen und Schreiben zur serielle Schnittstelle beschränkt. Hier zu gibt es jede Menge Beispiele im Netz, oder auf der MSDN Webseite bei Microsoft, wie eine serielle Schnittstelle unter Windows XP angesprochen wird.&lt;br /&gt;
Ist das WLAN Modul auf dem Roboter im Netzwerk mit seiner IP Nummer erkannt worden, dann kann via der Emulationssoftware ein COM Port zugewiesen werden  z.B. COM3.&lt;br /&gt;
 &lt;br /&gt;
Die Standardmäßige Einstellung der seriellen Schnittstelle ist, 9600 Baud, 8 Datenbits, 1 Stopbit, No Parity. Es ist an dieser Stelle sehr hilfreich sich das Logfile der Emulations Software anzusehen, da die Parameter der seriellen Schnittestelle herausgeschrieben werden und man sofort erkennt, ob das Modul erfolgreich connected wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Programm auf dem PC''&lt;br /&gt;
Zur Erstellung der PC seitigen Software habe ich Borland C++ benutzt. Die Routinen im Sourcecode sind wie bereits beschrieben von MSDN kopiert und angepasst worden.&lt;br /&gt;
Ich möchte hier nicht so tief auf die Beschreibung des Codes eingehen, dass kann man im angehängten SourceCode viel besser sehen. Das Programm besteht eigentlich nur aus einer lesenden Routine, die Daten aus der seriellen Schnittstelle ausliest und auf dem Bildschirm in einer DOS-Box darstellt. Senden von Daten an den Roboter ist auch möglich und als Funktion hinterlegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Netzwerk:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN-Netz wurde von mir mit den Standardparametern aufgesetzt. Ich habe nur die IP Adresse, die SSID und den Kanal angepasst. WEP / WAP  Verschlüsselung ist möglich und kann via Webpage auf dem WLAN Modul auf dem Roboter eingestellt werden (siehe Dokumentation)   &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roboter Seite:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN Modul:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN Modul wird über den I2C Bus angesprochen, die I2C Adresse habe ich behalten, da die Adresse 73 von keinem anderen I2C Device genutzt wird. &lt;br /&gt;
Wichtig war für mich die fertigen Routinen, die mit den RP6 Libraries geliefert werden, zu benutzen. Dadurch musste ich keine extra Funktionen entwickeln die den Lese / Schreibzugriff auf den I2C Bus ausführen. Allerdings ist zu beachten, dass bei schreibenden Zugriffen auf das WLAN Modul die I2C Adresse um ein Bit verschoben werden muss. Das Bit 0 muss mit einer Null gefüllt werden ( Adr&amp;lt;&amp;lt;1 )&lt;br /&gt;
&lt;br /&gt;
Schwieriger ist der lesenden Zugriff auf das Modul, dazu muss die Adresse ebenfalls um ein Bit verschoben werden und das Bit 0 auf EINS gesetzt werden ( Adr&amp;lt;&amp;lt;1 | 1 ).&lt;br /&gt;
Wichtig:  &lt;br /&gt;
Im Normalfall adressiert man, als ersten Schritt, ein I2C Device und das zu lesende Register von dem man die Daten abholen möchte. Anschließend greift man lesend auf das zuvor adressierte Register des I2C Devices zu.  &lt;br /&gt;
Will man lesend auf das WLAN Modul zugreifen, so habe ich festgestellt, dass man direkt lesend auf die I2C Adresse zugreifen kann, ohne das Device vorher, durch einen Schreibzugriff , zu adressieren. Die ersten zwei Byte, der abgeholten Daten, sind die Länge / Size der auf dem WLAN Modul bereitgestellten Daten. Somit kann man einfach feststellen wie viele Daten aus dem Device ausgelesen werden müssen. Alle Daten müssen aus dem Device abgeholt werden. Siehe auch SourceCode Beispiele. &lt;br /&gt;
Die verwendeten Software-Routinen werden mit dem RP6 Roboter mitgeliefert. Ebenso der verwendete AVR Compiler und dessen Libraries. &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den PC:'''&lt;br /&gt;
&lt;br /&gt;
Initialisieren der seriellen Schnittstelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;commctrl.h&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//  ********  Globale Variablen  ********  &lt;br /&gt;
&lt;br /&gt;
char          *gszPort;          &lt;br /&gt;
HANDLE        hCom = NULL;&lt;br /&gt;
DCB           dcb;&lt;br /&gt;
COMMTIMEOUTS  ct;&lt;br /&gt;
bool          CommFlag;&lt;br /&gt;
bool          ReadOnly;&lt;br /&gt;
char          string[100];&lt;br /&gt;
BYTE          data_in[100], data_out, buff[100];&lt;br /&gt;
int           k, m;&lt;br /&gt;
DWORD         n;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ************* COM Port initialisieren ************** &lt;br /&gt;
int setup_Com_Port ()&lt;br /&gt;
{&lt;br /&gt;
    gszPort = string;  &lt;br /&gt;
    hCom = CreateFile(gszPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);&lt;br /&gt;
    if (hCom == INVALID_HANDLE_VALUE)&lt;br /&gt;
    {&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error Initialise Port&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    dcb.DCBlength = sizeof(DCB);&lt;br /&gt;
    GetCommState(hCom, &amp;amp;dcb);&lt;br /&gt;
    if (!BuildCommDCB(&amp;quot;baud=9600 parity=N data=8 stop=1&amp;quot;, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error kann Portparameter nicht setzen e.g. 9600 Boud&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
    }&lt;br /&gt;
    if(!SetCommState(hCom, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Cannot set comm state  BCD.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    ct.ReadIntervalTimeout 	   = MAXDWORD;&lt;br /&gt;
    ct.ReadTotalTimeoutConstant    = 0;&lt;br /&gt;
    ct.ReadTotalTimeoutMultiplier  = 1;&lt;br /&gt;
    ct.WriteTotalTimeoutConstant   = 250;&lt;br /&gt;
    ct.WriteTotalTimeoutMultiplier = 1;&lt;br /&gt;
    if(!SetCommTimeouts(hCom, &amp;amp;ct))&lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n \a Cannot set comm timeouts.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
         return 0;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die serielle Schnittstelle'''&lt;br /&gt;
&lt;br /&gt;
/* *********** Senden der Daten an Serielle Schnittstelle ***** */	&lt;br /&gt;
			&lt;br /&gt;
void sende_cmd_start (BYTE cmd[10], int howmuch)	// Datenbytes und Anzahl wieviele Bytes   gesendet werden sollen &lt;br /&gt;
&lt;br /&gt;
{		    &lt;br /&gt;
        DWORD  n;    		&lt;br /&gt;
        WriteFile(hCom, &amp;amp;cmd, howmuch, &amp;amp;n, NULL);             &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Von der serielle Schnittstelle Daten auslesen''' &lt;br /&gt;
&lt;br /&gt;
/* **** Endlos Schleife des Hauptprogramms **** */&lt;br /&gt;
&lt;br /&gt;
 if (hCom != NULL)&lt;br /&gt;
 {&lt;br /&gt;
  while(CommFlag) 			    // Bearbeiten solange das COM Port offen ist&lt;br /&gt;
  {     &lt;br /&gt;
     ReadFile(hCom, &amp;amp;cmd, 9, &amp;amp;n, NULL); // Daten aus der Schnittstelle auslesen, hier 9 Bytes&lt;br /&gt;
     if(n) 			// Wenn Daten ausgelesen wurden, sichern im Feld  data_in&lt;br /&gt;
     {				// Daten gesichert für weitere Verarbeitung&lt;br /&gt;
         data_in[0] = cmd[0];&lt;br /&gt;
         data_in[1] = cmd[1];  &lt;br /&gt;
         data_in[2] = cmd[2];  &lt;br /&gt;
         data_in[3] = cmd[3];  &lt;br /&gt;
         data_in[4] = cmd[4];  &lt;br /&gt;
         data_in[5] = cmd[5]; &lt;br /&gt;
         data_in[6] = cmd[6];&lt;br /&gt;
         data_in[7] = cmd[7];    &lt;br /&gt;
         data_in[8] = cmd[8];              &lt;br /&gt;
     }        &lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beim verlassen des Programms serielle Schnittstelle schließen'''&lt;br /&gt;
&lt;br /&gt;
/*   ************ Port schliessen ******* */&lt;br /&gt;
   Sleep (5);&lt;br /&gt;
   CloseHandle(hCom);&lt;br /&gt;
   hCom = NULL;&lt;br /&gt;
   gotoxy (2,32);&lt;br /&gt;
   printf (&amp;quot;\n  Port %s geschlossen &amp;quot;, string);&lt;br /&gt;
   printf (&amp;quot;\n\n Programm beendet &amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den RP6 Roboter:'''&lt;br /&gt;
&lt;br /&gt;
''Auszug aus dem Hauptprogramm:''&lt;br /&gt;
I2CTWI_initMaster(100);      // Initialize the TWI Module for Master operation with 100kHz SCL Frequency&lt;br /&gt;
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);   // Register the event hand	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// *********************** Main loop ************************************&lt;br /&gt;
&lt;br /&gt;
while(true)&lt;br /&gt;
 &lt;br /&gt;
{		&lt;br /&gt;
   behaviourController();        	// Aufruf der Haupt-Controll-Funktion&lt;br /&gt;
   task_RP6System();             	// Abfrage des ADC, ACS, IRCOMM usw...&lt;br /&gt;
   if (getStopwatch1() &amp;gt; 200)&lt;br /&gt;
   {&lt;br /&gt;
       task_commandProcessor();   	// Abfrage ob ein Commando gesendet wurde&lt;br /&gt;
       setStopwatch1(0); &lt;br /&gt;
   }  &lt;br /&gt;
   task_I2CTWI();                // Call I2C Management routine&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Lesen von Daten von der WLAN Karte bereitgestellt über den I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
// **** Comandos von PC über WLAN Karte einlesen&lt;br /&gt;
&lt;br /&gt;
void task_commandProcessor(void)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
   uint16_t    	size;&lt;br /&gt;
   uint8_t    	messageBuf [100]; &lt;br /&gt;
   size = 0; &lt;br /&gt;
   if(!I2CTWI_isBusy())&lt;br /&gt;
   {    &lt;br /&gt;
      I2CTWI_readBytes (73&amp;lt;&amp;lt;1 | 1, &amp;amp;messageBuf[0],  38); 	// Daten von WLAN Karte einlesen. Hier werden  einfach mal 38 Byte eingelesen&lt;br /&gt;
      size = messageBuf[0]&amp;lt;&amp;lt;8 | messageBuf[1];  // Ermitteln wie viel tatsächlich Byte gesendet                        wurden&lt;br /&gt;
   }         					// Diese Funktion muss noch optimiert werden&lt;br /&gt;
}&lt;br /&gt;
//  In dem Feld messageBuf [2]  bis  messageBuf[size]  befinden sich die Daten von PC gesendet &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die WLAN Karte über den  I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
// Mit folgender Routine können eine belibige Anzahl, hier 9 Byte, an die WLAN Karte gesendet werden &lt;br /&gt;
// Daten im Feld „buffer“ zur WLAN Karte senden via  I2C  Bus  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if (!I2CTWI_isBusy ())   // Daten über I2C an WLAN senden &lt;br /&gt;
    I2CTWI_transmitBytes (73&amp;lt;&amp;lt;1, &amp;amp;buffer[0], 9); &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Author:&lt;br /&gt;
Peter Schneider&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 19:37, 22. Feb 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13209</id>
		<title>Wlan</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13209"/>
				<updated>2008-02-22T18:56:32Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Datenaustausch zwischen Roboter und PC via WLAN''' &lt;br /&gt;
&lt;br /&gt;
Ein Erfahrungsbericht:&lt;br /&gt;
&lt;br /&gt;
Im folgenden Bericht möchte ich auf die Möglichkeit eingehen, wie man Daten zwischen PC und Roboter via WLAN austauschen kann. &lt;br /&gt;
Meine Wahl fiel auf das Embedded WLAN Modul der Firma Avisaro. Das Modul kann, je nach Auslieferungszustand via CAN Bus, I2C Bus, SPI oder auch über RS232 Schnittstelle mit dem Roboter kommunizieren. &lt;br /&gt;
Ich habe mich für die Modulversion mit I2C Bus entschieden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Eingesetzte Software / Hardware''&lt;br /&gt;
&lt;br /&gt;
- Roboter RP6 der Firma  AREXX              ( www.arexx.com )&lt;br /&gt;
&lt;br /&gt;
- Borland C++  Compiler auf dem PC          ( www.borland.com )&lt;br /&gt;
&lt;br /&gt;
- PC OS ist Windows XP Home&lt;br /&gt;
&lt;br /&gt;
- Emulations- Software der Firma HWgroup    ( www.hw-group.com )   &lt;br /&gt;
&lt;br /&gt;
- WLAN Adapter der Firma Avisaro            ( www.avisaro.de )&lt;br /&gt;
&lt;br /&gt;
- Einfacher WLAN Router von D-Link &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Beschreibung der Komponenten:''&lt;br /&gt;
&lt;br /&gt;
1)	Das WLAN Modul der Firma Avisaro wird über den I2C Bus auf Seiten des Roboters angesprochen, dabei war es mir wichtig, die vorhandenen Routinen zu nutzen, die mit dem RP6 Roboter mit geliefert werden. Das WLAN Modul ist per default als Slave konfiguriert mit der I2C Adresse 73. Somit müssen die I2C Master Routinen auf dem Roboter benutzt werden. Die Frequenz der I2C Busses habe ich auf 100KHz gelassen. Das WLAN Modul kann auch, via Clock-Stretching, mit höherer Frequenz angesprochen werden &lt;br /&gt;
&lt;br /&gt;
2)	Die Software HW VSP3 „virtual serial port“ der Firma HW-Group wird auf der PC Seite eingesetzt, um die Kommunikation zur PC WLAN Karte zu vereinfachen.  &lt;br /&gt;
&lt;br /&gt;
3)	Es ist Möglich eine Peer zu Peer Verbindung zwischen PC und WLAN Modul aufzubauen. Ich habe aber die Lösung via WLAN Router gewählt. Das WLAN Modul ist Standardmäßig auf die IP Adresse 192.168.0.70 konfiguriert. Auf die Konfiguration des WLAN Moduls via Weboberfläche möchte ich hier nicht eingehen und verweise hiermit auf die mitgelieferte Dokumentation. &lt;br /&gt;
&lt;br /&gt;
Wichtig sind nur folgende Parameter:  &lt;br /&gt;
 	&lt;br /&gt;
-	Netzwerksetup als TCP Server&lt;br /&gt;
&lt;br /&gt;
-	I2C-Bus No ACK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Funktionsbeschreibung:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''PC Seite:''&lt;br /&gt;
&lt;br /&gt;
''Serielle Schnittstelle / Emulations-Software''&lt;br /&gt;
&lt;br /&gt;
Das PC Programm schreibt / liest Daten von und zu einer seriellen Schnittstelle und nicht direkt auf den PC WLAN Adapter.&lt;br /&gt;
Die serielle Schnittstelle wird durch die HW VSP3 Software emuliert und übernimmt Schreiben und Lesen der Daten auf den PC WLAN Adapter. Somit vereinfacht sich die Kommunikation von und zum WLAN Adapter wesentlich, da sich die Kommunikation auf Lesen und Schreiben zur serielle Schnittstelle beschränkt. Hier zu gibt es jede Menge Beispiele im Netz, oder auf der MSDN Webseite bei Microsoft, wie eine serielle Schnittstelle unter Windows XP angesprochen wird.&lt;br /&gt;
Ist das WLAN Modul auf dem Roboter im Netzwerk mit seiner IP Nummer erkannt worden, dann kann via der Emulationssoftware ein COM Port zugewiesen werden  z.B. COM3.&lt;br /&gt;
 &lt;br /&gt;
Die Standardmäßige Einstellung der seriellen Schnittstelle ist, 9600 Baud, 8 Datenbits, 1 Stopbit, No Parity. Es ist an dieser Stelle sehr hilfreich sich das Logfile der Emulations Software anzusehen, da die Parameter der seriellen Schnittestelle herausgeschrieben werden und man sofort erkennt, ob das Modul erfolgreich connected wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Programm auf dem PC''&lt;br /&gt;
Zur Erstellung der PC seitigen Software habe ich Borland C++ benutzt. Die Routinen im Sourcecode sind wie bereits beschrieben von MSDN kopiert und angepasst worden.&lt;br /&gt;
Ich möchte hier nicht so tief auf die Beschreibung des Codes eingehen, dass kann man im angehängten SourceCode viel besser sehen. Das Programm besteht eigentlich nur aus einer lesenden Routine, die Daten aus der seriellen Schnittstelle ausliest und auf dem Bildschirm in einer DOS-Box darstellt. Senden von Daten an den Roboter ist auch möglich und als Funktion hinterlegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Netzwerk:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN-Netz wurde von mir mit den Standardparametern aufgesetzt. Ich habe nur die IP Adresse, die SSID und den Kanal angepasst. WEP / WAP  Verschlüsselung ist möglich und kann via Webpage auf dem WLAN Modul auf dem Roboter eingestellt werden (siehe Dokumentation)   &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roboter Seite:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN Modul:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN Modul wird über den I2C Bus angesprochen, die I2C Adresse habe ich behalten, da die Adresse 73 von keinem anderen I2C Device genutzt wird. &lt;br /&gt;
Wichtig war für mich die fertigen Routinen, die mit den RP6 Libraries geliefert werden, zu benutzen. Dadurch musste ich keine extra Funktionen entwickeln die den Lese / Schreibzugriff auf den I2C Bus ausführen. Allerdings ist zu beachten, dass bei schreibenden Zugriffen auf das WLAN Modul die I2C Adresse um ein Bit verschoben werden muss. Das Bit 0 muss mit einer Null gefüllt werden ( Adr&amp;lt;&amp;lt;1 )&lt;br /&gt;
&lt;br /&gt;
Schwieriger ist der lesenden Zugriff auf das Modul, dazu muss die Adresse ebenfalls um ein Bit verschoben werden und das Bit 0 auf EINS gesetzt werden ( Adr&amp;lt;&amp;lt;1 | 1 ).&lt;br /&gt;
Wichtig:  &lt;br /&gt;
Im Normalfall adressiert man, als ersten Schritt, ein I2C Device und das zu lesende Register von dem man die Daten abholen möchte. Anschließend greift man lesend auf das zuvor adressierte Register des I2C Devices zu.  &lt;br /&gt;
Will man lesend auf das WLAN Modul zugreifen, so habe ich festgestellt, dass man direkt lesend auf die I2C Adresse zugreifen kann, ohne das Device vorher, durch einen Schreibzugriff , zu adressieren. Die ersten zwei Byte, der abgeholten Daten, sind die Länge / Size der auf dem WLAN Modul bereitgestellten Daten. Somit kann man einfach feststellen wie viele Daten aus dem Device ausgelesen werden müssen. Alle Daten müssen aus dem Device abgeholt werden. Siehe auch SourceCode Beispiele. &lt;br /&gt;
Die verwendeten Software-Routinen werden mit dem RP6 Roboter mitgeliefert. Ebenso der verwendete AVR Compiler und dessen Libraries. &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den PC:'''&lt;br /&gt;
&lt;br /&gt;
Initialisieren der seriellen Schnittstelle:&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;commctrl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*  ********  Globale Variablen  ********  */&lt;br /&gt;
&lt;br /&gt;
char          *gszPort;          &lt;br /&gt;
&lt;br /&gt;
HANDLE        hCom = NULL;&lt;br /&gt;
&lt;br /&gt;
DCB           dcb;&lt;br /&gt;
&lt;br /&gt;
COMMTIMEOUTS  ct;&lt;br /&gt;
&lt;br /&gt;
bool          CommFlag;&lt;br /&gt;
&lt;br /&gt;
bool          ReadOnly;&lt;br /&gt;
&lt;br /&gt;
char          string[100];&lt;br /&gt;
&lt;br /&gt;
BYTE          data_in[100], data_out, buff[100];&lt;br /&gt;
&lt;br /&gt;
int           k, m;&lt;br /&gt;
&lt;br /&gt;
DWORD         n;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ************* COM Port initialisieren ************** */&lt;br /&gt;
&lt;br /&gt;
int setup_Com_Port ()&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    gszPort = string;  &lt;br /&gt;
    hCom = CreateFile(gszPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);&lt;br /&gt;
    if (hCom == INVALID_HANDLE_VALUE)&lt;br /&gt;
    {&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error Initialise Port&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    dcb.DCBlength = sizeof(DCB);&lt;br /&gt;
    GetCommState(hCom, &amp;amp;dcb);&lt;br /&gt;
    if (!BuildCommDCB(&amp;quot;baud=9600 parity=N data=8 stop=1&amp;quot;, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error kann Portparameter nicht setzen e.g. 9600 Boud&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
    }&lt;br /&gt;
    if(!SetCommState(hCom, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Cannot set comm state  BCD.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    ct.ReadIntervalTimeout 	   = MAXDWORD;&lt;br /&gt;
    ct.ReadTotalTimeoutConstant    = 0;&lt;br /&gt;
    ct.ReadTotalTimeoutMultiplier  = 1;&lt;br /&gt;
    ct.WriteTotalTimeoutConstant   = 250;&lt;br /&gt;
    ct.WriteTotalTimeoutMultiplier = 1;&lt;br /&gt;
    if(!SetCommTimeouts(hCom, &amp;amp;ct))&lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n \a Cannot set comm timeouts.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
         return 0;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die serielle Schnittstelle'''&lt;br /&gt;
&lt;br /&gt;
/* *********** Senden der Daten an Serielle Schnittstelle ***** */	&lt;br /&gt;
			&lt;br /&gt;
void sende_cmd_start (BYTE cmd[10], int howmuch)	// Datenbytes und Anzahl wieviele Bytes   gesendet werden sollen &lt;br /&gt;
&lt;br /&gt;
{		    &lt;br /&gt;
        DWORD  n;    		&lt;br /&gt;
        WriteFile(hCom, &amp;amp;cmd, howmuch, &amp;amp;n, NULL);             &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Von der serielle Schnittstelle Daten auslesen''' &lt;br /&gt;
&lt;br /&gt;
/* **** Endlos Schleife des Hauptprogramms **** */&lt;br /&gt;
&lt;br /&gt;
 if (hCom != NULL)&lt;br /&gt;
 {&lt;br /&gt;
  while(CommFlag) 			    // Bearbeiten solange das COM Port offen ist&lt;br /&gt;
  {     &lt;br /&gt;
     ReadFile(hCom, &amp;amp;cmd, 9, &amp;amp;n, NULL); // Daten aus der Schnittstelle auslesen, hier 9 Bytes&lt;br /&gt;
     if(n) 			// Wenn Daten ausgelesen wurden, sichern im Feld  data_in&lt;br /&gt;
     {				// Daten gesichert für weitere Verarbeitung&lt;br /&gt;
         data_in[0] = cmd[0];&lt;br /&gt;
         data_in[1] = cmd[1];  &lt;br /&gt;
         data_in[2] = cmd[2];  &lt;br /&gt;
         data_in[3] = cmd[3];  &lt;br /&gt;
         data_in[4] = cmd[4];  &lt;br /&gt;
         data_in[5] = cmd[5]; &lt;br /&gt;
         data_in[6] = cmd[6];&lt;br /&gt;
         data_in[7] = cmd[7];    &lt;br /&gt;
         data_in[8] = cmd[8];              &lt;br /&gt;
     }        &lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beim verlassen des Programms serielle Schnittstelle schließen'''&lt;br /&gt;
&lt;br /&gt;
/*   ************ Port schliessen ******* */&lt;br /&gt;
   Sleep (5);&lt;br /&gt;
   CloseHandle(hCom);&lt;br /&gt;
   hCom = NULL;&lt;br /&gt;
   gotoxy (2,32);&lt;br /&gt;
   printf (&amp;quot;\n  Port %s geschlossen &amp;quot;, string);&lt;br /&gt;
   printf (&amp;quot;\n\n Programm beendet &amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den RP6 Roboter:'''&lt;br /&gt;
&lt;br /&gt;
''Auszug aus dem Hauptprogramm:''&lt;br /&gt;
I2CTWI_initMaster(100);      // Initialize the TWI Module for Master operation with 100kHz SCL Frequency&lt;br /&gt;
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);   // Register the event hand	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// *********************** Main loop ************************************&lt;br /&gt;
&lt;br /&gt;
while(true)&lt;br /&gt;
 &lt;br /&gt;
{		&lt;br /&gt;
   behaviourController();        	// Aufruf der Haupt-Controll-Funktion&lt;br /&gt;
   task_RP6System();             	// Abfrage des ADC, ACS, IRCOMM usw...&lt;br /&gt;
   if (getStopwatch1() &amp;gt; 200)&lt;br /&gt;
   {&lt;br /&gt;
       task_commandProcessor();   	// Abfrage ob ein Commando gesendet wurde&lt;br /&gt;
       setStopwatch1(0); &lt;br /&gt;
   }  &lt;br /&gt;
   task_I2CTWI();                // Call I2C Management routine&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Lesen von Daten von der WLAN Karte bereitgestellt über den I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
// **** Comandos von PC über WLAN Karte einlesen&lt;br /&gt;
&lt;br /&gt;
void task_commandProcessor(void)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
   uint16_t    	size;&lt;br /&gt;
   uint8_t    	messageBuf [100]; &lt;br /&gt;
   size = 0; &lt;br /&gt;
   if(!I2CTWI_isBusy())&lt;br /&gt;
   {    &lt;br /&gt;
      I2CTWI_readBytes (73&amp;lt;&amp;lt;1 | 1, &amp;amp;messageBuf[0],  38); 	// Daten von WLAN Karte einlesen. Hier werden  einfach mal 38 Byte eingelesen&lt;br /&gt;
      size = messageBuf[0]&amp;lt;&amp;lt;8 | messageBuf[1];  // Ermitteln wie viel tatsächlich Byte gesendet                        wurden&lt;br /&gt;
   }         					// Diese Funktion muss noch optimiert werden&lt;br /&gt;
}&lt;br /&gt;
//  In dem Feld messageBuf [2]  bis  messageBuf[size]  befinden sich die Daten von PC gesendet &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die WLAN Karte über den  I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
// Mit folgender Routine können eine belibige Anzahl, hier 9 Byte, an die WLAN Karte gesendet werden &lt;br /&gt;
// Daten im Feld „buffer“ zur WLAN Karte senden via  I2C  Bus  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if (!I2CTWI_isBusy ())   // Daten über I2C an WLAN senden &lt;br /&gt;
    I2CTWI_transmitBytes (73&amp;lt;&amp;lt;1, &amp;amp;buffer[0], 9); &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Author:&lt;br /&gt;
Peter Schneider&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|cb2sn43]] 19:37, 22. Feb 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13208</id>
		<title>Wlan</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Wlan&amp;diff=13208"/>
				<updated>2008-02-22T18:54:03Z</updated>
		
		<summary type="html">&lt;p&gt;Cb2sn43: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Datenaustausch zwischen Roboter und PC via WLAN''' &lt;br /&gt;
&lt;br /&gt;
Ein Erfahrungsbericht:&lt;br /&gt;
&lt;br /&gt;
Im folgenden Bericht möchte ich auf die Möglichkeit eingehen, wie man Daten zwischen PC und Roboter via WLAN austauschen kann. &lt;br /&gt;
Meine Wahl fiel auf das Embedded WLAN Modul der Firma Avisaro. Das Modul kann, je nach Auslieferungszustand via CAN Bus, I2C Bus, SPI oder auch über RS232 Schnittstelle mit dem Roboter kommunizieren. &lt;br /&gt;
Ich habe mich für die Modulversion mit I2C Bus entschieden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Eingesetzte Software / Hardware''&lt;br /&gt;
&lt;br /&gt;
- Roboter RP6 der Firma  AREXX              ( www.arexx.com )&lt;br /&gt;
&lt;br /&gt;
- Borland C++  Compiler auf dem PC          ( www.borland.com )&lt;br /&gt;
&lt;br /&gt;
- PC OS ist Windows XP Home&lt;br /&gt;
&lt;br /&gt;
- Emulations- Software der Firma HWgroup    ( www.hw-group.com )   &lt;br /&gt;
&lt;br /&gt;
- WLAN Adapter der Firma Avisaro            ( www.avisaro.de )&lt;br /&gt;
&lt;br /&gt;
- Einfacher WLAN Router von D-Link &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Beschreibung der Komponenten:''&lt;br /&gt;
&lt;br /&gt;
1)	Das WLAN Modul der Firma Avisaro wird über den I2C Bus auf Seiten des Roboters angesprochen, dabei war es mir wichtig, die vorhandenen Routinen zu nutzen, die mit dem RP6 Roboter mit geliefert werden. Das WLAN Modul ist per default als Slave konfiguriert mit der I2C Adresse 73. Somit müssen die I2C Master Routinen auf dem Roboter benutzt werden. Die Frequenz der I2C Busses habe ich auf 100KHz gelassen. Das WLAN Modul kann auch, via Clock-Stretching, mit höherer Frequenz angesprochen werden &lt;br /&gt;
&lt;br /&gt;
2)	Die Software HW VSP3 „virtual serial port“ der Firma HW-Group wird auf der PC Seite eingesetzt, um die Kommunikation zur PC WLAN Karte zu vereinfachen.  &lt;br /&gt;
&lt;br /&gt;
3)	Es ist Möglich eine Peer zu Peer Verbindung zwischen PC und WLAN Modul aufzubauen. Ich habe aber die Lösung via WLAN Router gewählt. Das WLAN Modul ist Standardmäßig auf die IP Adresse 192.168.0.70 konfiguriert. Auf die Konfiguration des WLAN Moduls via Weboberfläche möchte ich hier nicht eingehen und verweise hiermit auf die mitgelieferte Dokumentation. &lt;br /&gt;
&lt;br /&gt;
Wichtig sind nur folgende Parameter:  &lt;br /&gt;
 	&lt;br /&gt;
-	Netzwerksetup als TCP Server&lt;br /&gt;
&lt;br /&gt;
-	I2C-Bus No ACK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Funktionsbeschreibung:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''PC Seite:''&lt;br /&gt;
&lt;br /&gt;
''Serielle Schnittstelle / Emulations-Software''&lt;br /&gt;
&lt;br /&gt;
Das PC Programm schreibt / liest Daten von und zu einer seriellen Schnittstelle und nicht direkt auf den PC WLAN Adapter.&lt;br /&gt;
Die serielle Schnittstelle wird durch die HW VSP3 Software emuliert und übernimmt Schreiben und Lesen der Daten auf den PC WLAN Adapter. Somit vereinfacht sich die Kommunikation von und zum WLAN Adapter wesentlich, da sich die Kommunikation auf Lesen und Schreiben zur serielle Schnittstelle beschränkt. Hier zu gibt es jede Menge Beispiele im Netz, oder auf der MSDN Webseite bei Microsoft, wie eine serielle Schnittstelle unter Windows XP angesprochen wird.&lt;br /&gt;
Ist das WLAN Modul auf dem Roboter im Netzwerk mit seiner IP Nummer erkannt worden, dann kann via der Emulationssoftware ein COM Port zugewiesen werden  z.B. COM3.&lt;br /&gt;
 &lt;br /&gt;
Die Standardmäßige Einstellung der seriellen Schnittstelle ist, 9600 Baud, 8 Datenbits, 1 Stopbit, No Parity. Es ist an dieser Stelle sehr hilfreich sich das Logfile der Emulations Software anzusehen, da die Parameter der seriellen Schnittestelle herausgeschrieben werden und man sofort erkennt, ob das Modul erfolgreich connected wurde.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Programm auf dem PC''&lt;br /&gt;
Zur Erstellung der PC seitigen Software habe ich Borland C++ benutzt. Die Routinen im Sourcecode sind wie bereits beschrieben von MSDN kopiert und angepasst worden.&lt;br /&gt;
Ich möchte hier nicht so tief auf die Beschreibung des Codes eingehen, dass kann man im angehängten SourceCode viel besser sehen. Das Programm besteht eigentlich nur aus einer lesenden Routine, die Daten aus der seriellen Schnittstelle ausliest und auf dem Bildschirm in einer DOS-Box darstellt. Senden von Daten an den Roboter ist auch möglich und als Funktion hinterlegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Netzwerk:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN-Netz wurde von mir mit den Standardparametern aufgesetzt. Ich habe nur die IP Adresse, die SSID und den Kanal angepasst. WEP / WAP  Verschlüsselung ist möglich und kann via Webpage auf dem WLAN Modul auf dem Roboter eingestellt werden (siehe Dokumentation)   &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Roboter Seite:'''&lt;br /&gt;
&lt;br /&gt;
''WLAN Modul:''&lt;br /&gt;
&lt;br /&gt;
Das WLAN Modul wird über den I2C Bus angesprochen, die I2C Adresse habe ich behalten, da die Adresse 73 von keinem anderen I2C Device genutzt wird. &lt;br /&gt;
Wichtig war für mich die fertigen Routinen, die mit den RP6 Libraries geliefert werden, zu benutzen. Dadurch musste ich keine extra Funktionen entwickeln die den Lese / Schreibzugriff auf den I2C Bus ausführen. Allerdings ist zu beachten, dass bei schreibenden Zugriffen auf das WLAN Modul die I2C Adresse um ein Bit verschoben werden muss. Das Bit 0 muss mit einer Null gefüllt werden ( Adr&amp;lt;&amp;lt;1 )&lt;br /&gt;
&lt;br /&gt;
Schwieriger ist der lesenden Zugriff auf das Modul, dazu muss die Adresse ebenfalls um ein Bit verschoben werden und das Bit 0 auf EINS gesetzt werden ( Adr&amp;lt;&amp;lt;1 | 1 ).&lt;br /&gt;
Wichtig:  &lt;br /&gt;
Im Normalfall adressiert man, als ersten Schritt, ein I2C Device und das zu lesende Register von dem man die Daten abholen möchte. Anschließend greift man lesend auf das zuvor adressierte Register des I2C Devices zu.  &lt;br /&gt;
Will man lesend auf das WLAN Modul zugreifen, so habe ich festgestellt, dass man direkt lesend auf die I2C Adresse zugreifen kann, ohne das Device vorher, durch einen Schreibzugriff , zu adressieren. Die ersten zwei Byte, der abgeholten Daten, sind die Länge / Size der auf dem WLAN Modul bereitgestellten Daten. Somit kann man einfach feststellen wie viele Daten aus dem Device ausgelesen werden müssen. Alle Daten müssen aus dem Device abgeholt werden. Siehe auch SourceCode Beispiele. &lt;br /&gt;
Die verwendeten Software-Routinen werden mit dem RP6 Roboter mitgeliefert. Ebenso der verwendete AVR Compiler und dessen Libraries. &lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den PC:'''&lt;br /&gt;
&lt;br /&gt;
Initialisieren der seriellen Schnittstelle:&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;conio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;commctrl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*  ********  Globale Variablen  ********  */&lt;br /&gt;
&lt;br /&gt;
char          *gszPort;          &lt;br /&gt;
&lt;br /&gt;
HANDLE        hCom = NULL;&lt;br /&gt;
&lt;br /&gt;
DCB           dcb;&lt;br /&gt;
&lt;br /&gt;
COMMTIMEOUTS  ct;&lt;br /&gt;
&lt;br /&gt;
bool          CommFlag;&lt;br /&gt;
&lt;br /&gt;
bool          ReadOnly;&lt;br /&gt;
&lt;br /&gt;
char          string[100];&lt;br /&gt;
&lt;br /&gt;
BYTE          data_in[100], data_out, buff[100];&lt;br /&gt;
&lt;br /&gt;
int           k, m;&lt;br /&gt;
&lt;br /&gt;
DWORD         n;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* ************* COM Port initialisieren ************** */&lt;br /&gt;
&lt;br /&gt;
int setup_Com_Port ()&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    gszPort = string;  &lt;br /&gt;
    hCom = CreateFile(gszPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);&lt;br /&gt;
    if (hCom == INVALID_HANDLE_VALUE)&lt;br /&gt;
    {&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error Initialise Port&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    dcb.DCBlength = sizeof(DCB);&lt;br /&gt;
    GetCommState(hCom, &amp;amp;dcb);&lt;br /&gt;
    if (!BuildCommDCB(&amp;quot;baud=9600 parity=N data=8 stop=1&amp;quot;, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Error kann Portparameter nicht setzen e.g. 9600 Boud&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
    }&lt;br /&gt;
    if(!SetCommState(hCom, &amp;amp;dcb)) &lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n\n \a Cannot set comm state  BCD.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    ct.ReadIntervalTimeout 	   = MAXDWORD;&lt;br /&gt;
    ct.ReadTotalTimeoutConstant    = 0;&lt;br /&gt;
    ct.ReadTotalTimeoutMultiplier  = 1;&lt;br /&gt;
    ct.WriteTotalTimeoutConstant   = 250;&lt;br /&gt;
    ct.WriteTotalTimeoutMultiplier = 1;&lt;br /&gt;
    if(!SetCommTimeouts(hCom, &amp;amp;ct))&lt;br /&gt;
    {&lt;br /&gt;
        CloseHandle(hCom);&lt;br /&gt;
        hCom = NULL;&lt;br /&gt;
        printf (&amp;quot;\n \a Cannot set comm timeouts.\n&amp;quot;);&lt;br /&gt;
        CommFlag = false;&lt;br /&gt;
         return 0;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die serielle Schnittstelle'''&lt;br /&gt;
&lt;br /&gt;
/* *********** Senden der Daten an Serielle Schnittstelle ***** */	&lt;br /&gt;
			&lt;br /&gt;
void sende_cmd_start (BYTE cmd[10], int howmuch)	// Datenbytes und Anzahl wieviele Bytes   gesendet werden sollen &lt;br /&gt;
&lt;br /&gt;
{		    &lt;br /&gt;
        DWORD  n;    		&lt;br /&gt;
        WriteFile(hCom, &amp;amp;cmd, howmuch, &amp;amp;n, NULL);             &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Von der serielle Schnittstelle Daten auslesen''' &lt;br /&gt;
&lt;br /&gt;
/* **** Endlos Schleife des Hauptprogramms **** */&lt;br /&gt;
&lt;br /&gt;
 if (hCom != NULL)&lt;br /&gt;
 {&lt;br /&gt;
  while(CommFlag) 			    // Bearbeiten solange das COM Port offen ist&lt;br /&gt;
  {     &lt;br /&gt;
     ReadFile(hCom, &amp;amp;cmd, 9, &amp;amp;n, NULL); // Daten aus der Schnittstelle auslesen, hier 9 Bytes&lt;br /&gt;
     if(n) 			// Wenn Daten ausgelesen wurden, sichern im Feld  data_in&lt;br /&gt;
     {				// Daten gesichert für weitere Verarbeitung&lt;br /&gt;
         data_in[0] = cmd[0];&lt;br /&gt;
         data_in[1] = cmd[1];  &lt;br /&gt;
         data_in[2] = cmd[2];  &lt;br /&gt;
         data_in[3] = cmd[3];  &lt;br /&gt;
         data_in[4] = cmd[4];  &lt;br /&gt;
         data_in[5] = cmd[5]; &lt;br /&gt;
         data_in[6] = cmd[6];&lt;br /&gt;
         data_in[7] = cmd[7];    &lt;br /&gt;
         data_in[8] = cmd[8];              &lt;br /&gt;
     }        &lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beim verlassen des Programms serielle Schnittstelle schließen'''&lt;br /&gt;
&lt;br /&gt;
/*   ************ Port schliessen ******* */&lt;br /&gt;
   Sleep (5);&lt;br /&gt;
   CloseHandle(hCom);&lt;br /&gt;
   hCom = NULL;&lt;br /&gt;
   gotoxy (2,32);&lt;br /&gt;
   printf (&amp;quot;\n  Port %s geschlossen &amp;quot;, string);&lt;br /&gt;
   printf (&amp;quot;\n\n Programm beendet &amp;quot;);&lt;br /&gt;
   return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Sourcecode für den RP6 Roboter:'''&lt;br /&gt;
&lt;br /&gt;
''Auszug aus dem Hauptprogramm:''&lt;br /&gt;
I2CTWI_initMaster(100);      // Initialize the TWI Module for Master operation with 100kHz SCL Frequency&lt;br /&gt;
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);   // Register the event hand	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// *********************** Main loop ************************************&lt;br /&gt;
&lt;br /&gt;
while(true)&lt;br /&gt;
 &lt;br /&gt;
{		&lt;br /&gt;
   behaviourController();        	// Aufruf der Haupt-Controll-Funktion&lt;br /&gt;
   task_RP6System();             	// Abfrage des ADC, ACS, IRCOMM usw...&lt;br /&gt;
   if (getStopwatch1() &amp;gt; 200)&lt;br /&gt;
   {&lt;br /&gt;
       task_commandProcessor();   	// Abfrage ob ein Commando gesendet wurde&lt;br /&gt;
       setStopwatch1(0); &lt;br /&gt;
   }  &lt;br /&gt;
   task_I2CTWI();                // Call I2C Management routine&lt;br /&gt;
}  &lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Lesen von Daten von der WLAN Karte bereitgestellt über den I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
// **** Comandos von PC über WLAN Karte einlesen&lt;br /&gt;
&lt;br /&gt;
void task_commandProcessor(void)&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
   uint16_t    	size;&lt;br /&gt;
   uint8_t    	messageBuf [100]; &lt;br /&gt;
   size = 0; &lt;br /&gt;
   if(!I2CTWI_isBusy())&lt;br /&gt;
   {    &lt;br /&gt;
      I2CTWI_readBytes (73&amp;lt;&amp;lt;1 | 1, &amp;amp;messageBuf[0],  38); 	// Daten von WLAN Karte einlesen. Hier werden  einfach mal 38 Byte eingelesen&lt;br /&gt;
      size = messageBuf[0]&amp;lt;&amp;lt;8 | messageBuf[1];  // Ermitteln wie viel tatsächlich Byte gesendet                        wurden&lt;br /&gt;
   }         					// Diese Funktion muss noch optimiert werden&lt;br /&gt;
}&lt;br /&gt;
//  In dem Feld messageBuf [2]  bis  messageBuf[size]  befinden sich die Daten von PC gesendet &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Senden von Daten an die WLAN Karte über den  I2C Bus'''&lt;br /&gt;
&lt;br /&gt;
// Mit folgender Routine können eine belibige Anzahl, hier 9 Byte, an die WLAN Karte gesendet werden &lt;br /&gt;
// Daten im Feld „buffer“ zur WLAN Karte senden via  I2C  Bus  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if (!I2CTWI_isBusy ())   // Daten über I2C an WLAN senden &lt;br /&gt;
    I2CTWI_transmitBytes (73&amp;lt;&amp;lt;1, &amp;amp;buffer[0], 9); &lt;br /&gt;
      &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Author:&lt;br /&gt;
Peter Schneider&lt;br /&gt;
(cb2sn43)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Cb2sn43|Freizeitbastler]] 19:37, 22. Feb 2008 (CET)&lt;/div&gt;</summary>
		<author><name>Cb2sn43</name></author>	</entry>

	</feed>