Mein Projekt CaSSAndRA zur Steuerung des Ardumowers

@EinEinach Erst einmal habe ich Dir zu Danken. Du investierst hier Deine Zeit, damit ich Deine Arbeit auch nutzen kann.
Mit Deiner Codeänderung funktioniert es jetzt bei mir auch. Habe mal einen kleinen Testlauf gemacht.
Ich hatte an den ersten 2 Seiten des Perimeters einen Versatz von ca. 10cm gegenüber dem, wo er sonst fuhr und danach hatte er in 2 Ecken Vollkreise gedreht. Das werde ich aber erst mal weiter beobachten. Ich könnte mir vorstellen, dass er sich in der GPS-Positionierung anfangs geirrt hatte und es sich dann nachher eingependelt hatte. Mit den Vollkreisen hat sich dann vermutlich auf die neuen korrekten Positionen korrigiert.
Eine Auffälligkeit hätte ich aber noch:
Ich habe 2 Runden Perimeter abfahren eingestellt und dann die Linien so, dass diese annähernd parallel zu einer Kante verlaufen.
Ich glaube aber, dass Deine Rechnung eine Bahn zu früh endet, die Linien abzufahren. Es ist zwar richtig, dass eine normale weitere Bahn nicht mehr gehen würde, ohne in die 2 Borderbahn reinzufahren, wenn hier aber einfach beendet wird, bleibt dazwischen ein Streifen Gras stehen.
Es gäbe 2 Möglichkeiten, das zu verhindern. Entweder akzeptieren, dass er mit einer letzten Bahn beim Innenbereich ausfahren, in diese 2. Borderbahn fährt oder noch eine letzte Bahn im Innenbereich genau auf der äußersten zulässigen Bahn zu fahren.
IMG_2870.PNG
Der rote Punkt ist auf dem Endpunkt. Ich denke, man sieht am Abstand dieser letzten Linie zur 2. Borderlinie gegenüber den anderen Linien, was ich meine.
 
Einen Tipp kann ich Euch auch noch mithelfen. Bei der Erstinbetriebnahme helfen ein paar Neustarts.

Als erstes Problem hatte ich, dass beim ersten Start von CaSSAndRA alle Browser-Anfragen in ein "Connection refused" liefen. Als ich im Internet suchte, ob ich vielleicht noch den Port freigeben müsse oder ähnliches, fand ich ein paar Tipps zum Serverstart, die ich ausprobieren wollte. Da fand ich in app.py die auskommentierte Zeile zum Localhost. Diese hatte ich dann aktiviert und stattdessen die zum 0.0.0.0 deaktiviert. Dann lief es zumindest über den Browser direkt auf dem Pi. Als ich dann die Änderung wieder rückgängig gemacht hatte, lief es dann auch von anderen Rechnern aus. Vielleicht läuft es erst bei einem 2. Start, vielleicht muss man es auch erst mit den anderen Optionen starten, damit sich irgendwelche Configfiles passend einstellen. Auf jeden Fall läuft die Verbindung am Ende mit genau dem eingestellten Code.

Nachdem ich dann die Verbindung UART eingestellt hatte, hatte ich zwar anscheinend eine funktionierende UART-Verbindung, jedoch kamen im Log noch immer alle paar Sekunden ein Fehler, dass die Verbindung nicht funktionieren würde.
Dann USB-Verbindung noch mal gelöst, Mäher abgeschalten, Pi runtergefahren, Mäher wieder an, USB-Verbindung gesteckt, Pi wieder hochgefahren und es gab keine Fehlermeldungen mehr.
 
Ich glaube aber, dass Deine Rechnung eine Bahn zu früh endet, die Linien abzufahren. Es ist zwar richtig, dass eine normale weitere Bahn nicht mehr gehen würde, ohne in die 2 Borderbahn reinzufahren, wenn hier aber einfach beendet wird, bleibt dazwischen ein Streifen Gras stehen.
Das Problem ist, wenn man noch eine Bahn berechnen würde und man distance to border 0 auswählt also keine Mähkante, wird die letzte Bahn außerhalb des Perimeters verlaufen
 
Jepp, das ist das Problem, wenn man die einfache Lösung wählt, noch eine letzte Bahn zu fahren.
Aber eine Mähkante beim Ausfüllen stehen lassen ist auch keine Lösung.

Die saubere Lösung wäre, als letzte Bahn noch eine mit reduziertem Abstand zur bisher letzten Bahn zu fahren, wie es gerade noch erlaubt wäre, also eigentlich eine Bahn als (eingestellteBorderDistance + 1)te Bahn parallel zum Perimeter an entsprechender Seite.
Damit fährt man dann als allerletzte Bahn in jede Richtung jeweils die Randbahn des eingestellten Mähbereichs ab und mäht, was man sonst stehen lassen würde. So wie er es oben rechts quasi auch macht. Unten links müsste genauso die 3. Borderbahn wieder zurück fahren und dann erst enden.
Dann bleibt nichts stehen und er verlässt nicht den Bereich, den er mähen soll, wenn man 0 einstellt.
 
Ne, habe ich nicht. Ich hatte nur das "Anfahren einer Position" genutzt, um ihn aus der letzten Ecke zum Eingang zurückzufahren. Das hatte gut funktioniert.
Die manuelle Steuerung hatte ich immer gehasst, hatte dewegen gleich die Finger von gelassen.
Kann ich aber nächstes Mal gern mal probieren, wenn ich ihn wieder draußen habe.
 
18cm
In Deiner Ansicht ist die letzte Bahn noch immer etwas weiter von den Borderbahnen entfernt als die anderen. Ich hätte jetzt erwartet, dass zum Schluss eine zusätzliche Bahn mit etwas zu geringem Abstand erforderlich wird.

Wie zeigst Du denn die resultierenden Mähwege an, ohne den Mäher losmähen zu lassen?
 
Wie zeigst Du denn die resultierenden Mähwege an, ohne den Mäher losmähen zu lassen?
Das ist vielleicht die neue Preview Funktion.

Ursprünglich war Preview dafür gedacht etwas schneller eine Übersicht über den eingestellten Muster zu geben, damit man quasi Live die Änderungen sich ansehen kann. Im grundegenommen stellt jede Linie im Preview Modus einen eigenen Graph dar und gerade auf dem Raspberry Pi kommt diese Schnelligkeit nicht zum tragen. Teilweise dauert ein Plot von 100 Linien länger als gleich den richtigen Mähweg zu berechnen. Denn der Mähweg ist nur 1 Graph. Deswegen die Überlegung den Preview durch den berechneten Mähweg zu ersetzen. Das wird zwar den Preview auf den schnellen Rechnern verlangsamten auf dem Raspberry Pi dafür beschleunigen, so die Theorie.
In Deiner Ansicht ist die letzte Bahn noch immer etwas weiter von den Borderbahnen entfernt als die anderen.
das sieht nur so aus, der Abstand dürfte maximal die eingestellte Mähbreite haben
 
Einen etwas größeren Änderungswunsch hätte ich noch.
Ich verstehe schon Dein Konzept und die Vorteile Deiner Herangehensweise an die Maps und Steuerung. Es bringt aber auch noch einige Nachteile mit sich gegenüber der SunrayApp.

Ich halte aber ein BestOf für realisierbar:
Du könntest die aktuelle Map, die Du immer als ActualUsedVersion in der Anzeige hältst und auf dessen Basis auch ein Mähvorgang startest als Map[0] führen. Zusätzlich könntest Du in CaSSAndRA noch bspw. 10 weitere Slots für Maps halten Map[1] bis Map [10].
Diesen Slots sollte man sprechende Namen geben können und diese sollten potentiell sowohl Perimeter, Exclusions, Dockpoints als auch Waypoints aufnehmen können. Den aktuellen Inhalt von Map[0] sollte man auf jeden anderen Speicherslot kopieren können und genauso auch den Inhalt der Speicherslots als Map[0] heranziehen können.
Wenn Du jetzt noch im Preview-Button alle Waypoints berechnen lässt, aber auch genauso das Preview ausschaltbar machst, so dass dann die berechneten Waypoints wieder gelöscht werden, kann jeder entscheiden, ob er in den Slots nur Perimeter, Exclusions und Dockpoints oder auch Waypoints mit speichern möchte.
Beim Start des Mähvorgangs prüft CaSSAndRA, ob bereits Waypoints vorliegen (und angezeigt werden) oder ob diese erst noch berechnet werden müssen. Dementsprechend stößt CaSSAndRA erst noch eine Rechnung an oder schiebt die vorhandene Map gleich 1:1 auf den Mäher und startet dann den Mähvorgang.

In einem weiteren Schritt könnte man noch im Mäher ein AT-Kommando implementieren, bei dem der Mäher seine gespeicherte Karte an die App mitteilt. Dann kann man in CaSSAndRA sogar einen Button zum Abrufen der Daten aus dem Mäher implementieren. Dann könnte man leichter mit der SunrayApp Perimeter, ... erstellen, von dort alles auf den Mäher laden und diese Daten dann in CaSSAndRA direkt vom Mäher einlesen und in einem Slot speichern.

Warum das Ganze? Das bringt die volle Flexibilität für Mähkarten in Dein System.
In meinem Fall habe ich mehrere Rasenflächen in mehreren Karten. Jede soll noch mit unterschiedlichem Winkel immer am jeweiligen Weg entlang gemäht werden. Momentan muss ich beim Wechsel der Rasenfläche erst einmal die Karte importieren und dann den für die Fläche passenden Winkel einstellen. Könnte ich die einzelnen Flächen als fertig berechnete aus den Slots ziehen.
Wenn jemand eine komplizierte Fläche hat, wo der Automatismus vielleicht Mähflächen nicht einberechnet, kann man manuell in der Datei ein paar Waypoints hinzufügen, so dass der Mäher auch in diese Ecken kommt. So wäre man flexibel bis es einen optimierten Automatismus gäbe.
Außerdem gibt es Gärten mit schwachen GPS-Empfangsbereichen. Einige helfen sich dadurch, den Mäher immer geradeaus durch diese Bereiche laufen zu lassen und legen dann die Wendepunkte in bessere Bereiche. Wenn bspw. ein Baum in der Mitte steht, dann nicht versuchen die Exclusion zu umrunden oder daran zu wenden, sondern aus der Ferne kommend in verschiedenen Winkeln sternförmig am Baum vorbei fahren. Oder andersrum wenn die Randbereiche schwachen Empfang haben, kann man Sternförmig immer wieder durch die Mitte fahren.
Natürlich kann man auch für Bereiche mit schwachem Empfang Markierungen einführen und hierauf besondere Algorithmen erstellen. Das wird nur extrem aufwendig und würde wohl eher etwas für die ferne Zukunft sein.
Mit komplett gespeicherten Mähkarten hätte man jedoch die Flexibilität, einmalig Aufwand in die manuelle Mähwegmanipulation zu stecken und so auch ausgefallene Szenarien zu meistern.

Ich weiß, dass das keine 2-Zeilenänderung ist, die von heute auf morgen geht. Ich glaube aber, dass es mit ein wenig Umstrukturierung noch mit vertretbarem Aufwand gehen könnte.
 
Zunächst erst einmal meine Anerkennung zu diesem Projekt! Es gefällt mir sehr gut und ich würde es gerne einmal ausprobieren. Die Installation habe ich testweise auf einem Notebook durchgeführt, später soll das auf einem Raspberry laufen. Den habe ich hier noch liegen, nur fehlt mir z. Z. eine passende Speicherrkarte.
Auf dem Notebook läuft die Anwendung, ich kann mit dem Handy darauf zugreifen und auch den Mower kann ich erreichen. Was mir aber bisher noch nicht gelingt, ist die Karte zu importieren.
Vieleicht habe ich da auch ein Verständnisproblem. Wie kann ich die Karte aus der Sunray-App exporteieren?
Ich habe über Map Data und copy den Inhalt in der Textverarbeitung in eine Datei kopiert und diese als map.txt gespeichert, auf das Telefon geschoben und wollte sie dort in die App importieren, bekomme aber die Meldung 'import failed'.
Wasist da falsch?
 
Hallo jottka,
wenn du magst kann ich mir die Datei anschauen, einfach irgendwie zukommen lassen. bzw. in der app.py in der Zeile 5 INFO auf DEBUG ändern. Dann noch mal Import durchführen. Danach mit journalctl -u cassandra -e die Einträge anschauen, wenn der Dienst als daemon läuft, bzw. wenn direkt im Terminal gestartet wurde, dann von dort die Ausgaben anschauen und hier posten.

Gruss
 
Hallo @EinEinach, vielen Dank für die Antwort. Ist es denn soweit richtig, wie die Karte exportiert werden sollte und muss sie eventuell einen besonderen Namen haben?

Grüße
 
Ich habe es i. M. im Terminal laufen, INFO in DEBUG geändert.
Hier die Terminal-Ausgabe und die Karte:
 

Anhänge

  • map.txt
    332 KB · Aufrufe: 8
  • terminal.txt
    13,7 KB · Aufrufe: 5
Ich gehe mal davon aus, dass da noch irgendwas fehlt oder falsch konfiguriert ist, ich hab nur leider nicht viel Ahnung von Python!
 
Schmeiss das mal aus der Datei ganz hinten raus, als kurzfristige Lösung:
Code:
{
        "perimeter": [],
        "exclusions": [],
        "waypoints": [],
        "dockpoints": [],
        "patternAngle": 0.6806784082777886,
        "mowOfs": 0.2,
        "patternRings": false,
        "doMowExclusions": false,
        "doMowPerimeter": true,
        "doMowArea": false,
        "doPerimeterBorder": false,
        "doExclusionsBorder": false
    },
    {
        "perimeter": [],
        "exclusions": [],
        "waypoints": [],
        "dockpoints": [],
        "patternAngle": 2.356194490192345,
        "mowOfs": 0.15,
        "patternRings": false,
        "doMowExclusions": false,
        "doMowPerimeter": true,
        "doMowArea": false,
        "doPerimeterBorder": false,
        "doExclusionsBorder": false
    },
    {
        "perimeter": [],
        "exclusions": [],
        "waypoints": [],
        "dockpoints": [],
        "patternAngle": 2.3911010752322315,
        "mowOfs": 0.2,
        "patternRings": false,
        "doMowExclusions": false,
        "doMowPerimeter": true,
        "doMowArea": false,
        "doPerimeterBorder": false,
        "doExclusionsBorder": false
    },

Und ich kümmere mich um den Bugfix
 
Das hat geklappt, Danke!
Ich brauche eigentlich nur die 1. Karte, die anderen waren Teilstücke davon für die ersten Versuche im letzten Jahr.
 
Ok, habe ich gefixt. Außerdem habe ich in Readme die Vorgehensweise beschrieben, wie man auf die aktuellste Version updatet.
 
Also, ich habe CaSSAnndRA jetzt als Dienst laufen, das Karten laden funktioniert jetzt, auch ohne den Schluss raus zu löschen. Ich kann auch den Winkel der Mählinien usw. einstellen. Irgendwie verstehe ich aber die Bedeutung der Punkte am unteren Rand des Home-Schirmes noch nicht so richtig, es passiert auch außer beim Zahnrad nicht wirklich etwas, wenn ich darauf drücke und der Mäher reagiert auch nicht, wenn ich auf play drücke oder die Remote control nutze. Solution, State und SoC wird mir aber korrekt angezeigt.
Muss die Karte erst, wie in der Sunray-App auf den Mower geladen werden? Dazu habe ich noch nichts gefunden.
Was kann ich zur Klärung noch beisteuern?
 

Anhänge

  • Screenshot_20230504-180527.png
    Screenshot_20230504-180527.png
    157,3 KB · Aufrufe: 33
  • Screenshot_20230504-180542.png
    Screenshot_20230504-180542.png
    158 KB · Aufrufe: 33
Wenn Du das 2. Symbol drückst, also die Karte, solltest Du einen kompletten Mähplan, also alle Wege in der Ansicht erhalten, jeweils darauf angepasst, wie Du beim Zahnrad die Einstellungen gemacht hast. Ganz rechts solltest Du dann mit dem X die Wege wieder in der Ansicht gelöscht bekommen.
 
Oben