Inhaltsverzeichnis:

Autonomer Roboter Wallace - Teil 4 - Hinzufügen von IR-Entfernungs- und "Ampere"-Sensoren - Gunook
Autonomer Roboter Wallace - Teil 4 - Hinzufügen von IR-Entfernungs- und "Ampere"-Sensoren - Gunook

Video: Autonomer Roboter Wallace - Teil 4 - Hinzufügen von IR-Entfernungs- und "Ampere"-Sensoren - Gunook

Video: Autonomer Roboter Wallace - Teil 4 - Hinzufügen von IR-Entfernungs- und
Video: Die schockierende Wahrheit über nichtmenschliche UFOs: John Greenewald enthüllt alles 2024, Juli
Anonim
Image
Image
Unterstützende Schaltungen hinzufügen (MCP3008)
Unterstützende Schaltungen hinzufügen (MCP3008)

Hallo, heute beginnen wir die nächste Phase der Verbesserung der Fähigkeiten von Wallace. Insbesondere versuchen wir, die Fähigkeit des Roboclaw-Motorcontrollers, den Strom zu überwachen und in einen virtuellen (Software-) "Sensor" zu verwandeln, seine Fähigkeit zu verbessern, Hindernisse mit Infrarot-Abstandssensoren zu erkennen und zu vermeiden. Schließlich werfen wir einen Blick auf die Navigation ohne SLAM (simultaneous location and mapping) (vorerst), da der Roboter noch keine IMU (Inertia Measurement Unit) oder ToF (Time of Flight) Sensoren hat.

Bei der Navigation werden es zunächst nur zwei Hauptziele sein:

  1. Hindernisse vermeiden
  2. erkennen, wenn es irgendwo stecken bleibt und keine Fortschritte macht. ("Fortschritt" bedeutet, dass es sich um eine sinnvolle Entfernung vorwärts bewegt hat)
  3. ein mögliches drittes Ziel könnte darin bestehen, sich rechtwinklig an einer Wand auszurichten.

Dieses Projekt begann mit einem Roboter-Kit und dem Ausführen grundlegender Bewegungen über eine Tastatur und eine SSH-Verbindung.

Die zweite Phase bestand darin, ausreichend unterstützende Schaltkreise hinzuzufügen, um die Hinzufügung vieler Sensoren vorzubereiten.

Im vorherigen Instructable haben wir mehrere akustische HCSR04-Sensoren hinzugefügt und der Roboter kann jetzt Hindernisse vermeiden, während er sich in der Wohnung bewegt.

Während es sich in Küche und Flur mit guten, festen ebenen Flächen gut macht, ist es beim Betreten des Esszimmers völlig blind. Es kann die Tisch- und Stuhlbeine nicht "sehen".

Eine Verbesserung kann darin bestehen, typische Motorströme im Auge zu behalten, und wenn die Werte springen, muss der Roboter etwas getroffen haben. Es ist ein guter "Plan B" oder sogar C. Aber das hilft ihm nicht wirklich, sich im Essbereich zurechtzufinden.

(Update: eigentlich ist vorerst die Stromüberwachung beim Rückwärtsfahren Plan A, da ich temporär auch Sensoren von hinten entfernt habe).

Das Video für diesen Abschnitt bildet die letzte Phase der Hindernisvermeidungssensoren.

Was Sie im Video sehen, sind sechs akustische HCSR04-Frontsensoren und zwei Sharp IR-Sensoren. Die IR-Sensoren kamen im Video nicht viel ins Spiel. Ihre Stärke ist meist, wenn sich der Roboter im Essbereich mit Blick auf Tisch- und Stuhlbeine befindet.

Neben den Sensoren kam vor allem beim Rückwärtsfahren die Stromüberwachung ins Spiel, falls es mal etwas anstoßen sollte.

Schließlich verwendet es die Geschichte der letzten 100 Züge und einige grundlegende Analysen, um eine Frage zu beantworten:

"Gibt es in letzter Zeit wirklichen Fortschritt nach vorne (oder ist er in einem sich wiederholenden Tanz stecken geblieben)?"

Wenn Sie also im Video einen wiederholten Vorwärts-Rückwärts-Vorgang sehen, dreht er sich, bedeutet dies, dass er das Vorwärts-Rückwärts-Muster erkannt hat, also versucht es etwas anderes.

Das einzige programmierte Ziel dieser Softwareversion bestand darin, kontinuierlich Fortschritte zu erzielen und Hindernissen auszuweichen.

Schritt 1: Unterstützende Schaltungen hinzufügen (MCP3008)

Unterstützende Schaltungen hinzufügen (MCP3008)
Unterstützende Schaltungen hinzufügen (MCP3008)
Unterstützende Schaltungen hinzufügen (MCP3008)
Unterstützende Schaltungen hinzufügen (MCP3008)
Unterstützende Schaltungen hinzufügen (MCP3008)
Unterstützende Schaltungen hinzufügen (MCP3008)

Bevor wir die IR-Sensoren hinzufügen können, benötigen wir die Schnittstellenschaltung zwischen ihnen und dem Raspberry Pi.

Wir werden einen MCP3008 Analog-Digital-Wandler hinzufügen. Es gibt viele Online-Ressourcen, wie man diesen Chip mit dem Raspberry Pi verbindet, daher werde ich hier nicht viel darauf eingehen.

Grundsätzlich haben wir die Wahl. Wenn die Version der IR-Sensoren mit 3V arbeitet, kann dies auch der MCP3008 und wir können uns dann direkt mit dem Raspberry verbinden.

[3V IR-Sensor] - [MCP3008] -- [Raspberry Pi]

In meinem Fall betreibe ich jedoch meistens 5V, das bedeutet also einen bidirektionalen Pegelumsetzer.

[5V IR-Sensor] -- [MCP3008] -- [5V-zu-3V bidirektionaler Bus] -- [Raspberry Pi]

Hinweis: Es gibt nur einen Signalausgang vom IR-Sensor. Es geht direkt zu einer der analogen Eingangssignalleitungen des MCP3008. Vom MCP3008 müssen wir 4 Datenleitungen (über den bidirektionalen Bus) mit dem Raspberry Pi verbinden.

Im Moment wird unser Roboter mit nur zwei IR-Sensoren laufen, aber wir könnten leicht mehr hinzufügen. Der MCP3008 acht analoge Eingangskanäle.

Schritt 2: IR-Sensoren montieren

IR-Sensoren montieren
IR-Sensoren montieren
IR-Sensoren montieren
IR-Sensoren montieren
IR-Sensoren montieren
IR-Sensoren montieren
IR-Sensoren montieren
IR-Sensoren montieren

Sharp stellt mehrere verschiedene IR-Sensoren her, die unterschiedliche Reichweiten und Abdeckungsbereiche haben. Ich habe zufällig das Modell GP2Y0A60SZLF bestellt. Das von Ihnen gewählte Modell beeinflusst die Platzierung und Ausrichtung des Sensors. Leider habe ich nicht wirklich recherchiert, welche Sensoren ich besorgen soll. Es war eher eine "Welche kann ich zu einer vernünftigen Zeit und zu einem vernünftigen Preis von einer seriösen Quelle bekommen, aus denen, die sie anbieten"-Entscheidung.

(Update: Dies kann jedoch keine Rolle spielen, da diese Sensoren durch die Umgebungsbeleuchtung im Innenraum verwirrt zu werden scheinen. Ich erforsche dieses Problem immer noch.)

Es gibt mindestens drei Möglichkeiten, diese Sensoren am Roboter zu montieren.

  1. Platzieren Sie sie in einer festen Position, vorne, leicht voneinander entfernt.
  2. Legen Sie sie vorne auf ein Servo und zeigen Sie sie leicht voneinander weg.
  3. Platzieren Sie sie an einer festen Position, vorne, aber an den äußersten linken und rechten Ecken, zueinander abgewinkelt.

Beim Vergleich von Auswahl Nr. 1 mit Auswahl Nr. 3 denke ich, dass Nr. 3 einen größeren Kollisionsbereich abdeckt. Wenn man sich die Bilder ansieht, kann Auswahl #3 nicht nur so gemacht werden, dass sich die Sensorfelder überlappen, sondern sie können auch die Mitte und darüber hinaus die Außenbreite des Roboters abdecken.

Bei Auswahl Nr. 1 ist der tote Winkel in der Mitte umso größer, je weiter die Sensoren voneinander abgewinkelt sind.

Wir könnten # 2 machen (ich habe einige Bilder mit Servo als Möglichkeit hinzugefügt) und sie einen Sweep machen lassen, und dies kann offensichtlich den meisten Bereich abdecken. Ich möchte den Einsatz eines Servos jedoch aus mindestens zwei Gründen so lange wie möglich hinauszögern:

  • Wir werden einen der PWM-Kommunikationskanäle auf dem Raspberry Pi verwenden. (Es ist möglich, dies zu verbessern, aber immer noch…)
  • Die Stromaufnahme mit dem Servo kann erheblich sein
  • Es fügt Hard- und Software mehr hinzu

Ich möchte die Servooption für später aufheben, wenn ich wichtigere Sensoren wie Time-of-Flight (ToF) oder vielleicht eine Kamera hinzufüge.

Es gibt einen weiteren möglichen Vorteil bei Auswahl Nr. 2, der bei den anderen beiden Auswahlmöglichkeiten nicht verfügbar ist. Diese IR-Sensoren können je nach Beleuchtung verwechselt werden. Es könnte sein, dass der Roboter ein Objekt liest, das sich unmittelbar in der Nähe befindet, obwohl es tatsächlich kein Objekt in der Nähe gibt. Bei Auswahl Nr. 3 können beide Sensoren dasselbe Objekt (aus unterschiedlichen Winkeln) registrieren, da sich ihre Felder überlappen können.

Also gehen wir mit Platzierungswahl #3.

Schritt 3: Zeit zum Testen

Image
Image

Nachdem wir alle Verbindungen zwischen dem Raspberry Pi, dem MCP3008 ADC und den Sharp IR-Sensoren hergestellt haben, ist es Zeit zum Testen. Nur ein einfacher Test, um sicherzustellen, dass das System mit den neuen Sensoren funktioniert.

Wie in früheren Instructables verwende ich die wiringPi C-Bibliothek so oft wie möglich. Macht die Sache einfacher. Was bei der Überprüfung der wiringPi-Website nicht sehr offensichtlich ist, ist, dass der MCP3004/3008 direkt unterstützt wird.

Auch ohne das könnten Sie einfach die SPI-Erweiterung verwenden. Aber keine Notwendigkeit. Schaut man sich Gordons Git-Repository für wiringPi genau an, stößt man auf eine Auflistung unterstützter Chips, von denen einer für MCP3004/3008 ist.

Ich habe mich entschieden, den Code als Datei anzuhängen, da ich ihn auf dieser Seite nicht richtig anzeigen konnte.

Schritt 4: Ein virtueller Sensor - AmpSensor

Je mehr verschiedene Möglichkeiten Sie haben, den Roboter Informationen über die Außenwelt zu erhalten, desto besser.

Der Roboter verfügt derzeit über acht akustische HCSR04-Sonarsensoren (sie stehen nicht im Mittelpunkt dieses Instructable), und er verfügt jetzt über zwei Sharp IR-Distanzsensoren. Wie bereits erwähnt, können wir noch etwas anderes nutzen: die Motorstromerfassungsfunktion des Roboclaw.

Wir können diesen Abfrageaufruf an den Motorcontroller in eine C++-Klasse einschließen und ihn AmpSensor nennen.

Durch das Hinzufügen einiger "Smarts" zur Software können wir typische Stromaufnahmen bei geraden Bewegungen (vorwärts, rückwärts) und auch bei Drehbewegungen (links, rechts) überwachen und anpassen. Sobald wir diese Amperebereiche kennen, können wir einen kritischen Wert auswählen. Wenn der AmpSensor einen Strommesswert von der Motorsteuerung erhält, der diesen Wert überschreitet, wissen wir, dass die Motoren wahrscheinlich blockiert sind, was normalerweise darauf hindeutet, dass der Roboter gestoßen ist in etwas.

Wenn wir der Software etwas Flexibilität hinzufügen (Befehlszeilen-Argumente und / oder Tastatureingaben während des Betriebs), können wir den Schwellenwert für "kritische Ampere" während des Experimentierens erhöhen / verringern, indem wir den Roboter einfach bewegen und gegen Objekte stoßen lassen. sowohl direkt hinein, als auch beim Drehen.

Da unser Navigationsteil der Software die Bewegungsrichtung kennt, können wir all diese Informationen verwenden, um die Bewegung vielleicht zu stoppen und zu versuchen, die Bewegung für einen kurzen Zeitraum umzukehren, bevor wir etwas anderes versuchen.

Schritt 5: Navigation

Der Roboter ist derzeit im realen Feedback eingeschränkt. Es verfügt über einige Nahdistanzsensoren zur Vermeidung von Hindernissen und es verfügt über eine Rückfalltechnik zur Überwachung der Stromaufnahme, falls die Distanzsensoren ein Hindernis verfehlen.

Es hat keine Motoren mit Encodern und es hat keine IMU (Inertial-Measurement-Unit), was es schwieriger macht zu wissen, ob es sich wirklich bewegt oder dreht und um wie viel.

Während man mit den Sensoren, die sich derzeit am Roboter befinden, eine Art Entfernungsanzeige erhalten kann, ist ihr Sichtfeld weit und es gibt Unvorhersehbarkeit. Das akustische Sonar reflektiert möglicherweise nicht richtig; das Infrarot kann durch andere Beleuchtung oder sogar mehrere reflektierende Oberflächen verwirrt werden. Ich bin mir nicht sicher, ob es die Mühe wert ist, tatsächlich zu versuchen, die Entfernungsänderung als eine Technik zu verfolgen, um zu wissen, ob sich der Roboter bewegt und um wie viel und in welche Richtung.

Ich habe mich bewusst dafür entschieden, KEINEN Mikrocontroller wie einen Arduino zu verwenden, weil a) ich die Pseudo-C++-Umgebung nicht mag, b) und dass zu viel Entwicklung den Lese-Schreib-Speicher verschleißt (?) und dass ich würde einen Host-Computer benötigen, um zu entwickeln (?). Oder vielleicht passiert mir einfach nur der Raspberry Pi.

Der Pi, auf dem Raspbian läuft, ist jedoch kein Echtzeit-Betriebssystem. Zwischen den Instabilitäten dieser Sensoren und dem nicht jedes Mal genau lesenden Betriebssystem hatte ich das Gefühl, dass der Zweck dieser Sensoren besser für die Hindernisvermeidung geeignet ist und nicht tatsächliche Entfernungsmessung.

Dieser Ansatz schien kompliziert und mit nicht so viel Nutzen zu sein, wenn wir (später) bessere ToF-Sensoren (Time-of-Flight) für diesen Zweck verwenden können (SLAM).

Ein Ansatz, den wir verwenden können, besteht darin, in irgendeiner Weise nachzuverfolgen, welche Bewegungsbefehle in den letzten X Sekunden oder Befehlen ausgegeben wurden.

Nehmen wir als Beispiel an, dass der Roboter schräg gegenüber einer Ecke festsitzt. Ein Sensorsatz sagt ihm, dass er zu nah an einer Wand ist, also schwenkt er, aber der andere Sensorsatz sagt ihm, dass er zu nah an der anderen Wand ist. Es endet damit, dass es nur ein Muster von Seite zu Seite wiederholt.

Das obige Beispiel ist nur ein sehr einfacher Fall. Das Hinzufügen einiger Smarts kann das wiederholte Muster nur auf ein neues Niveau heben, aber der Roboter bleibt in der Ecke stecken.

Anstatt sich vor und zurück zu drehen, dreht es sich beispielsweise in eine Richtung, macht einen Moment rückwärts (was dann die kritischen Entfernungsanzeigen löscht), und selbst wenn es sich in die andere Richtung dreht, geht es immer noch in einem gewissen Winkel vorwärts in die Ecke zurück, ein komplizierteres Muster der im Wesentlichen gleichen Sache wiederholend.

Das bedeutet, dass wir wirklich eine Historie von Befehlen verwenden und uns ansehen könnten, wie man diese Informationen ausnutzt und verwendet.

Ich kann mir zwei sehr grundlegende (rudimentäre) Möglichkeiten vorstellen, die Bewegungsgeschichte zu verwenden.

  • Stimmen die letzten X Züge mit dem Y-Muster überein? Ein einfaches Beispiel könnte sein (und das geschah) "FORWARD, REVERSE, FORWARD, REVERSE, …..". Es gibt also diese Matching-Funktion, die entweder TRUE (Muster gefunden) oder FALSE (nicht gefunden) zurückgibt. Wenn TRUE, versuchen Sie im Navigationsteil des Programms andere Bewegungssequenzen.
  • für die letzten X Züge, gibt es eine allgemeine oder Netto-Vorwärtsbewegung. Wie könnte man feststellen, was echte Vorwärtsbewegung ist? Nun, ein einfacher Vergleich ist, dass bei den letzten X-Zügen "FORWARD" häufiger vorkommt als "REVERSE". Aber das muss nicht der einzige sein. Wie wäre es damit: "RECHTS, RECHTS, LINKS, RECHTS". In diesem Fall muss der Roboter nach rechts abbiegen, um aus einer Ecke herauszukommen oder weil er sich der Wand schräg nähert, was als echter Vorwärtsfortschritt angesehen werden könnte. Auf der anderen Seite kann „LINKS, RECHTS, LINKS, RECHTS…“nicht als echter Fortschritt angesehen werden. Wenn also "RECHTS" häufiger als "LINKS" oder "LINKS" häufiger als "RECHTS" vorkommt, dann könnte das ein echter Fortschritt sein.

Zu Beginn dieses Instructable erwähnte ich, dass ein mögliches 3. Ziel quadrieren oder an einer Wand ausrichten könnte. Dafür brauchen wir aber mehr als "sind wir einem Objekt nahe". Wenn wir zum Beispiel zwei nach vorne gerichtete akustische Sensoren (nicht im Mittelpunkt dieses Artikels) haben können, um relativ gute, stabile Antworten in Bezug auf die Entfernung zu geben, hat sich der Roboter offensichtlich der Wand genähert, wenn einer einen viel anderen Wert als der andere meldet in einem Winkel und könnten versuchen, zu manövrieren, um zu sehen, ob sich diese Werte annähern (mit direktem Blick auf die Wand).

Schritt 6: Letzte Gedanken, nächste Phase…

Hoffe, dieses Instructable gab einige Ideen.

Das Hinzufügen weiterer Sensoren bringt einige Vorteile und Herausforderungen mit sich.

Im obigen Fall haben alle akustischen Sensoren gut zusammengearbeitet und die Software war recht unkompliziert.

Als die IR-Sensoren in den Mix aufgenommen wurden, wurde es etwas anspruchsvoller. Der Grund dafür ist, dass sich einige ihrer Sichtfelder mit denen der akustischen Sensoren überlappten. Die IR-Sensoren wirken bei wechselnden Umgebungslichtbedingungen etwas empfindlich und unberechenbar, während die akustischen Sensoren natürlich nicht von der Beleuchtung beeinflusst werden.

Die Herausforderung bestand also darin, was zu tun ist, wenn ein akustischer Sensor uns sagt, dass es kein Hindernis gibt, der IR-Sensor jedoch.

Vorerst, nach Versuch und Irrtum, landeten die Dinge in dieser Priorität:

  1. Verstärkersensorik
  2. IR-Erfassung
  3. Akustik-Erfassung

Und was ich getan habe, war nur die Empfindlichkeit der IR-Sensoren zu verringern, damit sie nur sehr nahe Objekte erkennen (wie etwa nahestehende Stuhlbeine).

Bisher war keine Multi-Threading- oder Interrupt-gesteuerte Software erforderlich, obwohl ich gelegentlich auf einen Kontrollverlust zwischen dem Raspberry Pi und dem Roboclaw-Motorcontroller stoße (Verlust der seriellen Kommunikation).

Hier würde normalerweise die Not-Aus-Schaltung (siehe vorherige Instructables) zum Einsatz kommen. Da ich mich aber (noch) nicht damit befassen möchte, die Roboclaw während der Entwicklung zurücksetzen zu müssen, und der Roboter nicht so schnell fährt, und ich anwesend bin, um ihn zu überwachen und herunterzufahren, habe ich nicht den Not-Halt angeschlossen.

Irgendwann wird wahrscheinlich Multithreading notwendig sein.

Nächste Schritte…

Vielen Dank, dass Sie es bis hierher geschafft haben.

Ich habe einige VL53L1X IR-Laser-ToF-Sensoren (Flugzeit) erhalten, so dass dies höchstwahrscheinlich das Thema des nächsten Instructable ist, zusammen mit einem Servo.

Empfohlen: