Merkwürdiges Wendeverhalten am Bahnende

@eRacoon Das habe ich bei meinem Alfred auch. Ich meine es kam mit 318 dazu. Wir haben zwar keine großen Flächen aber einen sehr komplexen Garten. Die Mähzeit hat sich um über 1 1/2 Stunden erhöht weil er solche Dinge macht (die Drehungen geben ihren Teil dazu).
 
So gerade doch nochmal die letzten Sonnenstunden zwischen dem Regen genutzt und getestet.
Also mit der Funktion deaktiviert bzw. wieder auf einfach true setzen dachte ich hätte es gelöst.

Die ersten 80% sahen perfekt aus, jetzt fährt er auch die kurzen Punkte die beide Bahnen verbinden wieder schön an, das hat vorher ja irgendwie auch komplett gefehlt. Am Ende ging dann das Gezuckel inkl. Obstacle triggern aber wieder los, das waren aber dann die ersten Bahnen die den Hang bzw. ganz leichte Steigung hoch statt runter gingen. Berg runter lief alles super.

Daher muss irgendwas mit dem Anfahren unter Last nicht stimmen.
Hab dann nochmal durch den Code gescrollt weil ich eigentlich den Overload höher setzen wollte und dann USE_LINEAR_SPEED_RAMP gesehen was ich bei dem Update mal auf True gesetzt hatte.

Also das deaktiviert und nochmal die gleiche Stelle wie oben im Screenshot zu sehen gemacht.
0 Obstacles
0 falsche Dreher
0 360° Drehungen
0 Gezuckel 🥳

Hab dann nochmal ein zweiten kleinen Bereich am Hang mit sehr vielen Drehungen Bergauf erstellt und auch da keinerlei Probleme gehabt.
Wenn das Wetter passt werde ich Morgen nochmal die 1000qm² anwerfen aber das sah schon mal sehr vielversprechend eben aus.

Wenn das Morgen auf den 1000qm² auch noch passt dann hab ich für mich eine funktionierende .318 Version gefunden.

- USE_LINEAR_SPEED_RAMP -> in config.h deaktiviert
- SMOOTH_CURVES -> in config.h deaktiviert (vorsorglich weil das in der angleToTargetFits Funktion in den anderen if Bereich sonst läuft)
- angleToTargetFits -> zurück auf True
- get_turn_direction_preference -> auskommentieren
- SUPER_SPIKE_ELIMINATOR -> auskommentieren in AmRobotDriver.cpp
- EscapeReverseOp -> deaktivieren (wobei das Problem jetzt seltener getriggert werden sollte, überlege noch ob ich das wieder aktiviere)


Danke für die Hilfe, die Community liefert wie immer ab! 🙂
 
Zuletzt bearbeitet:
@eRacoon, ich habe deine empfohlenen Änderungen in der 318 durchgeführt, da mich das Tänzeln meines Mowers auch gestört hat, und danach versucht zu mähen. Bevor der Mower zum ersten Punkt losfuhr, hat er sich erst einmal gefühlt 20x im Kreis gedreht und auch an den Bahnenden sah es mehr nach Tanz als nach Wenden aus. Ständig ruckartige Bewegungen und mehrfaches im Kreis drehen. Es funktioniert also bei mir mit der 318 definitiv nicht! Ich habe dann abgebrochen, nachdem er mir rückwärts in eine Exclusion rein gefahren und mit Motor-Error stehen geblieben ist.
Jetzt habe ich die Version 314, die ich noch zur Verfügung hatte, wieder aufgespielt und nun mäht er wieder so wie bisher und wie ich es möchte. Die 318 ist für mich so nicht nutzbar.
 
Konnte es heute nur sehr kurz testen aber ja bei voller Größe hatte ich auch kein Erfolg mehr.
Alleine das ersten Starten ging schon nicht, hier kam er nicht zum Startpunkt sondern hat nur rum gezuckelt.
Nach einem Restart ging es dann erstmal wieder, aber später ging es wieder los.

Könnte eventuell wieder ein Thema sein was nach längerer Uptime vom Roboter erschein/schlimmer wird.
Gestern hab ich die Tests ja immer direkt nach dem Upload der Firmware gemacht.

Werde als nächstes auch mal die 314 oder 317 testen.
 
Hab jetzt mal 2h laufen lassen mit der .317 ohne irgendwelche Anpassungen.
Sieht soweit erstmal wieder ganz okay aus, hin und wieder dreht er mal in die falsche Richtung oder auch mal eine 360° Drehung dabei aber wirklich sehr selten.
Damit kann ich leben, aber mal schauen wie es sich im Langzeittest so macht.

Was mir aber direkt auffällt, die Genauigkeit der Bahnen ist wieder etwas schlechter geworden, er eiert teilweise wieder ein ganz bisschen rum.
Da hatte ich das Gefühl das die .318 deutlich präziser war, eventuell sind da auch die Bugs dann reingekommen.
Gedanke war gut, aber noch nicht wirklich nutzbar in dem Zustand.

Werde das aber weiter beobachten ob ich mit der .317 so leben kann oder noch weiter zurück muss.
Ich berichte...
 
Weil ich die Probleme mit dem Drehen auch hatte, bin ich mit der Datei "LineTracker.cpp" wieder zurück auf Version 288. Danach war alles wieder ok.
Ab Version 289 wurde das Feature eingebaut, dass der Mäher möglichst wenig über den Perimeter dreht. Das scheint noch nicht richtig ausgereift und macht meiner Meinung nach aktuell noch mehr Probleme als es nützt.
 
Zuletzt bearbeitet:
Die LineTracker.cpp ver. 288 in die 318 kopiert führt bei mir zu Fehlern beim Kompilieren:

C++:
Arduino: 1.8.19 (Windows Store 1.8.57.0) (Windows 10), Board: "Adafruit Grand Central M4 (SAMD51), Enabled, 120 MHz (standard), Small (-Os) (standard), 50 MHz (standard), Arduino, Off"



C:\Users\GV9492\Box Sync\Ardumower\Sunray-1.0.318\sunray\LineTracker.cpp: In function 'void trackLine(bool)':

LineTracker.cpp:212:30: error: no matching function for call to 'Map::nextPoint(bool)'

  212 |     if (!maps.nextPoint(false)){

      |                              ^

In file included from C:\Users\GV9492\Box Sync\Ardumower\Sunray-1.0.318\sunray\robot.h:26,

                 from C:\Users\GV9492\Box Sync\Ardumower\Sunray-1.0.318\sunray\LineTracker.cpp:8:

C:\Users\GV9492\Box Sync\Ardumower\Sunray-1.0.318\sunray\map.h:197:10: note: candidate: 'bool Map::nextPoint(bool, float, float)'

  197 |     bool nextPoint(bool sim,float stateX, float stateY);

      |          ^~~~~~~~~

C:\Users\GV9492\Box Sync\Ardumower\Sunray-1.0.318\sunray\map.h:197:10: note:   candidate expects 3 arguments, 1 provided

exit status 1

no matching function for call to 'Map::nextPoint(bool)'

@CrazyJ: oder bist Du auf die komplette 288 zurück gegangen?
 
Ich hab die Sunray .318 benutzt.
In der Linetracker.cpp aus der Version .288 muss man noch die Zeile 212 etwas ändern (aus der .318 übernehmen) sonst bekommt man den Fehler:
if (!maps.nextPoint(false,stateX,stateY)){
 
Ab Version 1.0.319 (derzeit nur "Arbeitsversion") ist das Drehen wieder vereinfacht - das Feature "vom Perimeter weg drehen" ist ein Community-Beitrag und es scheint mehr Nachteile als Vorteile zu haben und ist daher erstmal wieder aus dem "Masterzweig" verschwunden ("keep-it-simple")...
 
Zuletzt bearbeitet:
@AlexanderG
Danke für die Info. Das klingt vernünftig.
Gut wäre auch, wenn man neue Features einfach in der Config abschalten kann. So kann jeder die neuen Funktionen erstmal für sich testen und hier dazu eine Rückmeldung geben. Es ist sonst immer schwer die richtige Stelle im Quellcode zu finden.
 
Richtig- nur bei diesem Community-Feature wurde keine Abschalt-Option vorgesehen (und ich kann's nicht auf die Schnelle ergänzen), daher blieb nur das erstmal ganz wegzulassen...
 
Ich denke die Angletotargetfits Sache hat im Ursprung einen Denkfehler.
Dort stand auch ein Kommentar: set rotation direction and keep it.

Seit ich das verändert hatte macht die Bude eigentlich genau das was man erwartet:

if (trackerDiffDelta < 0) { //MrTree set rotation direction and do not keep it :) rotateLeft = true; rotateRight = false; } else { rotateRight = true; rotateLeft = false;


Ansonsten, bis auf die ganzen Einstellbaren Parameter ist es nah am Ursprung. Das ist schon eine weile her, aber ich konnte mich einfach nicht daran gewöhnen das unvorhersehbare Sachen passiert sind. Seitdem ich das geändert hatte passiert wie gesagt genau das was man eingestellt hat. Hier mal der ganze Code:

// allow rotations only near last or next waypoint or if too far away from path // it might race between rotating mower and targetDist check below // if we race we still have rotateLeft or rotateRight true if ( (targetDist < 0.3) || (lastTargetDist < 0.3) || (fabs(distToPath) > 2.5) || rotateLeft || rotateRight ) { if (SMOOTH_CURVES) angleToTargetFits = (fabs(trackerDiffDelta) / PI * 180.0 < 120); else angleToTargetFits = (fabs(trackerDiffDelta) / PI * 180.0 < 20); //MrTree we have more than 20deg difference to point } else { // while tracking the mowing line do allow rotations if angle to target increases (e.g. due to gps jumps) angleToTargetFits = (fabs(trackerDiffDelta)/PI*180.0 < 60); // angleToTargetFits = true; } if ((!angleToTargetFits || !angleToTargetPrecise) && !dockTimer) { //MrTree added !dockTimer, !angleToTargetPrecise // angular control (if angle to far away, rotate to next waypoint) if (!angleToTargetFits) angleToTargetPrecise = false; resetLinearMotionMeasurement(); //MrTree added function call from svol0 linear = 0; //MrTree while turning from >= 20/45 deg difference, linear is 0... still decelerating or accelerating on stepin/out if (((maps.isDocking()) || (maps.isUndocking())) && ((maps.trackSlow) && (trackslow_allowed))) { angular = DOCKANGULARSPEED / 180.0 * PI; //MrTree use DOCKANGULARSPEED in config.h, added trackslowallowed : RTT=29deg/s=0.5 rad/s; } else { if (fabs(trackerDiffDelta)/PI*180.0 >= ANGLEDIFF1) angular = ROTATETOTARGETSPEED1 / 180.0 * PI; //MrTree set angular to fast defined in config.h if (fabs(trackerDiffDelta)/PI*180.0 < ANGLEDIFF1) angular = ROTATETOTARGETSPEED2 / 180.0 * PI; //MrTree slow down turning when near desired angle if (fabs(trackerDiffDelta)/PI*180.0 <= ANGLEDIFF2) angular = ROTATETOTARGETSPEED3 / 180.0 * PI; //MrTree slow down turning even more when almost at desired angle } if (trackerDiffDelta < 0) { //MrTree set rotation direction and do not keep it :) rotateLeft = true; rotateRight = false; } else { rotateRight = true; rotateLeft = false; } if (rotateLeft) angular *= -1; if (fabs(trackerDiffDelta)/PI*180.0 < ANGLEPRECISE){ rotateLeft = false; // reset rotate direction rotateRight = false; angleToTargetPrecise = true; //MrTree Step out of everything when angle is precise... angular = 0; } if (fabs(CurrSpeed) >= 0.1) angular = 0; //MrTree reset angular if current speed is over given value (still deccelerating) } else { // line control (stanley)
 
Wenn jemand eine zuverlässige funktionierende Version hat ohne Probleme gerne mal den Weg genau hier posten welche Version + welcher Fix etc...
Die .317 Version dreht teils auch komplett am Rad, der Roboter dreht sich teils am Bahnende 5x im Kreis bis er sich dann entscheidet ein Obstacle zu triggern.
Dauert dadurch weiterhin alles Ewigkeiten.
 
Oben