- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 16

Thema: SLAM auf dem ESP32?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Bresenham ist bei mir Ewigkeiten her, habe ich ganz kurz in den 90gern mal was mit gemacht. Nur zur Verwendung mit Grafikkarte. Habe das dann nie wieder benötigt.

    500ms scheint mir schon recht viel. Die 1s pro Zyklus, sind auch nur relativ zur Geschwindigkeit zu sehen oder nicht? Wie dem auch sei, habe ich nur eine begrenzte Vorstellung von dem, was da so im Programm passieren muss, weil ich mich noch nie damit beschäftigt habe. Frage ist, ob ein Roboter bei normaler Geschwindigkeit mit der Rechenleistung auskäme. Oder ob das wirklich nur Sinn macht, wenn der dann entsprechend langsam fährt.

    Trotzdem, erstmal schöne Sache!

    Gruß
    Moppi

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Zitat Zitat von Moppi Beitrag anzeigen
    500ms scheint mir schon recht viel. Die 1s pro Zyklus, sind auch nur relativ zur Geschwindigkeit zu sehen oder nicht?
    Ich hatte in der Simulation die Robotergeschwindigkeit auf 1Einheit/ Beam (ein Beam=eine Abstandsmessung des Lidars) gesetzt. Mit 120 Beams/Scan sind das also 120 Einheiten, die das Teil sich max. pro Scan fortbewegt. Auf obiges Beispiel mit der Wohnung bezogen (4mm/Einheit) wären das bei Fullspeed (der Roboter rennt wirklich geradeaus) knapp 50cm/Scan.

    Auch zeigt mir der "Scan integration report" nach Durchlauf der Simulationsdatei 235 ermittelte Scans an. Bei 1s/Scan hätten die beiden Rundläufe durch die Wohnung etwa 4min gedauert.

    Sag Du mir, ob das langsam ist?


    Nachtrag:
    Ich habe mir gerade einmal eine Wegmessung eingebaut...
    In Slam.h:
    Code:
    class Slam
      {
      public:
        float Way=0;
    ...und am Ende der Funktion Slam::IntegrateScan() unter dem Kommentar "// Report to client" die Sache etwas aufgebohrt.
    Code:
      // Report to client
      Scans++; 
      Way+=max.Distance();
      unsigned long end = millis();
      
      snprintf(Report, sizeof(Report),"{\"MsgID\":3, \"Text\":\"Nr %d, %d Beams | Pose X:%.1f, Y:%.1f, O:%.2f, Way:%.2f, Weight:%.2f| Time:%d ms, Idle:%d ms, Heap: %d bytes\"}\0", Scans, scanLen, PsObj->X, PsObj->Y, PsObj->Orientation, Way, maxWeight, end-start, start-lastEnd, ESP.getFreeHeap());
      lastEnd= end;
      PoseUpdated = true;
      ReportUpdated = true;
    Ergebnis der Sache: Am Ende der Simulation ist der Way-Zähler auf etwa 24000 hochgelaufen. Das entspräche dann etwa 100m Netto-Fahrstrecke.
    Geändert von Holomino (17.12.2021 um 16:51 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich kenne das Konzept nicht, auch keinen Ablaufplan. Daher weiß ich nicht, wie schnell was ist, bzw. ob es ausreichend schnell ist. Ausreichend schnell, für Dein Konzept. Das interessierte mich, deswegen fragte ich.

    Bei Bewegungsabläufen, bei denen auch Reaktionen auf Ereignisse stattfinden, spielen Latenzen immer eine nicht unerhebliche Rolle, auf Systemen, die eine überschaubar geringe Leistung haben. Für drinnen ist meine Schätzung maximal 50cm pro Sekunde. Steuert die Umgebungsauswertung direkt die Fahrt, bedeutet das, dass in einer halben Sekunde 25cm zurückgelegt sind, in denen womöglich nichts passiert. Wenn die Fahrt aber generell anders gesteuert wird, mit anderen Sensoren, und die Umgebungserfassung nur zur groben Richtungsbestimmung dient (im Grunde so, wie bei Autofahren durch einen Menschen, der nebenbei ein Navi benutzt), spielt da eine Verzögerung im Sekundenbereich keine große Rolle. Zur Not hält so ein Roboter dann an und wartet, bis ein Ergebnis vorliegt, das er zum Weiterfahren benötigt. Wenn die Umgebungserkennung und Kartierung eingesetzt wird, um überhaupt nur einen Grundriss zu erstellen, mit Hindernissen, und ein Reinungsroboter (bspw.) würde dann aber nur aufgrund der fertigen Karte im Speicher fahren (ohne auf Echtzeitscans angewiesen zu sein), ist das auch wieder eine andere Sache.

    Du hast so eine Kartierung ja schon ein paar mal gemacht / umgesetzt. Ich dachte, wegen dem Thementitel, dass auch eine Einschätzung am Ende steht, wie man so einen SLAM-Algorythmus auf -- jetzt -- einem ESP sinnvoll einsetzt. Was geht, was nicht, in Bezug auf Steuerungskonzepte (oder auch nur Dein Steuerungskonzept).

    Lieben Gruß
    Moppi

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Zitat Zitat von Moppi Beitrag anzeigen
    Du hast so eine Kartierung ja schon ein paar mal gemacht / umgesetzt. Ich dachte, wegen dem Thementitel, dass auch eine Einschätzung am Ende steht, wie man so einen SLAM-Algorythmus auf -- jetzt -- einem ESP sinnvoll einsetzt. Was geht, was nicht, in Bezug auf Steuerungskonzepte (oder auch nur Dein Steuerungskonzept).
    Mal ganz allgemein: SLAM ist auch nur eine Teillösung. Ohne Pathfinder und Pathfollower ist es ein Gimmik (schön anzusehen). Diesbezüglich bin ich auch nicht "am Ende" angelangt. Ich muss es allerdings auch erst noch schreiben. Bislang ist es nur eine Preview.
    Nach 25 Jahren C++-Abstinenz und ohne wesentliche Vorkenntnisse über den ESP32, RTOS, Arduino, WebServer oder HTML finde ich allerdings schon, dass es vorangeht (aufgrund des Verbreitungsgrades kann man sich viele Dinge aus dem Netz ziehen).

    Bezüglich "Steuerungskonzept": Ich gehe jetzt nicht davon aus, dass die laufende Umrechnung von Radencoderwerten in eine Pose oder das Anschließen oder verdrahten von Motortreibern zum jetzigen Zeitpunkt projektrelevant sind. Dazu verwende ich eben die Simulation.
    Den einen Teil der Hardwareschnittstelle (das Lidartelegramm) habe ich bereits vorgestellt.
    Der Pathfinder hat keine Schnittstelle zur Hardware (nur zur UI) und der Pathfollower wird auch nur zyklisch eine aus der subjektiven Pose abgeleitete Koordinate ausgeben, die der Roboter über eine primitive Regelung ansteuern kann (maximal kann man während der Fahrt durch weitere Hindernissensoren den Pathfollower unterbrechen und am Pathfinder eine Neuberechnung antriggern).

    Kurz: Die beiden Telegramme kann ich über die serielle Schnittstelle lösen, die Gegenstelle (Simulation) ist eh da, dann kann ich mich auf's Wesentliche konzentrieren.


    Zitat Zitat von Moppi Beitrag anzeigen
    Was geht, was nicht.
    Es werden einige komplexere Probleme (closed loop, kidnapped robot) wahrscheinlich nicht gehen. Allerdings weiß ich auch nicht, ob die bei z.B. Staubsaugerrobotern gelöst werden, oder ob diese Geräte nicht gerade deshalb die "Verbindung nach Hause" suchen, damit die Softies beim Hersteller die Sache heilen.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Weiter geht es mit neuen Features.
    Die V0.6 liegt hier (https://c.gmx.net/@31902611639422705...GUZEDN7AmUzQ):
    Wenn auf der verlinkten Seite etwas von fehlender Freigabe steht, einmal über F5 im Browser aktualisieren.

    Als Update einfach entpacken, mit Arduino öffnen, PWD und SSID aus Common.h anpassen und das Spiffs-Laufwerk aus dem data-Verzeichnis aktualisieren. Ggf. noch die serielle Schnittstelle anpassen (sonst kommen keine Daten).

    Die Eroded-map
    ==============

    Klicke auf die Grafik für eine größere Ansicht

Name:	Eroded.jpg
Hits:	4
Größe:	42,4 KB
ID:	35686

    Der im Fall A) gezeigte Pfad geht zwar nach den Informationen der bisher erstellten Karte über freie Felder, trotzdem würde der dem Pfad folgende Roboter mit dem Hinderniss kollidieren (er ist selber ein Körper).
    Entweder berechnet man bei der Pfadsuche also die Abmessungen des Roboters ein, oder, wie in Fall B) gezeigt, man vergrößert die Hindernisse entsprechend: man zeichnet jeden Hindernispunkt der Lidar-map als Klecks mit dem Radius des Roboters in die Eroded-map.
    Das funktioniert nach folgenden Spielregeln:
    Aus dem Slam-Zyklus heraus werden die Felder der Lidar-map über Grid->Set(x,y,value) letztendlich in Tile->Set(x,y,value) manipuliert.

    Verpassen wir Tile->Set einen Rückgabewert, der angibt, in welche Richtung sich der Belegtwert des Feldes (>0 oder <=0) ändert...
    Code:
    int8_t Tile::Set(int x, int y, int8_t val)
    {
      int8_t rval =0;
      int offset = y*_width+x;
      if(Data[offset]<=0 && val > 0)
        rval= 5;
      if(Data[offset]>0 && val <= 0)
        rval= -5;
    
      Data[offset] = val;  
      IsDirty= true;
      IsTested= false;
      return rval;
    }
    ... können wir in Grid->Set mithilfe einer vordefinierten Maske in der Eroded-map den nötigen Tintenklecks einfügen.
    Code:
    //from common.h
    // 2 fields additional mask:
    // XXX
    //XXXXX
    //XXOXX
    //XXXXX
    // XXX
    int RobotMask[][2]={        {-1, 2},{0, 2},{1, 2},
                        {-2, 1},{-1, 1},{0, 1},{1, 1},{2, 1},
                        {-2, 0},{-1, 0},{0, 0},{1, 0},{2, 0},
                        {-2, -1},{-1, -1},{0, -1},{1, -1},{2, -1},
                                {-1, -2},{0, -2},{1, -2}
                       };
    
    
    
    void Grid::Set(int x, int y, int8_t val)
    {
      Tile* tile = GetTile(x,y, true);
      if (tile == nullptr) 
        return;
        
      int8_t e = tile->Set((x-xMin)%SLAM_TILESIZE,(y-yMin)%SLAM_TILESIZE, val);
      if (e !=0)
      {
        int ex, ey;
        for (int i=0;i <sizeof(RobotMask)/8;i++)
        {
          ex= x+RobotMask[i][0];
          ey= y+RobotMask[i][1];
                
          tile = GetTile(ex,ey, true);
          if (tile != nullptr) 
            tile->AddToEroded((ex-xMin)%SLAM_TILESIZE,(ey-yMin)%SLAM_TILESIZE, e);
        }
      }
    }
    Das Resultat: Dickere Wände, freie Felder sind 0, besetzte Felder haben einen positiven Wert.
    Negative Werte werden nicht eingenommen.

    Wissenswert vielleicht noch: Die Umstellung der Ansicht Lidar-map/ Eroded-map erfolgt über
    #define DRAWING_SHOW_ERODED
    (wie immer in Common.h)

    Der Pathfinder
    ==============
    In der jetzigen Testimplementierung sucht der Pathfinder den Weg von der aktuellen Roboterposition zum Zielpunkt (0;0). Den Zielpunkt kann man im Frontend durch Klicken auf die Map umsetzen. In der Debug-Sektion gibt der "Pathfinder-Report" weitere Infos.

    Zum Algorithmus: Nachdem wir mit der Eroded-map quasi das Speicheraufkommen für die lapidare Aufgabe der Kollisionsvermeidung um Hindernisse herum verdoppelt haben, wurde es Zeit, zumindest beim Pathfinder nach einer der Hardware angemessenen Lösung zu suchen.

    Klicke auf die Grafik für eine größere Ansicht

Name:	PathfollowOptimal.png
Hits:	10
Größe:	82,4 KB
ID:	35687

    Das Ergebnis im Bild: Links der aktuell implementierte Algorithmus, im Vergleich rechts ein A* auf dem PC. Das sieht auf den ersten Blick nicht optimal aus.
    Auf den zweiten Blick allerdings zeigt auch der A* keinen perfekten Weg. Knoten sind nun mal auf einem Array Nachbarfelder. Die können nur horizontal, vertikal oder diagonal sein. Entsprechend ermittelt auch der A* nicht die über die blaue Linie angedeutete Abkürzung.

    Beim A* bietet es sich an, während der Fahrt über den Pfad (Pathfollower) diese Abkürzungen zu suchen, indem man mithilfe des bereits im Slam verwendeten Bresenham die vor sich liegenden Felder abtastet. Wenn man dadurch ein´weiter entferntes Feld hinter der nöchsten Kurve geradlinig erreichen kann, dann kann man die Kurve also schneiden.

    Und ja, ich bin der Meinung, das kann man auch mit dem Ergebnis des ESP-Patfinders. Mit ein bisschen Spielen wird also während der Fahrt nicht viel Anderes bei rumkommen.

    Die Handbremse lösen
    ===================
    Wer noch einmal die alte Version 0.5 hervorholt und hier in der loop() in ESP32Slam.ino ein vTaskDelay(100) einfügt, wird bemerken, dass sich die Zykluszeiten des Slam auf dem ESP32-S2 um ca. 40% verbessern.
    Ich denke mal, dass auch die loop() eine RTOS-Task mit Priority>0 ist und der leere Rumpf alleine die anderen Tasks gewaltig ausbremst. Anders kann ich es mir nicht erklären.
    Geändert von Holomino (26.12.2021 um 23:36 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Klicke auf die Grafik für eine größere Ansicht

Name:	Simulator.png
Hits:	3
Größe:	118,7 KB
ID:	35695

    Der Simulator ist da
    Als Vorbereitung für den Pathfollower oder einfach zum Spielen.
    Ein Klick auf die Karte in der HTML-Seite löst beim simulierten Roboter ein primitives Bewegungsmuster (drehen in Richtung/ Vorwärtsfahrt bis zum Zielpunkt) aus. Kollidiert der Roboter dabei mit einem Hindernis, hält er stumpf an.

    Sowohl die Bewegung als auch die kontinuierlichen Lidarmessungen werden mit Fehlern versehen, so dass der Slam etwas zu tun hat (sieht man nach kurzer Fahrt recht gut, wenn man den Slam über SLAM_ANGLEDEVIATION/SLAM_DISTANCEDEVIATION deaktiviert).

    Die simulierte Karte ist in sim.h als Array mit 32x32 Feldern definiert. Eine 1 als Element definiert ein Hindernis, eine 0 ist frei befahrbar. Entsprechend der angegebenen Feldgröße 400 (SIM_FIELDSIZE) hätte die Karte eine Abmessung von 12800x12880 Einheiten.
    Mit der Einheit "mm" und der Rastereinstellung 100 im Slam (SLAM_RASTER) wäre die Simulationsumgebung von 12,8x12,8m also in 10cm-Kästchen gerastert.
    Ebenso in sim.h befinden sich die anderen zugehörigen Parameter, so dass man mit unterschiedlichen Sensor- (Reichweite, Messungen/Umdrehung, Genauigkeit) und Fahrsettings (Robotergröße, Odometriegenauigkeit, Geschwindigkeit) spielen kann.


    Stabilere Ausgabe
    Ich Suche Fehler eigentlich immer eher bei mir, es hat also etwas gedauert (nach Betrachtung der Quellen zusammen mit meinem personal Informatiker waren uns beiden die Quellen nicht so recht geheuer), bis ich diesen Link gesucht/gefunden habe:
    https://github.com/me-no-dev/ESPAsyn...ver/issues/900

    Bedauerlich: Es gibt etliche begeisterte Netzbeiträge über den AsyncWebserver und mindestens genauso viele Rückfragen bezüglich Instabilität. Die Lösung liegt (versteckt den Dornröschenschlaf fristend) gleich nebenan:
    https://github.com/yubox-node-org/ESPAsyncWebServer.
    Warum verlinkt da keiner drauf?

    Lässt sich jedenfalls, genau wie das Original, als Zip-Lib in Arduino installieren (vorher das Original einfach von der Platte löschen)
    Für diese Anwendung ist der Wert 4 in der Konstante WS_MAX_QUEUED_MESSAGES ein guter Kompromiss.

    Das neue Board-Package 2.0.2
    ...funktioniert bei mir nicht. Soweit ich nach kurzer Testinstallation (mal so nebenbei, sollte ja nur 10 min dauern und hat dann doch wieder 2h Stirnrunzeln gekostet, grummel) gesehen habe, läuft UART1 auf dem S2 nicht mehr. Ob's nun am Programm bei mir liegt oder am Package? Keine Ahnung - ich muss es noch testen. Also:
    Zur Zeit ist das gültige Board-Package für dieses Projekt noch die Version 2.0.1.



    Die V0.7 liegt hier: (https://c.gmx.net/@31902611639422705...SkGUZEDN7AmUzQ). Wie gehabt: Wenn "diese Freigabe leider ungültig ist", einmal über F5 aktualisieren, dann klappt das schon.
    Der Simulator sendet seine Daten, wie bisher schon zelebriert, weiterhin über die UART. Also auch das Patchkabel zum Brücken von RxD/TxD stecken lassen.
    Geändert von Holomino (03.01.2022 um 10:52 Uhr)

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    903
    Der Pathfollower

    Ein Linksklick auf die Map lässt den Roboter jetzt optimiert über den Pathfollower den Pfad zum Zielpunkt folgen.
    Rechtsklick ist die aus der letzten Version bereits bekannte Fahrt per Luftlinie (da klatscht der Roboter halt vor die nächste Wand).

    Netter Nebeneffekt für Indoor: Wenn man auf einen Punkt außerhalb der Umrisse klickt, sucht sich der Roboter iterativ den Pfad und exploriert so nebenbei die gesamte Umgebung:





    Die V0.8 liegt hier (https://c.gmx.net/@31902611639422705...SkGUZEDN7AmUzQ). Wie gehabt: Wenn "diese Freigabe leider ungültig ist", einmal über F5 aktualisieren, dann klappt das schon.

    Um Links-/Rechtsklick nutzen zu können, muss auch wieder das SPIFFS-Verzeichnis aktualisiert werden.

Ähnliche Themen

  1. SLAM für autonomen Roboter nötig?
    Von Moppi im Forum Software, Algorithmen und KI
    Antworten: 45
    Letzter Beitrag: 26.06.2020, 13:40
  2. Flaschenhals im Slam?
    Von Holomino im Forum Software, Algorithmen und KI
    Antworten: 6
    Letzter Beitrag: 01.06.2015, 16:31
  3. Roboter mit Neato Lidar und SLAM
    Von teamohnename im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 4
    Letzter Beitrag: 20.04.2015, 12:41
  4. 360° Laser-Scanner für 360€, SLAM
    Von Günter49 im Forum Sensoren / Sensorik
    Antworten: 12
    Letzter Beitrag: 16.11.2014, 18:19
  5. Angebot eines SLAM Kurses
    Von Magox im Forum Offtopic und Community Tratsch
    Antworten: 2
    Letzter Beitrag: 26.09.2014, 17:18

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress