Posts by elchico

    Ah okay. Ich dachte, Du meintest Kamera-Navigation und nicht allgemein SLAM. Da habe ich die Links von Dir noch und bin fleißig am lesen (sofern das Arbeit etc. zulässt).


    Dann schau ich mal, vielleicht kennt noch jemand andere Projekte, bei denen speziell Kamera Navigation mit RPi benutzt wurde (erstmal unabhängig von der Sprache, auch wenn Python natürlich cool wäre weil verständlicher für mich).

    Hallo,


    @ __deets__: Danke für die Info. SLAM habe ich auch schon mehrmals gelesen und hatte auch hier einen entsprechenden anderen Thread gestartet. Ich hätte natürlich auch nichts gegen ein entsprechendes Modul, welches in Java / C++ oÄ geschrieben ist, solange ich das dann mit Python auswerten kann. Der restliche Code vom Robot (der inzwischen schon allein rumfährt und Hindernissen ausweicht) ist in Python, deswegen diese Limitierung (mal davon abgesehen, dass ich in Python leidlich programmieren kann, in maschinennäheren Sprachen bin ich nicht wirklich versiert). Hast Du eine Quelle zu entsprechendem Code?


    @ Kelvin: Danke für deine Nachricht. Laut dieser Website gibt es quasi drei Typen von Staubsauger Robotern, die entweder random herumfahren oder eben navigieren, entweder über entsprechende LiDAR Aufsätze oder eben per Kamera-Navigation. So etwas hätte ich mir vorgestellt. Und das scheint ja im Moment auch Stand der Technik zu sein, wenn ich mir das so ansehe. Deswegen hätte ich mir vorstellen können, dass da eine entsprechende Implementierung für den RPi evtl. schon vorhanden ist.
    Danke für das Paper, ich lese es mir mal durch.

    "Saugroboter mit Kamera-Navigation haben oben auf dem Gehäuse eine Kamera installiert. Die Kamera ist dabei nach oben ausgerichtet und kann nichts anderes als Deine Decke erfassen. Doch keine Sorge, es werden keine optischen Aufnahmen gemacht. Sprich: Der smarte Saugroboter erfasst den Grundriss Deiner Wohnung durch das Scannen Deiner Decke und navigiert sich dann systematisch durch Deine Räume."
    https://www.tink.de/blog/welch…besser-laser-oder-kamera/


    oder: https://www.smarthomeassistent…er-kamera-was-ist-besser/


    LG

    Hallo zusammen,


    hat jemand schon mal ausprobiert, bzw. einen Blog / Tutorial gelesen, ob man die Raspberry Pi Kamera zur Kamera Navigation nutzen kann? Ich würde mir etwas ähnliches vorstellen wie manche Staubsauger Roboter zur Navigation nutzen (Kamera senkrecht nach oben, zur Orientierung im Raum). Ich würde das gern per Python realisieren.


    Ich bin gerade erst dabei, mich in Kamera Navigation einzulesen, und wäre für den Anfang über ein paar Links / Quellen zu Tutorials / Beschreibungen der Technik etc. recht glücklich ;)

    LG
    Michi

    Danke für die ausführliche Antwort.


    Werde also das Rechnen auf meinen Laptop auslagern und die Daten online / live streamen. Hier muss ich mich aber noch einlesen. Früher oder später soll Es dann allein arbeiten können (ohne, dass der Laptop nebenbei läuft), aber das ist wohl weiter entfernt als ich gehofft hatte ;) Deswegen hatte ich eigentlich auch gehofft, dass es quasi alles (inklusive der Visualisierung) auf dem Pi läuft und ich bei Bedarf mich online dazuschalten kann (online meint: gleiches Netzwerk, aber während der Graph auf dem Pi kontinuierlich erweitert wird). Aber ich sehe ein, dass das noch ein weiter Weg ist.


    Arduino war mir klar, dass das nur bei den Low-Level Aufgaben hilft (Motorsteuerung etc.), aber wäre zumindest für die Genauigkeit der Daten definitiv eine große Hilfe. Bin aber auch hier noch von entfernt. Möchte erstmal was Grundlegendes auf dem Pi schaffen, auf dem ich dann aufbauen möchte.
    Deine anderen Vorschläge / Anregungen werde ich bei Bedarf dann aufgreifen, danke dafür.


    Eine letzte Frage noch, nachdem Du das jetzt schon zweimal erwähnt hast: Hast Du einen Link zu einem bestehenden Projekt, das evtl. das Vorgehen beschreibt und im Idealfall auch Code zur Verfügung stellt? Ich möchte das früher oder später selbst programmiert haben, aber ohne Anleitung braucht man bei sowas wohl 10fach so lange und es wird nur halb so gut (fehlende Funktionen usw). Deswegen wäre da ein Leitfaden, evtl. mit Material zum Anschauen (Code) hilfreich ;)


    Danke und einen schönen Abend noch,
    Michi

    Vielen Dank erstmal für die Antwort!


    Gedanklich ist man natürlich immer schon etwas weiter, aber rein praktisch stecke ich wohl auch noch im ersten Punkt ;)


    Mal ein paar Antworten zu deinen Anregungen:
    1) Pan/Tilt ist im Moment wohl noch etwas "over-powered", weil ich zum einen "nur" eine 2D Map brauche und zum anderen meinen US Sensor schon auf einem Servo habe ==> Ist also eine ähnliche Richtung, aber für mich noch etwas zu viel =)

    2) LIDAR ist definitiv eine Option, die ich auch schon in Erwägung gezogen habe, allerdings ist es im momentanen Stadium noch etwas zu teuer. Wenn mein Es dann mal fährt und tut, was es soll, wird das dann evtl. als Optimierung / Verbesserungsmodul aufgesetzt.

    3) Das mit den Ungenauigkeiten ist mir auch ein Dorn im Auge ... Ich muss auch gleich zugeben, dass ich mich über Genauigkeiten von zB. GPS Sensoren (bezahlbaren Sensoren) noch nicht auseinander gesetzt habe. Steht auf der Agenda.

    4) Zumindest das Parallele werde ich wohl früher oder später auf einen Arduino auslagern müssen. Zumindest für die Motorensteuerung + Sensorik sollte das dann am Ende eine kleine Verbesserung bedeuten. Da bin ich aber zeitlich noch etwas entfernt von.

    5) Halbwegs verlässliche Eigen-Lokalisierung: Das ist definitiv ein Problem, bei welchem ich noch nicht genau weiß, wie ich das handhaben werde. Da meine Wohnung räumlich begrenzt ist (man glaubt es kaum), könnte ich mir vorerst vorstellen, diese zu rastern (zB ein Zimmer = ein Bereich) und diese Bereiche abzustecken (zB mit einer Laserdiode). Dann kann Es sich quasi immer neu kalibrieren über die Übertritte in einen neuen Bereich, indem bei Durchschreiten der Laserschranke und Abständen nach links rechts (wo in der Tür befindet Es sich) eine halbwegs passable Lokalisierung möglich ist. Ab dann gibt es eine Neukalibrierung. Außerdem stelle ich mir vor, dass Es quasi kontinuierlich (da wären wir wieder beim parallelen) die Abstände zu den (seitlichen) Wänden misst und so halbwegs präzise weiß, wie weit es von links / rechts entfernt ist.


    Die restlichen Punkte werde ich im Hinterkopf behalten.


    Deswegen zwei Nachfragen, um da jetzt Schritt für Schritt dran zu gehen:
    1) Gibt es eine Software für den Raspberry (vorzugsweise als Modul in Python, solange ich das noch nutze), die Messpunkte (in meinem Fall Distanzen) graphisch aufbereiten kann? Damit ich mal visuell abschätzen kann, wie gut / schlecht mein Ansatz funktioniert und wo definitiv Verbesserungen nötig sind? Also ich würde mir vorstellen: Ich habe Rohdaten (x,y1,y2,y3), wobei x die aktuelle Position ist und y die Distanz in die Richtungen 1,2,3 (also zB links, vorne, rechts). Diese werden dann geplottet, sodass man durch "Random fahren" eine Art "Karte" erstellt? Geht auf jeden Fall "manuell", indem bekannte Softwares (Excel, OriginLab etc.) missbraucht werden, aber die sind ja eigentlich nicht dafür gemacht ... Zumal ich es gern auf dem Raspberry laufen lassen würde.

    2) Gibt es ein Modul, welches solche Daten einliest, um theoretisch zu berechnen, dass am Punkt x links im Abstand y1 bzw. vorne oder rechts (y2,y3) etwas sein sollte? Klingt jetzt auf Anhieb auch (an sich) nicht so schwer von der Grundidee her, allerdings würde das doch einiges an Zeit fressen, das manuell zu programmieren, deswegen die Frage nach einem Modul (welches sicherlich auch noch besser / umfangreicher programmiert ist als ich es je könnte).


    LG und danke nochmal,
    Michi


    Edit: Habe dein Projekt schon gesehen gehabt und werde hin und wieder mal reinschauen ;) Bin mal gespannt, wie Du das mit der Wegplanung machst.

    Hallo zusammen,


    ich möchte meinem kleinen (fahrenden) Robot die Fähigkeit geben, sich in meiner Wohnung zurecht zu finden. Dazu gehört:


    1) Selbstständig eine 2D Karte der Wohnung zu erstellen

    2) Aufgrund einer bereits erstellten Karte sich grob zu lokalisieren

    3) Path Finding - zumindest einen halbwegs schnellen Weg zum Zielpunkt zu finden

    4) Wenn die aktuelle Position nicht präzise genug lokalisiert werden kann, dann soll er ein wenig "random" herumfahren, um eine "bessere" Position zu finden, anhand derer er sich dann weiterbewegen kann


    Ich habe folgende Seite schon gefunden:
    https://pythonrobotics.readthe…/latest/modules/slam.html

    https://atsushisakai.github.io/PythonRobotics/

    Ziemlich viele Arbeiten (Bachelor, Master etc.) darüber. Scheint zum einen ein "hot topic" zu sein, zum anderen wohl auch nicht gänzlich trivial.


    So, nun meine Idee / mein Ansatz:

    Ich möchte das Ganze mit Python 3 programmieren. Der Robot soll mehr oder weniger random (darf gerne auch gezielt sein, zB indem er in einem Raster die Wohnung abfährt) eine Karte erstellen, diese abspeichern und für spätere Runs abrufen können (deswegen wäre SLAM cool, aber nicht zwingend notwendig). Aufgrund seiner Startposition, diversen Sensoren (Ultraschall, Kompass), der Kenntnis über seine eigene Größe und seines Bewegungsprofils (Schrittmotoren als Antrieb) soll er seine ungefähre Position auf der Karte ausfindig machen können und im Anschluss auch mehr oder weniger direkt zu Zielpunkten steuern können (ist noch nicht endgültig, aber mein Ansatz - bin für Vorschläge offen). Mit einem Kompass, seinen gelaufenen Schritten und dem Wissen, was links, rechts und vor ihm liegt, sollte er grob seine Position abschätzen können.

    Mir ist klar, dass Schrittmotoren nicht perfekte Ergebnisse liefern und das gleiche kann man wohl auch über Ultraschallsensoren sagen. Allerdings geht es mir auch nicht darum, eine perfekte Position zu ermitteln, sondern mir würde es reichen, wenn er grob weiß, wo er sich befindet und wie er zum Zielpunkt kommt. Er sollte also sowohl aufgrund der bereits ermittelten Daten / Karte, als auch aufgrund seiner live-Daten seinen Weg anpassen können und im Idealfall mithilfe statistischer Methoden halbwegs abschätzen können, ob die Daten, die er grade bekommt, valide sind (zum Beispiel gibt der US-Sensor manchmal unsinnige Ergebnisse aus). Wenn eine perfekte Position gebraucht wird (zum Beispiel könnte man sich vorstellen, eine "Ladestation" zu bauen, an die er andockt), dann könnte man das über "Line Following" machen, was wahrscheinlich deutlich präziser möglich ist für kleines Geld?


    Nice-to-have wäre es außerdem, wenn die Kartendaten als "Karte" auch für den User (also mich) anzuschauen wäre und Bereiche definiert werden könnten (zum Beispiel Zimmer oder Sperrgebiete). Damit könnte ich ihn dann gezielt ins Wohnzimmer oder in die Küche rufen.


    Was habe ich schon:

    Ein fahrendes Etwas, das im Moment von einem US-Sensor (HC-SR04) auf einem Servo Daten erhält. Das soll ausgeweitet werden auf mindestens einen US-Sensor an jeder Seite, sodass Es jederzeit weiß, was vor ihm, links und rechts liegt. Es kann fahren und auch selbstständig anhalten, wenn ihm etwas zu nahe kommt. Die Daten werden gespeichert. Die Distanzdaten kann ich natürlich auch graphisch auftragen, mithilfe seiner eigenen Schritten und der Distanzdaten kann ich auch schon ganz grob mal ein Bild von seiner unmittelbaren Umgebung machen. Allerdings ist das noch weit von einer "Karte" entfernt. Ich weiß, ist nicht sonderlich viel, aber immerhin.


    Was suche ich / meine Frage:
    Hat jemand von Euch schon mal Mapping / Lokalisierung aufgebaut bzw. ein Tutorial an der Hand, in dem das in Python programmiert wurde? Gibt es dafür Module? Auf der Website von oben habe ich versucht, mich durchzukämpfen, hänge allerdings noch ein wenig fest (schon relativ früh, muss ich zugeben: Was ist überhaupt von den obigen Ideen ein Ansatz für meine Problemstellung?). Vielleicht gibt es ja bessere / leichtere oder sogar zugeschnittenere Module / Tutorials? Ich muss dazu sagen, dass ich mich in Python halbwegs zurecht finde (und mir auch aneignen kann, wenn mir was fehlt), allerdings C++ oÄ Programmiersprachen weder schreiben noch lesen kann. Also Module / Tutorials in der "falschen" Programmiersprache sind quasi nur semi-hilfreich, wäre aber immer noch besser als nichts ;)


    Wenn jemand eine Idee / Vorschlag oder sogar ein Tutorial zur Hand hat, wäre das cool =)
    LG
    Michi


    PS: Sorry für den langen Text und danke für's Durchlesen, wer bis hierher gekommen ist ;) Aber ich wollte die Problemstellung möglichst präzise beschreiben =)

    PPS: Bin mir unsicher über die Forenwahl. Falls falsch: Ich habe keine Ahnung, ob ich das Thema oder nur der Mod verschieben kann? Aber verschieben an sich ist natürlich kein Problem ;)

    Hallo zusammen,


    ich möchte ein Python Skript im Hintergrund ausführen, sodass ich die Verbindung per SSH vom Pi trennen kann und später wieder anmachen (der Pi soll die ganze Zeit weiterlaufen mit dem Python Skript).


    Außerdem möchte ich die Ausgabe kontinuierlich in ein Txt Dokument schreiben lassen (das Python Skript schreibt alle 10 sek die Uhrzeit an (ist nur ein Test-Skript)).


    Ich bin bisher auf den Befehl


    Code
    python skript.py >> log.txt 2> error.txt &


    gekommen, allerdings wird zum einen nicht kontinuierlich angehängt (wenn ich, während das Python Skript läuft, die log.txt anschaue => steht nix drin), zum anderen wird es beendet, sobald ich das Terminal (Putty) beende.


    Gibt es da einen pfiffigen Linux Befehl für?


    VG und danke
    elchico


    Edit: ich habe den Befehl "screen" auch schon gefunden, aber kontinuierlich läuft da auch nicht und sobald ich das Haupt-Terminal schließe (zum Beispiel, indem ich meine SSH - Verbindung schließe) schließt auch das Python Skript

    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]Ich habe aber, denke ich, das Problem gefunden. Das Problem ist die "control" Funktion.[/font]


    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]In dieser arbeite ich zwar auch vieles mehrfach ab, aber das Hauptproblem dafür, dass der Computer in die Knie geht, ist folgendes: Ich suche die kleinste Zahl x, die durch alle drei vorgegebenen Längen (im unteren Code: a, b, c) teilbar ist. Dann iteriere ich von 1 bis x und immer, wenn x durch eine der drei Längen teilbar ist, macht dieser Motor einen Schritt. Außerdem soll nur dann eine bestimmte Zeit gewartet werden, falls überhaupt mindestens ein Schritt gemacht wird. Andernfalls soll einfach weiter iteriert werden.[/font]


    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]Das funkioniert ganz gut, wenn die Längen irgendwie gut miteinander korrelieren (alle 67 oder 67 und 33.5 etc). Falls aber zum Beispiel 67 und 66 auftaucht, muss der Computer 4422 (kleinste gemeinsame Zahl) finden und von 1 iterieren, weswegen er hier leistungstechnisch in die Knie geht (bei größeren Zahlen oder 3 Zahlen noch viel eher...).[/font]


    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]Zusammenfassung: Das Problem ist zum einen das Suchen von "x" (wobei das sehr sehr lange dauern...), und auch das iterieren bis x. Gibt es hierfür eine schnellere Lösung?[/font]



    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]VG[/font]
    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]elchico[/font]



    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]PS: ich habe einen Code geschrieben, der genau das gleiche macht wie der in meinem Skript unten, nur etwas übersichtlicher ist.[/font]



    [font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]

    Code
    import time[/font][/size][/color]   a = 67b = 1c = 68def LCM(a,b,c):                                #gibt kleinste Zahl zurueck, die durch a, b und c teilbar ist   lst = [a,b,c]   sorted(lst)   if 0 in lst:       lst[lst.index(0)]=1   print lst   a = lst[0]   b = lst[1]   c = lst[2]   d = c   while d%a != 0:       d=d+b   e = d   while d%b != 0:        #and c       e=e+d       print e   return ecommon_number = LCM(a,b,c)a_step = common_number/ab_step = common_number/bc_step = common_number/cprint common_numberfor i in range (1, common_number+1):             #pruefen, ob kleinste Zahl durch a und/oder b und/oder c teilbar ist   m = 0                                        #falls kleinste Zahl durch mindestens eine der drei Zahlen (a,b,c) teilbar ist => warte 1 sek   if (i % a_step) == 0:       print "a"       m = 1   if (i % b_step) == 0:       print "b"       m = 1   if (i % c_step) == 0:       print "c"       m = 1   if m == 1:[color=#323d4f][size=12][font="Lucida Grande, Trebuchet MS, Helvetica, Arial, sans-serif"]       time.sleep(1)

    [/font][/size][/color]

    Andreas:
    Nein, ist nicht dieselbe Stromversorgung: Motoren über 5 V und 3.5 A und Pi über 5 V und 1 A. Die Schutzdioden werde ich einbauen :)




    Ich habe inzwischen das Skript auch mal laufen lassen, ohne dass die Motoren am Strom angeschlossen waren (also alle Pins etc ganz normal aktiviert etc, aber einfach die Stromversorgung der Motoren weggelassen) und auch hier schießt der RAM Verbrauch auf 95 %.


    Damit denke ich, ist es ein Rechenproblem Software-seitig, oder? Allerdings ist der Anstieg von 67 mm (13 %) auf 93 mm (95 % + SWAP) enorm. Bei weniger als 67 mm sinkt die RAM Auslastung nur geringfügig.
    Aber wo in meinem Skript ist eine solche Rechenpower nötig?



    VG und danke nochmals.


    elchico

    Andreas:
    Nein, bisher habe ich noch keine verbaut. Leider weiß ich nicht, wie ich dir die Schaltung aufmalen kann, deswegen eine kurze Beschreibung:
    Ich habe alle benötigten Pins (im Python Skript unter der Funktion "parameter") auf ein Steckbrett per Steckbrücken geschaltet und von dort wiederum mit Steckbrücken an die entsprechenden Pins der Motoren. Stromversorgung läuft vom Netzteil auf das Steckbrett und dort per Parallelschaltung an die einzelnen Motoren. Außerdem habe ich eine LED parallel geschaltet, um eine visuelle Rückmeldung zu haben, ob Strom fließt oder nicht (als Überprüfung für mich, damit ich nicht bastle, wenn der Strom noch drauf ist).


    meigrafd:
    Hatte Swap nicht ausgeschaltet, habe es jetzt allerdings auf 1024 MB vergrößtert. Habe hierüber (http://jankarres.de/2013/11/ra…rpi-monitor-installieren/) ein Monitor installiert und darüber den RAM beobachtet.
    Ergebnis: er bleibt bei 67 mm bei ca. 13 %, schießt bei 93 mm auf 95 % (+ Swap Auslagerung). Habe das Skript jetzt, obwohl der Pi sich scheinbar aufhang, laufen lassen (5 min) und siehe da, er hat sich wieder gefangen. Allerdings werden die Motoren nicht flüssig angesteuert (ich nehme mal an, dass das an der hohen RAM Auslastung liegt).


    Weiß jemand, woran es genau liegt, dass die Auslastung bei 93 so in die Höhe schießt, bei 67 allerdings bei 13 % liegt?



    VG und danke schon mal!
    elchico

    Stromversorgung der Motoren über eigene Stromquelle (5 V, 3.5 A => ausreichend).
    Stromversorgung vom Pi: 5 V, 1 A


    Wo finde ich den Errorlog?



    Syslog (auf heute begrenzt):


    Hallo zusammen,


    anbei der Code für einen GCode Interpreter, der theoretisch 4 Motoren "gleichzeitig" steuern kann (3D + 4. Motor). Ich komme direkt zu meinem Problem:
    Wenn ich eine GCode Zeile habe, die zum Beispiel so aussieht: "G1 X67 Y67 E20.1 F7800", dann rechnet mein Pi das runter und steuert die 3 Motoren "gleichzeitig" (leider langsamer, als ich es erwarten würde, weiß noch nicht genau, warum. Vielleicht, weil es ja nur "mehr oder weniger" gleichzeitig ist...)


    Wenn nun eine GCode Zeile folgendermaßen ausschaut: "G1 X92.150 Y93.154 F7800.000", dann stürtzt der Pi ab. Ich weiß nicht genau, was er dann macht (Power LED + WLAN Stick leuchten beide noch), allerdings rührt sich kein Motor und WinSCP und Putty sagen beide, dass der Pi nicht mehr erreichbar wäre.
    Manchmal fängt er sich wieder (hat scheinbar von selbst das Python-Skript abgebrochen) und ist wieder erreichbar, manchmal hilft nur vom Netz nehmen und neu anschließen.


    Mein Frage nun: Warum ist das so, was kann ich dagegen unternehmen? ;)


    Falls Fragen auftauchen, antworte ich natürlich sehr gern :)
    Vielen Dank schon mal für Eure Ideen, Tipps.


    VG


    elchico



    Hinweis: die Funktion IJPosition funktioniert noch nicht.