EinEinfach / CaSSAndRA

Cascaded sunray server and rover application
MIT License
25 stars 17 forks source link

Mower ignores exclusions when uploaded with cassandra #35

Closed disaster123 closed 11 months ago

disaster123 commented 11 months ago

I've at least two maps which i originally created using sunray and imported into cassandra. If i upload those maps - some exclusions or all seem to be missing. If the mower tries to drive from a to b using pathFinder code (not on mowlines) it tries to drive through the exclusions. This does not happen if i upload the "old" map with sunray to the mower. So this is not a bug in the mower FW.

disaster123 commented 11 months ago

Beispiel Screenshot - er versucht direkt durch die Exclusion zum Punkt zu kommen - passiert mit gleicher Karte und sunray nicht: image

disaster123 commented 11 months ago

Gefühlt habe ich gar keine Karte wo die Exclusions beachtet werden, wenn ich via Cassandra hochlade... Er mäht dort nur nicht, weil Cassandra keine Pfad hindurch generiert, aber wenn er frei in der MAP fahrne soll, scheinen die Exclusions dem Mäher nicht bekannt.

EinEinfach commented 11 months ago

Wir müssen mal ins log von Cassandra reinschauen, wenn die Karte hochgeladen wird. Werden die Exclusions mit hochgeladen. Es sind die beiden Befehle AT+X und AT+N von Interesse, was steht drin

disaster123 commented 11 months ago

@EinEinfach AT+X und AT+N enthalten quasi keine Daten - Ausgabe: https://pastebin.com/raw/QYd5t10W

EinEinfach commented 11 months ago

Doch, es steht was drin. Die erste null in dem AT+X verwirrt mich (Eine Exclusion ohne Punkte? Kann sowas sein?)

AT+N: 49 Perimeterpunkte, 28 Exclusionspunkte, 20 Dockpfadpunkte, 318 Mähpunkte... sieht gut aus

AT+X: 0 Punkte erste Exclusion????, 13 zweite, 9 dritte, 6 vierte... zusammen 28, also passt...

Ich muss mal schauen, ob die Null vorne weg normal ist... ich glaube nicht.

Wie startest du den Mäher? Aus dem Task oder von der Übersichtsseite?

AT+N,49,28,20,318,0 is send to the rover 2023-08-11 08:38:56 DEBUG Calced checksumme: 0xef 2023-08-11 08:38:56 DEBUG Encryption: true 2023-08-11 08:38:56 DEBUG Data to be send: gzQtRZ_RX^RXVRYW^RVRV?,- 2023-08-11 08:38:56 DEBUG Starting new HTTP connection (1): 192.168.178.138:80 2023-08-11 08:38:56 DEBUG http://192.168.178.138:80 "POST / HTTP/1.1" 200 8 2023-08-11 08:38:56 DEBUG Backend: AT+X,0,13,9,6 is send to the rover

disaster123 commented 11 months ago

OK dann war ich zu doof es zu sehen ;-)

Ich starte den Mäher aus der Übersichtsseite - also Mow All + Play

disaster123 commented 11 months ago

Zu der 0 Punkte Exclusion habe ich keine Idee ;-) Aber selbst das sollte doch nicht dazu führen, dass er die anderen Exclusions ignoriert oder?

EinEinfach commented 11 months ago

Kannst du mal in den Alfred Log schauen, was kommt dort nach der Kartenübertragung an. Vielleicht kann man dort was erkennen

EinEinfach commented 11 months ago

Ich habe es überprüft, die erste 0 in der AT+X Message ist auch bei mir vorhanden, also hat es seine Richtigkeit. Der Fehler liegt woanders.

Als nächstes müsste man die Übertragenen Daten überprüfen, ob die Exclusions auch an den Stellen sind, wo die sein müssten, ist etwas mühsam, aber hilft nicht. Ich kann dir anbieten, dass ich mit deiner Karte in deinen Einstellungen den Simulator anwerfe und prüfe, ob bei mir zum ähnlichen Verhalten kommt.

Aber ich verstehe es richtig, wenn du den Rover vor die Exclusion stellst und zB. mit Go to Button den Zielpoint hinter der Exclusion setzt, dann fährt der Rover über die Exclusion?

disaster123 commented 11 months ago

Kannst du mal in den Alfred Log schauen, was kommt dort nach der Kartenübertragung an. Vielleicht kann man dort was erkennen

Im Log steht nur:

Aug 11 12:18:34 bananapi start_sunray.sh[21633]: clearMap
Aug 11 12:18:34 bananapi start_sunray.sh[21633]: CRC ERRORCB,92
Aug 11 12:18:34 bananapi start_sunray.sh[21633]: Motor::setMowState ON
Aug 11 12:18:34 bananapi start_sunray.sh[21633]: setOperation op=1
Aug 11 12:18:34 bananapi start_sunray.sh[21633]: changeOperationType
Aug 11 12:18:34 bananapi start_sunray.sh[21633]: dumpState:  X=-0.06 Y=0.35 delta=0.00 mapCRC=1359600 mowPointsIdx=0 dockPointsIdx=0 freePointsIdx=0 wayMode=2 op=1 sensor=0 sonar.enabled=1 fixTimeout=49 absolutePosSource=0 lon=0.00 lat=0.00 pwmMaxMow=255 finishAndRestart=0 motorMowForwardSet=0
Aug 11 12:18:34 bananapi start_sunray.sh[21633]: save state... ok
disaster123 commented 11 months ago

Ich habe es überprüft, die erste 0 in der AT+X Message ist auch bei mir vorhanden, also hat es seine Richtigkeit. Der Fehler liegt woanders.

Als nächstes müsste man die Übertragenen Daten überprüfen, ob die Exclusions auch an den Stellen sind, wo die sein müssten, ist etwas mühsam, aber hilft nicht. Ich kann dir anbieten, dass ich mit deiner Karte in deinen Einstellungen den Simulator anwerfe und prüfe, ob bei mir zum ähnlichen Verhalten kommt.

Aber ich verstehe es richtig, wenn du den Rover vor die Exclusion stellst und zB. mit Go to Button den Zielpoint hinter der Exclusion setzt, dann fährt der Rover über die Exclusion?

Ja das verstehst du richtig. Ich nutze nicht goto sondern starte einfach das Docking - damit ich das gleiche mit Sunray prüfen kann. Das kann ja kein goto.

@map / karte wie kann ich die "teilen"?

disaster123 commented 11 months ago

irgendwie sieht das Log jedes mal anders aus - bei einem weiteren Versuch sah es nun so aus:

Aug 11 12:22:12 bananapi start_sunray.sh[7838]: clearMap
Aug 11 12:22:12 bananapi start_sunray.sh[7838]: CRC ERROR0,DD
Aug 11 12:22:12 bananapi start_sunray.sh[7838]: CRC ERRORF,FD
Aug 11 12:22:12 bananapi start_sunray.sh[7838]: CRC ERROR8,8D
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: CRC ERROR0,D4
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: CRC ERROR0,DF
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: ptIdx=13 exclusionPointsCount=28
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: ptIdx=22 exclusionPointsCount=28
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: ptIdx=28 exclusionPointsCount=28
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: finishedUploadingMap
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: map dump - mapCRC=684078
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: points:
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: perimeter pts: 49
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: exclusion pts: 28
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: exclusions: 3
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: dock pts: 20
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: mow pts: 318
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: first mow point:15.80,1.46
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: free pts: 0
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: mowPointsIdx=0 dockPointsIdx=0 freePointsIdx=0 wayMode=4
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: map save... ok
Aug 11 12:22:13 bananapi start_sunray.sh[7838]: CRC ERROR5,5D
disaster123 commented 11 months ago

diesmal so:

Aug 11 12:32:02 bananapi start_sunray.sh[9626]: clearMap
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: ptIdx=13 exclusionPointsCount=28
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: ptIdx=22 exclusionPointsCount=28
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: ptIdx=28 exclusionPointsCount=28
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: finishedUploadingMap
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: map dump - mapCRC=1119338
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: points:
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: perimeter pts: 49
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: exclusion pts: 28
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: exclusions: 3
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: dock pts: 20
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: mow pts: 324
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: first mow point:15.97,0.40
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: free pts: 0
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: mowPointsIdx=0 dockPointsIdx=0 freePointsIdx=0 wayMode=4
Aug 11 12:32:03 bananapi start_sunray.sh[9626]: map save... ok
EinEinfach commented 11 months ago

Also, die logs sehen gut aus. Aber auch hier kann ich keinen Fehler erkennen, bleibt eigentlich nur die übertragenen Exclusionkoordinaten zu prüfen, ob diese auch an der richtigen Stelle sind und nicht irgendwo außerhalb von Perimeter

EinEinfach commented 11 months ago

In /src/data/map liegt perimeter.json. Den brauche ich, dann kann ich mit deiner Karte mal mit dem Simulator mähen, bzw. versuchen das gleiche nachzustellen

EinEinfach commented 11 months ago

Was sind das für CRC Fehler im ersten Log?

disaster123 commented 11 months ago

Was sind das für CRC Fehler im ersten Log?

Das Frage ich mich auch... die kommen aus der processCMD Funktion beim verarbeiten von AT Kommandos - diese schlagen dann wohl fehl. Code dazu:

   if ((expectedCrc != crc) && (checkCrc)) crcErr = true;
    if (crcErr) {
      CONSOLE.print("CRC ERROR");
      CONSOLE.print(crc,HEX);
      CONSOLE.print(",");
      CONSOLE.print(expectedCrc,HEX);
      CONSOLE.println();
      return;
EinEinfach commented 11 months ago

Dann muss das, das Problem sein. Keine Ahnung was Sunray damit macht, wenn die CRC fehlschlägt, verwirft die dann die übertragenen Punkte??? Wenn ja, dann passen die, AT+X und AT+N Informationen nicht mehr. Wenn du mal eine Übertragung ohne CRC Fehler hast, bügelt der Rover trotzdem über die Exclusion?

disaster123 commented 11 months ago

Ich habe mal das Logging ausgebaut im Sunray Code und teste mal ob das Problem auch auftritt, wenn kein CRC Fehler beim Upload passiert...

Ja, Sunray verwirft alle Punkte / das ganze Kommando bei einem CRC Fehler.

disaster123 commented 11 months ago

OK das Problem gibt es tatsächlich nur, wenn CRC Fehler auftreten - dann fehlen einfach Teile der Karte... man bekommt es aber gar nicht mit.

Ist die Übertragung ohne CRC Fehler läuft alles wie es soll.

EinEinfach commented 11 months ago

Ok, das ist ein großes Problem. Ich muss mir überlegen, wie ich das abfangen kann

disaster123 commented 11 months ago

Es müsste eigentlich auf dem Befehl eine andere / keine Rückmelfung geben. Ich habe bei Alex von Sunray mal nachgefragt was er in dem Fall macht.

Ich lasse mir nun zusätzlich den gesamten Commando String ausgeben. Ungewöhnlich dass da CRC Fehler kommen…

disaster123 commented 11 months ago

Also der original sunray Client sendet die befehle immer wieder bis es eine Rückantwort gibt.

EinEinfach commented 11 months ago

Ich kann mir schon vorstellen, wie das funktioniert. Sunray FW schickt auf jeden Request die berechnete Checksumme als Response. Sunray App prüft die erhaltene Checksumme mit der berechneten Checksumme, bei nicht Übereinstimmung wird der Request wiederholt. Ich habe damals auf diese Überprüfung verzichtet,

  1. da ich mit MQTT gestartet bin, und dort gab es sowas nicht

  2. Ich habe noch nie einen CRC Fehler gesehen

  3. Macht im HTTP Mode alles langsammer

Als ich vermutet habe, dass es mit einzelnen Paketen Probleme geben kann, wollte ich nach der Übertragung auf den berechneten mapCRC im State String warten und im Falle einer Übereinstimmung Mähvorgang starten. Durch die Rundungsfehler in der Sunray FW kommt es allerdings nicht zu einer exakten Übereinstimmung. So dass es trotzdem nicht 100% sicher wäre. Allerdings gibt es einen Vorschlag von Bernard wie man diese Rundungsfehler vermeiden kann, dazu muss im Sunray FW was angepasst werden.

Vorteil ist, mapCRC gibt es überall: HTTP, MQTT und UART

disaster123 commented 11 months ago

Mich wundert der CRC Fehler auch - er tritt scheinbar nur manchmal auf. Ich habe das Gefühl es hat was mit der Encryption zu tun. Da ich recht viel am Sunray FW Code entwickle, starte ich die Sunray FW sehr oft neu - und der Encryption "Code" ändert sich.

Manchmal funktioniert danach die Cassandra Sunray Verbindung auch gar nicht.

EinEinfach commented 11 months ago

Kann sein, die http Lösung hatte ich nie produktiv im Einsatz, geschweige der encrypt Lösung. Ich hatte das mal gebaut um diverse Tests durchzuführen, die die MQTT nicht out of the box hergibt.

Wahrscheinlich sparst du dir eine Menge Ärger, wenn du die Encryption ertstmal deaktivierst. Bei einigen Usern klappt die encrypted Verbindung gar nicht. Ich habe das im Rahmen meiner Möglichkeiten aus dem Sunray Code Reverse engineert, evtl. kann da Alexander drüber schauen. Vielleicht findet er sofort den Fehler.

Bzgl. der unvollständigen Karten baue ich nächste Woche mapCRC Überprüfung mit ein. Parallel sollte man klären ob es ein Problem wäre im Sunray Code im class Point die Datentypen von px und py auf float umstellen um Umrechnungsfehler im mapCRC auszumerzen.

disaster123 commented 11 months ago

Mega nervig - nun gerade wieder:

Aug 11 20:11:38 bananapi start_sunray.sh[10096]: CRC ERROR: got crc: 0 expected crc: D3
Aug 11 20:11:38 bananapi start_sunray.sh[10096]: CRC ERROR: got crc: 0 expected crc: D5
Aug 11 20:11:38 bananapi start_sunray.sh[10096]: CRC ERROR: got crc: 1 expected crc: 1D
Aug 11 20:11:38 bananapi start_sunray.sh[10096]: CRC ERROR: got crc: F expected crc: FD
Aug 11 20:11:38 bananapi start_sunray.sh[10096]: CRC ERROR: got crc: 5 expected crc: 5D

der Mäher fährt dann einfach mit der hälfte der Punkte los...

ich deaktivere mal die "Encryption"

disaster123 commented 11 months ago

Habe die Encryption nun aus - bisher keine Probleme mehr

EinEinfach commented 11 months ago

Benutzt du Standardpasswort aus dem config_example.h?

disaster123 commented 11 months ago

Nein hatte "12346" gesetzt - also die 5 gelöscht ;-)

EinEinfach commented 11 months ago

@disaster123 kannst du bitte mit deinem Problemsetup testen: https://github.com/EinEinfach/CaSSAndRA/commit/f5dab7a2728175557ab6cdbefc2bbec4e7419db8

Was aktuell die Sunray FW über alle Kanäle liefert (UART, HTTP, MQTT) geht es nicht besser. Ich rechne jetzt die mapCRC vor der Übertragung nach, dann wartet Cassandra ab. Wenn Sunray FW mapCRC im erlaubten Bereich von der Cassandra CRC ist (+-500cm), dann wird das Mähvorgang getriggert.

Das Problem sind die Datentypumrechnungen in der Sunray FW, je mehr Punkte zu Übertragen sind, desto größer ist die Abweichung. Dort muss nachgebessert werden. Ich habe es mit einer großen Karte probiert (11km Mähweg), dort kam es zu einer Abweichung von 347cm. Die Sunray APP wird bei dieser Karte immer not synchronized melden, da lautet AlexanderG die Sunray APP eine maximale Abweichung von 200cm erlaubt

disaster123 commented 11 months ago

Mache ich gerne aber mal ne kurze Frage dazu. Das passiert is nur mit encrypt 1 - bei 0 passiert das nicht. Crc und co gibt es doch aber auch bei encrypt 0?

EinEinfach commented 11 months ago

Ja, crc gibt es immer. Warum Cassandra sich im encrypt modus verschlückt, habe ich noch nicht rausgefunden

disaster123 commented 11 months ago

Aber was soll ich dann testen? Bei mir geht es aktuell ohne encrypt immer fehlerfrei!

EinEinfach commented 11 months ago

Ob im Fehlerfall der Robot losfährt, oder du eine entsprechende Fehlermeldung bekommst. Aber, wenn es jetzt funktioniert, dann schliesse ich den Issue.

disaster123 commented 11 months ago

Ok eventuell habe ich mich unklar ausgedrückt. Das ganze ist ein reines encryption Thema. Der crc ist nur falsch bei encrypt 1. bei 0 ist der crc immer korrekt.

EinEinfach commented 11 months ago

Ok jetzt rennt es: https://github.com/EinEinfach/CaSSAndRA/commit/afdb5524c460ba31d641fdcff4a475a86ed25f06

disaster123 commented 11 months ago

Cool - danke scheint zu klappen.